基本环境
-
总共四台虚拟机,安装CentOS 7 X64系统。
-
每台虚拟机两张网卡,分别连接两个网络,NAT网络192.168.195.0,仅主机网络192.168.162.0。
-
Target主机安装iSCSI TGT服务,提供共享存储服务。
-
Test1和Test2主机利用Target主机提供的共享存储对外提供A/P结构的NFS服务,使用PaceMaker进行集群管理。
-
Develop主机mount有Test主机提供的NFS服务并测试其功能。
网络配置
IP地址
使用静态IP地址,并按如下的方式进行配置。
Target
eth0 : 192.168.195.131
eth1 : 192.168.162.131
Test1
eth0 : 192.168.195.132
eth1 : 192.168.162.132
Test2
eth0 : 192.168.195.133
eth1 : 192.168.162.133
Develop
eth0 : 192.168.195.136
eth1 : 192.168.162.136
NFS使用的浮动IP为:192.168.195.200。
域名解析
在四台机器的域名解析文件下增加如下部分,并确保相互可以ping通。
$ vi /etc/hosts
192.168.195.131 target
192.168.195.132 test1
192.168.195.133 test2
192.168.195.136 develop
配置iSCSI
安装tgt服务
在Target主机上执行如下操作:
安装软件包
$ yum install -y scsi-target-utils iscsi-initiator-utils
配置tgt服务,使用/dev/sdd1分区作为第一个LUN,密码为nfsha。
$ cp -v /etc/tgt/targets.conf /etc/tgt/targets.conf.bak
$ vi /etc/tgt/targets.conf
<target iqn.2016-12.org.lr:lvm>
backing-store /dev/sdd1
initiator-address 192.168.0.0/16
incominguser nfsha nfsha
</target>
在LVM中忽略掉/dev/sdd1分区。
$ vi /etc/lvm/lvm.conf
global_filter = [ "a|/dev/sdc|", "r|.*/|" ]
重启服务
$ systemctl enable tgtd.service
$ systemctl restart tgtd.service
$ systemctl status tgtd.service
$ tgtadm -L iscsi -m target -o show
配置initiator客户端
在Test1,Test2,Develop三个主机上执行如下操作:
安装软件包。
$ yum install -y iscsi-initiator-utils
设置客户端名称,把XXX分别换成test1,test2,develop。
$ vi /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2016-12.com.lr:XXX
设置验证协议和密码。
$ vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = nfsha
node.session.auth.password = nfsha
重启服务。
$ systemctl enable iscsid.service
$ systemctl restart iscsid.service
$ systemctl status iscsid.service
发现及添加存储。
$ iscsiadm -m discovery -t st -p 192.168.195.131
$ iscsiadm -m node -T iqn.2016-12.org.lr:lvm -p 192.168.195.131:3260 -l
$ iscsiadm -m discovery -t st -p 192.168.162.131
$ iscsiadm -m node -T iqn.2016-12.org.lr:lvm -p 192.168.162.131:3260 -l
查看新添加的存储。
$ iscsiadm -m node –l
192.168.195.131:3260,1 iqn.2016-12.org.lr:lvm
192.168.162.131:3260,1 iqn.2016-12.org.lr:lvm
$ ll /dev/sd*
brw-rw---- 1 root disk 8, 0 11月 24 16:25 /dev/sda
brw-rw---- 1 root disk 8, 1 11月 24 16:25 /dev/sda1
brw-rw---- 1 root disk 8, 2 11月 24 16:25 /dev/sda2
brw-rw---- 1 root disk 8, 3 11月 24 16:25 /dev/sda3
brw-rw---- 1 root disk 8, 16 11月 24 16:25 /dev/sdb
brw-rw---- 1 root disk 8, 17 11月 24 16:25 /dev/sdb1
brw-rw---- 1 root disk 8, 32 11月 24 16:25 /dev/sdc
brw-rw---- 1 root disk 8, 48 11月 24 16:25 /dev/sdd
brw-rw---- 1 root disk 8, 64 11月 24 16:25 /dev/sde
brw-rw---- 1 root disk 8, 80 11月 24 16:25 /dev/sdf
新生成的设备为sde和sdf。
增加多路径
在Test1,Test2,Develop三个主机上执行如下操作:
安装软件包并加载驱动。
$ yum install -y device-mapper*
$ modprobe dm-multipath
查看iSCSI设备的WWID。
$ /lib/udev/scsi_id -g -u /dev/sde
360000000000000000e00000000010001
配置多路径名称。
$ vi /etc/multipath.conf
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^sd[a-d][0-9]*"
}
defaults {
user_friendly_names yes
path_grouping_policy multibus
failback immediate
no_path_retry fail
}
multipaths {
multipath {
wwid 360000000000000000e00000000010001
alias lvm
}
}
启动服务
$ mkdir /run/multipathd/ -pv
$ touch /run/multipathd/multipathd.pid
$ chmod 777 /run/multipathd/multipathd.pid
$ systemctl enable multipathd.service
$ systemctl restart multipathd.service
$ systemctl status multipathd.service
$ reboot
刷新multipath缓存
$ multipath -F
$ multipath -v2
$ multipath -ll
lvm (360000000000000000e00000000010001) dm-2 IET ,VIRTUAL-DISK
size=10G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
|- 4:0:0:1 sde 8:64 active ready running
`- 3:0:0:1 sdf 8:80 active ready running
配置LVM
允许LVM扫描iscsi设备
$ vi /etc/lvm/lvm.conf
filter = [ "a|/dev/mapper/lvm|", "r|.*/|" ]
创建LVM分区
$ pvcreate /dev/mapper/lvm
$ vgcreate storage /dev/mapper/lvm
$ lvcreate -L 10G -n test storage
配置LVM,设置locking_type为1,设置use_lvmetad为0,禁用lvmetad服务。
$ lvmconf --enable-halvm --services --startstopservices
设置volume_list,排除我们要使用的storage卷组,避免系统自动激活。
$ vgs --noheadings -o vg_name
storage
$ vi /etc/lvm/lvm.conf
volume_list = [ ]
重建initramfs,避免内核启动时,卷组自动激活。
$ dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)
重启系统,使配置生效。
$ reboot
配置集群服务
初始化设置
在Test1和Test2上进行如下配:
禁用防火墙
$ systemctl disable firewalld
$ systemctl stop firewalld
Or
$ firewall-cmd --permanent --add-service=high-availability
$ firewall-cmd --add-service=high-availability
$ firewall-cmd --reload
禁用SeLinux
$ setenforce 0
$ sed -i.bak "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
$ reboot
安装软件包。
$ yum install pcs pacemaker fence-agents-all
修改集群账号密码
$ passwd hacluster
$ cat /etc/passwd | grep hacluster
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin
重启服务
$ systemctl start pcsd.service
$ systemctl enable pcsd.service
$ systemctl status pcsd.service
初始化集群
在任意一个Test节点上进行如下配:
认证集群账户
$ pcs cluster auth test1 test2
Username: hacluster
Password:
test1: Authorized
test2: Authorized
创建集群
$ pcs cluster setup --start --name my_cluster test1 test2
Shutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
test1: Succeeded
test2: Succeeded
Starting cluster on nodes: test1, test2...
test2: Starting Cluster...
test1: Starting Cluster...
Synchronizing pcsd certificates on nodes test1, test2...
test1: Success
test2: Success
Restaring pcsd on the nodes in order to reload the certificates...
test1: Success
test2: Success
手动启动集群
$ pcs cluster start
设置集群开机启动
$ pcs cluster enable --all
查看集群状态
$ pcs cluster status
test1: Success
test2: Success
$ pcs cluster enable --all
test1: Cluster Enabled
test2: Cluster Enabled
$ pcs cluster status
Cluster Status:
Last updated: Tue Dec 13 14:58:32 2016 Last change: Tue Dec 13 14:57:07 2016 by hacluster via crmd on test2
Stack: corosync
Current DC: test2 (version 1.1.13-10.el7_2.4-44eb2dd) - partition with quorum
2 nodes and 0 resources configured
Online: [ test1 test2 ]
PCSD Status:
test1: Online
test2: Online
配置fence设备
安装插件软件包
$ yum install -y fence-*
查看可用fence插件
$ pcs stonith list
查看fence插件使用说明
$ pcs stonith describe fence_kdump
fence_kdump - Fence agent for use with kdump
The fence_kdump agent is intended to be used with with kdump service.
Stonith options:
nodename: Name or IP address of node to be fenced
ipport: Port number
family: Network family
action: Fencing action
timeout: Timeout in seconds
verbose: Print verbose output
version: Print version
usage: Print usage
priority: The priority of the stonith resource. Devices are tried in order of highest priority to lowest.
pcmk_host_map: A mapping of host names to ports numbers for devices that do not support host names.
pcmk_host_list: A list of machines controlled by this device (Optional unless pcmk_host_check=static-list).
pcmk_host_check: How to determine which machines are controlled by the device.
pcmk_delay_max: Enable random delay for stonith actions and specify the maximum of random delay
创建fence_kdump。
$ pcs stonith create my_fence fence_kdump test1
查看fence状态。
$ pcs stonith show my_fence
Resource: my_fence (class=stonith type=fence_kdump)
Operations: monitor interval=60s (my_fence-monitor-interval-60s)
配置NFS服务
创建文件系统资源
创建NFS分区,并格式化为ext4文件系统。
$ lvcreate -L 50G -n nfs storage
$ mkfs.ext4 /dev/storage/nfs
挂载NFS分区。
$ mkdir /mnt/nfs
$ mount /dev/storage/nfs /mnt/nfs
创建NFS目录和测试文件。
$ mkdir -pv /mnt/nfs/exports
$ mkdir -pv /mnt/nfs/exports/export1
$ mkdir -pv /mnt/nfs/exports/export2
$ touch /mnt/nfs/exports/export1/clientdatafile1
$ touch /mnt/nfs/exports/export2/clientdatafile2
卸载NFS分区,并去激活LVM卷组。
$ umount /dev/storage/nfs
$ vgchange -an storage
创建LVM资源,以便激活卷组。
$ pcs resource create my_lvm LVM volgrpname=storage exclusive=true --group nfsgroup
创建文件系统资源。
$ pcs resource create nfsshare Filesystem \
device=/dev/storage/nfs directory=/mnt/nfs fstype=ext4 --group nfsgroup
创建导出资源
创建NFS服务资源。
$ pcs resource create nfs-daemon nfsserver \
nfs_shared_infodir=/mnt/nfs/nfsinfo nfs_no_notify=true --group nfsgroup
创建exportfs资源。
$ pcs resource create nfs-root exportfs clientspec=192.168.0.0/255.255.0.0 \
options=rw,sync,no_root_squash directory=/mnt/nfs/exports fsid=0 --group nfsgroup
$ pcs resource create nfs-export1 exportfs clientspec=192.168.0.0/255.255.0.0 \
options=rw,sync,no_root_squash directory=/mnt/nfs/exports/export1 fsid=1 --group nfsgroup
$ pcs resource create nfs-export2 exportfs clientspec=192.168.0.0/255.255.0.0 \
options=rw,sync,no_root_squash directory=/mnt/nfs/exports/export2 fsid=2 --group nfsgroup
创建浮动IP资源。
$ pcs resource create nfs_ip IPaddr2 ip=192.168.195.200 cidr_netmask=24 --group nfsgroup
创建nfsnotify资源。
$ pcs resource create nfs-notify nfsnotify source_host=192.168.195.200 --group nfsgroup
查看当前状态。
$ pcs status
Cluster name: my_cluster
Last updated: Tue Dec 13 15:09:27 2016 Last change: Tue Dec 13 15:09:15 2016 by root via cibadmin on test1
Stack: corosync
Current DC: test2 (version 1.1.13-10.el7_2.4-44eb2dd) - partition with quorum
2 nodes and 9 resources configured
Online: [ test1 test2 ]
Full list of resources:
my_fence (stonith:fence_kdump): Started test1
Resource Group: nfsgroup
my_lvm (ocf::heartbeat:LVM): Started test2
nfsshare (ocf::heartbeat:Filesystem): Started test2
nfs-daemon (ocf::heartbeat:nfsserver): Started test2
nfs-root (ocf::heartbeat:exportfs): Started test2
nfs-export1 (ocf::heartbeat:exportfs): Started test2
nfs-export2 (ocf::heartbeat:exportfs): Started test2
nfs_ip (ocf::heartbeat:IPaddr2): Started test2
nfs-notify (ocf::heartbeat:nfsnotify): Started test2
PCSD Status:
test1: Online
test2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
验证和测试
在Develop节点上进行如下测试。
查看当前导出的文件系统
$ showmount -e 192.168.195.200
Export list for 192.168.195.200:
/mnt/nfs/exports/export1 192.168.0.0/255.255.0.0
/mnt/nfs/exports 192.168.0.0/255.255.0.0
/mnt/nfs/exports/export2 192.168.0.0/255.255.0.0
验证NFSv4
$ mkdir nfsshare
$ mount -o "vers=4" 192.168.195.200:export1 nfsshare
$ mount | grep nfsshare
192.168.195.200://export1 on /root/nfsshare type nfs4 (rw,relatime,vers=4.0,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.195.136,local_lock=none,addr=192.168.195.200)
$ ls nfsshare
clientdatafile1
$ umount nfsshare
验证NFSv3
$ mkdir nfsshare
$ mount -o "vers=3" 192.168.195.200:/mnt/nfs/exports/export2 nfsshare
$ mount | grep nfsshare
192.168.195.200:/mnt/nfs/exports/export2 on /root/nfsshare type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.195.200,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=192.168.195.200)
$ ls nfsshare
clientdatafile2
$ umount nfsshare
Failover测试
使用NFSv4挂载export1。
$ mkdir nfsshare
$ mount -o "vers=4" 192.168.195.200:export1 nfsshare
$ ls nfsshare
查看集群运行状态,当前服务全部运行在Test2节点上。
$ Cluster name: my_cluster
Last updated: Tue Dec 13 15:20:53 2016 Last change: Tue Dec 13 15:20:50 2016 by root via crm_attribute on test1
Stack: corosync
Current DC: test2 (version 1.1.13-10.el7_2.4-44eb2dd) - partition with quorum
2 nodes and 9 resources configured
Online: [ test1 test2 ]
Full list of resources:
my_fence (stonith:fence_kdump): Started test1
Resource Group: nfsgroup
my_lvm (ocf::heartbeat:LVM): Started test2
nfsshare (ocf::heartbeat:Filesystem): Started test2
nfs-daemon (ocf::heartbeat:nfsserver): Started test2
nfs-root (ocf::heartbeat:exportfs): Stopped
nfs-export1 (ocf::heartbeat:exportfs): Stopped
nfs-export2 (ocf::heartbeat:exportfs): Stopped
nfs_ip (ocf::heartbeat:IPaddr2): Stopped
nfs-notify (ocf::heartbeat:nfsnotify): Stopped
PCSD Status:
test1: Online
test2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
运行测试循环代码。
$ while :; do date +"%s %c -- $i" | tee -a ~/nfsshare/nfstest.log; sleep 1; (( ++i )); done
挂起Test2主机。
$ pcs cluster standby test2
查看集群运行状态,当前服务全部运行在Test1节点上。
$ pcs status
Cluster name: my_cluster
Last updated: Tue Dec 13 15:26:16 2016 Last change: Tue Dec 13 15:25:47 2016 by root via crm_attribute on test1
Stack: corosync
Current DC: test2 (version 1.1.13-10.el7_2.4-44eb2dd) - partition with quorum
2 nodes and 9 resources configured
Node test2: standby
Online: [ test1 ]
Full list of resources:
my_fence (stonith:fence_kdump): Started test1
Resource Group: nfsgroup
my_lvm (ocf::heartbeat:LVM): Started test1
nfsshare (ocf::heartbeat:Filesystem): Started test1
nfs-daemon (ocf::heartbeat:nfsserver): Started test1
nfs-root (ocf::heartbeat:exportfs): Started test1
nfs-export1 (ocf::heartbeat:exportfs): Started test1
nfs-export2 (ocf::heartbeat:exportfs): Started test1
nfs_ip (ocf::heartbeat:IPaddr2): Started test1
nfs-notify (ocf::heartbeat:nfsnotify): Started test1
PCSD Status:
test1: Online
test2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
在Test2主机上。
$ dmesg -c
[ 3145.065649] nfsd: last server has exited, flushing export cache
在Test1主机上。
$ dmesg -c
[ 4423.429239] EXT4-fs (dm-2): mounted filesystem with ordered data mode. Opts: (null)
[ 4424.169604] NFSD: starting 90-second grace period (net ffffffff81a26d80)
在Develop主机上。
$ cat ~/nfsshare/nfstest.log
...
1481613943 2016年12月13日 星期二 15时25分43秒 -- 71
1481613944 2016年12月13日 星期二 15时25分44秒 -- 72
1481613945 2016年12月13日 星期二 15时25分45秒 -- 73
1481613946 2016年12月13日 星期二 15时25分46秒 -- 74
1481613947 2016年12月13日 星期二 15时25分47秒 -- 75
1481614054 2016年12月13日 星期二 15时27分34秒 -- 76
1481614055 2016年12月13日 星期二 15时27分35秒 -- 77
1481614056 2016年12月13日 星期二 15时27分36秒 -- 78
1481614057 2016年12月13日 星期二 15时27分37秒 -- 79
1481614058 2016年12月13日 星期二 15时27分38秒 -- 80
1481614059 2016年12月13日 星期二 15时27分39秒 -- 81
...
$ dmesg -c
...
[39697.057079] nfs: server 192.168.195.136 not responding, still trying
[39701.648036] nfs: server 192.168.195.136 not responding, still trying
[39738.902904] nfs: server 192.168.195.136 not responding, timed out
[39918.946359] nfs: server 192.168.195.136 not responding, timed out
[39923.889380] nfs: server 192.168.195.136 not responding, timed out
...
$ cat /proc/fs/nfsfs/servers
NV SERVER PORT USE HOSTNAME
v4 c0a8c3c8 801 1 192.168.195.200
$ cat /proc/fs/nfsfs/volumes
NV SERVER PORT DEV FSID FSC
v4 c0a8c3c8 801 0:42 0:0 no
可以看到,在切换主机前后后,Develop主机上的写入进程大概被阻塞107秒(多次反复测试,均在95秒到110秒之间),之后可以正常进行读写。
在读写时进行主备切换,查看文件是否能够正确读写。
$ cp /Data/Software/OS/CentOS-7-x86_64-Everything-1511.iso .
$ md5sum /Data/Software/OS/CentOS-7-x86_64-Everything-1511.iso CentOS-7-x86_64-Everything-1511.iso
dba29c59117400b111633be2bf2aaf0e /Data/Software/OS/CentOS-7-x86_64-Everything-1511.iso
dba29c59117400b111633be2bf2aaf0e CentOS-7-x86_64-Everything-1511.iso
参考文档
Red Hat Enterprise Linux 7 High Availability Add-On Administration