zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

MySQL半同步复制的实现和复制过滤器

2023-02-18 16:34:37 时间

异步:

当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。

同步:

当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端

半同步:

介于同步和异步之间,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= #指定复制表的黑名单