我们的某个服务需要通过将数据目录挂载到共享存储上,每个节点都能访问存储中的数据,以实现多节点的集群高可用。
在之前的博文pacemaker+drbd双主中我们通过drbd+gfs2实现,那有没有更简单点的方式呢?
本文将介绍iscsi+pacemaker+corosync+gfs2+clvmd实现存储的共享。
大家都知道多节点是可以同时挂载同一个iscsi存储的,若使用lvm创建的分卷是能够在不同节点读取到的,但是数据无法正常共享,需使用如下命令:
#激活分卷
lvchange -ay /dev/vg/lv1
#刷新分卷
lvchange --refresh /dev/vg/lv
这样无法满足正常使用,如何解决?
答案:使用gfs2+clvmd。
GFS2是一个原生的(native)文件系统,它直接和Linux内核文件系统接口的VFS层进行通信。GFS2使用分布式元数据和多个日志来优化群集操作。要维护文件系统的完整性,GFS2使用一个分布式锁管理器(DLM,DistributedLock Manager)来协调I/O,当一个节点操作系统时,会进行加锁。当节点修改了GFS2文件系统上的数据,这个改动马上为使用这个文件系统的其他群集节点可见。
CLVM(Cluster Logical Volume Manager,群集逻辑卷管理器)是LVM的一组群集的扩展。这些扩展允许计算机群集使用LVM管理共享存储(例如:在SAN中),当在一个节点上对共享存储进行LVM操作时,会通过高可用组件通知其他节点。
主机名 | ip | 备注 |
---|---|---|
node1 | 192.168.3.54 | vmware虚拟机-centos7.3-ap1 |
node1 | 192.168.3.55 | vmware虚拟机-centos7.3-ap2 |
iscsi | 192.168.3.29 | 存储 |
1.按如上表格配置主机名、ip,请关闭selinux或防火墙。
若防火墙不关,建议请开通相关端口。
2.在所有ap节点上安装组件
#安装pcs会附带安装pacemaker,corosync等
yum install pcs -y
3.在各个node节点启动pcsd
systemctl enable pcsd.service
systemctl start pcsd.service
4.集群各个node节点之间进行认证
#为两个node节点账户设置密码(账户是hacluster),密码必须要一致
passwd hacluster
#配置认证(下面表示认证通过)
pcs cluster auth node1 node2 #后面接的是主机名
[root@node1 ~]# pcs cluster auth node1 node2
Username: hacluster
Password:
node1: Authorized
node2: Authorized
5.创建集群
##在node1和node2上创建一个群集,只需要在一个node上执行
pcs cluster setup --name testcluster node1 node2
pcs在执行以上命令时会生产corosync.conf及修改cib.xml文件,corosync.conf为corosync的配置文件,cib.xml为pacemaker的配置文件。这两个配置文件是集群的核心配置,重装系统时建议做好这两个配置文件的备份。
6.启动群集
#只需要在一个node上执行
pcs cluster start --all #启动群集
pcs cluster enable --all #设置集群自动启动
pcs cluster status #查看集群状态
可以参考Chapter 5. Configuring a GFS2 File System in a Cluster
虽然我们的集群已经初始化完毕,但是在配置gfs文件系统前,我们必须配置好fence。由于我们虚拟机是在ESXI5.5建立的,我们使用fence-agents-vmware-soap来虚拟fence设备。
1.安装组件
#在各个node节点
yum install fence-agents-vmware-soap
[root@node1 ~]# fence_vmware_soap -h
Usage:
fence_vmware_soap [options]
Options:
-a, --ip=[ip] IP address or hostname of fencing device
-l, --username=[name] Login name
-p, --password=[password] Login password or passphrase
-z, --ssl Use ssl connection
-t, --notls Disable TLS negotiation and force SSL3.0.
This should only be used for devices that do not support TLS1.0 and up.
-n, --plug=[id] Physical plug number on device, UUID or
identification of machine
-u, --ipport=[port] TCP/UDP port to use
(default 80, 443 if --ssl option is used)
-4, --inet4-only Forces agent to use IPv4 addresses only
-6, --inet6-only Forces agent to use IPv6 addresses only
-S, --password-script=[script] Script to run to retrieve password
--ssl-secure Use ssl connection with verifying certificate
--ssl-insecure Use ssl connection without verifying certificate
-o, --action=[action] Action: status, reboot (default), off or on
-v, --verbose Verbose mode
-D, --debug-file=[debugfile] Debugging to output file
-V, --version Output version information and exit
-h, --help Display this help and exit
-C, --separator=[char] Separator for CSV created by 'list' operation
--power-timeout=[seconds] Test X seconds for status change after ON/OFF
--shell-timeout=[seconds] Wait X seconds for cmd prompt after issuing command
--login-timeout=[seconds] Wait X seconds for cmd prompt after login
--power-wait=[seconds] Wait X seconds after issuing ON/OFF
--delay=[seconds] Wait X seconds before fencing is started
--retry-on=[attempts] Count of attempts to retry power on
2.查看设备
[root@node1 ~]# fence_vmware_soap -z -l [email protected] -p test -a 192.168.3.216 -o list --ssl-insecure
ap1,4214b3a6-68ed-42e9-f65d-6f932a185a55
ap2,4214d57d-766e-2e12-d372-d3b06e874dda
其中192.168.3.216是两台虚拟机所在的ESXI虚拟主机或vCenter。
3.配置fence
#只需要在一个node上执行
#查看fence_vmware_soap的相关配置参数
pcs stonith describe fence_vmware_soap
#配置fence
pcs stonith create fence_vmware_1 fence_vmware_soap ipaddr=192.168.3.216 ipport=443 ssl_insecure=1 inet4_only=1 login="[email protected]" passwd="test" pcmk_host_map="ap1:4214b3a6-68ed-42e9-f65d-6f932a185a55;ap2:4214d57d-766e-2e12-d372-d3b06e874dda" pcmk_host_list="node1,node2" pcmk_host_check=static-list pcmk_monitor_timeout=60s pcmk_reboot_action=reboot power_wait=3 op monitor interval=60s
4.查看fence
[root@node1 ~]# pcs stonith show --full
Resource: fence_vmware (class=stonith type=fence_vmware_soap)
Attributes: inet4_only=1 ipaddr=192.168.3.216 ipport=443 [email protected] passwd=testpcmk_host_check=static-list pcmk_host_list=node1,node2 pcmk_host_map=ap1:4214b3a6-68ed-42e9-f65d-6f932a185a55;ap2:4214d57d-766e-2e12-d372-d3b06e874dda pcmk_monitor_timeout=60s power_wait=3 ssl_insecure=1
Operations: monitor interval=60s (fence_vmware-monitor-interval-60s)
#查看集群状态
[root@node1 ~]# pcs status
Cluster name: testcluster
Stack: corosync
Current DC: node1 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Sun Jul 29 00:40:15 2018
Last change: Sun Jul 29 00:37:40 2018 by root via cibadmin on node1
2 nodes configured
7 resources configured
Online: [ node1 node2 ]
Full list of resources:
fence_vmware (stonith:fence_vmware_soap): Started node1
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
1.安装组件
#在各个node节点
yum install lvm2-cluster gfs2-utils
2.设置no_quorum_policy
#只需要在一个node上执行
pcs property set no-quorum-policy=freeze
默认情况下,no-quorum-policy的值设置为stop,表示一旦丢失仲裁,将立即停止剩余分区上的所有资源。 通常,此默认值是最安全和最佳选项,但与大多数资源不同,GFS2需要仲裁才能运行。 当仲裁丢失时,使用GFS2安装的应用程序和GFS2安装本身都无法正确停止。 任何在没有仲裁的情况下停止这些资源的尝试都将失败,这最终会导致每次法定人数丢失时整个群集都被隔离。
要解决这种情况,您可以在使用GFS2时设置no-quorum-policy = freeze。 这意味着当仲裁丢失时,剩余分区将无法执行任何操作,直到重新获得仲裁。
3.添加dlm资源
#只需要在一个node上执行
pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true
4.启用集群锁
#在各个node节点
/sbin/lvmconf --enable-cluster
5.添加clvm资源
#只需要在一个node上执行
pcs resource create clvmd ocf:heartbeat:clvm op monitor interval=30s on-fail=fence clone interleave=true ordered=true
请注意,clvmd和cmirrord deamons由Pacemaker使用ocf:heartbeat:clvm资源代理启动和管理,不需要在使用systemd启动时启动。 此外,作为启动过程的一部分,ocf:heartbeat:clvm资源代理将/etc/lvm/lvm.conf文件中的locking_type参数设置为3并禁用lvmetad守护程序。
注意:
当报如下错误:
connect() failed on local socket: No such file or directory
Internal cluster locking initialisation failed.
WARNING: Falling back to local file-based locking.
Volume Groups with the clustered attribute will be inaccessible.
Skipping clustered volume group VGgfs00
是由于clvmd没有启动成功导致,可能你需要检查下你的fence是否有问题。我遇到的情况是由于fence没有设置或设置有问题,导致clvmd没有启动。
6.创建dlm和clum的依赖和启动顺序
#只需要在一个node上执行
pcs constraint order start dlm-clone then clvmd-clone
pcs constraint colocation add clvmd-clone with dlm-clone
7.挂在iscsi并创建gfs文件系统
#只需要在一个node上执行
#iscsi挂载为/dev/sdb
pvcreate /dev/sdb
vgcreate -Ay -cy cluster_vg /dev/sdb
lvcreate -l 100%FREE -n cluster_lv cluster_vg
mkfs.gfs2 -j2 -p lock_dlm -t testcluste:test /dev/cluster_vg/cluster_lv
8.添加clusterfs 资源
#只需要在一个node上执行
pcs resource create clusterfs Filesystem device="/dev/cluster_vg/cluster_lv" directory="/mnt" fstype="gfs2" "options=noatime" op monitor interval=10s on-fail=fence clone interleave=true
9.建立GFS2 和clvmd启动顺序和依赖
#只需要在一个node上执行
pcs constraint order start clvmd-clone then clusterfs-clone
pcs constraint colocation add clusterfs-clone with clvmd-clone
10.确认gfs是否挂载成功
查看挂载并写入数据测试