Pacemaker-2.0-Clusters_from_Scratch-en-US.pdf 阅读笔记
HA Cluster——drbd+pacemaker+corosync
安装配置Centos 7.3
——安装系统和配置网络网上教程很多,hostnamectl 更改FQDN为主机名,/etc/hosts配置主机名,ssh-keygen生成密钥用于主机间免密ssh
安装Cluster软件
#yum install -y pacemaker pcs psmisc policycoreutils-python
文章使用pcs作为集群管理器,其他也有crmsh,语法上会有不同
#代表在每个节点上都要运行
配置Cluster软件
关闭防火墙限制
#firewall-cmd --permanent --add-service=high-availability
success
#firewall-cmd --reload
success
启用pcs守护进程
在集群可被配置前,每个节点的pcs进程需要先启动并设置为开机自启
pcs命令行可以管理同步集群所有节点的corosync配置
#systemctl start pcsd.service
#systemctl enable pcsd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
安装包会创建一个hacluster用户(/etc/passwd可以直接查看)默认带有一个禁用的密码,当在本地运行pcs命令没有问题,在集群其他节点上同步corosync配置,启用/禁用节点时账户就需要登录密码
#passwd hacluster
ssh修改节点2的hacluster密码
ssh pcmk-2 -- 'echo mysupersecretpassword | passwd --stdin hacluster'
配置Corosync
在任一节点上, 使用pcs cluster auth作为hacluster用户进行身份验证:
pcs cluster auth pcmk-1 pcmk-2
接下来,在同一节点上运行 pcs cluster setup 生成和同步corosync 配置:
pcs cluster setup --name mycluster pcmk-1 pcmk-2
如果报认证错误,重新确认一遍每个节点的hacluster的密码是否相同
配置文件路径/etc/corosync/corosync.conf
Pacemaker Tools
直接输入pcs查看命令选项
pacemakerd --features查看版本信息
pcs status help查看已知可用的状态分类
集群的启动和验证
前面pcs cluster auth后就可以直接调用一下命令启动所有节点
pcs cluster start --all
也可以在每个节点上单独启动调用命令
# pcs cluster start
or
# systemctl start corosync.service
# systemctl start pacemaker.service
在上述例子中,corosync和pacemaker服务没有设置开机自启。所以,一个集群节点fail或者reboot后,需要重新调用以下命令
pcs cluster start --all
or
pcs cluster start nodename
验证Corosync
首先,运行 corosync-cfgtool 检查集群通信状况
corosync-cfgtool -s
可以看到id是设置的ip地址而不是 127.0.0.x loopback address
状态栏没有报错
如果有异常的地方,可以检查节点的网络连接,防火墙和SELinux设置
check the membership and quorum APIs:
#corosync-cmapctl | grep members
#pcs status corosync
可以看到两个节点1,2都已经加入集群
验证Pacemaker
上面已经确认Corosync正常工作,接下来是Pacemaker
pcs status
可以看到除了提示警告STONITH配置相关,没有其他错误
创建Active/Passive集群
Pacemaker启动后会自动记录集群节点数目和细节,也包括Stack和version等信息
pcs status
or
pcs cluster cib
CIB(集群信息库 XML文档),对于CIB,只有工作在DC(主节点)上的文档是可以修改的,其他CIB都是复制DC上的那个文档而来的。
在进行变动前,最好检查一下配置的合法性
crm_verify -L -V
为了确保数据的安全性,隔离(也叫做STONITH,利用心跳机制)默认是启用的。
上述的错误就是没有找到STONITH相关配置,但是启用了STONITH
所以这里先禁用STONITH
pcs property set stonith-enabled=false
crm_verify -L
STONITH是Shoot-The-Other-Node-In-The-Head的简称,并且它能够保护数据使其不会因为节点异常或者同时访问而遭到损坏。
节点无反应并不代表它没有存取数据,如果想要百分百确认数据安全的话,需要使用STONITH来隔离节点,以确保在目前的节点已经离线后其它节点才能正常存取数据。
STONITH也能用于集群服务无法停下的情况。在这种情况下,集群可以使用STONITH来强制整个节点离线,并让服务在其它节点上安全启用。
添加资源
添加一个集群用于在任一节点上可以提供的专有IP。不考虑集群服务运行在哪个节点,终端用户总是需要一个一致的IP访问的。
这里我使用的是192.168.11.165作为浮动IP,命名为ClusterIP,并且集群设置每30s检查一下是否在运行。
为了确保使用的IP未被占用可以自行ping当前网段的ip查看
下面是一个*.bat脚本
#!/bin/bash
ip=1
while [ $ip != "254" ]; do
ping 192.168.11.$ip -c 2 | grep -q "ttl=" && echo "192.168.11.$ip yes" || echo "192.168.11.$ip no"
ip=`expr "$ip" "+" "1"`
done
添加IP资源
pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.11.165 cidr_netmask=24 op monitor interval=30s
ocf:heartbeat:IPaddr2
第一部分ocf即资源脚本服从标准和执行位置/pcs resource standards
第二部分heartbeat即明确标准,对于OCF资源,告诉集群资源脚本在哪个OCF命名空间/pcs resource providers
第三部分IPaddr2即资源脚本名称 /pcs resource agents ocf:heartbeat
删除资源
pcs resource delete ClusterIP
故障转移
pcs cluster stop pcmk-1
pcs status
节点1下线,但是节点1的pcsd还是激活的,可以继续接受pcs命令,ClusterIP现在运行在节点2上。
这里还有一个资源黏性的概念,即类似服务自身转移花费,即防止恢复后的资源转移造成额外开销
pcs resource defaults resource-stickiness=100
pcs resource defaults
Quorum
投票仲裁机制,过半数即有仲裁权
total_nodes < 2 * active_nodes
但是双节点是一个特殊情况, corosync has the ability to treat two-node clusters as if only one node is required for quorum.
添加Apache HTTP Server作为集群服务
安装Apache
# yum install -y httpd wget
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
不要enable httpd服务,即服务自启动。对于集群软件管理的服务不应该交给OS管理。通过手动的启动、停止、验证后再加入到集群,可以防止一些非集群问题的引入。
Note:我自己遇到的一个问题,节点1 WebSite资源添加后显示为Starting状态并且报错Fail Action on pcmk-1,转移到pcmk-2后同样出错,最后Stopped。
原因:status URL没有配置成正确的格式,httpd.service无法正常启动。
总结:新添加资源可以开放服务端口,不要设置自启动或者在未手动运行成功前不要添加成资源
新建Website
Apache默认网页目录是/var/www/html
# cat <<-END >/var/www/html/index.html
<html>
<body>
My Test Site - $(hostname)
</body>
</html>
END
启用Apache status URL
为了监控Apache实例,故障恢复,Pacemaker使用的资源代理层默认server-status URL是可用的
# cat <<-END >/etc/httpd/conf.d/status.conf
<Location /server-status>
SetHandler server-status
Require local
</Location>
END
Note:这里的格式要严格要求这样,不然启动httpd.service会报错,即一行一条指令
httpd配置文件httpd.conf规则说明和一些基本指令
不同的OS server-status可能默认启用了or配置路径不同;
Apache HTTP Server版本低于2.4,语法也会不同
配置集群
添加Website资源
pcs resource create WebSite ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://localhost/server-status" op monitor interval=1min
默认对于 start, stop, and monitor的操作超时限制时20s,很多情况下这个timeout限制低于特定资源建议的timeout。这里,我们调整全局操作的timeout为240s。
pcs resource op defaults timeout=240s
pcs resource op defaults
在生产集群,还是对每个资源的start, stop, and monitor timeout分别调整比较好,而不是全局设置。
Note:WebStite资源和IP没有运行在同一主机上
如果显示错误,可能是没有正确启用status URL,可以运行以下命令检查:
wget -O - http://localhost/server-status
看到 Not Found or Forbidden,那么就可能是status错误了,检查<Location /server-status>块是否正确。
保证资源运行在同一主机
为了减轻任一主机的负载,Pacemaker会将配置的资源分散到集群节点上。当然,也可以声明两个资源是相关的需要运行在同一主机。这里,声明WebSite只能运行在激活了ClusterIP的主机上。
constraint colocation
表明两种资源位置选择的顺序,即WebSite资源选择位置前需要先找到ClusterIP的位置
INFINITY score表明如果ClusterIP没有在任一节点激活,那WebSite也不会在任一节点启用。
pcs constraint colocation add WebSite with ClusterIP INFINITY
pcs constraint
保证资源有序启动和停止
ordering constraint
保证ClusterIP先于WebSite运行
pcs constraint order ClusterIP then WebSite
pcs constraint
节点偏好性
location constraint
Pacemaker不要求节点硬件的对称性,即节点机器差异是允许的。
引出当条件更好的机器可用时,为了更好的性能表现就会出现偏好or资源放在稍差的节点,那在故障转移的时候就不用担心负载的问题了
pcs constraint location WebSite prefers pcmk-1=50
pcs constraint
查看当前替换分数:
crm_simulate -sL
Note:设置了节点1的prefer score为50,但是还是低于前面设置的资源黏性100,即转移失败
手动转移资源
管理员覆盖集群并强制移动资源到特定位置,比如这里强制移动WebSite到pcmk-1
pcs resource move WebSite pcmk-1
pcs constraint
pcs resource move会创建一个临时约束其分数为INFINITY
恢复正常操作,去除新约束
pcs resource clear WebSite
pcs constraint
Note:由于第一个Location Constraint和资源黏性,资源还是在节点1上
去除第一个score为50的Location Constraint
pcs constraint --full
pcs constraint remove {ID}
分布式复制块设备DRBD
即使使用静态页面网站,手动在集群节点间同步网站内容也是不现实的;对于动态网站,像wiki就更不在考虑内了。NAS太过昂贵,数据又需要同步。
DRBD,可以理解为是network-based RAID-1(mirror)
安装DRBD
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum install -y kmod-drbd84 drbd84-utils
默认SElinux安全策略禁止DRBD运行
# semanage permissive -a drbd_t
配置DRBD到端口7789
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.11.163/164" port port="7789" protocol="tcp" accept'无效..没搞懂
# firewall-cmd --permanent --zone=public --add-port=7789/tcp
# firewall-cmd --reload
分配一个磁盘卷给DRBD
DRBD需要每个节点上有独享的块设备。可以是物理磁盘分区or逻辑卷,任意大小。
这里,我们使用512M LV,存储单个HTML文件和GFS2 metadata
# vgdisplay | grep -e Name -e Free
# lvcreate --name drbd-demo --size 512M centos
# lvs
ssh方式:
ssh pcmk-2 -- lvcreate --name drbd-demo --size 512M centos
配置DRBD
配置DRBD资源文件
# cat <<END >/etc/drbd.d/wwwdata.res
resource wwwdata{protocol C;meta-disk internal;device /dev/drbd1;syncer{verify-alg sha1;}net{allow-two-primaries;}on pcmk-1{disk /dev/centos/drbd-demo;address 192.168.11.163:7789; }on pcmk-2{disk /dev/centos/drbd-demo;address 192.168.11.164:7789;}}
END
Note:自行更改ip地址和LV路径
初始化DRBD
# systemctl start drbd.service
drbdadm create-md wwwdata
modprobe drbd
drbdadm up wwwdata
cat /proc/drbd
还未初始化数据所以显示 Inconsistent,没有初始化从节点,本地状态为 WFConnection(wait for connection),另一节点的状态为 Unknown
节点2重复上一步 报错:Module drdb not found
uname -r
不低于3.10.0-514.6.1.el7.x86_64
yum -y install kernel-devel kernel kernel-headers or yum -y install kernel*
reboot
节点1作为正确数据节点
[root@pcmk-1 ~]# drbdadm primary --force wwwdata
填充DRBD磁盘
primary节点建立文件系统
mkfs.xfs /dev/drbd1
mount /dev/drbd1 /mnt
cat <<-END >/mnt/index.html
<html> <body>My Test Site - DRBD</body> </html>
END
chcon -R --reference=/var/www/html /mnt
umount /dev/drbd1
DRBD设备配置集群
pcs一个重要特点就是整合多个更改到一个文件并一次性提交。开始前,先填充CIB现有的原始XML配置文件。
pcs cluster cib drbd_cfg
pcs的-f参数,修改存储在drbd_cfg的配置文件,这部分修改在drbd_cfg文件推送到集群CIB前是不可见的。
这里,为DRBD设备新建了一个集群资源以及一个额外的clone资源来保证资源同时在两个节点运行。
pcs -f drbd_cfg resource create WebData ocf:linbit:drbd drbd_resource=wwwdata op monitor interval=60s
pcs -f drbd_cfg resource master WebDataClone WebData master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
pcs -f drbd_cfg resource show
pcs cluster cib-push drbd_cfg --config
pcs status
资源代理层要在DRBD模块未加载时遇到需要DRBD模块时自动加载,如果失效,配置OS自启动模块。对于Centos 7.5:
# echo drbd >/etc/modules-load.d/drbd.conf
配置集群文件系统
上述已经配置了可以工作的DRBD设备,现在还需要挂载其文件系统
除了定义文件系统,还需要告诉集群其位置(在DRBD主节点上)以及启动时间(主节点启动后)
这次创建资源时可以取巧,不直接显示声明需要 ocf:heartbeat:Filesystem 脚本,只调用Filesystem。之所以可以这么干,是因为在Pacemaker中只有一个资源脚本叫Filesystem,并且pcs也可以自动填充ocf:heartbeat。如果OCF providers有多个Filesystem脚本,就需要明确声明完整的Filesystem了。
pcs cluster cib fs_cfg
pcs -f fs_cfg resource create WebFS Filesystem device="/dev/drbd1" directory="/var/www/html" fstype="xfs"
Note:可以看到Pacemaker自己推断的过程
pcs -f fs_cfg constraint colocation add WebFS with WebDataClone INFINITY with-rsc-role=Master
pcs -f fs_cfg constraint order promote WebDataClone then start WebFS
pcs -f fs_cfg constraint colocation add WebSite with WebFS INFINITY
pcs -f fs_cfg constraint order WebFS then WebSite
pcs -f fs_cfg constraint
pcs -f fs_cfg resource show
pcs cluster cib-push fs_cfg --config
pcs status
测试集群故障转移
之前的测试通过pcs cluster stop pcmk-1来停止pcmk-1上所有集群服务,故障转移集群资源,但还有一种安全模拟节点崩溃的办法。
可以让节点进入standby模式。这个模式下的节点可以继续运行corosync和pacemaker但是无法运行资源。任何原本在此节点激活的资源都会被转移。这个特性在执行系统管理任务比如更新资源所需的packages时会非常有用。
pcs cluster standby pcmk-1
pcs status
结束standby节点上的事务后,恢复正常运行
pcs cluster unstandby pcmk-1
pcs status
Note:pcmk-1已经恢复到Online模式,而资源由于之前设置的资源黏性还是留在pcmk-2