我在 2 个物理上相同的 Ubuntu Server 16.04 LTS 上安装了 pacemaker/corosync/drbd,并且正在尝试实现 MySQL 5.7 和 Apache 2.4 的高可用性。
两台服务器的设置方式完全相同,并且安装了完全相同的软件包。唯一的区别是主机名、IP 地址和 pacemaker/corosync/drbd 中的主/从配置。
我的问题是,pacemaker 能够启动节点 1 上的 MySQL 服务器和所有其他服务,但是当我模拟节点 1 崩溃时,pacemaker 无法启动节点 2 上的 MySQL 服务。
这是 crm_mon 的输出(两个节点均在线):
Last updated: Wed Jan 10 18:57:02 2018 Last change: Wed Jan 10 18:00:19
2018 by root via crm_attribute on Server1
Stack: corosync
Current DC: Server1 (version 1.1.14-70404b0) - partition with quorum
2 nodes and 7 resources configured
Online: [ Server1 Server2 ]
Master/Slave Set: ms_r0 [r0]
Masters: [ Server1 ]
Slaves: [ Server2 ]
Resource Group: WebServer
ClusterIP (ocf::heartbeat:IPaddr2): Started Server1
WebFS (ocf::heartbeat:Filesystem): Started Server1
Links (ocf::heartbeat:drbdlinks): Started Server1
DBase (ocf::heartbeat:mysql): Started Server1
WebSite (ocf::heartbeat:apache): Started Server1
但是当我模拟节点 1 崩溃时,我得到:
Last updated: Wed Jan 10 19:05:25 2018 Last change: Wed Jan 10 19:05:17
2018 by root via crm_attribute on Server1
Stack: corosync
Current DC: Server1 (version 1.1.14-70404b0) - partition with quorum
2 nodes and 7 resources configured
Node Server1: standby
Online: [ Server2 ]
Master/Slave Set: ms_r0 [r0]
Masters: [ Server2 ]
Resource Group: WebServer
ClusterIP (ocf::heartbeat:IPaddr2): Started Server2
WebFS (ocf::heartbeat:Filesystem): Started Server2
Links (ocf::heartbeat:drbdlinks): Started Server2
DBase (ocf::heartbeat:mysql): Stopped
WebSite (ocf::heartbeat:apache): Stopped
Failed Actions:
* DBase_start_0 on Server2 'unknown error' (1): call=45, status=complete
, exitreason='MySQL server failed to start (pid=3346) (rc=1), please check your
installation',
last-rc-change='Wed Jan 10 17:58:15 2018', queued=0ms, exec=2202ms
这是我最初的 Pacemaker 配置:https://pastebin.com/kEYjjgKw
在我意识到节点 2 上的 MySQL 启动存在问题后,我做了一些研究,发现应该在 Pacemaker 配置中向 MySQL 传递一些额外的参数。这就是我将 Pacemaker 配置更改为以下内容的原因:https://pastebin.com/J7Zk1kBA
不幸的是,这并没有解决问题。
据我所知,Pacemaker 在两台机器上使用相同的命令来启动 MySQL 守护进程。这就是为什么我觉得它无法在以完全相同的方式配置的节点 2 上启动 MySQL 有点荒谬。
drbd0 正在由 pacemaker 安装,drbdlinks 正在为 /var/www 和 /var/lib/mysql 创建符号链接
我测试了此功能,它似乎可以工作。当节点 1 处于离线状态时,drbd0 会挂载到节点 2 上,并创建符号链接。/var/lib/mysql 指向 drbd0,所有文件都位于目录中。
如果您对如何缩小该问题的原因有任何想法/建议,我将非常感激您能将它们发布在这里。
如果需要更多信息,我很乐意提供。
提前致谢!
问候,PAlbrecht
答案1
过去,当我必须使用起搏器时,我会使用几种不同的程序来排除此类故障。一般的想法是验证起搏器配置的每个依赖“层”,其中依赖关系图如下:
mysql -> mounting of filesystem -> DRBD master
还从头开始构建集群对非常相似的配置有一个很好的演练。
首先要确保 DRBD 已配置并同步。在任一节点上运行:
cat /proc/drbd
如果 DRBD 完全同步并准备好进行故障转移,则输出应显示类似以下内容(请参阅 CfS 第 45 页):
[root@pcmk-1 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10
05:13:52
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:1048508 nr:0 dw:0 dr:1049420 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
如果
cat /proc/drbd
输出类似的内容(也在 CfS 第 45 页上)
[root@ovz-node1 ~]# cat /proc/drbd
version: 0.7.17 (api:77/proto:74)
SVN Revision: 2093 build by phil@mescal, 2006-03-06 15:04:12
0: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:627252 nr:0 dw:0 dr:629812 al:0 bm:38 lo:640 pe:0 ua:640 ap:0
[=>..................] sync'ed: 6.6% (8805/9418)M
finish: 0:04:51 speed: 30,888 (27,268) K/sec
那么系统就无法成功进行故障转移。等待故障转移完成,然后重试故障转移测试。
假设在模拟 node1 故障之前 DRBD 已同步,当 DB 未在 node2 上运行时,故障转移到 node2 后要尝试的下一步是登录到 node2 并检查以下内容:
- 是否
cat /proc/drbd
显示 node2 为主节点? - 是否
mount
显示 /dev/drbd0 安装在其配置的挂载点(从 pastebin 来看,这应该是 '/sync')? - 所有预期的符号链接都已设置吗?
- 您是否看到节点 2 上的 /sync 中的文件与故障转移之前节点 1 上的文件相同?
最重要的是,如果所有这些问题的答案都是肯定的:
- 在 node2 上手动启动 MySQL 时(可能使用
/etc/init.d/mysql start
或 systemctl 等效)是否可以成功启动? - 如果 MySQL 启动,mysql 客户端是否显示正在运行的服务器实际上正在提供存储在 /sync 下的 DB 数据?是否可以使用 node2 上的 mysql 客户端访问已知在 node1 上运行的数据库和表?
如果 MySQL 手动启动,那么它的起搏器配置可能有问题。
全面披露:我个人没有使用过 ocf::heartbeat:mysql 资源;而是使用了“lsb”资源“lsb:mysql”。