likes
comments
collection
share

基于docker搭建MySQL8异步及半同步复制

作者站长头像
站长
· 阅读数 19

上篇文章我们熟悉了MySQL复制原理及应用,这里我们动手搭建一下主从复制。

docker安装主从MySQL

这里我们使用MySQL8.0.32版本:

主库配置

master.cnf

#基础配置#
[client]
port=3306
socket=/var/run/mysqld/mysql.sock
[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysql.sock 	#路径需要有mysql用户权限 建议直接在mysql目录
character-set-server=UTF8MB4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #mysql8.0适配5.7语法


#主从配置#
server-id=1                   		#id唯一,一般采用机器ip后缀
replicate-wild-ignore-table=mysql.*     	# 忽略表
#半同步复制#
#plugin_load="rpl_semi_sync_master=semisync_master.so"
#rpl_semi_sync_master_enabled=1  	#表示在master上已经开启了半同步复制模式(主库)

#主库必须,从库不必须#
log-bin=mysql-bin                       #bin-log日志路径, 路径相对于 datadir
#binlog_cache_size=2M            	#为每个session 分配的内存,如果事务大而且多,dml操作也频繁(2–4M)
log_slave_updates=1            	#表示slave将复制事件写进自己的二进制日志
binlog_format=mixed             	#数据混合复制同步
#expire_logs_days=15                    #超过天数删除binlog日志
#sync_binlog=1                   	#默认0:让filesystem自行决定什么时候来同步,或者cache满了之后再同步
                                	#sync_binlog 1:事物提交会把BINLOG刷新到磁盘,很大的影响MySQL和IO性能,0和设置为1的系统写入性能差距可能高达5倍甚至更多;

运行容器:

这里将数据及配置映射到本地。

docker run -p 4306:3306 --name mysql1 -v /Users/XXX/work/docker/data/mysql/mysql1:/var/lib/mysql -v /Users/XXX/work/docker/data/mysql/conf/master.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -d mysql:8.0.32

从库配置

#基础配置#
[client]
port=3306
socket=/var/run/mysqld/mysql.sock
[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysql/mysql.sock 	#路径需要有mysql用户权限 建议直接在mysql目录
character-set-server=UTF8MB4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #mysql8.0适配5.7语法

#主从配置#
server-id=2                   		#id唯一,一般采用机器ip后缀
replicate-wild-ignore-table=mysql.*     	# 忽略表
#半同步复制#
#rpl_semi_sync_slave_enabled=1  	#表示在master上已经开启了半同步复制模式(主库)
#rpl_semi_sync_slave_timeout=5000       #表示如果主库在某次事务中的等待时间超过5000毫秒,则降级为异步复制模式,不在等待slave从库。如果主库再次探测到slave从恢复了,则会自动切换回半同步复制模式

#主库必须,从库不必须#
#log-bin=mysql-bin                       #bin-log日志路径, 路径相对于 datadir
#binlog_cache_size=2M            	#为每个session 分配的内存,如果事务大而且多,dml操作也频繁(2–4M)
#log_slave_updates=1            	#表示slave将复制事件写进自己的二进制日志
#binlog_format=mixed             	#数据混合复制同步
#expire_logs_days=15                    #超过天数删除binlog日志
#sync_binlog=1                   	#默认0:让filesystem自行决定什么时候来同步,或者cache满了之后再同步
                                	#sync_binlog 1:事物提交会把BINLOG刷新到磁盘,很大的影响MySQL和IO性能,0和设置为1的系统写入性能差距可能高达5倍甚至更多;

运行容器:

docker run -p 5306:3306 --name mysql2 -v /Users/XXX/work/docker/data/mysql/mysql2:/var/lib/mysql -v /Users/XXX/work/docker/data/mysql/conf/slave.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456  --privileged=true -d mysql:8.0.32

异步复制搭建

异步复制配置

  • 连接主库
    mysql -h127.0.0.1 -uroot -p123456 -P4306
    
  • 主库创建复制用户,这里需要指定密码类型,MySQL8默认类型从库无法连接
CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'XXXX';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  • 查询主库状态 show master status;

    基于docker搭建MySQL8异步及半同步复制

  • 连接从库 mysql -h127.0.0.1 -uroot -p123456 -P5306

  • 连接到从库运行以下命令。设置主库链接。 master_host :Master的地址。 由于这里使用docker容器部署,采用桥接模式,IP需要填写宿主机IP master_port:Master的端口号 master_user:用于数据同步的用户,这里填我们新创建的用户主从同步的用户 master_password:用于同步的用户的密码 master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上面主库中 File 字段的值 master_log_pos:从哪个 Position 开始读,即上面主库 Position 字段的值 master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

    change master to master_host='192.168.1.10',master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=157,master_port=4306;
    
  • 启动从库同步

    start slave;
    
  • 查看同步状态

    show slave status;
    

    下图表示主库已连接成功: 基于docker搭建MySQL8异步及半同步复制

测试

主库创建测试数据库test,并创建表t1 基于docker搭建MySQL8异步及半同步复制

从库查看数据源已同步过来

基于docker搭建MySQL8异步及半同步复制

表也同步过来 基于docker搭建MySQL8异步及半同步复制

半同步复制搭建

半同步复制是使用额外的插件实现的,并非MySQL中内置的,因此必须单独安装相应插件之后才能启用。安装插件后,可以通过与之关联的系统变量来控制半同步复制的启用或禁用。在安装关联的插件之前,与半同步复制相关的系统变量不可用(因为这些系统变量是半同步复制插件携带的)。

由于半同步复制需要已经配置好异步复制且复制处于可用状态,这里我们直接使用上面的异步复制进行。

主库配置

  • 安装semi插件 install plugin rpl_semi_sync_master soname 'semisync_master.so'; 查看插件状态 show global variables like '%semi%'; 基于docker搭建MySQL8异步及半同步复制
  • 开启半同步,并将主从错误连接超时时间改为3秒。

    set global rpl_semi_sync_master_enabled = 1;
    set global rpl_semi_sync_master_timeout = 3000;
    

    改后配置如下:

    基于docker搭建MySQL8异步及半同步复制

从库配置

设置从库

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled = 1;

查看从库半同步配置

show global variables like '%semi%';

基于docker搭建MySQL8异步及半同步复制

  • 重启同步线程 必须重启从库的I/O线程,否则半同步复制不生效。重启I/O线程之后,从库会重新连接到主库,并注册为半同步的从库(如果是全新搭建的复制拓扑,可以忽略该步骤。但是,半同步复制的配置如果发生在异步复制的配置之后,则仍然需要此步骤):

    stop slave io_thread;
    start slave io_thread;
    

    基于docker搭建MySQL8异步及半同步复制

到此半同步复制就配置完成了。