Mysql5.7的gtid主从半同步复制和组复制

(一)gtid主从半同步复制

一、半同步复制原理

mysql默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果crash掉了,此时主库上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。 

二、操作步骤

server2   master

server3   slave

1) 在server2(master)上进行配置文件的修改

--->  vim /etc/my.cnf

 

server-id=1         # 表示master的id                  
log-bin=mysql-bin   # 生成二进制文件  
gtid_mode=ON        # 打开gtid模式
enforce_gtid-consistency=ON

 

--->  /etc/init.d/mysqld  start

2)在server3(slave)上编写配置文件

--->  vim /etc/my.cnf

server-id=2  
gtid_mode=ON
enforce-gtid-consistency=true

 

--->  /etc/init.d/mysqld  start

3)在slave中,基于gtid的主从复制搭建成功后,关闭slave。 (可以参照之前的博客mysql的gtid的主从复制)

4)在master中安装半同步复制所需的模块

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

mysql>  set global rpl_semi_sync_master_enabled=1;

mysql>  show variables like '%semi_sync%';    # 半同步复制等待时间为10s

5)在slave中安装模块并查看

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql> set global rpl_semi_sync_slave_enabled=1;

mysql> stop slave io_thread;

mysql> start slave io_thread;

mysql> show global variables like '%semi%';     # 查看半同步的信息

--->  start slave;

6)在master中插入一条语句,并进行检测 

mysql>  use student;

mysql>  insert into msg values ('4','lala');

mysql>  show status like '%semi_sync%';    # 可以看到半同步成功了次数加了1

注释: Rpl_semi_sync_master_yes_tx  ##使用半同步成功的次数,数据一致性性能提高

      Rpl_semi_sync_master_no_tx   ##使用半同步失败的次数,10s后没有得到反馈信息,会转为异步复制

7)将slave的半同步关闭时候,进行插入测试

mysql> set global rpl_semi_sync_slave_enabled=OFF;  ###将半同步设置为关闭

mysql> stop slave io_thread;

mysql> start slave io_thread;

mysql> show global variables like '%semi%'; 

# 此时在server2(master)中再插入一条数据测试。结果如下:

mysql> insert into  msg  values  ('5','ling');     # 本次插入花费了十秒,因为异步复制有十秒等待slave发送ack的时间;若10s后还没有反映,就会转换为异步复制。

mysql> show global status like '%semi%';           # 查看异步复制的执行记录(失败次数+1)

 

在此过程出现问题和解决方式

问题1:Slave_SQL_Running: No 

解决方法:start  slave;            # 启动slave(或者关闭slave之后,---> reset slave,再启动slave)

问题2:Slave_IO_Running: Connecting,说明主从库没有连接上

解决方法:1) 在master中是否对用户进行授权     

         2) 密码或pos号是否正确     

         3) 防火墙是否关闭

 

(二)组复制

环境: server2   master

      server3、server4  slave

参照官方文档:https://dev.mysql.com/doc/refman/5.7/en/group-replication-adding-instances.html;最终实现三台主机均可以读写,且可以同步。

 

1、首先关闭server2、3、4的mysqld服务,并把/var/lib/mysql下的内容删除。

 

2、在server2、server3、server4中修改配置文件:

--->  vim /etc/my.cnf          

 

server_id=1                    # 三个节点的id不同

gtid_mode=ON                   # 打开gtid模式
enforce_gtid_consistency=ON
master_info_repository
=TABLE   # 把relay.info记录在
slave_relay_log_info表中
relay_log_info_repository=TABLE
log_bin=binlog
 
transaction_write_set_extraction
=XXHASH64
loose-group_replication_group_name
="c1a16382-2146-417d-a1c7-1b77fd000b42"     # uuid我们可以使用uuidgen来生成
loose-group_replication_start_on_boot=off
loose-group_replication_local_address
= "172.25.2.2:24901"         # 填写自己主机的ip
loose-group_replication_group_seeds= "172.25.2.2:24901,172.25.2.3:24902,172.25.2.4:24901"  # 三个节点ip
loose-group_replication_bootstrap_group
= off
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_ip_writelist='127.0.0.1/8,172.25.2.0/24'
loose-group_replication_single_primary_mode=off

---> /etc/init.d/mysqld  start     # 启动数据库

3、在server2中进行mysql的登陆,并进行设置。(随机密码在/var/log/mysqld下查找)

mysql>  SET SQL_LOG_BIN=0;      # 关闭日志同步

mysql>  alter user root@localhost identified by 'Xniu+123';  # 修改root用户密码

mysql>  GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' identified by 'Xniu+123';  # 向rel_user用户授予所有权限(用来同步信息)

mysql>  FLUSH PRIVILEGES;    # 刷新授权表
mysql>  reset master;

mysql>  SET SQL_LOG_BIN=1;   # 开启日志记录

mysql>  CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xniu+123'  FOR CHANNEL 'group_replication_recovery';

mysql>  INSTALL PLUGIN group_replication SONAME 'group_replication.so';   # 安装组复制所需的模块

mysql>  SHOW PLUGINS;

mysql>  SET GLOBAL group_replication_bootstrap_group=ON;
mysql>  START GROUP_REPLICATION;

mysql>  SET GLOBAL group_replication_bootstrap_group=OFF;

mysql>  SELECT * FROM performance_schema.replication_group_members;    # 此时server2已添加到组中。(状态为online)

 

4、在server3和server4中进行mysql的设置。由于步骤相同,在这以server3为例显示:

mysql>  SET SQL_LOG_BIN=0;       

mysql>  alter user root@localhost identified by 'Xniu+123';

mysql>  GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Xniu+123';

mysql>  reset master;

mysql>  SET SQL_LOG_BIN=1;

mysql>  CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xniu+123' FOR CHANNEL 'group_replication_recovery';

mysql>  INSTALL PLUGIN group_replication SONAME 'group_replication.so';

mysql>  START GROUP_REPLICATION;

mysql>  SELECT * FROM performance_schema.replication_group_members;   # 若此时server4也配置完成,则结果如下:(状态均为online)

5、测试

#当我们在server2中创建数据库时,所有节点均可以看到

mysql> CREATE DATABASE test;

mysql> USE test;

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
server2:

server3:

server4:

# 当我们在server4中插入信息时,在srver2和server3中结果如下:

mysql> INSERT INTO test.t1 VALUES (2, 'Lucy');

server2:

server3:

 

posted @ 2018-10-06 21:24  UTHN_B  阅读(1505)  评论(1编辑  收藏  举报