目录
MGR介绍
基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(
MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才
能得以提交。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。
组复制依靠分布式一致性协
议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案。
================================================
1. 创建用户,修改hosts
hostnamectl set-hostname mysql useradd -M -s /sbin/nologin mysql vim /etc/hosts
添加:
192.168.8.10 mysql
保存退出
2. 上传5.7.20软件到/usr/local解压
tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.20-linux-glibc2.12-x86_64/ /usr/local/mysql
3. 环境变量
vi /root/.bash_profile
添加:
export PATH=$PATH:/usr/local/mysql/bin
保存退出
source /root/.bash_profile mkdir -p /data/3306/data /data/3307/data /data/3308/data chown -R mysql.mysql /data /usr/local/mysql
4. 配置文件说明
配置示例:
cat >> /data/3306/my.cnf << END [mysqld] user=mysql datadir=/data/3306/data basedir=/usr/local/mysql port=3306 socket=/data/3306/mysql.sock server_id=1 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="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625" loose-group_replication_start_on_boot=off loose-group_replication_local_address="192.168.8.10:33061" loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063" loose-group_replication_bootstrap_group=off END cat >> /data/3307/my.cnf << END [mysqld] user=mysql datadir=/data/3307/data basedir=/usr/local/mysql port=3307 socket=/data/3307/mysql.sock 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="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625" loose-group_replication_start_on_boot=off loose-group_replication_local_address="192.168.8.10:33062" loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063" loose-group_replication_bootstrap_group=off END cat >> /data/3308/my.cnf << END [mysqld] user=mysql datadir=/data/3308/data basedir=/usr/local/mysql port=3308 socket=/data/3308/mysql.sock 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="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625" loose-group_replication_start_on_boot=off loose-group_replication_local_address="192.168.8.10:33063" loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063" loose-group_replication_bootstrap_group=off END
组复制部分,配置文件介绍:
group_replication变量使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动
transaction_write_set_extraction = XXHASH64
##指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="01e5fb97-be64-41f7-bafd-3afc7a6ab555"
##表示将加入或者创建的复制组命名为01e5fb97-be64-41f7-bafd-3afc7a6ab555
##可自定义(通过cat /proc/sys/kernel/random/uuid)
loose-group_replication_start_on_boot=off
##设置为Server启动时不自动启动组复制
loose-group_replication_local_address="192.168.8.10:33061"
##绑定本地的192.168.8.10及33061端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063"
##本行为告诉服务器当服务器加入组时,应当连接到192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063
##这些种子服务器进行配置。本设置可以不是全部的组成员服务地址。
loose-group_replication_bootstrap_group = off
##配置是否自动引导组
loose-group_replication_ip_whitelist=”10.30.0.0/16,10.31.0..0/16,10.27.0.0/16″
##配置白名单,默认情况下只允许192.168.8.10连接到复制组,如果是其他IP则需要配置。
5. 初始化数据,并启动数据库节点
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data / usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data mysqld_safe --defaults-file=/data/3306/my.cnf & mysqld_safe --defaults-file=/data/3307/my.cnf & mysqld_safe --defaults-file=/data/3308/my.cnf &
6. 3306节点加入GR
创建复制用户
mysql -S /data/3306/mysql.sock set sql_log_bin=0; grant replication slave,replication client on *.* to repl@'localhost' identified by '123'; grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123'; grant replication slave,replication client on *.* to repl@'192.168.8.%' identified by '123'; flush privileges; SET SQL_LOG_BIN=1;
注:如果为三台独立节点,需要将localhost、127.0.0.1和远程主机域都授权用户
开启分布式复制
:
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
加载GR插件
:
install plugin group_replication soname 'group_replication.so';
show plugins;
启动复制程序:
set global group_replication_bootstrap_group=ON;
start group_replication;
检测组是否创建并已加入新成员:
select * from performance_schema.replication_group_members;
7. 3307加入GR:
创建复制用户
mysql -S /data/3307/mysql.sock set sql_log_bin=0; grant replication slave,replication client on *.* to repl@'localhost' identified by '123'; grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123'; grant replication slave,replication client on *.* to repl@'192.168.8.%' identified by '123'; flush privileges; SET SQL_LOG_BIN=1;
注:如果为三台独立节点,需要将localhost、127.0.0.1和远程主机域都授权用户
开启分布式复制
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
加载GR插件
install plugin group_replication soname 'group_replication.so';
show plugins;
启动复制程序
start group_replication;
#检测组是否创建并已加入新成员
select * from performance_schema.replication_group_members;
注: 前面的用户密码修改和创建用户操作必须设置binlog不记录,执行后再打开,否则会引起START GROUP_REPLICATION执行报错:
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
解决方案是:根据提示打开group_replication_allow_local_disjoint_gtids_join选项,mysql命令行执行:
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; mysql> start group_replication;
8. 3308加入GR
创建复制用户
mysql -S /data/3308/mysql.sock set sql_log_bin=0; grant replication slave,replication client on *.* to repl@'localhost' identified by '123'; grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123'; grant replication slave,replication client on *.* to repl@'192.168.8.%' identified by '123'; flush privileges; set sql_log_bin=1;
开启分布式复制
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
加载GR插件
install plugin group_replication soname 'group_replication.so';
show plugins;
启动复制程序
start group_replication;
#检测组是否创建并已加入新成员
select * from performance_schema.replication_group_members;
--------------------------------------------------------------
网络限制
MGR 组通信引擎目前仅支持 IPv4 网络,并且对节点间的网络性能要求较高,低延迟、高带宽的网络是部署 MGR 集群的基础。
MGR 忽略表锁和命名锁,在 MGR 中 lock tables 、 unlock tables 、 get_lock 、 release_lock 等这些表锁和命名锁将被忽略。
MGR 多主模式中,默认不支持 SERIALIZABLE 隔离级别。
多主模式下,对同一个对象进行并发的有冲突的ddl 和 dml 操作导致这种冲突在部分成员节点中无法检测到,最终可能导致数据不一致。
多主模式下,不支持级联约束的外键,可能造成有冲突的操作无法检测。
不支持超大事务。
多主模式下可能导致死锁,比如select ...for update 在不同节点执行,由于多节点锁无法共享,很容易导致死锁。
不支持复制过滤,如果有节点设置了复制过滤,将影响节点间决议的达成。
MGR 最多支持 9 个节点,大于 9 个节点,将拒绝新节点的加入。