MySQL Group Replication学习记录

MySQL 常见的高可用方案有 MHA,Galera,Orchestrator,以及官方的 Group Replication(MGR),本文是 MGR 多主集群的搭建及维护学习记录。

MGR特点

  • 支持单主和多主模式
  • 基于 Paxos 算法,实现数据复制的一致性
  • 插件化设计,支持插件检测,新增节点小于集群当前节点主版本号,拒绝加入集群,大于则加入,但无法作为主节点
  • 没有第三方组件依赖
  • 支持全链路 SSL 通讯
  • 支持 IP 白名单
  • 不依赖网络多播

搭建

可以使用 vagrant 启动 3 台虚拟机。分配 IP 如下:

itop-mgr-1192.168.10.101
itop-mgr-2192.168.10.102
itop-mgr-3192.168.10.103
mgr 节点IP

安装

MySQL 版本选择最新的 8.x,用以下命令安装:

手动配置

可以手动配置一个 mgr 集群,也可以用 mysql-shell 来配置。本文将记录手动配置过程,然后用 mysql-shell 来接管。

my.cnf

my.cnf 配置示例。

账号设置

为了方便在 vagrant 中用脚本操作,先重新用 insecure 方式初始化 MySQL。

然后修改 root 账号的密码。

设置复制账号。

安装MGR插件

启动MGR

在第一个节点上启动 MGR,另外两个节点加入 MGR。

group_replication_bootstrap_group 选项,为了避免每次启动自动引导具有相同名称的第二个组,所以需要设置为 OFF。因此执行 START GROUP_REPLICATION 之后需要关闭。

使用mysql-shell接管MGR

如果在已经配置好的组复制上创建 InnoDB Cluster,并且希望使用它来创建集群,可将 adoptFromGR 选项传递给 dba.createCluster() 函数。创建的InnoDB Cluster 会匹配复制组是以单主数据库还是多主数据库运行。

status.js

init.js

reboot.js

如果从一开始就使用 mysql-shell 创建并管理集群,可以参考以下命令。

运维问题

节点状态

  • ONLINE - 节点状态正常。
  • OFFLINE - 实例在运行,但没有加入任何Cluster。
  • RECOVERING - 实例已加入Cluster,正在同步数据。
  • ERROR - 同步数据发生异常。
  • UNREACHABLE - 与其他节点通讯中断,可能是网络问题,可能是节点crash。
  • MISSING 节点已加入集群,但未启动group replication

集群状态

  • OK – 所有节点处于online状态,有冗余节点。
  • OK_PARTIAL – 有节点不可用,但仍有冗余节点。
  • OK_NO_TOLERANCE – 有足够的online节点,但没有冗余,例如:两个节点的Cluster,其中一个挂了,集群就不可用了。
  • NO_QUORUM – 有节点处于online状态,但达不到法定节点数,此状态下Cluster无法写入,只能读取。
  • UNKNOWN – 不是online或recovering状态,尝试连接其他实例查看状态。
  • UNAVAILABLE – 组内节点全是offline状态,但实例在运行,可能实例刚重启还没加入Cluster。

重新加入集群

如果节点故障后重启,状态为 MISSING 时,需要手动重新加入集群。

重启集群

当集群所有节点掉线,比如所有机器都宕机后启动,可以用 mysql-shell 重启集群。

当使用 vagrant reload 虚拟机的时候,1 号虚机最先关机,这时候 2,3 号如果还在写入,会比 1 号数据新,当 reload 完成之后,如果还默认以1 号为准,用 SQL 语句启动集群,会出现以下问题:

因此这种情况用 mysql-shell 来重启比较好。

当已经出现这种情况的时候,用下面的命令查看所有 member。

然后以 MEMBER_IDMEMBER_HOST 不为空的节点为基础,启动 group_replication

然后启动 3 号节点

1 号节点无法直接加入,需要先移除在加入,并且使用 clone 方式恢复数据。

执行完成之后,三个节点上 SELECT @@GTID_EXECUTED 应返回相同的结果:

mysql-shell非交互式

使用 'interactive': false 选项。

执行 dba.rebootClusterFromCompleteOutage 时会要求用户确认是否加入集群 (y/N) ,脚本中需要强制 yes,可以用以下方法,注意列表里不要写当前操作的节点 IP。

执行 addInstance 时指定 recoveryMethod 选项,避免交互。

常用命令

集群验证 SQL 语句

常用语句

查看集群状态

Note: If you get following message, then it's time to reboot cluster from complete outage

Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, but GR is not active) (RuntimeError)

reboot from complete outage 即以下命令。

从仲裁丢失中恢复集群

集群处于 NO_QUORUM 状态。Re-establish quorum using the method cluster.forceQuorumUsingPartitionOf()

调试方法

启动 mysql-shell 时指定 log level。

unmanaged replication group

InnoDB cluster status is different for mysqlsh and performance_schema.replicaion_group_members. In performance_schema it is ONLINE but mysqlsh depicts MISSING.( Cluster.status() is out of sync with the Group Replication view replication_group_members)。

这种情况可能是集群尚未被 mysql-shell 接管,可以执行上文提到的接管集群的命令。或者

Restore auto.cnf form backup, restart mysqld. If require remove instance and add it back again. 

About auto.cnf and server_uuid:auto.cnf file is similar to my.cnf. It contains server_uuid. Server_uuid is generated automatically. When starting MySQL it read and use server_uuid from auto.cnf. The value of the server_uuid used in reapplication. server_uuid is true UUID in an addition to user supplied server_id system variable.

About auto.cnf and server_uuid

参考资料

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注