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的主从复制)

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

Mysql5.7的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

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

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%';     # 查看半同步的信息

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

--->  start slave;

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

mysql>  use student;

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

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

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

注释: 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%';

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

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

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

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

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

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

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

问题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

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

---> /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;

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

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)

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

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)

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

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:

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

server3:

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

server4:

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

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

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

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

server2:

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

server3:

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

上一篇:91.Bower : ENOGIT git is not installed or not in the PATH 解决方法


下一篇:使用Yeoman,Grunt和Bower开发AngularJS(译)