快速做一个安全可靠的Mysql生产服务器
背景
最近阿里云和腾讯云都在做活动2C4G 5M的ECS服务器竟然只要3年998,就想着买一个服务器,部署个东西自己玩玩(程序员都有这种折腾的爱好吧~),买完之后,部署wordpress博客,但是考虑数据如何安全存储,我可不想辛苦写了几十篇文章,结果服务器挂了就全没了
那首先想到直接买RDS云服务吧,但是!!!尼玛,最便宜的mysql一年也要五六百,我买了服务器才几毛钱,配个RDS太贵了吧,于是就想自己折腾一个吧~
本人只是个程序猿 ,不是专业运维,请大神不要吐槽~
前提
- 拥有一台服务器(废话,不然也不折腾了)
- 买个OSS存储(主要是省事儿,你想放到自己的私有硬盘也可以,比如NAS),价格貌似流量不大的话一个月1块钱,还能做图片服务器。
搭建思路
- 备份,最好能备份最近7天数据,这样比较保险。
- 备份最好不要在当前服务器上,最好做到异地备份,省的忘记续费或者未知故障导致服务器不可恢复(简配版的异地灾备~)。
- 开启binlog功能,也是防止数据丢失,或者不小心的执行了delete误操作。
找合适的docker镜像
- 由于本人不是专业运维,所以优先考虑docker部署。(一键部署,一键迁移),然后去网上搜下相关问题,毕竟你想到的大牛可能已经帮你做好了,果不其然,搜到一篇 https://blog.csdn.net/alinyua/article/details/82532988
- 按照文档试一下,果然可行,但是也有一些问题,那我们就不重复造轮子了,直接站在大神的肩膀上改问题算了。
- 直接映射backup目录会因为权限问题导致mysqldump执行失败,看到start.sh中有chmod 777 /cron-shell的代码,那复制一下吧。(直接777太暴力,运维不要吐槽,大家根据需要修改)
- cron-shell中有backup.sh中mysqldump命令是使用MYSQL_ROOT_PASS环境变量来做备份,但是crontab是取不到环境变量,而且放到环境变量不安全,一旦docker-compose.yml启动之后,密码再放这里就会导致安全问题,所以这里要自己写死(自己docker cp出来,改完自己的密码,再映射这个脚本或者重新打自己的镜像,否则会备份失败)。
- 这样自动备份就搞定了,那就在考虑如何将备份文件搞到另外一个服务器上。
自动备份文件到OSS上
这里我只做了一个自动备份到OSS的,而且是偷懒。
- 将OSS buket挂载到服务器上,参考:https://help.aliyun.com/document_detail/32196.html?spm=a2c4g.11174283.6.751.179d7da2MDQKWn
主要命令:echo wine-mysql:keyid:key > /etc/passwd-ossfs ossfs buketname /wine-mysql -ourl=http://oss-cn-hangzhou.aliyuncs.com
-
使用rsync将docker映射的mysqlbackup 文件夹和这oss文件夹同步。
0 2 * * * rsync -vd --delete /root/project/mysql/data/backup/ /mysqlbackup
注意:backup文件夹映射,不能映射oss挂载,不然会chmod777失败,导致mysql启动不了。
文件信息
镜像地址:registry.cn-hangzhou.aliyuncs.com/yangch/mysql
如果有朋友想要docker-entrypoint.sh的,可以下载镜像自己docker cp出来,太长了我就不贴了。
docker-compose.yml(建议初始化好以后将MYSQL_ROOT_PASSWORD删掉,不然容易造成密码泄露)
version: '3.1'
services:
mysql-db:
image: registry.cn-hangzhou.aliyuncs.com/yangch/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ******
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql
- ./backup:/backup
Dockerfile文件
FROM mysql:5.7
MAINTAINER ych
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
&& apt-get update \
&& apt-get install -y --no-install-recommends cron \
&& apt-get install -y dos2unix \
&& apt-get install sudo \
&& echo '%mysql ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
RUN sudo mkdir /backup
ADD docker-entrypoint.sh /usr/local/bin
ADD mysql-config/ /etc/mysql/conf.d/
COPY cron-shell/ /cron-shell/
COPY init-shell/ /docker-entrypoint-initshell.d/
RUN chmod a+x -R /docker-entrypoint-initshell.d
mysql配置文件
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
skip-name-resolve
lower_case_table_names=1
max_connections=1024
log-bin = binlog
server-id=1
binlog-format = ROW
binlog_rows_query_log_events = off
expire-logs-days = 7
max-binlog-size = 500M
后续补充
实际使用过程中,还是有一个风险 ,如果服务器被入侵或者被勒索病毒,阿里云oss因为是挂载目录,权限很高,又没有版本备份,可能最终还是不够安全。
所以实际使用中,最后还是在我的NAS中每天将这个backup目录备份到我家里硬盘,没有nas的可以考虑备份到自己其他服务器上,重要数据一定要备份2-3份。
注意:nas使用async来同步,同步策略要选择增量,而且要忽略删除和修改,否则还是有被删除和勒索的风险的.
本文固定链接:杨晨辉的个人博客 » 使用docker做一个自动备份安全可靠的Mysql生产服务器
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!