MySQL集群mgr
MySQL集群MGR和MHA的区别
MySQL Manager(mysqlmgr)
适用场景:
- 用于需要高可用性、自动化管理和负载均衡的 MySQL 集群环境。
- 适合部署基于 Group Replication 的 InnoDB 集群。
MHA (MySQL High Availability)
适用场景:
- 适用于传统的基于主从复制的 MySQL 环境。
- 需要自动故障转移且希望降低手动干预的系统。
- 对于已有的 MySQL 环境,可以用 MHA 实现高可用性,而不需要过多改变现有架构。
特性 | MySQL Manager (mysqlmgr) | MHA |
---|---|---|
架构类型 | 基于 MySQL Group Replication | 基于 MySQL 主从复制 |
自动故障转移 | 自动故障转移,并自动修复 | 自动故障转移 |
高可用性实现 | 集群内所有节点互为主备,通过 Group Replication 保证高可用 | 通过选举健康的从节点提升为主节点 |
配置复杂度 | 相对简单,内建自动化工具和管理界面 | 配置复杂,需要手动配置主从复制架构 |
数据一致性 | 保证数据一致性,通过 Group Replication 实现 | 尽量保证一致性,但可能存在短暂的数据丢失 |
适用场景 | MySQL InnoDB 集群环境,自动化管理 | 传统 MySQL 主从复制环境,高可用需求 |
MGR的核心特性
1.1 数据一致性与复制
- 强一致性:MGR 使用一种叫做 分布式协议 的方式来保证集群中的所有节点的数据一致性。所有节点都能保持数据同步,并确保没有数据丢失。
- 基于 Group Replication:通过 Group Replication,集群中的节点自动同步事务。数据一致性通过 Paxos 协议保证,确保集群中的每个节点都达成一致,避免数据冲突。
1.2 自动故障转移
- 自动主节点选举:当集群中某个节点出现故障或掉线时,MGR 会自动选择一个新的主节点来接管事务处理。这样即使某个节点出现故障,集群仍然可以正常工作,不会影响服务。
- 节点恢复:MGR 还能够自动修复节点,只要故障节点重新加入集群,它将与集群中的其他节点自动同步数据。
1.3 事务复制与集群管理
- 事务性复制:所有数据更改都是事务性的,即使在故障恢复的过程中,也能保证数据不会丢失。
- 单个事务:集群中的所有节点都能处理相同的事务,不存在主从复制中的延迟问题。
1.4 高可用性和负载均衡
- 多主复制:所有节点都可以处理读写操作,这样可以实现负载均衡,提高集群的性能。
- 无缝扩展:随着节点的增加,MGR 可以无缝地扩展数据库集群的规模,而不影响服务的可用性。
MGR的架构
MySQL Group Replication 采用 "组内复制"(Group Replication)的模型,其中包含了多个节点,每个节点都可以是读写节点,集群内的每个节点都有一个完整的数据库副本
Primary Node:集群中的主节点,负责处理写请求。
Secondary Node:集群中的从节点,负责处理读请求。在发生故障转移时,Secondary Node 会被提升为 Primary Node。
Member Node:指的是集群中任意一个节点,它可能是 Primary Node,也可能是 Secondary Node。MGR 集群的核心思想就是通过这些节点来共同保持数据一致性和高可用性。
MGR组复制模式
组复制可以在两种模式下运行:
- 单主模式下,组复制具有自动选主功能,所有更新操作都在主上进行,其它成员只提供读服务。
- 多主模式下,所有的Server都可以同时处理更新操作,没有主从之分,成员角色是完全对等的。
MGR使用限制
- 仅支持InnoDB表,为什么需要使用innodb引擎呢?在MySQL Group Replication中,事务以乐观形式执行,但是在提交时检查冲突,如果存在冲突,则会在某些实例上回滚事务,保持各个实例的数据一致性。
- 每个需要复制的表都必须定义一个显式主键,用于做write set的冲突检测,即在进行事务冲突检测时需要利用主键值对比。
- 必须开启binlog且二进制日志格式必须设置为ROW。
- 必须打开GTID特性,且主从状态信息存于表中(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE),--log-slave-updates打开。
- 目前一个MGR集群最多支持9个节点。
- 不支持外键:多主不支持,单主模式不存在此问题。
- 二进制日志不支持binlog event checksum,需设置--binlog-checksum=none
搭建mgr集群(单主节点)
配置主机间hosts文件
[root@server1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.5.101 server1
192.168.5.102 server2
192.168.5.103 server3
[root@server1 ~]# for i in 1 2 3 ; do scp /etc/hosts root@192.168.5.10$i:/etc/hosts ;done
修改数据库配置文件
[root@server2 ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/data
port=3306
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
character-set-server=utf8
log-error=/data/mysql/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
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='ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot=off
loose-group_replication_local_address='server2:33061' ------# 每台不一样
loose-group_replication_group_seeds='server1:33061,server2:33061,server3:33061'
loose-group_replication_bootstrap_group=off
#loose-group_replication_single_primary_mode = off
#loose-group_replication_enforce_update_everywhere_checks = on
主节点数据库配置
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)mysql> CHANGE master TO master_user='rpl_user', master_password='password' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.01 sec)mysql> SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%group_replication%';
+-------------------+----------------+---------------+-------------------+---------------------+----------------------+------------------------+---------------+---------------------------+----------------+-------------+
| PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_TYPE | PLUGIN_TYPE_VERSION | PLUGIN_LIBRARY | PLUGIN_LIBRARY_VERSION | PLUGIN_AUTHOR | PLUGIN_DESCRIPTION | PLUGIN_LICENSE | LOAD_OPTION |
+-------------------+----------------+---------------+-------------------+---------------------+----------------------+------------------------+---------------+---------------------------+----------------+-------------+
| group_replication | 1.0 | ACTIVE | GROUP REPLICATION | 1.1 | group_replication.so | 1.7 | ORACLE | Group Replication (1.0.0) | GPL | ON |
+-------------------+----------------+---------------+-------------------+---------------------+----------------------+------------------------+---------------+---------------------------+----------------+-------------+
1 row in set (0.00 sec)mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.02 sec)mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)SET GLOBAL group_replication_bootstrap_group=ON;
启用该选项,表示当前 MySQL 实例是 Group Replication 集群的引导节点。
通常在 第一个节点启动 Group Replication 时使用。
START GROUP_REPLICATION;:
启动 Group Replication,将当前节点加入到 Group Replication 群组中。
SET GLOBAL group_replication_bootstrap_group=OFF;:
启动成功后,将引导标志设为 OFF,防止后续节点也被误标为集群的引导节点。
从节点数据库配置
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)mysql> CHANGE master TO master_USER='rpl_user', master_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.03 sec)mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.04 sec)mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 3fa7b9b6-b6dd-11ef-9364-08000726c0a6 | server2 | 3306 | ONLINE |
| group_replication_applier | a696cf2e-b6ca-11ef-a1ba-000c29c0da00 | server1 | 3306 | ONLINE |
| group_replication_applier | e76692bc-c065-11ef-b6ac-08000726c0a7 | server3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
查看状态
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 3fa7b9b6-b6dd-11ef-9364-08000726c0a6 | server2 | 3306 | ONLINE |
| group_replication_applier | a696cf2e-b6ca-11ef-a1ba-000c29c0da00 | server1 | 3306 | ONLINE |
| group_replication_applier | e76692bc-c065-11ef-b6ac-08000726c0a7 | server3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)#查看主节点
mysql> select b.member_host the_master,a.variable_value master_uuidfrom performance_schema.global_status ajoin performance_schema.replication_group_members bon a.variable_value = b.member_idwhere variable_name='group_replication_primary_member';
+------------+--------------------------------------+
| the_master | master_uuid |
+------------+--------------------------------------+
| server1 | a696cf2e-b6ca-11ef-a1ba-000c29c0da00 |
+------------+--------------------------------------+
1 row in set (0.00 sec)
从节点测试写入数据
mysql> insert into student values(2,"zz");
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
搭建mgr集群(多主节点)
多主模式(Multi-Master Mode) 是指多个数据库节点(通常是 MySQL 或兼容数据库)作为主节点运行,它们可以同时处理读写请求,并且支持数据同步。这种模式通常用于提高数据库的 高可用性 和 负载均衡,尤其是在需要高性能和高可用性的场景中,能够有效避免单点故障。
1.修改mysql的配置文件
[root@server1 ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/data
port=3306
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
character-set-server=utf8
log-error=/data/mysql/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
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='ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot=off
loose-group_replication_local_address='server1:33061'
loose-group_replication_group_seeds='server1:33061,server2:33061,server3:33061'
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = on
核心配置文件
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = on
#loose-group_replication_single_primary_mode = off #指定复制模式,是否启动单主模式,默认值为ON,即单主模式。如果启动,则本实例是主库,提供读写,其他实例仅提供读,如果为off就是多主模式了。#loose-group_replication_enforce_update_everywhere_checks = on #多主模式下,强制检查每一个实例是否允许该操作,如果不是多主,可以关闭。
重新启动mgr集群
在第一台启动节点上执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.02 sec)SET GLOBAL group_replication_bootstrap_group=OFF;:
后续节点执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
测试多主节点是否搭建成功
mysql> select b.member_host the_master,a.variable_value master_uuid-> from performance_schema.global_status a-> join performance_schema.replication_group_members b-> on a.variable_value = b.member_id-> where variable_name='group_replication_primary_member';
Empty set (0.00 sec)
1.查询不到主节点Database changed
mysql> insert into student values(2,"asd") ;
Query OK, 1 row affected (0.00 sec)mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 1 | ax |
| 2 | asd |
+----+------+
2 rows in set (0.00 sec)2.server2上可以插入数据