使用docker做一个自动备份安全可靠的Mysql生产服务器

技术总结 yangchenhui 10896℃ 0评论

快速做一个安全可靠的Mysql生产服务器

背景

最近阿里云和腾讯云都在做活动2C4G 5M的ECS服务器竟然只要3年998,就想着买一个服务器,部署个东西自己玩玩(程序员都有这种折腾的爱好吧~),买完之后,部署wordpress博客,但是考虑数据如何安全存储,我可不想辛苦写了几十篇文章,结果服务器挂了就全没了

那首先想到直接买RDS云服务吧,但是!!!尼玛,最便宜的mysql一年也要五六百,我买了服务器才几毛钱,配个RDS太贵了吧,于是就想自己折腾一个吧~

本人只是个程序猿 ,不是专业运维,请大神不要吐槽~

前提

  1. 拥有一台服务器(废话,不然也不折腾了)
  2. 买个OSS存储(主要是省事儿,你想放到自己的私有硬盘也可以,比如NAS),价格貌似流量不大的话一个月1块钱,还能做图片服务器。

搭建思路

  1. 备份,最好能备份最近7天数据,这样比较保险。
  2. 备份最好不要在当前服务器上,最好做到异地备份,省的忘记续费或者未知故障导致服务器不可恢复(简配版的异地灾备~)。
  3. 开启binlog功能,也是防止数据丢失,或者不小心的执行了delete误操作。

找合适的docker镜像

  1. 由于本人不是专业运维,所以优先考虑docker部署。(一键部署,一键迁移),然后去网上搜下相关问题,毕竟你想到的大牛可能已经帮你做好了,果不其然,搜到一篇 https://blog.csdn.net/alinyua/article/details/82532988
  2. 按照文档试一下,果然可行,但是也有一些问题,那我们就不重复造轮子了,直接站在大神的肩膀上改问题算了。
  3. 直接映射backup目录会因为权限问题导致mysqldump执行失败,看到start.sh中有chmod 777 /cron-shell的代码,那复制一下吧。(直接777太暴力,运维不要吐槽,大家根据需要修改)
  4. cron-shell中有backup.sh中mysqldump命令是使用MYSQL_ROOT_PASS环境变量来做备份,但是crontab是取不到环境变量,而且放到环境变量不安全,一旦docker-compose.yml启动之后,密码再放这里就会导致安全问题,所以这里要自己写死(自己docker cp出来,改完自己的密码,再映射这个脚本或者重新打自己的镜像,否则会备份失败)。
  5. 这样自动备份就搞定了,那就在考虑如何将备份文件搞到另外一个服务器上。

自动备份文件到OSS上

这里我只做了一个自动备份到OSS的,而且是偷懒。

  1. 将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
  2. 使用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生产服务器
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址