MySQL之MGR原理+保姆级配置部署

文章目录

    • MGR
    • MGR特点
    • 组复制故障检测
    • 组复制的限制
    • MGR主从复制实战
        • 环境清理(这步可忽略)
        • 三台机器的准备工作
        • 安装数据库:每个机器都做,MySQL版本最好一致
      • master配置内容
        • 配置[mysqld]
        • 启动数据库
        • 创建复制组的用户
        • 复制用户凭据到复制组通道
        • 查看复制组插件是否装载
        • 启动复制组
        • 查看复制组
      • 两台slave配置内容
        • 配置[mysqld]
        • 启动MySQL服务器
        • 连接服务器
        • 切换数据库
        • 创建复制组用户
        • 复制用户凭据到复制组通道
        • 查看复制组插件是否装载
        • 启动复制组
        • 查看复制组
        • 如果需要停止复制组,则使用
      • 测试
        • master创建数据库
        • slave查看数据库

MGR

​ 基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在 5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。

​ 由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1) 决议并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为一致 性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务 才能够最终得以提交并响应。

	引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制 依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正 的数据高可用方案

MGR特点

MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与 高扩展的解决方案,以插件形式提供,实现了分布式下数据的最终一致性,总结MGR特点如 下:

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

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

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

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

组复制故障检测

​ 故障检测是提供关于哪些 server 可能已死的信息(猜测)的分布式服务。 某个 server 无响应时 触发猜测,组中其余成员进行协调决定以排除给定成员。如果某个 server 与组的其余成员隔 离,则它会怀疑所有其他 server 都失败了。由于无法与组达成协议(因为它无法确保仲裁成员 数),其怀疑不会产生后果。

​ 当服务器以此方式与组隔离时,它无法执行任何本地事务。 在线 server 列表通常称为视图,新成员server的加入离开,无论是自愿还是被迫的离开,该组都会 动态地重新规划其配置,并触发视图更新

组复制的限制

存储引擎必须为Innodb,即仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;

每个表必须提供主键;

只支持ipv4,网络需求较高;

必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set;

COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景;

目前一个MGR集群组最多支持9个节点;

不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚; 二进制日志binlog不支持Replication event checksums;

多主模式(也就是多写模式) 不支持SERIALIZABLE事务隔离级别;

多主模式不能完全支持级联外键约束;

多主模式不支持在不同节点上对同一个数据库对象并发执行DDL(在不同节点上对同一行并发 进行RW事务,后发起的事务会失败);

MGR主从复制实战

master:192.168.10.138 mgr1

slave1: 192.168.10.139 mgr2

slave2: 192.168.10.140 mgr3

mysql的用户统一创建user:mgr password:SYCRedhat23

环境清理(这步可忽略)

yum remove mysql-server -y
rm -rf /etc/my.cnf.d/
rm -rf /var/lib/mysql/
rm -rf /var/log/mysql/

三台机器的准备工作

  • 修改主机名 hostnamectl set-hostname 主机名
  • 修改/etc/hosts,映射关系
  • 关闭和禁用防火墙 systemctl stop firewalld systemctl disable firewalld
  • 做免密登录 ssh
  • 验证密码登录

安装数据库:每个机器都做,MySQL版本最好一致

#挂载镜像
mount /dev/sr0 /mnt
#安装本地仓库的mysql
yum install mysql-server -y
#初始化:启动、停止
systemctl start mysqld
systemctl stop mysqld

master配置内容

配置[mysqld]

vim /etc/my.cnf.d/mysql-server.cnf

# 追加内容
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

#server_id 确保每个机器不一样  
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64

plugin_load_add='group_replication.so'

#uuid确保每个机器都一样,可以用uuidgen生成
group_replication_group_name="8e1969ec-3ae3-4bd1-b80f-6de58b837ff5"
group_replication_start_on_boot=off

#当前主机的主机名和复制组端口,建议用主机名
group_replication_local_address= "mgr1:33061"
group_replication_group_seeds= "mgr1:33061,mgr2:33061,mgr3:33061"
group_replication_bootstrap_group=off

启动数据库

[root@mgr01 ~]# systemctl start mysqld
[root@mgr01 ~]# mysql -uroot -p
mysql> use mysql;

创建复制组的用户

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER mgr@'%' IDENTIFIED BY 'SYCredhat123';
mysql> GRANT REPLICATION SLAVE ON *.* TO mgr@'%';
mysql> GRANT BACKUP_ADMIN ON *.* TO mgr@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

复制用户凭据到复制组通道

mysql> CHANGE MASTER TO MASTER_USER='mgr', MASTER_PASSWORD='SYCredhat123' FOR CHANNEL 'group_replication_recovery';

查看复制组插件是否装载

mysql> SHOW PLUGINS;
# 如果有以下内容则表示已装载
 group_replication   | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL  

启动复制组

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION USER='mgr', PASSWORD='SYCredhat123';
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

查看复制组

mysql> SELECT * FROM performance_schema.replication_group_members;
# 出现以下信息表示成功
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | a49b5c8f-fd44-11eb-a9e2-000c29707010 | mgr1       |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
1 row in set (0.00 sec)

两台slave配置内容

配置[mysqld]

【slave1】

只需要更改server_id=2和group_replication_local_address= “mgr2:33061”

【slave2】

只需要更改server_id=3和group_replication_local_address= “mgr3:33061”

vim /etc/my.cnf.d/mysql-server.cnf

# 追加内容
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

#server_id 确保每个机器不一样  
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64

plugin_load_add='group_replication.so'

#uuid确保每个机器都一样,可以用uuidgen生成
group_replication_group_name="8e1969ec-3ae3-4bd1-b80f-6de58b837ff5"
group_replication_start_on_boot=off

#当前主机的主机名和复制组端口,建议用主机名
group_replication_local_address= "mgr2:33061"
group_replication_group_seeds= "mgr1:33061,mgr2:33061,mgr3:33061"
group_replication_bootstrap_group=off

启动MySQL服务器

[root@mgr2 ~]# systemctl start mysqld

连接服务器

[root@mgr2 ~]# mysql -uroot -p

切换数据库

mysql> use mysql;

创建复制组用户

SET SQL_LOG_BIN=0;
CREATE USER mgr@'%' IDENTIFIED BY 'SYCredhat123';
GRANT REPLICATION SLAVE ON *.* TO mgr@'%';
GRANT BACKUP_ADMIN ON *.* TO mgr@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

复制用户凭据到复制组通道

mysql> CHANGE MASTER TO MASTER_USER='mgr', MASTER_PASSWORD='SYCredhat123' FOR CHANNEL 'group_replication_recovery';

查看复制组插件是否装载

mysql> show plugins;
# 如果有以下内容则表示已装载
 group_replication   | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL 

启动复制组

mysql> START GROUP_REPLICATION USER='mgr', PASSWORD='SYCredhat123';

查看复制组

mysql> SELECT * FROM performance_schema.replication_group_members;

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | a49b5c8f-fd44-11eb-a9e2-000c29707010 | mgr1       |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
| group_replication_applier | a9eed5dc-fd44-11eb-aec2-000c29de2f00 | mgr2       |        3306 | ONLINE       | SECONDARY   | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)

如果需要停止复制组,则使用

mysql> stop GROUP_REPLICATION

测试

master创建数据库

mysql> create database school;
Query OK, 1 row affected (0.01 sec)

slave查看数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

affected (0.01 sec)

你可能感兴趣的:(数据库,mysql,数据库,linux,服务器,sql)