MySQL 集群数据节点在其孪生失败时重新启动

Posted

技术标签:

【中文标题】MySQL 集群数据节点在其孪生失败时重新启动【英文标题】:MySQL cluster data node restarts when its twin fails 【发布时间】:2014-09-18 06:30:31 【问题描述】:

配置:

服务器 #1:1 个 mgm 节点 (#49)、1 个数据节点 (#1)、1 个 sql 节点(真实 IP 192.168.1.128) 服务器 #2:1 个 mgm 节点 (#50)、1 个数据节点 (#2)、1 个 sql 节点(真实 IP 192.168.1.130) 虚拟 IP:192.168.1.240(使用 keepalived,服务器 #1 作为主服务器)

规格:

mysql 集群 7.3.6 x86_64 Debian 7.6 x86_64

它是使用 MySQL Cluster Auto-Installer 部署的。一切正常。 但是,当我关闭一个节点时,另一台服务器上的数据节点会重新启动。 NDB_MGM 显示它正在“开始”。而且退出“开始”状态需要很长时间。 正如我测试的那样,当有四个节点时它不会发生。 有谁知道这次重启的原因是什么? 提前致谢。

更新:配置文件和命令行参数 1. NDB_MGMD #50 的配置文件

#
# Configuration file for MyCluster NDB_MGMD #49
# /usr/local/mysql/data/49/config.ini

[NDB_MGMD DEFAULT]
Portnumber=1186

[NDB_MGMD]
NodeId=49
HostName=192.168.1.128
DataDir=/usr/local/mysql/data/49/
Portnumber=1186

[NDB_MGMD]
NodeId=50
HostName=192.168.1.130
DataDir=/usr/local/mysql/data/50/
Portnumber=1186

[TCP DEFAULT]
SendBufferMemory=4M
ReceiveBufferMemory=4M

[NDBD DEFAULT]
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
BackupReportFrequency=10
MemReportFrequency=30
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
DataMemory=1M
IndexMemory=1M
MaxNoOfTables=4096
MaxNoOfTriggers=3500
NoOfReplicas=2
StringMemory=25
DiskPageBufferMemory=64M
SharedGlobalMemory=20M
LongMessageBuffer=32M
MaxNoOfConcurrentTransactions=16384
BatchSizePerLocalScan=512
FragmentLogFileSize=64M
NoOfFragmentLogFiles=16
RedoBuffer=32M
MaxNoOfExecutionThreads=2
StopOnError=false
LockPagesInMainMemory=1
TimeBetweenEpochsTimeout=32000
TimeBetweenWatchdogCheckInitial=60000
TransactionInactiveTimeout=60000
HeartbeatIntervalDbDb=15000
HeartbeatIntervalDbApi=15000

[NDBD]
NodeId=1
HostName=192.168.1.128
DataDir=/usr/local/mysql/data/1/

[NDBD]
NodeId=2
HostName=192.168.1.130
DataDir=/usr/local/mysql/data/2/

[MYSQLD DEFAULT]

[MYSQLD]
NodeId=53
HostName=192.168.1.128

[MYSQLD]
NodeId=54
HostName=192.168.1.130

2。 NDB_MGMD #50 的配置文件

#
# Configuration file for MyCluster NDB_MGMD #50
# /usr/local/mysql/data/50/config.ini

[NDB_MGMD DEFAULT]
Portnumber=1186

[NDB_MGMD]
NodeId=49
HostName=192.168.1.128
DataDir=/usr/local/mysql/data/49/
Portnumber=1186

[NDB_MGMD]
NodeId=50
HostName=192.168.1.130
DataDir=/usr/local/mysql/data/50/
Portnumber=1186

[TCP DEFAULT]
SendBufferMemory=4M
ReceiveBufferMemory=4M

[NDBD DEFAULT]
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
BackupReportFrequency=10
MemReportFrequency=30
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
DataMemory=1M
IndexMemory=1M
MaxNoOfTables=4096
MaxNoOfTriggers=3500
NoOfReplicas=2
StringMemory=25
DiskPageBufferMemory=64M
SharedGlobalMemory=20M
LongMessageBuffer=32M
MaxNoOfConcurrentTransactions=16384
BatchSizePerLocalScan=512
FragmentLogFileSize=64M
NoOfFragmentLogFiles=16
RedoBuffer=32M
MaxNoOfExecutionThreads=2
StopOnError=false
LockPagesInMainMemory=1
TimeBetweenEpochsTimeout=32000
TimeBetweenWatchdogCheckInitial=60000
TransactionInactiveTimeout=60000
HeartbeatIntervalDbDb=15000
HeartbeatIntervalDbApi=15000

