当前位置: 首页 > news >正文

MGR实现mysql高可用性

一。MGR和PXC的区别

1. PXC的消息广播机制是在节点间循环的,需要所有节点都确认消息,因此只要有一个节点故障,则会导致整个PXC都发生故障。而MGR则是多数派投票模式,个别少数派节点故障时,一般不影响整体的可用性。这也是PXC存在的最大问题。

2. PXC的节点间数据传输除了binlog,还有个gcache,这相当于是给MySQL又增加两个黑盒子。而MGR则都是基于原生binlog的,没有新增黑盒子,运行起来更可靠,需要排障时也更方便。

3. 发生网络分区时,整个PXC集群都不可用。而MGR则至少还能提供只读服务。

4. PXC的流控机制影响更大,一旦触发流控,所有节点都受到影响。而MGR触发流控后,只会影响本地节点,不影响远程节点。当然了,MySQL的流控做的也比较粗糙,在GreatSQL中进一步完善和优化。

5. 执行DDL期间,整个PXC集群都不可同时执行DML,也就是说不支持Online DDL。而MGR是支持的,这也是很大的优势。

相对于传统主从复制(Replication),我认为MGR的优势有以下几点:

1. 主从复制非常容易产生复制延迟,尤其是当表中没有显式主键时。而在MGR里,要求表一定要有主键(或是可用作聚集索引的非空唯一索引),避免了这个问题。

2. 半同步复制中,一旦slave因为锁或其他原因响应慢的话,也会导致master事务被阻塞。MGR是采用多数派确认机制,个别节点响应慢对Primary节点的影响没那么大(不要选用AFTER模式)。

3. 主从复制没有类似MGR那样提供事务数据的一致性保证。MGR自带了事务数据一致性保障机制。

二。部署MGR集群

1.配置host解析:

2.配置vi /etc/my.cnf.d/mysql-server.cnf

[mysqld]

#开启GTID,必须开启

gtid_mode = ON

#强制GTID的一致性

enforce_gtid_consistency = ON

#binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用

binlog_format = row

#server-id必须是唯一的

server-id = 1

#MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度

transaction_isolation = READ-COMMITTED

#因为集群会在故障恢复时互相检查binlog的数据,

#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.

log-slave-updates = 1

#binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE

binlog_checksum = NONE

#基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错

master_info_repository = TABLE

#同上配套

relay_log_info_repository = TABLE

#组复制设置#记录事务的算法,官网建议设置该参数使用 XXHASH64 算法

transaction_write_set_extraction = XXHASH64

#相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的,

#主要是用来区分整个内网里边的各个不同的GROUP,而且也是这个group内的GTID值的UUID

loose-group_replication_group_name = '5dbabbe6-8050-49a0-9131-1de449167446'

#IP地址白名单,默认只添加127.0.0.1,不会允许来自外部主机的连接,按需安全设置

loose-group_replication_ip_whitelist = '127.0.0.1/8,192.168.6.0/24'

#是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况

loose-group_replication_start_on_boot = OFF

#本地MGR的IP地址和端口,host:port,是MGR的端口,不是数据库的端口

loose-group_replication_local_address = '192.168.6.151:33081'

#需要接受本MGR实例控制的服务器IP地址和端口,是MGR的端口,不是数据库的端口

loose-group_replication_group_seeds = '192.168.6.151:33081,192.168.6.152:33081,192.168.6.153:33081'

#开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,

loose-group_replication_bootstrap_group = OFF

#是否启动单主模式,如果启动,则本实例是主库,提供读写,其他实例仅提供读,如果为off就是多主模式了

loose-group_replication_single_primary_mode = ON

#多主模式下,强制检查每一个实例是否允许该操作,如果不是多主,可以关闭

loose-group_replication_enforce_update_everywhere_checks = on

3.加载插件:

[root@mgr1 ~]# mysql -e "show plugins;" | grep "group_replication"

如果没正确加载,也可以登入MySQL Server自行手动加载这个plugin:

[root@mgr1 ~]# mysql -e "install plugin group_replication soname 'group_replication.so'"

[root@mgr1 ~]# mysql -e "show plugins;" | grep "group_replication"

4.配置账号:

mysql> set session sql_log_bin=0;

mysql> create user repl@'%' identified with mysql_native_password by 'repl';

mysql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;

#创建完用户后继续启用binlog记录

mysql> set session sql_log_bin=1;

#配置MGR服务通道

#通道名字 group_replication_recovery 是固定的,不能修改

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

5.主库操作:

SET GLOBAL group_replication_bootstrap_group = ON;

