前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MGR集群搭建(单主模式)

MGR集群搭建(单主模式)

作者头像
MySQL数据库技术栈
发布2020-11-03 10:58:49
1.1K0
发布2020-11-03 10:58:49
举报

MySQL Group Replication(MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案,MGR是基于原生复制及paxos协议的组复制技术,并以插件的方式提供,可以采取多主模式和单主模式,单主模式下,会自动选主,所有更新操作都在主上进行,多主模式下,所有server都可以同时处理更新操作。下面我们就来搭建下MGR集群(单主模式)。

环境清单

节点

IP

端口

MySQL版本

Node2

192.168.150.133

3306

5.7.25

Node1

192.168.150.134

3306

Node3

192.168.150.135

3306

修改配置文件

代码语言:javascript
复制
gtid_mode=on  #开启全局事务
enforce_gtid_consistency=on  #强制GTID的一致性
master_info_repository = TABLE  #将master_info元数据保存在系统表中
relay_log_info_repository = TABLE  #将relay_info元数据保存在系统表中
binlog_checksum = NONE  #禁用二进制日志校验
log_slave_updates = ON  #从库记录二进制日志
binlog-format=row  #以行格式记录
transaction_write_set_extraction = XXHASH64  #以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。
loose-group_replication_group_name = '3773a86e-0def-11eb-a478-000c29a841a1' #组名字loose-group_replication_start_on_boot = off  #为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_bootstrap_group = off  #同上
loose-group_replication_local_address = "192.168.150.134:33061" #写自己主机所在IP
loose-group_replication_group_seeds = "192.168.150.134:33061,192.168.150.133:33061,192.168.150.135:33061"
loose-group_replication_single_primary_mode = true  #开启单主模式的参数
loose-group_replication_enforce_update_everywhere_checks = false #开启多主模式的参数

创建复制用户

每个节点执行,执行前建议先关闭binlog

代码语言:javascript
复制
mysql> set sql_log_bin=0;
mysql> grant replication slave on *.* to repl@'%' identified by 'repl';
mysql> set sql_log_bin=1;

安装组复制插件

代码语言:javascript
复制
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#查看插件的安装情况
mysql>show plugins;
+----------------------------+----------+--------------------+----------------------+-------------+
| Name                       | Status   | Type               | Library              | License     |
+----------------------------+----------+--------------------+----------------------+-------------+
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | PROPRIETARY |
+----------------------------+----------+--------------------+----------------------+-------------+

启动mgr集群

构建组复制集群

配置通道的恢复凭据,当节点需要从其他成员恢复状态时,使用group_replication_recovery'复制通道的凭据。分布式恢复是加入组的server执行的第一步,如果未正确设置这些凭据,server将无法执行恢复过程并获得与其他组成员同步,因此会最终将无法加入组。

在每个节点上执行:

代码语言:javascript
复制
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

在主机上(node2)执行:

代码语言:javascript
复制
mysql> SET GLOBAL group_replication_bootstrap_group = ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group = OFF; 

查看集群状态:

代码语言:javascript
复制
select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | a7828aa6-b5c3-11ea-8308-000c29a841a1 | node2       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

加入节点

加入node1,在node1上执行

代码语言:javascript
复制
mysql> START GROUP_REPLICATION;

加入node3,在node3上执行

代码语言:javascript
复制
mysql> START GROUP_REPLICATION; 

查看集群状态

代码语言:javascript
复制
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 3118d7cb-67ca-11e9-9baa-000c29d7c489 | node3       |        3306 | ONLINE       |
| group_replication_applier | 7e6667ab-903a-11ea-ae4a-000c29d7c488 | node1       |        3306 | ONLINE       |
| group_replication_applier | a7828aa6-b5c3-11ea-8308-000c29a841a1 | node2       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

验证

在主库node2执行下面的命令进行验证

代码语言:javascript
复制
mysql> create database test;
Query OK, 1 row affected (0.33 sec)
mysql> use test
Database changed
mysql> create table t(id int primary key auto_increment,name varchar(30),addr varchar(30));
Query OK, 0 rows affected (0.07 sec)
检查其他两个节点的数据。

模拟主库宕机

关闭主库

代码语言:javascript
复制
service mysqld stop

查看组成员

代码语言:javascript
复制
mysql>  select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 3118d7cb-67ca-11e9-9baa-000c29d7c489 | node3       |        3306 | ONLINE       |
| group_replication_applier | 7e6667ab-903a-11ea-ae4a-000c29d7c488 | node1       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

查看哪台服务器成为新主库,在MySQL8.0中通过replication_group_members表就能看出哪个节点是主库。

代码语言:javascript
复制
mysql>  select * from performance_schema.global_status where variable_name='group_replication_primary_member' ;
+----------------------------------+--------------------------------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 3118d7cb-67ca-11e9-9baa-000c29d7c489 |
+----------------------------------+--------------------------------------+

问题

1. node3加入组时报错:[ERROR] Slave I/O for channel '': error connecting to master 'repl@192.168.3.117:3306' - retry-time: 60 retries: 16, Error_code: 2003

原 因:该节点之前曾作为另外一个集群的从节点。

解决方案:stop slave;reset slave;清空之前的集群信息。

2. 从节点之前已经存在数据了,搭建集群时节点之间数据不一致

解决方案:首先清空从节点的数据,从主库备份数据,在从库恢复。可以采用mysqldump或者Xtrabackup的方式备份恢复。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL数据库技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境清单
  • 修改配置文件
  • 创建复制用户
  • 安装组复制插件
  • 启动mgr集群
  • 加入节点
  • 验证
  • 模拟主库宕机
  • 问题
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档