Centos7.3基于iscsi+pacemaker+corosync+gfs2+clvmd实现磁盘共享

需求

我们的某个服务需要通过将数据目录挂载到共享存储上,每个节点都能访问存储中的数据,以实现多节点的集群高可用。

在之前的博文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		#查看集群状态

二、配置fence

可以参考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

三、配置gfs

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是否挂载成功
查看挂载并写入数据测试

如果你对博文感兴趣,请关注我的公众号“木讷大叔爱运维”,与你分享运维路上的点滴。
Centos7.3基于iscsi+pacemaker+corosync+gfs2+clvmd实现磁盘共享_第1张图片

你可能感兴趣的:(HA高可用)