Docker上部署MySQL集群--主从复制

2 篇文章 0 订阅
1 篇文章 0 订阅

Docker上部署MySQL主从复制

Date: 2021-01-24

  • 实现一主两从的MySQL架构;
  • 当前实战是在Mac上实现的,如果是Windows,挂在的目录需要注意一下,使用D:/xxx/yyy。
  • 背景:搭建MySQL一主多从目的是为了搭建可靠的Nacos集群,需要搭建一主多从MySQL数据库;
  • 在此基础上,了解 Docker的挂在技术;MySQL的主从复制底层原理binlog文件;MySQL的6个log文件及各自功能;

1、拉取镜像并创建容器

   docker pull mysql:5.7
    ## 一般情况下,需要将配置文件和data目录挂载在宿主机上,因此首先在宿主机创建好目录,
    ## /Users/zhaohong/Documents/study_test/mysql
    ## ①配置文件(创建个空文件):/conf/mysql.cnf  /conf/mysql_01.cnf /conf/mysql_02.cnf  
    ## ②数据目录:/data /data_02 /data_02
    ## mysql容器默认的配置文件目录:/etc/mysql/mysql.cnf (注意my.cnf是个链接,请使用mysql.cnf)
    ## mysql容器默认的数据目录:/var/lib/mysql
  ## master
  docker run -d --privileged=true 
  -v /Users/zhaohong/Documents/study_test/mysql/conf/mysql.cnf:/etc/mysql/mysql.cnf 
  -v /Users/zhaohong/Documents/study_test/mysql/data:/var/lib/mysql 
  --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  ## mysql_01 第一个slave
  docker run -d --privileged=true 
  -v /Users/zhaohong/Documents/study_test/mysql/conf/mysql_01.cnf:/etc/mysql/mysql.cnf 
  -v /Users/zhaohong/Documents/study_test/mysql/data_01:/var/lib/mysql
  --name mysql_01 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  ## mysql_02 第二个slave
  docker run -d --privileged=true 
  -v /Users/zhaohong/Documents/study_test/mysql/conf/mysql_02.cnf:/etc/mysql/mysql.cnf 
  -v /Users/zhaohong/Documents/study_test/mysql/data_01:/var/lib/mysql
  --name mysql_02 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
 ## 查看所有的容器
 docker ps

2、修改配置文件并重启容器

	这次配置MySQL主从复制的目的是搭建可靠的Nacos服务,因此首选需要创建nacos数据库,将创建表的语句导入即可。

nacos-mysql.sql : https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql

 # master  mysql.cnf
 [mysqld]
 port=3306
 server-id=1
 log-bin=mysql-bin
 binlog-ignore-db=information_schema
 binlog-ignore-db=mysql
 binlog-do-db=nacos
    # slave mysql_01.cnf
    [mysqld]
    port=3306
    server-id=2
    log-bin=mysql-bin
    binlog-ignore-db=information_schema
    binlog-ignore-db=mysql
    replicate-do-db=nacos
    log-slave-updates
    slave-skip-errors=all
    slave-net-timeout=60
    # slave mysql_02.cnf
    [mysqld]
    port=3306
    server-id=3
    log-bin=mysql-bin
    binlog-ignore-db=information_schema
    binlog-ignore-db=mysql
    replicate-do-db=nacos
    log-slave-updates
    slave-skip-errors=all
    slave-net-timeout=60

重启容器:
docker restart mysql
docker restart mysql_01
docker restart mysql_02
docker ps #查看容器

## 3、主从MySQL建立连接
## mysql mater 对slave授权(master username:root,password:root)
GRANT FILE ON *.* TO 'root'@'从机IP' IDENTIFIED BY '连接密码';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'从机IP' IDENTIFIED BY '连接密码';
FLUSH PRIVILEGES;
## 对第1个slave授权 172.17.0.3
GRANT FILE ON *.* TO 'root'@'172.17.0.3' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.0.3' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
## 对第2个slave授权 172.17.0.4
GRANT FILE ON *.* TO 'root'@'172.17.0.4' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.0.4' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
```
 ## 查看下master状态
 show master status;
 show variables like 'log_bin'; 
 show binary logs;

    ## mysql slave 连接master(两个slave均执行相同命令)
    stop slave;
    change master to  master_host='172.17.0.2', master_user='root', master_password='root', 
     master_log_file='mysql-bin.000001', master_log_pos=2044;
    start slave; 
    ## 查看slave状态,从信息中可以看出是否成功,若失败,可看出失败原因
    show slave status;

一切OK之后,就可以验证一下。DDL、DML语句均会同步,如创建表格、删除表格、表格增加字段、update、insert、delete等。

## 4、 配置说明

### (1) binlog文件
  • 默认情况下binlog是关闭状态;
    查看binlog是否开启:
    show variables like ‘log_bin’; ## OFF/ON
    show binary logs;
  • 开启binlog
    ## 在配置文件mysql.cnf中,配置log-bin=xxx即开启binlog日志;
    log-bin=mysql-bin #{datadir}/mysql-bin.000001.log
    ## 或者指定绝对路径
    log-bin=/var/lib/Mysql-binlog/mysql-bin
  • binlog文件以xxxx.000001… xxx.000003等编号文件,当前文件xxxx.index。
### (2) mysql.cnf配置说明
       log-bin=mysql-bin ##开启bin-log;
       server-id=1 ##集群每个实例唯一标志;
       binlog-ignore-db=mysql ##忽略的数据库;
       binlog-do-db=nacos ##需要执行binlog的数据库;
       ## slave
       replicate-do-db=nacos ##需要复制同步数据的数据库;
       slave-skip-errors=all ##跳过所有同步错误;
       slave-net-timeout=60
  ### (3) binlog文件大小限制
      ## log-bin文件太多,占用空间,可以指定过时时间及大小。
      log-bin = /usr/local/var/mysql/logs/mysql-bin
      expire-logs-days = 14
      max-binlog-size = 500M
 ###  (4) 遇到的问题
  ① MySQL主从复制遭遇 'Misconfigured master - server id was not set'
  问题:今天在配主从复制时,遇到从库的IO ERROR,提示如下
  Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - server id was not set'
  原因及解决办法:每个实例都需要指定唯一的server-id,注意不要指定为0,需要从1开始,重启即可。
  ② MySQL无法重启Warning: World-writable config file ‘/etc/mysql/my.cnf’ is ignored
  https://blog.csdn.net/qilovehua/article/details/45508925
      root@cd196102c70b:/# mysql -uroot -p
      mysql: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
      Enter password:
  问题分析:根据提示可知,配置文件是全局可写,任何一个用户都可以写。mysql担心这种文件被其他用户恶意修改,所以忽略掉这个配置文件,这样mysql无法关闭。

解决办法:查看my.cnf文件权限:
ls -l /etc/mysql/my.cnf
-rwxrwxrwx 权限777,任何一个用户都可以修改my.cnf,存在很大隐患。
chmod 644 /etc/mysql/my.cnf
然后重启mysql,不会再报Warning,配置文件就生效了。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值