一、什么是MGR
MySQL Group Replication (简称MGR)是MySQL官方推出的高扩展与高可用的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。
二、MGR的特点
· 高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
· 高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
· 高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
· 高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
三、MGR基础结构要求
引擎必须为innodb,因为需事务支持在commit时对各节点进行冲突检查
每个表必须有主键,在进行事务冲突检测时需要利用主键值对比
必须开启binlog且为row格式
开启GTID,且主从状态信息存于表中(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE),--log-slave-updates打开
一致性检测设置--transaction-write-set-extraction=XXHASH64
四、MGR使用限制
RP和普通复制binlog校验不能共存,需设置--binlog-checksum=none
不支持gap lock(间隙锁),隔离级别需设置为read_committed
不支持对表进行锁操作(lock /unlock table),不会发送到其他节点执行 ,影响需要对表进行加锁操作的情况,列入mysqldump全表备份恢复操作
不支持serializable(序列化)隔离级别
DDL语句不支持原子性,不能检测冲突,执行后需自行校验是否一致
不支持外键:多主不支持,单主模式不存在此问题
最多支持9个节点:超过9台server无法加入组
五、基础环境准备
5.1 数据库服务器规划
| 序号 | IP地址 | 主机名 | 数据库 | 端口号 | 操作系统 | ID |
| 1 | 192.168.1.1 | master | 5.7 | 3306 | centos7 | 1 |
| 2 | 192.168.1.2 | slave1 | 5.7 | 3306 | centos7 | 2 |
| 3 | 192.168.1.3 | slave2 | 5.7 | 3306 | centos7 | 3 |
5.2 搭建MySQL数据库-----略
5.3 配置my.cnf文件 - 添加以下内容(master节点)
server_id = 1 #服务IDgtid_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 = 'master:33061' #以本机端口33061接受来自组中成员的传入连接loose-group_replication_group_seeds ='master:33061, slave1:33062, slave2:33063' #组中成员访问表loose-group_replication_bootstrap_group = off #不启用引导组### 重启mysql服务
5.4 master节点上建立复制账号
mysql> set SQL_LOG_BIN=0; #停掉日志记录
mysql> grant replication slave on *.* to repl@'10.10.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #开启日志记录
mysql> change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #构建group replication集群
5.5 在master节点的mysql上安装group replication插件
-- 安装插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
-- 查看group replication组件
mysql> show plugins;

5.6 启动master节点上的插件
-- 设置group_replication_bootstrap_group为ON是为了表示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置。
mysql> set global group_replication_bootstrap_group=ON;
-- 作为首个节点启动mgr集群
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;
查看mgr的状态
-- 查询表performance_schema.replication_group_members
mysql> select * from performance_schema.replication_group_members;
六、复制组添加slave节点
6.1 修改my.cnf 配置文件
server_id = 2 #注意服务ID不一样
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 = 'slave1:33062'
loose-group_replication_group_seeds = 'master:33061, slave1:33062, slave2:33063'
loose-group_replication_bootstrap_group = off
### 重启mysql
6.2 用户授权
mysql> set SQL_LOG_BIN=0; #停掉日志记录
mysql> grant replication slave on *.* to repl@'10.10.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #开启日志记录
mysql> change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery'; #构建group replication集群
-- 安装group replication插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.00 sec)
6.3 把实例添回到之前的复制组
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> start group_replication;
Query OK, 0 rows affected (6.65 sec)
6.4 在xuegod68.cn上查看复制组状态
mysql> select * from performance_schema.replication_group_members;

slave2以同样方式配置 注意server id的修改
七、consul的介绍
什么是consul
Consul
是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul
是分布式
的、高可用
的、 可横向扩展
的用于实现分布式系统的服务发现与配置。
consul具有哪些特点?
服务发现(Service Discovery):Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心:Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
八、二进制安装consul (略)
九、添加server.json (server节点)
[root@master consul.d]# cat server.json{"data_dir": "/data/consul","datacenter": "dc1","log_level": "INFO","server": true,"bootstrap_expect": 1,"bind_addr": "192.168.44.10","client_addr": "192.168.44.10","ui":true}
十、配置client.json (client节点)
[root@slave1 consul.d]# cat client.json{"data_dir": "/data/consul","enable_script_checks": true,"bind_addr": "192.168.44.20","retry_join": ["192.168.44.10"],"retry_interval": "30s","rejoin_after_leave": true,"start_join": ["192.168.44.10"]}
十一、创建检测mysql状态的shell脚本 (是否为master库-所有节点都需创建)
[root@slave1 shell]# cat check_mysql_mgr_master.sh#!/bin/bashport=3306user="root"passwod="123456"comm="/usr/local/mysql/bin/mysql -u$user -h 127.0.0.1 -P $port -p$passwod"value=`$comm -Nse "select 1"`primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`# 判断mysql是否存活if [ -z $value ]thenecho "mysql $port is down....."exit 2fi# 判断节点状态node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`if [ $node_state != "ONLINE" ]thenecho "MySQL $port state is not online...."exit 2fi# 判断是不是主节点if [[ $server_uuid == $primary_member ]]thenecho "MySQL $port Instance is master ........"exit 0elseecho "MySQL $port Instance is slave ........"exit 2fi
十二、创建检测mysql状态的shell脚本 (是否为slave库-所有节点都需创建)
[root@slave1 shell]# cat check_mysql_mgr_slave.sh#!/bin/bashport=3306user="root"passwod="123456"comm="/usr/local/mysql/bin/mysql -u$user -h 127.0.0.1 -P $port -p$passwod"value=`$comm -Nse "select 1"`primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`# 判断mysql是否存活if [ -z $value ]thenecho "mysql $port is down....."exit 2fi# 判断节点状态node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`if [ $node_state != "ONLINE" ]thenecho "MySQL $port state is not online...."exit 2fi# 判断是不是主节点if [[ $server_uuid != $primary_member ]]thenecho "MySQL $port Instance is slave ........"exit 0elsenode_num=`$comm -Nse "select count(*) from performance_schema.replication_group_members"`# 判断如果没有任何从节点,主节点也注册从角色服务。if [ $node_num -eq 1 ]thenecho "MySQL $port Instance is slave ........"exit 0elseecho "MySQL $port Instance is master ........"exit 2fifi
十三、创建服务发现slave节点的json (所有节点)
[root@slave1 consul.d]# cat r-mysql-mgr-server-lhr.json{"service": [{"name": "r-mysql-mgr-server-lhr","tags": ["MGR-Slave"],"address": "192.168.44.20","port": 3306,"check":{"args": ["/data/consul/shell/check_mysql_mgr_slave.sh"],"interval": "5s"}}]}
十四、创建服务发现slave节点的json (所有节点)
[root@slave1 consul.d]# cat rw-mysql-mgr-server-lhr.json{"service":{"name": "rw-mysql-mgr-server-lhr","tags": ["MGR-Master"],"address": "192.168.44.20","port": 3306,"check":{"args": ["/data/consul/shell/check_mysql_mgr_master.sh", "3306"],"interval": "5s"}}}
十五、启动consul
nohup consul agent -config-dir=/etc/consul.d &
十六、使用build搭建DNS服务器
搭建过后便可以使用域名进行访问 (服务宕机不需要手动切换配置)
(类似于keepalive功能,在不能使用keepalive的情况下可以选择使用
consul的DNS功能)




