MySQL半同步复制的实现和复制过滤器
异步:
当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。
同步:
当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端
半同步:
介于同步和异步之间,mysql进行主从复制的时候,只要将数据复制给一个slave节点就通知用户成功。(只有一个从节点,半同步就意义不大,多个从节点才有意义)
MySQL复制默认使用的事异步,异步可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕
MySQL实现半同步复制流程:
-
1.需要在数据库中安装对应的插件
-
2.启用半同步功能并设置复制阈值(slave只需要开启半同步功能)
-
3.配置MySQL主从复制
查看提供半同步功能的插件
[root@CentOS8 ~]# rpm -ql mysql-server |grep semisync
/usr/lib64/mysql/plugin/semisync_master.so #master使用
/usr/lib64/mysql/plugin/semisync_slave.so #slave使用
范例:MySQL8.0实现半同步复制
master:10.0.0.10
#安装对应的插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)
#启用半同步功能并设置复制阈值
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
server_id=1
log-bin=/data/logbin/mysql-logbin
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000 #设置3s内无法同步,也将返回成功信息给客户端
#创建用于复制的用户账号
mysql> create user repluser@'10.0.0.%';
Query OK, 0 rows affected (3.00 sec)
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#mysql8.0不能授权的时候同时创建账号
slave1:10.0.0.13
#安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
#开启功能
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
server_id=13
relay-log=/data/relaylog/relay-log
#slave_skip_errors=1007|ALL
rpl_semi_sync_slave_enabled=ON
#连接到master
mysql> change master to
-> master_host='10.0.0.10',
-> master_user='repluser',
-> master_port=3306,
-> master_log_file='mysql-logbin.000001',
-> master_log_pos=787;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
#开启slave的复制线程:
mysql> start slave;
slave2:10.0.0.14
操作同slave1
查看MySQL的插件:mysql>SHOW PLUGINS;
确认是否开启半同步复制和复制阈值: mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
查看目前已经存在的半同步复制客户端:mysql> SHOW GLOBAL STATUS LIKE '%semi%';(是一个状态变量)
临时开启半同步复制和设置阈值:
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1; #临时修改变量
mysql>SET GLOBAL rpl_semi_sync_master_timeout = 3000; #超时长1s,默认值为10s
mysql复制过滤器
作用:让从节点只复制指定的数据库,或指定数据库的指定表
复制过滤器的两种实现方式:
-
服务器选项
-
从服务器选项:
服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
binlog-do-db=db1 #数据库白名单列表,不支持同时指定多个值,如果想实现多个数据库需多行实现
binlog-ignore-db= #数据库黑名单列表
通过服务器选项实现复制过滤的特点:
-
会间接影响二进制的备份,基于二进制还原将无法实现;不建议使用
-
只需要在主节点配置一次即可
从服务器选项:从服务器SQL_THREAD在relay log中的事件时,仅读取与特定数据库(特定表)相关的事件
-
缺点:会造成网络及磁盘IO浪费,在所有从节点都要配置
-
优点: 不影响二进制备份还原
replicate_do_db="db1,db2,db3" #指定复制库的白名单,变量可以指定逗号分隔的多个值,选项不支持多值,只能分别写多行实现
replicate_ignore_db= #指定复制库黑名单
replicate_do_table= #指定复制表的白名单
replicate_ignore_table= #指定复制表的黑名单