Mysql主从复制是把一台主机的数据复制到其他一台或多台主机上;
主从复制原理:
主从同步过程中主服务器有一个工作线程I/O dump thread,从服务器有两个工作线程I/O thread和SQL thread。
主库把外界接收的SQL请求记录到自己的binlog日志中,从库的I/O thread去请求主库的binlog日志,并将binlog日志写到中继日志中,然后从库重做中继日志的SQL语句。主库通过I/O dump thread给从库I/O thread传送binlog日志。
原理图
1)准备两个mysql5.7的容器
下载mysql5.7
docker pull mysql:5.7
这里我们要搞个操作,方便宿主机修改容器里的配置以及查看日志,我们要搞容器卷,这里首先得把mysql的配置文件和日志目录cp到宿主机;
我们先启动Mysql;
docker run -p 3306:3306 -d -e MYSQL_ROOT_PASSWORD=123456 镜像id
宿主机下 home目录下 新建 mysql目录 用于存放配置文件和日志目录;
docker cp 3096849fc5c9:/etc/mysql/mysql.conf.d/ /home/mysql/
docker cp 3096849fc5c9:/var/log /home/mysql/
我们启动两个mysql容器:
docker run -p 3306:3306 --name master -d -v /home/mysql/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql/log/:/var/log -e MYSQL_ROOT_PASSWORD=123456 镜像ID
docker run -p 3307:3306 --name slave -d -v /home/mysql2/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql2/log/:/var/log -e MYSQL_ROOT_PASSWORD=123456 镜像ID
启动后,我们可以用Navicat连接
2)docker自定义网络模式,实现容器固定ip地址
我们在使用Docker容器时候,每次启动容器,容器分配到的虚拟IP经常变动,比如我们现在使用Mycat + Mysql,我们是需要配置Mysql服务IP地址的,这个IP是Docker分配的虚拟IP,假如老是变,那我们还得老是修改配置,那就很麻烦了;所以我们需要固定手工分配容器IP;
Docker默认使用的是bridge 桥接网络模式,
我们可以查看下网络模式
docker network ls
我们创建自定义网络模式;
docker network create --subnet=172.20.0.0/16 extnetwork
通过--net extnetwork --ip 172.20.0.2 指定 案例:
docker run -p 3306:3306 --name master -d -v /home/mysql/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql/log/:/var/log --net extnetwork --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
docker run -p 3307:3306 --name slave -d -v /home/mysql2/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql2/log/:/var/log --net extnetwork --ip 172.20.0.3 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
我们启动两个Mysql容器,并且固定分配IP 172.20.0.2和172.20.0.3 (注意:这里必须用172.20.0.2开始分配,因为172.20.0.1是网关;)
docker inspect 容器id
我们后面mycat也分配一个 172.20.0.4 这样就容易运维了;
扩展:
docker network rm extnetwork #删除网络
3)mysql配置主从复制
现在 Mysql主服务器 172.20.0.2 从服务器 172.20.0.3
3.1)mysql配置文件mysqld.cnf配置
首先主机mysql配置: 打开mysqld.cnf,添加如下配置:
# 主服务器ID 必须唯一(一般局域网ip)
server-id=2
# 开启及设置二进制日志文件名称
log_bin=mysql-bin
# 要同步的数据库
binlog-do-db =db_javaxl
# 不需要同步的数据库
binlog-ignore-db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
# 设置logbin格式
binlog_format= MIXED # binlog日志格式,mysql默认采用statement,建议使用mixed
从服务器: 打开mysqld.cnf:
server-id=3
relay-log=mysql-relay
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。
① STATEMENT模式(SBR)
每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
② ROW模式(RBR)
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
③ MIXED模式(MBR)
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
3.2)mysql服务器设置
主服务器创建从机访问用户以及授权:
CREATE USER 'slave1'@'172.20.0.3' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'172.20.0.3';
FLUSH PRIVILEGES;
查看主服务器状态;
SHOW MASTER STATUS
从服务器创建连接主服务器的IP,用户,密码以及日志文件和位置;
CHANGE MASTER TO MASTER_HOST='172.20.0.2', MASTER_USER='slave1', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
启动主从复制
START SLAVE;
查看从机状态;
SHOW SLAVE STATUS
假如有 No 或者 Connecting,请看下方日志 或者找到Mysql日志文件查看具体问题;
3.3)主从复制常用命令
1)start slave
不带任何参数,表示同时启动I/O 线程和SQL线程。 I/O线程从主库读取bin log,并存储到relay log中继日志文件中。 SQL线程读取中继日志,解析后,在从库重放。
2)stop slave
完成停止I/O 线程和SQL线程的操作。
3)show master status
查看主服务器状态;
4)show slave status
查看从服务器状态:
5)reset master
删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库,
我们在主服务器可以新建db_javaxl数据库 ,以及创建表,crud数据,从服务器都会自动同步;
主服务器配置中binlog-do-db指明了要同步的只有db_javaxl,所以主服务器中db_javaxl2就不会同步了;
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有