《叶问》38期,MGR整个集群挂掉后,如何才能自动选主,不用手动干预

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 《叶问》38期,MGR整个集群挂掉后,如何才能自动选主,不用手动干预

当集群中所有节点都宕机后,集群再次启动后,能否自动选主

1、MGR集群所有节点都宕机后,集群重启,能否自动选主和启动MGR服务

这是个来自群友的问题。

首先,MySQL服务利用 systemd 即可实现故障后自启动,注意下面这个配置即可:

[root@GreatSQL ~]# cat /usr/lib/systemd/system/greatsql.service
...
Restart=on-failure

其次,mysqld进程启动后,想要实现MGR的自动选主及自启动也是可以的,利用MySQL Shell即可,例如:

[root@GreatSQL ~]# mysqlsh --uri greatsql@yejr-mgr3:3306
...
-- 不管干啥,都先看 help,这是玩转Linux的必备素养,啥事不清楚都先找男人(man)
-- 注意到有这样的一个方法 rebootClusterFromCompleteOutage(),看起来没跑了
MySQL  yejr-mgr3:3306 ssl  JS > \help dba
      rebootClusterFromCompleteOutage([clusterName][, options])
            Brings a cluster back ONLINE when all members are OFFLINE.
-- 跑一个试试看
MySQL  yejr-mgr3:3306 ssl  JS > dba.rebootClusterFromCompleteOutage()
Restoring the default cluster from complete outage...
The instance 'yejr-mgr4:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y
The instance 'yejr-mgr2:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y
Dba.rebootClusterFromCompleteOutage: The active session instance (yejr-mgr3:3306) isn't the most updated in comparison with the ONLINE instances of the Cluster's metadata. Please use the most up to date instance: 'yejr-mgr4:3306'. (RuntimeError)

可以看到错误信息提示我们当前节点上没有最新的数据,不能直接启动MGR,错误信息中还提供了该去哪个节点启动的建议,所以我们改成在 yejr-mgr4 节点上执行拉起MGR:

[root@GreatSQL ~]# mysqlsh --uri greatsql@yejr-mgr3:3306
...
MySQL  yejr-mgr4:3306 ssl  JS > dba.rebootClusterFromCompleteOutage()
Restoring the default cluster from complete outage...
The instance 'yejr-mgr3:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y
The instance 'yejr-mgr2:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y
yejr-mgr4:3306 was restored.
Rejoining 'yejr-mgr3:3306' to the cluster.
Rejoining instance 'yejr-mgr3:3306' to cluster 'GreatSQLMGR'...
The instance 'yejr-mgr3:3306' was successfully rejoined to the cluster.
Rejoining 'yejr-mgr2:3306' to the cluster.
Rejoining instance 'yejr-mgr2:3306' to cluster 'GreatSQLMGR'...
The instance 'yejr-mgr2:3306' was successfully rejoined to the cluster.
The cluster was successfully rebooted.

可以看到,MGR集群已经被正常启动了。

上面是利用MySQL Shell启动一个发生过故障的MGR集群,如果是手动的话该怎么办呢?

首先,在各个节点执行下面的SQL,确认各节点当前的事务执行情况:

-- yejr-mgr2节点
root@GreatSQL [none]> select RECEIVED_TRANSACTION_SET from performance_schema.replication_connection_status where 
channel_name = 'group_replication_applier' union all 
select variable_value from performance_schema.global_variables where 
variable_name = 'gtid_executed'\G
*************************** 1. row ***************************
RECEIVED_TRANSACTION_SET:
*************************** 2. row ***************************
RECEIVED_TRANSACTION_SET: 1c293e90-3bdc-11ec-bca1-525400e2078a:1-4537605,
4b7b3b88-3b13-11ec-86e9-525400e2078a:1
-- yejr-mgr3节点
...
*************************** 1. row ***************************
RECEIVED_TRANSACTION_SET:
*************************** 2. row ***************************
RECEIVED_TRANSACTION_SET: 1c293e90-3bdc-11ec-bca1-525400e2078a:1-4542304,
4b7b3b88-3b13-11ec-86e9-525400e2078a:1
-- yejr-mgr4节点
...
*************************** 1. row ***************************
RECEIVED_TRANSACTION_SET:
*************************** 2. row ***************************
RECEIVED_TRANSACTION_SET: 1c293e90-3bdc-11ec-bca1-525400e2078a:1-4652391,
4b7b3b88-3b13-11ec-86e9-525400e2078a:1

从上面的结果可以看到,yejr-mgr4 节点上已执行完的事务GTID值最大:4652391 > 4542304 > 4537605,因此应该选择 yejr-mgr4 节点作为 Primary 节点。

将该节点设置为引导模式,然后启动MGR服务:

[root@GreatSQL ~]# mysql -hyejr-mgr4 -P3306 -ugreatsql -p
...
greatsql@mgr4:3306 [(none)]>set global group_replication_bootstrap_group=ON;
greatsql@mgr4:3306 [(none)]>start group_replication;
-- 启动完MGR后,记得立即将其设置为OFF
greatsql@mgr4:3306 [(none)]>set global group_replication_bootstrap_group=OFF;