[NDBD]
NodeId=1
HostName=192.168.1.128
DataDir=/usr/local/mysql/data/1/

[NDBD]
NodeId=2
HostName=192.168.1.130
DataDir=/usr/local/mysql/data/2/

[MYSQLD DEFAULT]

[MYSQLD]
NodeId=53
HostName=192.168.1.128

[MYSQLD]
NodeId=54
HostName=192.168.1.130

命令行参数: 1. 在服务器 #1 上启动 ndb_mgmd

/usr/local/mysql/bin/ndb_mgmd --initial --ndb-nodeid=49 \
--config-dir=/usr/local/mysql/data/49/ \
--config-file=/usr/local/mysql/data/49/config.ini

2。在服务器 #2 上启动 ndb_mgmd

/usr/local/mysql/bin/ndb_mgmd --initial --ndb-nodeid=50 \
--config-dir=/usr/local/mysql/data/50/ \
--config-file=/usr/local/mysql/data/50/config.ini

3。在服务器 #1 上启动 ndbmtd

/usr/local/mysql/bin/ndbmtd --ndb-nodeid=1 --bind-address=192.168.1.128 \
--ndb-connectstring=192.168.1.240:1186,

4。在服务器 #2 上启动 ndbmtd

/usr/local/mysql/bin/ndbmtd --ndb-nodeid=2 --bind-address=192.168.1.130 \
--ndb-connectstring=192.168.1.240:1186,

【问题讨论】:

【参考方案1】:

你的两个节点设置有问题。如果您有网络问题(脑裂情况),两个节点将无法看到对方,然后,他们将决定关闭。 然后,它们将启动,但必须等待另一个节点,除非指定了“nowaitfornodes”。

如果有 4 个节点,您将 3/1 拆分集群,因此具有网络的节点将有足够的仲裁来验证其作为仲裁者的 mgm 节点,并将成为主节点。

您应该将 mgm 节点放置在第三台机器中(这是一个非常轻量级的进程,因此不需要特殊资源)或使用集群并将 mgm 服务绑定到 VIP 来解决此问题。否则,您将因其中一个节点的网络故障而失去服务

对于VIP配置数据节点必须强制使用真实IP:

--bind-address=name

并且 ArbitrationTimeout 应该设置得足够高以允许集群迁移 mgm 服务

对于 mgm 节点,禁用配置缓存将使配置更改更容易

--config-cache=FALSE

【讨论】:

感谢您的回答。为了清楚起见:你指的是哪个节点?顺便说一句,为什么它不会发生在四个节点上?正如我所意识到的,断开连接的服务器(接口已关闭)上的数据节点已关闭。但是另一个会重新启动。即使 mgm 节点在同一台服务器上运行,它也不会发生在四个节点上。顺便说一句,我无法更改设计。 我尝试使用“nowait-nodes”参数但没有成功(对于两种类型的节点)。它只防止一个节点重新启动。我找到了一些关于 MGM 节点的“ArbitrationRank”的信息,这也没有帮助。我还尝试将 VIP 用于服务器上的两个 MGM 节点。它不起作用,因为位于同一台机器上的数据节点(正在运行 MGM 节点)无法连接到 MGM 节点。 MGM 节点看到的是从虚拟 IP 而非真实 IP 进行通信的数据节点。你有什么想法可以解决吗?谢谢 我们解决了 VIP 问题,强制数据节点使用真实 IP,如已编辑 它仍然不断重启。我添加了我的配置文件和参数。请你看看他们。提前致谢。

以上是关于MySQL 集群数据节点在其孪生失败时重新启动的主要内容,如果未能解决你的问题,请参考以下文章

超时错误重新启动 mysql (mariadb) 这是 3 节点 galera 集群中的节点之一

k8s集群节点添加失败,可用以下命令清理后,重新加入节点

k8s node节点重新加入集群失败问题解决

当集群退出并重新启动时,使用集群和 mariaSQL 100% 的 CPU 使用率

cassandra 调试问题

Flink 任务失败重启与恢复策略