1.什么是MYSQL GROUP REPLICATE?
MySQL Group Replication(下简称MGR)准确来说是官方推出的高可用解决方案,基于原生复制技术,并以插件的方式提供。
通过Paxos协议提供数据库集群节点数据强一致保证,扫清了MySQL进入金融行业最后的障碍。
集群间所有节点可写入,这是很多同学梦寐以求的功能,解决了单个集群的写入性能,所有节点都能读写,不过现实还是有些残酷;
解决网络分区导致的脑裂问题,提升复制数据的可靠性。
3种复制的比较:
第一种:组复制与异步主从复制区别.
第二种:半同步复制,它在协议中添加了一个同步步骤。 这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。
3.MySQL 组复制实现了基于复制协议的多主更新。
1)复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。
2)换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。
3)组复制使您能够根据在一组 server 中复制系统的状态来创建具有冗余的容错系统。因此,只要它不是全部或多数 server 发生故障,即使有一些 server 故障,系统仍然可用,最多只是性能和可伸缩性降低,但它仍然可用。server 故障是孤立并且独立的。它们由组成员服务来监控,组成员服务依赖于分布式故障检测系统,其能够在任何 server 自愿地或由于意外停止而离开组时发出信号。
4)他们是由一个分布式恢复程序来确保当有 server 加入组时,它们会自动更新组信息到最新。并且多主更新确保了即使在单个服务器故障的情况下也不会阻止更新,不必进行 server故障转移。因此,MySQL 组复制保证数据库服务持续可用。
5)值得注意的一点是,尽管数据库服务可用,但当有一个 server 崩溃时,连接到它的客户端必须定向或故障转移到不同的 server。
这不是组复制要解决的问题。连接器,负载均衡器,路由器或其他形式的中间件更适合处理这个问题。
总之,MySQL 组复制提供了高可用性,高弹性,可靠的 MySQL 服务。
MGR的限制
仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
目前一个MGR集群最多支持9个节点
不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
二进制日志不支持binlog event checksum
MYsql 5.8的安装与集群的安装
步骤一 . 安装5.8
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz #下载
xz -d mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz #解压
tar -xvf mysql-8.0.12-linux-glibc2.12-x86_64.tar #tar解压
创建一个my.cnf 用于初始化
[root@localhost mysql]# cat my.cnf
[mysqld]
server-id = 2
port = 3307
mysqlx_port = 33070
mysqlx_socket = /tmp/mysqlx.sock
datadir = /root/mgr/node1/mysql/node1/data/mysql
socket = /tmp/mysql.sock
pid-file = /tmp/mysqld.pid
log-error = error.log
slow-query-log = 1
slow-query-log-file = slow.log
long_query_time = 0.2
log-bin = bin.log
relay-log = relay.log
binlog_format =ROW
relay_log_recovery = 1
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect ='SET NAMES utf8mb4'
innodb_buffer_pool_size = 1G
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
log_timestamps = SYSTEM
lower_case_table_names = 1
default-authentication-plugin =mysql_native_password
#server_id=1 #设置复制过程是不同的server_id
gtid_mode=ON #开启GTID事务模式
enforce_gtid_consistency=ON #开启GTID事务模式
master_info_repository=TABLE #slave的master_info放在TABLE里
relay_log_info_repository=TABLE #slave的relay_log_info放在TABLE里
binlog_checksum=NONE #关闭binlog的checksum
log_slave_updates=ON #接收master的log信息并写入slave的binary log里
log_bin=binlog #开启binary log
binlog_format=ROW #binary log的日志格式为row
transaction_write_set_extraction=XXHASH64 #server为每个事务收集write set并用XXHASH64哈唏算法编码这个set
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #表示plugin连接、创建的group的名称
loose-group_replication_start_on_boot=off #当server开启时,plugin并不会自动开启
loose-group_replication_local_address= "127.0.0.1:33071" #表示本地以IP,PORT与group中的其它member进行连接
loose-group_replication_group_seeds= "127.0.0.1:33071,127.0.0.1:33081,127.0.0.1:33091" #告诉plugin这些IP加入group中通过port相互
loose-group_replication_bootstrap_group= off #关闭boostrap the group
loose-group_replication_single_primary_mode=FALSE #关闭single_primary_mode
loose-group_replication_enforce_update_everywhere_checks= TRUE #当multi-master时对任何更改开启强一制性检查
创建文件夹 /root/mgr/node1/mysql/node1/data/mysql
my.cnf 位于/root/mgr/node1/mysql/node1 下
basedir 指的是mysql的安装目录
初始化:
./bin/mysqld --defaults-file=/root/mgr/node1/mysql/node1/my.cnf --initialize-insecure
这边使用 --initialize-insecure 创建 然后免密码登录 , 初始化data
mysql 启动
./bin/mysqld --defaults-file=/root/mgr/node1/mysql/node1/my.cnf --user=root &
mysql 登录
./mysql -uroot -P3308 -h127.0.0.1
节点2 对应的my.cnf
[root@localhost node1]# cat ../node2/my.cnf
[mysqld]
server-id = 2
port = 3308
mysqlx_port = 33080
mysqlx_socket = /tmp/mysqlx1.sock
datadir = /root/mgr/node1/mysql/node2/data/mysql
socket = /tmp/mysql1.sock
pid-file = /tmp/mysqld1.pid
log-error = error.log
slow-query-log = 1
slow-query-log-file = slow.log
long_query_time = 0.2
log-bin = bin.log
relay-log = relay.log
binlog_format =ROW
relay_log_recovery = 1
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect ='SET NAMES utf8mb4'
innodb_buffer_pool_size = 1G
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
log_timestamps = SYSTEM
lower_case_table_names = 1
default-authentication-plugin =mysql_native_password
gtid_mode=ON #开启GTID事务模式
enforce_gtid_consistency=ON #开启GTID事务模式
master_info_repository=TABLE #slave的master_info放在TABLE里
relay_log_info_repository=TABLE #slave的relay_log_info放在TABLE里
binlog_checksum=NONE #关闭binlog的checksum
log_slave_updates=ON #接收master的log信息并写入slave的binary log里
log_bin=binlog #开启binary log
binlog_format=ROW #binary log的日志格式为row
transaction_write_set_extraction=XXHASH64 #server为每个事务收集write set并用XXHASH64哈唏算法编码这个set
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #表示plugin连接、创建的group的名称
loose-group_replication_start_on_boot=off #当server开启时,plugin并不会自动开启
loose-group_replication_local_address= "127.0.0.1:33081" #表示本地以IP,PORT与group中的其它member进行连接
loose-group_replication_group_seeds= "127.0.0.1:33071,127.0.0.1:33081,127.0.0.1:33091" #告诉plugin这些IP加入group中通过port相互联系。那些想加入group的就是seed member
loose-group_replication_bootstrap_group= off #关闭boostrap the group
loose-group_replication_single_primary_mode=FALSE #关闭single_primary_mode
loose-group_replication_enforce_update_everywhere_checks= TRUE #当multi-master时对任何更改开启强一制性检查
第二步mysql group replicate 集群创建
my.conf中 如果没有下面这部分对应的进行添加.
#server_id=1 #设置复制过程是不同的server_id
gtid_mode=ON #开启GTID事务模式
enforce_gtid_consistency=ON #开启GTID事务模式
master_info_repository=TABLE #slave的master_info放在TABLE里
relay_log_info_repository=TABLE #slave的relay_log_info放在TABLE里
binlog_checksum=NONE #关闭binlog的checksum
log_slave_updates=ON #接收master的log信息并写入slave的binary log里
log_bin=binlog #开启binary log
binlog_format=ROW #binary log的日志格式为row
transaction_write_set_extraction=XXHASH64 #server为每个事务收集write set并用XXHASH64哈唏算法编码这个set
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #表示plugin连接、创建的group的名称
loose-group_replication_start_on_boot=off #当server开启时,plugin并不会自动开启
loose-group_replication_local_address= "127.0.0.1:33071" #表示本地以IP,PORT与group中的其它member进行连接
loose-group_replication_group_seeds= "127.0.0.1:33071,127.0.0.1:33081,127.0.0.1:33091" #告诉plugin这些IP加入group中通过port相互
loose-group_replication_bootstrap_group= off #关闭boostrap the group
loose-group_replication_single_primary_mode=FALSE #关闭single_primary_mode
loose-group_replication_enforce_update_everywhere_checks= TRUE #当multi-master时对任何更改开启强一制性检查
primary进行对应的设置:
mysql> create user rpl_user@'%'; #创建用户
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> ALTER USER 'rpl_user'@'%' IDENTIFIED BY 'Workhard@345'; #修改密码
Query OK, 0 rows affected (0.08 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #来自其它member的恢复需要的user credentials
Query OK, 0 rows affected (0.06 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Workhard@345' FOR CHANNEL 'group_replication_recovery'; #这个复制跟普通的change master命令有区别,并不需要指定master是谁,但需要指定通道为’group_replication_recovery’。
Query OK, 0 rows affected, 1 warning (0.28 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #创建插件
Query OK, 0 rows affected (0.08 sec)
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from plugin;
+-------------------+----------------------+
| name | dl |
+-------------------+----------------------+
| group_replication | group_replication.so |
+-------------------+----------------------+
1 row in set (0.01 sec)
mysql> reset master; # 情空空一些事务 有时候 也需要reset salve
mysql> SET GLOBAL group_replication_bootstrap_group=ON; #此引导应仅由单个 sever 独立完成,该 server 启动组并且只启动一次。 这就是为什么引导配置选项的值不保存在配置文件中的原因。 如果将其保存在配置文件中,则在重新启动时,server 会自动引导具有相同名称的第二
个组。 这将导致两个不同的组具有相同的名称
Query OK, 0 rows affected (0.00 sec)
mysql> start GROUP_REPLICATION;
Query OK, 0 rows affected (3.13 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+------
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBE
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+------
| group_replication_applier | 5074d59f-b654-11e8-a315-000c294c72a4 | localhost.localdomain | 3307 | ONLINE | PRIMA
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+------
1 row in set (0.00 sec)
replicate:
mysql> create user rpl_user@'%';
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> ALTER USER 'rpl_user'@'%' IDENTIFIED BY 'Workhard@345';
Query OK, 0 rows affected (0.08 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.06 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Workhard@345' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 1 warning (0.28 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.08 sec)
mysql> select * from plugin;
ERROR 1046 (3D000): No database selected
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from plugin;
+-------------------+----------------------+
| name | dl |
+-------------------+----------------------+
| group_replication | group_replication.so |
+-------------------+----------------------+
1 row in set (0.01 sec)
mysql> reset master;
Query OK, 0 rows affected (0.03 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.99 sec)
或者在创建用户的时候 关闭bin_log
SET SQL_LOG_BIN=0;
...
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
第三步: 错误
mysql> 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.
查看 data/error.log
2018-09-13T19:40:37.540136-08:00 0 [ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 3d335d54-b7c6-11e8-8cd5-000c294c72a4:1-3 > Group transactions: 5074d59f-b654-11e8-a315-000c294c72a4:1-5,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-13'
2018-09-13T19:40:37.540182-08:00 0 [ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
解决办法:
reset master;
stop GROUP_REPLICATION;
第四部:GR相关的视图 查看命令
1.查看GR中的memeber:
SELECT * FROM performance_schema.replication_group_members \G ;
2.查看GR中的memeber的统计信息:
select * from performance_schema.replication_group_member_stats \G ;
3.查看replication连接status:
select * from performance_schema.replication_connection_status \G ;
4.查看replicaton的applier的状态:
select * from performance_schema.replication_applier_status \G ;
5.看哪个是primary
select *from performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
或 show global status like 'group_replication_primary_member';
备份与导入:
数据全部丢失的情况下,或者data 下的文件全都丢失了。
mysqlbackup --defaults-file=/etc/my.cnf --with-timestamp \
--host=localhost --user=root --password=mtls0352 \
--backup-dir=/tmp/ --backup-image=/tmp/2017-12-01T12:30:00.mbi --no-history-logging \
backup-to-image
目标主机恢复:
mysqlbackup --defaults-file=/etc/my.cnf --backup-image=/tmp/2017-12-01T12:30:00.mbi \
--backup-dir=/tmp/ --datadir=/database/mysql/data/3306/ \
copy-back-and-apply-log
mysql命令执行:
mysql> reset master;
Query OK, 0 rows affected (0.10 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /database/mysql/data/3306/backup_gtid_executed.sql ;
Query OK, 0 rows affected (0.10 sec)
mysql> set sql_log_bin=1;
余下就是配置作为replicate加入集群。
参考资料:
https://blog.csdn.net/vkingnew/article/details/81267223 Linux安装MySQL8.0.12之二进制安装
https://blog.csdn.net/yajie_12/article/details/78770573 mysql MGR常见问题大全
https://www.cnblogs.com/JiangLe/p/7941929.html mysql group replication 主节点宕机恢复
https://blog.csdn.net/sinat_36888624/article/details/79215233 mysql5.7实现组复制(MGR)
https://blog.csdn.net/u010719917/article/details/79098734 mysql5.7的GROUP REPLICATION操作步骤
https://www.cnblogs.com/JiangLe/p/7941929.html mysql group replication 主节点宕机恢复