mysql 主备从
创建mysql服务
ip端口 | |
192.168.153.19:3307 | master |
192.168.153.19:3308 | slave |
192.168.153.19:3309 | master01 |
192.168.153.19:3310 | slave01 |
# docker 拉取mysql镜像 docker pull mysql:5.7 # 宿主机创建文件夹 mkdir /data/docker/mysql-master/{conf,data,log} mkdir /data/docker/mysql-master01/{conf,data,log} mkdir /data/docker/mysql-slave/{conf,data,log} mkdir /data/docker/mysql-slave01/{conf,data,log}
如图:
启动镜像:
docker run -p 3307:3306 --privileged=true --name mysql-master \ -v /data/docker/mysql-master/log:/var/log/mysql \ -v /data/docker/mysql-master/data:/var/lib/mysql \ -v /data/docker/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 docker run -p 3308:3306 --privileged=true --name mysql-slave \ -v /data/docker/mysql-slave/log:/var/log/mysql \ -v /data/docker/mysql-slave/data:/var/lib/mysql \ -v /data/docker/mysql-slave/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 docker run -p 3309:3306 --privileged=true --name mysql-master01 \ -v /data/docker/mysql-master01/log:/var/log/mysql \ -v /data/docker/mysql-master01/data:/var/lib/mysql \ -v /data/docker/mysql-master01/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 docker run -p 3310:3306 --privileged=true --name mysql-slave01 \ -v /data/docker/mysql-slave01/log:/var/log/mysql \ -v /data/docker/mysql-slave01/data:/var/lib/mysql \ -v /data/docker/mysql-slave01/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7
编辑master my.cnf
vim /data/docker/mysql-master/conf/my.cnf [mysqld] server_id=1 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能 log-bin=mysql-bin ## 需要复制的数据库 binlog-do-db=mydb1 ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row) binlog_format=statement ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 # 在作为从数据库时,有写入操作也要更新二进制日志文件 log-slave-updates # 表示自增长字段每次递增的量,指自增字段的起始值,默认值是1,取值范围1--65535 auto-increment-increment=2 # 表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1--65535 auto-increment-offset=1
编辑master01 my.cnf
vim /data/docker/mysql-master01/conf/my.cnf [mysqld] server_id=3 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能 log-bin=mysql-bin ## 需要复制的数据库 binlog-do-db=mydb1 ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row) binlog_format=statement ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 # 在作为从数据库时,有写入操作也要更新二进制日志文件 log-slave-updates # 表示自增长字段每次递增的量,指自增字段的起始值,默认值是1,取值范围1--65535 auto-increment-increment=2 # 表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1--65535 auto-increment-offset=2
编辑slave my.cnf
vim /data/docker/mysql-slave/conf/my.cnf [mysqld] server_id=3 # 启用中继日志 relay-log=mysql-relay
编辑slave01 my.cnf
vim /data/docker/mysql-slave01/conf/my.cnf [mysqld] server_id=4 relay-log=mysql-relay
重启容器
docker restart mysql-master mysql-master01 mysql-slave mysql-slave01
进入mysql-mysql容器数据库创建主从同步用户
docker exec -it mysql-master /bin/bash # 进入mysql mysql -uroot -p123456 # 创建同步数据用户 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123'; # 刷新权限 FLUSH PRIVILEGES;
进入mysql-mysql01容器数据库创建主从同步用户
docker exec -it mysql-master01 /bin/bash # 进入mysql mysql -uroot -p123456 # 创建同步数据用户 GRANT REPLICATION SLAVE ON *.* TO 'slave01'@'%' IDENTIFIED BY '123123'; # 刷新权限 FLUSH PRIVILEGES;
slave[3308]同步master[3307],slave01[3310]同步master01[3309]
# 进入slave从库 docker exec -it mysql-slave /bin/bash # 登录mysql mysql -uroot -p123456 CHANGE MASTER TO MASTER_HOST='192.168.153.19', MASTER_PORT=3307, MASTER_USER='slave', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.000001', # 登陆主服务器 show master status; 查询 取File列值 参考下图 MASTER_LOG_POS=612; # 登陆主服务器 show master status; 查询 取Position列值 参考下图 # 开始从库同步 start slave; # 查看主从同步状态 show slave status\G
如图:
# 进入slave01从库 docker exec -it mysql-slave01 /bin/bash # 登录mysql mysql -uroot -p123456 CHANGE MASTER TO MASTER_HOST='192.168.153.19', MASTER_PORT=3309,MASTER_USER='slave01', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.000001', # 登陆主服务器 show master status; 查询 取File列值 参考下图 MASTER_LOG_POS=612; # 开始从库同步 start slave; # 查看主从同步状态 show slave status\G
如图:
master、master01互为主备配置:
master01复制master
# 进入master01节点数据库执行 CHANGE MASTER TO MASTER_HOST='192.168.153.19', MASTER_PORT=3307,MASTER_USER='slave', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.000001', # 登陆主服务器 show master status; 查询 取File列值 参考下图 MASTER_LOG_POS=612; # 启动 start slave; # 查看状态 show slave status\G
master复制master01
# 进入master节点数据库执行 CHANGE MASTER TO MASTER_HOST='192.168.153.19', MASTER_PORT=3309,MASTER_USER='slave01', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.000001', # 登陆主服务器 show master status; 查询 取File列值 参考下图 MASTER_LOG_POS=612; # 启动 start slave; # 查看状态 show slave status\G
测试:因为数据库设置只允许同步mydb1数据库,所以切记测试时,要吗去掉只同步mydb1的配置,要么直接创建mydb1数据库。
插入测试语句
binlog为statement所以insert的@@hostname为系统变量,每台服务器的hostname数据都为该服务器的服务器名称。所以 生产环境binlog建议用row格式,确保不会因为系统变量导致每台mysql的数据有区别
master
master01
slave
slave01