实战案例:主从复制及半同步复制

216 阅读3分钟

一、主从复制配置

1.环境准备

一台机器master,ip为10.0.0.147。

一台机器slave1,ip为10.0.0.148。

两台机器已安装MySQL,开启了二进制

2.大致的配置过程如下:

1 主节点
1) 二进制日志
2) server_id=
3) 创建用户,replication slave 权限
4) 全备份 --master-data=1

2 从节点
1) server_id=
2) source /data/full.sql 
3) CHANGE MASTER TO
  MASTER_HOST='10.0.0.8',
  MASTER_USER='repluser',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002', 
  MASTER_LOG_POS=30489887,
  MASTER_CONNECT_RETRY=5;
4) start slave;

3.详细配置过程如下:

3.1主节点配置:

(1)启用二进制日志,并为当前节点设置一个全局唯一的ID号

[root@master ~]# vim /etc/my.cnf
[mysqld]
server-id=147
log-bin=/data/logbin/mysql-bin  #修改二进制日志保存到指定路径

[root@master ~]# mkdir /data/logbin  #确保路径存在
[root@master ~]# chown mysql.mysql /data/logbin  修改所有者和所属组

[root@master ~]# systemctl restart mysqld

[root@master ~]# ls /data/logbin
mysql-bin.000001  mysql-bin.index

(2)创建有复制权限的用户账号

mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';

(3)完全备份

[root@master ~]# mysqldump -uroot -p123456 -A -F --single-transaction --source-data > /backup/full-`date +%F`.sql

[root@master /]# scp /backup/full-2023-08-03.sql 10.0.0.148:/backup #将完全备份传到slave1机器上

3.2从节点配置:

(1)启用二进制日志,并为当前节点设置一个全局唯一的ID号

[root@slave1 ~]# vim /etc/my.cnf
[mysqld]
server-id=148
read-only  #修改为只读,默认为1

systemctl restart mysqld

(2)配置从节点,从完全备份的位置之后开始复制

[root@slave1 ~]# vim /backup/full-2023-08-03.sql
  CHANGE MASTER TO 
  MASTER_HOST='10.0.0.147',
  MASTER_USER='repluser',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002', 
  MASTER_LOG_POS=157,
  MASTER_CONNECT_RETRY=5;

(3)进行备份还原

mysql> set sql_log_bin=0;  #因为下一步还原会产生大量的二进制日志,所以先关闭二进制日志

mysql> source /backup/full-2023-08-03.sql 

mysql> set sql_log_bin=1;  #重新开启二进制日志

3.3测试

master机器上提前设置好的数据库

image.png

[root@master /]# insert teachers (name,age,gender) values('zang',30,'M');

image.png

此时发现slave1机器上并未同步,查看线程还未运行

mysql> show slave status\G;

image.png

在slave1机器同时启动I/O线程和SQL线程

mysql> start slave;

然后再次查看发现线程均已运行,查看数据也发现已经同步,完成主从复制的配置

4.遇到的问题

在配置slave1机器同时启动I/O线程和SQL线程后,I/O线程未启动

mysql> start slave;

image.png

发现由于slave1机器是由master机器克隆后再配置的,所以slave1机器的UID和master机器的一样,所以对slave1机器的UID进行修改。

image.png

修改完后重新启动I/O线程和SQL线程后即可完成主从同步

二、半同步复制配置

1.环境准备

三台配置已经配置好主从复制的机器,主从复制配置过程与前文一致

master机器IP为10.0.0.149

slave1机器IP为10.0.0.151

slave2机器IP为10.0.0.152

2.详细配置过程如下

2.1主节点配置

查看插件文件

[root@master ~]#rpm -ql mysql-server |grep semisync

image.png

主服务器永久安装插件并查看插件

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>SHOW PLUGINS;

修改主配置文件

[root@master ~]#vim /etc/my.cnf
[mysqld]
server-id=149
log-bin=/data/logbin/mysql-bin
rpl_semi_sync_master_enabled=ON     #修改此行,需要先安装semisync_master.so插件后,再重 启,否则无法启动
rpl_semi_sync_master_timeout=3000   #设置3s内无法同步,也将返回成功信息给客户端

[root@master ~]#systemctl restart mysqld

2.2从节点配置

从服务器配置: (两台从节点都需要配置,这里以10.0.0.151为例)

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';

修改主配置文件

[mysqld] 
server-id=151 
rpl_semi_sync_slave_enabled=ON #修改此行,需要先安装semisync_slave.so插件后,再重启,否则无法启动

[root@slave1 ~]#systemctl restart mysqld

3.查看配置结果

image.png

image.png

image.png

image.png

验证:把其中一台slave断掉,然后进行数据更新,发现主从复制依然很快。

把两台slave都断掉后进行数据更新,发现主机器会等待(配置等待了3秒)。

4.可能遇到的问题

如果已经实现主从复制,需要stop slave;start slave;

mysql> stop slave;
mysql> start slave;
mysql> SHOW GLOBAL STATUS LIKE '%semi%';