在其他节点上,则直接启动MGR服务即可,切记无需再次设置引导模式,否则它就会变成一个全新的MGR集群的Primary节点了。

好了,自动、手动两种方式拉起一个故障MGR集群方法都介绍完毕了。

2、MySQL Router可以在同一个系统环境下跑多实例吗

答案是确定的,可以。

MySQL Router的手册中其实也已经有提到了:

--directory dir_path, -d dir_path
Specifies that a self-contained MySQL Router installation will be created at the defined directory instead of configuring the system-wide router instance. This also allows multiple router instances to be created on the same system.

也就是说,如果想要让MySQL Router以多实例方式运行,可以通过指定 --directory 选项将其安装在各自不同目录下。

例如下面这样:

-- 针对4306端口的服务,初始化一个router实例
-- 可自行指定目录、实例名、端口号等多个选项
mysqlrouter --bootstrap mymgr@172.16.16.16:4306 --name=MyMGR --directory=/etc/mysqlrouter/MyMGR  --user=mysqlrouter --conf-base-port=7446 --https-port=9443

初始化完成后,在每个实例相应的目录下,会有下列的文件:

$path/start.sh
$path/stop.sh
$path/mysqlrouter.pid
$path/mysqlrouter.conf
$path/mysqlrouter.key
$path/run
$path/run/keyring
$path/data
$path/log
$path/log/mysqlrouter.log

可以看到还有 start.sh / stop.sh 这样的脚本,感觉有点土味啊,哈哈。

接下来,我们要自行编辑systemd服务文件,把多个router实例管理起来,每个router实例对应一个文件:

[root@yejr-mgr4 ~]# ls -l /usr/lib/systemd/system/mysqlrouter@*
-rw-r--r-- 1 root root 312 Nov 11 14:13 /usr/lib/systemd/system/mysqlrouter@GrMGR.service
-rw-r--r-- 1 root root 312 Nov 11 14:12 /usr/lib/systemd/system/mysqlrouter@MyMGR.service
-- 查看其中一个文件的内容
[root@yejr-mgr2 ~]# cat /usr/lib/systemd/system/mysqlrouter@GrMGR.service
[Unit]
Description=MySQL Router
After=network.target
After=syslog.target
[Service]
Type=notify
User=mysqlrouter
Group=mysqlrouter
ExecStart=/usr/bin/mysqlrouter -c /etc/mysqlrouter/GrMGR/mysqlrouter.conf
LimitNOFILE = 10000
#Restart=on-failure
Restart=always
PrivateTmp=true
[Install]
WantedBy=multi-user.target

ExecStart 这里自行指定每个实例对应的配置文件即可。

这样就可以实现MySQL Router的单机多实例了。

3、MySQL客户端pager怎么只显示"TRANSACTIONS"和"FILE I/O"中间的内容?

用下面这个就行了:

pager cat - | sed -n "/^TRANSACTIONS$/,/^FILE I\/O$/p"

是不是很简单?

此外,可以再看下这两篇文章:

Enjoy GreatSQL :)

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
定位技术 网络架构 UED
主从副本架构可能存在风险
主从副本架构可能存在风险
124 0
|
11月前
|
存储 运维 NoSQL
数据复制系统设计(3)-配置新的从节点及故障切换过程详解
1.3 配置新的从节点 有时需考虑新增一个从节点: 提高容错能力 或替换失败的副本节点
103 0
|
NoSQL Redis 开发者
集群-主从下线与主从切换|学习笔记
快速学习集群-主从下线与主从切换
89 0
|
监控 NoSQL Redis
如何解决 “主节点故障恢复的自动化” 问题?
工作 & 面试中,当面试官问你主服务器宕机了,怎么办,如何处理?那么“哨兵”它来了~~~
如何解决 “主节点故障恢复的自动化” 问题?
|
算法 调度 数据库
源码分析ElasticJob故障失效转移
源码分析ElasticJob故障失效转移
源码分析ElasticJob故障失效转移
『叶问』#41,三节点的MGR集群,有两个节点宕机后还能正常工作吗
『叶问』#41,三节点的MGR集群,有两个节点宕机后还能正常工作吗
196 0
|
SQL 监控 前端开发
《叶问》37期,三节点的MGR集群关掉两个节点后还能继续读写吗
《叶问》37期,三节点的MGR集群关掉两个节点后还能继续读写吗
280 0
|
运维 Kubernetes NoSQL
读懂这一篇,集群节点不下线
排查完全陌生的问题、完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战。今天借这篇文章,跟大家分析一例这样的问题。排查过程中,需要理解一些自己完全陌生的组件,比如 systemd 和 dbus。但是排查问题的思路和方法基本上还是可以复用了,希望对大家有所帮助。
读懂这一篇,集群节点不下线
一主两从的环境,如果主库挂了,如何选举一个从库作为主库?
一主两从的环境,如果主库挂了,如何选举一个从库作为主库? 如图: 如果M挂了,怎么从S1和S2中选举一个从库作为主库? 传统复制的解决方法 (1)查看从库状态: S1:show slave status; S2:show slave status; root@l...
912 0