mysql组复制简称MGR,是MySQLServer5.7.17及更高版本提供的一个内置MySQL插件(Replication)。mysql组复制提供了一个高可用、高弹性、高可靠性的mysql服务。当主节点故障后,集群自动选举新的主节点,只要不是全部或大多数,系统仍然可用。有一致性,以及不依赖外部组件实现的自动切换、可多点并发写入等特点。
它们由一个组成员服务跟踪,该服务依赖于一个分布式故障检测器,该检测器能够在任何服务器自愿或由于意外停止而离开组时发出信号。有一个分布式恢复过程来确保服务器加入组时自动更新它们,不需要服务器故障转移,而且多主更新无处不在的特性确保即使是更新也不会在单个服务器发生故障时被阻止总之,mysql组复制保证数据库服务持续可用。
mysql组复制提供了分布式状态复制,服务器之间具有很强的协调性。当服务器属于同一组时,它们会自动进行协调。该组可以在单一主模式下操作,并自动进行主选择,其中一次只有一台服务器接受更新。或者,对于更高级的用户,可以在多主模式下部署组,其中所有服务器都可以接受更新,即它们是并发发布的。这种能力的代价是应用程序必须克服这种部署带来的限制。
mysql组复制实现了一个多主更新无处不在的复制协议。实际上,复制组由多个服务器组成,组中的每个服务器可以独立执行事务。但是,所有读写(rw)事务只有在得到集团批准后才能提交。只读(ro)事务不需要在组内进行协调,因此可以立即提交。
准确地说,当事务准备在原始服务器上提交时,服务器原子地广播写值(已更改的行)和对应的写集(已更新行的唯一标识符),然后为该事务建立全局总顺序。最终,这意味着所有服务器以相同的顺序接收相同的事务集。因此,所有服务器以相同的顺序应用相同的更改集,因此它们在组内保持一致。
但是,在不同服务器上并发执行的事务之间可能存在冲突。如果在不同服务器上执行的两个并发事务更新同一行,则存在冲突。第二个会被回滚。
mysql组复制依赖于组成员身份服务。这是插件内置的。它定义哪些服务器处于联机状态并参与组。
mysql组复制构建在paxos分布式算法的实现之上,以提供服务器之间的分布式协调。因此,它要求大多数服务器(多数)处于活动状态才能达到仲裁,从而作出决定这直接影响到系统在不影响自身和整体功能的情况下能够容忍的故障数量。容忍f故障所需的服务器数量(n)为n=2 x f+1。
实际上,这意味着要容忍一个故障,组中必须有三个服务器。
mysql组复制使用的是异步复制协议。
组复制不是同步的,而是最终同步的。更准确地说,事务以相同的顺序传递给所有组成员,但它们的执行不同步,这意味着在接受提交事务后,每个成员都以自己的速度提交。
选择新主机制:
1 当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave谁作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,
2 在group_replication_member_weight值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
组复制最多支持9个节点。
组复制不能向外扩展写。
相对于简单复制架构来说,组复制会消耗更多网络带宽,内存及cpu。
必须了解,虽然数据库服务可用,但在服务器崩溃时,必须将连接到该服务的客户端重定向或故障转移到其他服务器。这不是组复制试图解决的问题连接器、负载平衡器、路由器或某种形式的中间件更适合处理此问题
--数据库版本必须在5.7.17及以上(这里为5.7.27)。
这里配置成单主模式。
IP:10.192.203.107/108/109,107是主,108/109是备。
Mysql单实例安装过程省略,可以参考:
https://blog.csdn.net/yabingshi_tech/article/details/50433126
[root@ZooKeeper-node1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.192.203.107 ZooKeeper-node1
10.192.203.108 ZooKeeper-node2
10.192.203.109 ZooKeeper-node3
安全该插件前,确保以下两个参数设置正确:
master_info_repository=TABLE
relay_log_info_repository=TABLE
否则安装插件时会报错:
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
ERROR 1123 (HY000): Can't initialize function 'group_replication'; Plugin initialization function failed.
执行SHOW PLUGINS;检查确认插件是否安装成功。
port=3306
server_id=1
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
slave-parallel-workers=N
slave-preserve-commit-order=1
slave-parallel-type=LOGICAL_CLOCK
group_replication_group_name="34d9b756-100f-11ea-a5ff-005056842fb1"
group_replication_start_on_boot=off
group_replication_local_address= "10.192.203.107:33061"
group_replication_group_seeds= "10.192.203.107:33061, 10.192.203.108:33062, 10.192.203.109:33063"
group_replication_bootstrap_group=off
group_replication_unreachable_majority_timeout=5
group_replication_compression_threshold=131072
group_replication_transaction_size_limit=20971520
注意:需要注意修改server-id,各节点的值不能重复。
注意:group_replication_local_address= "10.192.203.107:33061"
group_replication_group_seeds= "10.192.203.107:33061, 10.192.203.108:33062, 10.192.203.109:33063"
这里的端口和数据库本身的3306端口值是不一样的。
实例2相关配置为:
group_replication_local_address= "10.192.203.108:33062"
group_replication_group_seeds= "10.192.203.107:33061, 10.192.203.108:33062, 10.192.203.109:33063"
实例3相关配置为:
group_replication_local_address= "10.192.203.109:33063"
group_replication_group_seeds= "10.192.203.107:33061, 10.192.203.108:33062, 10.192.203.109:33063"
group_replication_group_name必须是有效的UUID。使用SELECT UUID()来生成UUID。
group_replication_start_on_boot=off表示在启动时服务器时不自动启动组复制。这在设置组复制时很重要,因为它确保您可以在手动启动插件之前配置服务器。配置成员后,可以将group_replication_start_on_boot设置为on,以便组复制在服务器启动时自动启动。
修改完后重启数据库。
各节点都需要创建认证账号
mysql> CREATE USER rpl_user @'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user @'%';
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
这里只在主节点上执行:
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
检查确认:
SELECT * FROM performance_schema.replication_group_members;
START GROUP_REPLICATION; 假如报错: [ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions 先确保各节点数据一致。一致后在各节点上reset master。然后重新CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
然后重新在各节点启动组复制。
#检查确认
SELECT * FROM performance_schema.replication_group_members;
mysql> create database dan;
Query OK, 1 row affected (0.01 sec)
mysql> use dan;
Database changed
mysql> create table t(id int not null unique);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t(id) values(1);
Query OK, 1 row affected (0.00 sec)
注意:表必须有主键或者必须有非空唯一键,否则虽然表创建不会报错,但插入数据时会报错:ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin。
其中一个从节点会自动变为可写模式(read_only,super_read_only会从on自动变为off)。
数据仍能正常同步。不影响整个集群的可用。
将原主节点启动后,需要手动启动下组复制,原主库变为了一个新备库。
read_only,super_read_only从off自动变为on。宕机期间现主库新增的数据会自动同步过来。
错误日志会有相关输出:
2019-11-27T05:13:31.388051Z 0 [Warning] Plugin group_replication reported: 'Member with address ZooKeeper-node2:3306 has become unreachable.'
2019-11-27T05:13:31.578473Z 0 [Note] Plugin group_replication reported: '[GCS] Removing members that have failed while processing new view.'
2019-11-27T05:13:32.394451Z 0 [Warning] Plugin group_replication reported: 'Members removed from the group: ZooKeeper-node2:3306'
2019-11-27T05:13:32.394892Z 0 [Note] Plugin group_replication reported: 'Group membership changed to ZooKeeper-node1:3306, ZooKeeper-node3:3306 on view 15748300718041265:4.'
数据仍能正常同步。不影响整个集群的可用。
将故障节点启动后,需要手动启动下组复制,然后宕机期间主库新增的数据会自动同步过来,read_only,super_read_only也会从off自动变为on。
--MGR只支持数据库集群本身的高可用,但在服务器崩溃时,不能将连接到该服务的客户端重定向或故障转移到其他服务器。因此,需要结合mysql router等代理中间件来实现真正的高可用(主节点故障时程序能够自动连接到新的主节点),同时实现读写分离及负载均衡。可以参考https://blog.csdn.net/yabingshi_tech/article/details/103530104