START GROUP_REPLICATION;

SET GLOBAL group_replication_bootstrap_group = OFF;

SELECT * FROM performance_schema.replication_group_members;

6.从库操作:

START GROUP_REPLICATION;

SELECT * FROM performance_schema.replication_group_members;

三。MGR的维护:

在 **单主模式** 下,有且只有一个(Primary)节点可以写入数据,其余(Secondary)节点都只能读数据。而在 **多主模式** 下,可以在任意节点上同时读写数据。

1.切换主节点:

select group_replication_set_as_primary('52854f96-9314-11ee-8821-000c29ced34f');

注释:此id为想预定设置为primary的id

2.单主和多主模式间的切换:

切换多主(将所有主机变为primary):select group_replication_switch_to_multi_primary_mode();

切换单主:select group_replication_switch_to_single_primary_mode('783eb73d-1a87-11f0-9ba9-000c2900b49e');使用某一个的id进行变为主,其他则变为从

3.添加新节点

首先,要先完成MySQL Server初始化,创建好MGR专用账户、设置好MGR服务通道等前置工作。接下来,直接执行命令 `start group_replication` 启动MGR服务即可,新增的节点会进入分布式恢复这个步骤,它会从已有节点中自动选择一个作为捐献者(donor),并自行决定是直接读取binlog进行恢复,还是利用Clone进行全量恢复。

如果是已经在线运行一段时间的MGR集群,有一定存量数据,这时候新节点加入可能会比较慢,建议手动利用Clone进行一次全量复制。还记得前面创建MGR专用账户时,给加上了 **BACKUP_ADMIN** 授权吗,这时候就排上用场了,Clone需要用到这个权限。

4.删除节点:

在命令行模式下,一个节点想退出MGR集群,直接执行 `stop group_replication` 即可,如果这个节点只是临时退出集群,后面还想加回集群,则执行 `start group_replication` 即可自动再加入。而如果是想彻底退出集群,则停止MGR服务后,执行 `reset master; reset slave all;` 重置所有复制(包含MGR)相关的信息就可以了。

5.重启集群:

正常情况下,MGR集群中的Primary节点退出时,剩下的节点会自动选出新的Primary节点。当最后一个节点也退出时,相当于整个MGR集群都关闭了。这时候任何一个节点启动MGR服务后,都不会自动成为Primary节点,需要在启动MGR服务前,先设置 `group_replication_bootstrap_group=ON`,使其成为引导节点,再启动MGR服务,它才会成为Primary节点,后续启动的其他节点也才能正常加入集群。

6.MGR事务监控:用于监控所有节点的信息

 SELECT MEMBER_ID AS id, COUNT_TRANSACTIONS_IN_QUEUE AS trx_tobe_certified, COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE AS relaylog_tobe_applied, COUNT_TRANSACTIONS_CHECKED AS trx_chkd, COUNT_TRANSACTIONS_REMOTE_APPLIED AS trx_done, COUNT_TRANSACTIONS_LOCAL_PROPOSED AS proposed FROM performance_schema.replication_group_member_stats;

相关文章:

  • JVM:垃圾回收
  • JVM:运行时数据区和线程
  • 【计算机方向】中科院双一区TOP顶刊,IF=14.7,Nature招牌1区Top,中一篇直接就稳了!
  • map用法介绍
  • 前沿计组知识入门(六)
  • Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)
  • Idea集成AI:CodeGeeX开发
  • 【Leetcode-Hot100】缺失的第一个正数
  • 【LangChain核心组件】Memory:让大语言模型拥有持续对话记忆的工程实践
  • 杭电oj(2013-2028)题解
  • 100个GEO基因表达芯片或转录组数据处理023.GSE24807
  • 分布式锁框架Lock4j
  • 毛笔书体检测-hog+svm python opencv源码
  • 开启 Python 编程之旅:基础入门实战班全解析
  • antv/g6 图谱实现,自定义节点,自定义边,边动画
  • 内网穿透原理解析、使用网络场景、及如何实现公网访问步骤教程
  • Android ViewPager使用预加载机制导致出现页面穿透问题
  • 第二章 DQL查询语句
  • Vue 2 和 Vue 3 中的 `nextTick` 原理
  • openssh离线一键升级脚本分享(含安装包)
  • 北京网站建设公司动感/网站seo服务
  • 宁波工程造价信息网/宁波seo在线优化
  • 门户网站盈利/搜索网络如何制造
  • dedecms 做微网站/手机百度搜索引擎入口
  • 宣传册样式/seo优化公司排名
  • 安徽两学一做网站/谷歌竞价推广教程