博客信息

Mysql主从复制

发布时间:『 2020-03-06 19:37』  博客类别:中间件  阅读(689)

原理

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日志。

原理图

小李飞刀_Mycat


小李飞刀_Mycat


实现

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连接

小李飞刀_Mycat


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

小李飞刀_Mycat


创建容器并指定IP; 通过--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


完美分配了; 我们后面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


binlog_format详解

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

小李飞刀_Mycat


从服务器创建连接主服务器的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

小李飞刀_Mycat

有两个yes才OK;

假如有 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数据,从服务器都会自动同步;

小李飞刀_Mycat


主服务器配置中binlog-do-db指明了要同步的只有db_javaxl,所以主服务器中db_javaxl2就不会同步了;


over......


关键字:     数据库中间件       Mycat  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有