MySQL Group Replication(MGR)单主配置
young / / mysql / 阅读量

简介

MySQL Group Replication(简称MGR)字面意思是mysql组复制的意思,但其实他是一个高可用的集群架构,暂时只支持mysql5.7和mysql8.0版本.

是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案,提供了高可用、高扩展、高可靠的MySQL集群服务.

也是mysql官方基于组复制概念并充分参考MariaDB Galera Cluster和Percona XtraDB Cluster结合而来的新的高可用集群架构.

MySQL Group Replication是建立在基于Paxos的XCom之上的,正因为有了XCom基础设施,保证数据库状态机在节点间的事务一致性,才能在理论和实践中保证数据库系统在不同节点间的事务一致性。

由一般主从复制概念扩展,多个节点共同组成一个数据库集群,事务的提交必须经过半数以上节点同意方可提交,在集群中每个节点上都维护一个数据库状态机,保证节点间事务的一致性。

传统的数据主从复制

主从复制

传统的数据主从辅助属于异步复制,从库起IO线程连接主库,获取主库二进制日志写到本地中继日志,并更新master-info文件(存放主库相关信息),从库再利用SQL线程执行中继日志。

img

半同步复制

半同步复制是建立在基本的主从复制基础上,利用插件完成半同步复制,传统的主从复制,不管从库是否正确获取到二进制日志,主库不断更新,半同步复制则当确认了从库把二进制日志写入中继日志才会允许提交,如果从库迟迟不返回ack,主库会自动将半同步复制状态取消,进入最基本的主从复制模式。

img

组复制

组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的server集群。复制组由多个server成员组成,如上图的master1,master2,master3,所有成员独立完成各自的事务。当客户端先发起一个更新事务,该事务先在本地执行,执行完成之后就要发起对事务的提交操作了。在还没有真正提交之前需要将产生的复制写集广播出去,复制到其他成员。如果冲突检测成功,组内决定该事务可以提交,其他成员可以应用,否则就回滚。最终,这意味着所有组内成员以相同的顺序接收同一组事务。因此组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。

img

新成员加入组的简单流程:

当有新的成员加入组中,组内原有的成员会在二进制日志中插入一个视图切换的事件。
在组成员内找到一个donor捐赠之前缺失的数据,如果这个donor突然下线了,新成员会从新的donor获取缺失的数据,这时候组还在不断更新,新成员会将新的事件写到内存的一个临时空间
当获取到视图切换事件的时候,新成员将开始执行保存到内存临时空间的事件

特点

高一致性:基于分布式paxos协议实现组复制,保证数据一致性;

高容错性:自动检测机制,只要不是大多数节点都宕机就可以继续工作,内置防脑裂保护机制;

高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致;

高灵活性:提供单主模式和多主模式,单主模式在主库宕机后能够自动选主,所有写入都在主节点进行,多主模式支持多节点写入。

限制

仅支持innodb存储引擎

MGR集群中,只支持innodb存储引擎,能够创建非innodb引擎的表,但是无法写入数据,向非innodb表写数据直接报错

表必须有主键,或者非Null的唯一键

MGR集群中,只支持innodb引擎的表,并且该表必须有显式的主键,或者非Null的唯一键,否则即使能够创建表,也无法向表中写入数据。

网络限制

MGR 组通信引擎目前仅支持IPv4网络,并且对节点间的网络性能要求较高,低延迟、高带宽的网络是部署MGR集群的基础。

MGR忽略表锁和命名锁

在MGR中lock tables、unlock tables、get_lock、release_lock等这些表锁和命名锁将被忽略。

多主模式下,对同一个对象进行并发的有冲突的ddl和dml操作导致这种冲突在部分成员节点中无法检测到,最终可能导致数据不一致。
多主模式下,不支持级联约束的外键,可能造成有冲突的操作无法检测。
不支持超大事务。
多主模式下可能导致死锁

比如select …for update在不同节点执行,由于多节点锁无法共享,很容易导致死锁。

不支持复制过滤

如果有节点设置了复制过滤,将影响节点间决议的达成。

MGR最多支持9个节点,大于9个节点,将拒绝新节点的加入。

环境

3台服务器搭建3节点MGR集群,MySQL版本8.0.25,操作系统版本CentOS 7.9。

192.168.3.252 mgr1
192.168.222.171 mgr2
192.168.222.70 mgr3

安装

mysql安装

下载地址:

wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

安装数据库

具体过程省略

修改配置文件

/etc/my.cnf

#

[mysqld]

# -------------------- basic settting --------------------
user=root
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure_file_priv=/
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
#skip-grant-tables
skip-name-resolve
skip-external-locking
max_connections = 1000
max_connect_errors = 10000


#-------------------- log settting --------------------

