MySQL集群MGR架构for单主模式

来自Linux78|wiki
Bob讨论 | 贡献2019年12月16日 (一) 12:19的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

MGR简介

MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MySQL组复制提供了高可用、高扩展、高可靠的MySQL集群服务。

1)高一致性

基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;

2)高容错性

只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;

3)高扩展性

节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;

4)高灵活性

有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。

MGR是MySQL数据库未来发展的一个重要方向。

MGR基础结构要求

1、引擎必须为innodb,因为需事务支持在commit时对各节点进行冲突检查

2、每个表必须有主键,在进行事务冲突检测时需要利用主键值对比

3、必须开启binlog且为row格式

4、必须打开GTID特性,且主从状态信息存于表中(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE)

5、--log-slave-updates打开

6、一致性检测设置--transaction-write-set-extraction=XXHASH64

MGR使用限制

1、RP和普通复制binlog校验不能共存,需设置--binlog-checksum=none

2、不支持gap lock(间隙锁),隔离级别需设置为read_committed

3、不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入mysqldump全表备份恢复操作

4、不支持serializable(序列化)隔离级别

5、DDL语句不支持原子性,不能检测冲突,执行后需自行校验是否一致

6、不支持外键:多主不支持,单主模式不存在此问题

7、最多支持9个节点:超过9台server无法加入组

MGR单主模式部署

准备环境

主机IP		     主机名		  数据库版本		     Server ID				 操作系统
192.168.10.22	nongziyi22.xin	 mysql-5.7.19		1	    Centos6.5
192.168.10.27	nongziyi27.xin   mysql-5.7.19		2		Centos6.5
192.168.10.29   nongziyi29.xin	 mysql-5.7.19		3		Centos6.5

设置hostname和ip映射关系

在三台服务器上都设置:

vim /etc/hosts
192.168.10.22   nongziyi22.xin
192.168.10.27   nongziyi27.xin
192.168.10.29   nongziyi29.xin

nongziyi22.xin服务器配置

1、配置my.cnf

vim /etc/mysql/my.cnf

[mysqld]
datadir=/a01/apps/mysql/data
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#Group Replication
server_id = 1								#服务ID
gtid_mode = ON							#全局事物
enforce_gtid_consistency = ON				#强制GTID的一致性
master_info_repository = TABLE				#将master.info元数据保存在系统表中
relay_log_info_repository = TABLE			#将relay.info元数据保存在系统表中
binlog_checksum = NONE					#禁用二进制日志事件校验
log_slave_updates = ON					#级联复制
log_bin = binlog							#开启二进制日志记录
binlog_format= ROW						#以行的格式记录 

transaction_write_set_extraction = XXHASH64			#使用哈希算法将其编码为散列
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'	#加入的组名
loose-group_replication_start_on_boot = off			#不启用自动复制集群功能
loose-group_replication_local_address = '192.168.10.22:33061'		#以本机3306端口接收来自组成员的传入连接
loose-group_replication_group_seeds ='192.168.10.22:33061,192.168.10.27:33061, 192.168.10.29:33061'								 
#组中成员访问列表 
loose-group_replication_bootstrap_group = off		#不启用引导组

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

2、重启mysql服务

service mysqld restart

3、建立复制账号

mysql -u root -p123456

mysql> set SQL_LOG_BIN=0;				#停掉日志记录
mysql> grant replication slave on *.* to MGR@'192.168.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1;				#开启日志记录
mysql> change master to master_user='MGR',master_password='123456' for channel 'group_replication_recovery';									 #构建group_replication集群

4、安装group replication插件

#安装插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
#查看group replication组件
mysql> show plugins;
...
group_replication|ACTIVE|GROUP PERLICATION|group_replication.so|GPL

5、启动服务器上mysql的group replication

  1. 设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置

mysql> set global group_replication_bootstrap_group=ON;

  1. 作为首个节点启动MGR集群

mysql> start group_replication; mysql> set global group_replication_bootstrap_group=OFF;


6、查看MGR的状态

mysql> select * from performance_schema.replication_group_members;


7、插入数据以便一会别的主机添加到集群中的时候查看效果

mysql> create database nongkaige;
mysql> use nongkaige;
mysql> create table ziyi(id int primary key,name varchar(20));
mysql> insert into ziyi values (1,'nongziyi');
mysql> select * from nongkaige.ziyi;


nongziyi27.xin服务器配置

1、配置my.cnf(和之前的一样,只是server_id和IP地址不一样而已)

vim /etc/mysql/my.cnf 

#Group Replication
server_id = 2
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW

transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.10.27:33061'
loose-group_replication_group_seeds ='192.168.10.22:33061,192.168.10.27:33061,192.168.10.29:33061'
loose-group_replication_bootstrap_group = off 2、重启mysql服务
service mysqld restart

3、建立复制账号

mysql -u root -p123456

mysql> set SQL_LOG_BIN=0;				#停掉日志记录
mysql> grant replication slave on *.* to MGR@'192.168.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1;				#开启日志记录
mysql> change master to master_user='MGR',master_password='123456' for channel 'group_replication_recovery';									 
#构建group_replication集群

4、安装group replication插件

#安装插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';

5、启动MGR集群

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;

6、查看MGR的状态

mysql> select * from performance_schema.replication_group_members;

7、检测数据是否同步过来

mysql> select * from nongkaige.ziyi;

nongziyi29.xin服务器配置

1、配置my.cnf(和之前的一样,只是server_id和IP地址不一样而已)

vim /etc/mysql/my.cnf

#Group Replication
server_id = 3
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW

transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.10.29:33061'
loose-group_replication_group_seeds ='192.168.10.22:33061,192.168.10.27:33061,192.168.10.29:33061'
loose-group_replication_bootstrap_group = off

2、重启mysql服务

service mysqld restart

3、建立复制账号

mysql -u root -p123456

mysql> set SQL_LOG_BIN=0;				#停掉日志记录
mysql> grant replication slave on *.* to MGR@'192.168.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1;				#开启日志记录
mysql> change master to master_user='MGR',master_password='123456' for channel 'group_replication_recovery';									 
#构建group_replication集群

4、安装group replication插件

#安装插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';

5、启动MGR集群

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;

6、查看MGR的状态

mysql> select * from performance_schema.replication_group_members;

7、检测数据是否同步过来

mysql> select * from nongkaige.ziyi;

查看谁是MGR集群的主节点

mysql> select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member';

参照上边的MGR集群状态,可以知道,现在是nongziyi22.xin为主节点

MGR集群测试

1、测试集群复制功能 其实呢,我们上边的实验已经测试过了这个功能,因为我们所新添进来的节点,都自动同步了我们主节点上的数据,接下来我们是新插入数据进行测试

A.先在主节点上插入一条数据

mysql> insert into ziyi values (2,'nongkaige');

B.然后去其他两个节点查看数据是否同步过来 节点1:

select * from nongkaige.ziyi;

节点2:

select * from nongkaige.ziyi;

2、测试集群主节点宕机,自动选主功能

A.模仿主节点宕机

mysql> stop group_replication;

B.先查看MGR的集群状态

mysql> select * from performance_schema.replication_group_members;

C.在其他节点上查看现在谁是主节点 mysql> select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member';


很明显,主节点变成了nongziyi29.xin这台主机

说明

1、上边演示了主节点宕机之后集群自动选出一个作为主节点,当原先的主节点恢复之后,只能运行以下命令来使该节点变成从库来运行,而不能恢复成原来的主节点了。

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;

2、单主模式中,只有主节点可以写入,从库无法写入,例如在从库上插入数据:

mysql> insert into ziyi values (3,'huanglihua');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement