基本环境
  -  总共四台虚拟机,安装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