log_error = /var/lib/mysql/error.log
#slow_query
slow_query_log = 1
long_query_time = 10
slow_query_log_file = /var/lib/mysql/slow.log

#-------------------- binlog settting --------------------

server-id=1
#二进制日志
log-bin=master-bin
log-bin-index=master-bin.index
log_slave_updates = 1

binlog_format = row
binlog_rows_query_log_events = on
binlog_checksum = none
#设置清除日志时间
expire_logs_days=30

#执行N次写入后,与硬盘同步。1是最安全的,但是也是最慢的。
sync_binlog=5
#使执行N次写入后,与硬盘同步,默认是10000
sync_relay_log=1000

#将master.info和relay.info保存在表中
master_info_repository = TABLE
relay_log_info_repository = TABLE


slave-parallel-type = LOGICAL_CLOCK
slave-parallel-workers = 4
slave_preserve_commit_order = 1

# -------------------- GTID         --------------------
gtid_mode=on
enforce-gtid-consistency=on
log-slave-updates = 1
binlog_gtid_simple_recovery=1

# -------------------- MGR settting --------------------

plugin_load="group_replication=group_replication.so"

#对每个事务获取write set,并且用XXHASH64算法获取hash值
transaction_write_set_extraction = XXHASH64 
# group_name UUID 可使用select uuid()生成
loose-group_replication_group_name = "ca62b997-9bdd-11e9-bd51-000c29a21c95" 
loose-group_replication_start_on_boot = off 
loose-group_replication_local_address = "mgr1:33061" 
loose-group_replication_group_seeds = "mgr1:33061,mgr2:33061,mgr3:33061" 
#loose-group_replication_ip_whitelist="mgr1,mgr2,mgr3"

# singe or multi mode  这里2个参数不开启则为单主模式
# 是否启动单主模式,如果启动,则本实例是主库,提供读写,其他实例仅提供读
# loose-group_replication_single_primary_mode = off
# 多主模式下,强制检查每一个实例是否允许该操作
# loose-group_replication_enforce_update_everywhere_checks = on

loose-group_replication_member_weight = 80 
loose-group_replication_bootstrap_group = off 

#配置组接受的最大事务大小(以字节为单位)
group_replication_transaction_size_limit=20971520


# -------------------- innodb setting --------------------

innodb_page_size = 16K
innodb_buffer_pool_size=2G

初始化

./bin/mysqld --defaults-file=/etc/my.cnf  --initialize-insecure --user=root

启动

cp support-files/mysql.server /etc/init.d/mysql
/etc/init.d/mysql start

配置HOSTS

/etc/hosts (每台主机都需配置)

192.168.3.252 mgr1
192.168.222.171 mgr2
192.168.222.70 mgr3

配置MGR

配置mgr第一个主节点

下步骤在192.168.3.252主机上的mysql中执行

创建用于复制的用户

set sql_log_bin=0;
create user repuser@'%' IDENTIFIED WITH mysql_native_password BY 'amT_2Kj19';
grant replication slave,replication client on *.* to repuser@'%' ;
flush privileges;
set sql_log_bin=1;

配置复制所使用的用户

change master to master_user='repuser',master_password='amT_2Kj19' for channel 'group_replication_recovery';

安装mysql group replication插件

# 如果在my.cnf里写入plugin_load="group_replication=group_replication.so" 这步就可以不用操作
install plugin group_replication soname 'group_replication.so';
# 查看是否安装成功
show plugins;

初始化复制组

set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
select * from performance_schema.replication_group_members;

注意 mgr 部署时第一个节点需要使用。 新增节点直接使用start group_replication 即可

配置从节点

创建用于复制的用户

set sql_log_bin=0;
create user repuser@'%' IDENTIFIED WITH mysql_native_password BY 'amT_2Kj19';
grant replication slave,replication client on *.* to repuser@'%' ;
flush privileges;
set sql_log_bin=1;

配置复制所使用的用户

change master to master_user='repuser',master_password='amT_2Kj19' for channel 'group_replication_recovery';

安装mysql group replication插件

# 如果在my.cnf里写入plugin_load="group_replication=group_replication.so" 这步就可以不用操作
install plugin group_replication soname 'group_replication.so';
# 查看是否安装成功
show plugins;

初始化复制组

set global group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;

注意 mgr 部署时第一个节点需要使用。 新增节点直接使用start group_replication 即可

检查

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 07a96b05-9bd1-11e9-bd95-000c29ceaa09 | test-3      |        3306 | ONLINE       |
| group_replication_applier | 9739c60d-9bda-11e9-9af3-000c29a21c95 | test-1      |        3306 | ONLINE       |
| group_replication_applier | ec96355f-9bd0-11e9-8437-000c29fdc162 | test-2      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章