1 前言
在部署EOS时,由于相同内容的文件在多个机器单独存储存在冗余且不方便管理,引入了NFS。而NFS默认是单Server多Client的,存在NFS Server单点故障的问题,因此需要实现NFS主备节点高可用方案。
在baidu和google搜了很多资料,最终定的方案是基于DRBD+Corosync+Pacemaker实现NFS主备节点高可用。
2 参考资料
2.1 NFS相关
- NFS官网
- Linux下NFS服务器的搭建与配置
- NFS原理详解
- NFS笔记(一)NFS服务器工作原理及详细配置
- NFS笔记(二)NFS服务器配置实例
2.2 Linux高可用相关
- Linux 高可用(HA)集群基本概念详解
2.3 DRBD相关
- DRBD官网
- Linux 高可用(HA)集群之DRBD详解
- DRBD(一) DRBD详解 及 DRBD配置
2.4 Corosync&Pacemaker相关
- Corosync Cluster Engine维基百科
- Corosync官网
- Pacemaker详解
2.5 Heartbeat相关
- Linux 高可用(HA)集群之Heartbeat详解
2.6 Keepalived相关
- Keepalived详细介绍简介
2.7 Rsync+Inotify相关
- rsync
- Rsync+Inotify实现文件自动同步
2.8 Linux LVM相关
- Linux下的磁盘分区和逻辑卷
- 一张图让你学会LVM
2.9 其它
- Corosync+Pacemaker+DRBD+NFS高可用实例配置
- linux下 lvm 磁盘扩容
- Pacemaker, Heartbeat, Corosync, WTF?
- What is the difference between keepalive and heartbeat?
- Hot-Stanby Mode vs. Active-Standby Mode
- High Availability - Cold, Warm, Hot
- Which messaging layer to use, Heartbeat or Corosync?
3 技术对比
3.1 Heartbeat/Corosync VS. Keepalived
Heartbeat和Corosync类似,都属于消息层(Messaging Layer),提供心跳检测等功能。它们主要用于面向集群(Cluster-Oriented)的产品,确保一个共享资源最多在一处呈现(ensure that a shared resource will be present at *at most* one place),这对共享文件系统和磁盘来说很重要。它们被设计为在切换节点时在一个节点关闭一项服务,并在另一个节点启动服务。因此,共享资源不会被并发访问(concurrently accessed)。
Keepalived主要用于面向网络(Network-Oriented)的产品,确保一个共享IP至少在一处呈现(ensure that a shared IP address will be present at *at least* one place),它无关服务或资源。它不会尝试启动或关闭一项服务,而是根据某些条件抉择哪一个节点更适合提供服务。因此,它更适合于路由冗余(redundant routers)、防火墙(firewalls)以及代理(proxies),而不是磁盘矩阵(disk arrays)或文件系统(filesystems)。一般使用Nginx + Keepalived + LVS 来实现高可用负载均衡。
3.2 Heartbeat VS. Corosync
|
Heartbeat |
Corosync |
社区活跃度 |
从2010年之后,就不再继续维护 |
仍然处于活跃期 |
配置复杂度 |
非常容易进行配置,第一次配置可能只需要几分钟 |
有一定的复杂度,需要一点耐心 |
管理资源的灵活性 |
只能为所有的资源配置一个主服务 |
允许为不同的资源组配置不同的主服务 |
资源粘连性 |
在主服务server1当机之后,切换到从服务节点server2; 还会把之前的主节点server1继续放入从属节点列表之内 |
会剔除出现问题的节点 |
配置文件的版本管理 |
需手动 |
自行处理配置文件的同步问题 |
分组管理 |
只支持2个节点 |
支持多个节点的集群,支持把资源进行分组,按照组进行资源的管理, 设置主服务,自行进行启停 |
Heartbeat已不再维护,将来会逐步弃用。
Corosync技术更新,设计更好,和Heartbeat比起来支持更多的PaceMaker特性,是未来的消息层(Messaging Layer)技术趋势。
3.3 DRBD VS. Rsync+Inotify
都有人用,无定论,为了降低部署和维护的复杂度,采用DRBD替代Rsync和Inotify的组合,可能更何时(需要时间证明)。
4 方案说明
经过前述分析,我们采用DRBD + Corosync + PaceMaker + NFS来实现NFS高可用。如下图所示:
其中:
- DRBD针对分区进行文件监测,实时自动同步文件变化;
- Corosync负责主备节点工作状态监测,配合Pacemaker进行资源调度等;
- Pacemaker负责接收Corosync消息,关闭故障主节点服务,启动备节点服务;
- NFS Server Master 对外提供NFS服务,NFS Server Slave为备节点。NFS Server双节点在Pacemaker中注册虚拟IP(VIP),对NFS Client提供NFS服务。
下图为磁盘、分区、目录等结构关系:
如上图,当业务需要,磁盘控件不足时,首先判断VG是否有剩余空间,有则补充给LV,没有则再新增磁盘、分区、新增PV,再扩展进VG中,最后补充给LV,即可完成磁盘动态扩展。
5 部署
5.1 准备工作
5.1.1 环境说明
机器 |
192.168.1.52 192.168.1.100 |
系统 |
CentOS7 Linux node2.micserver 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux |
磁盘 |
两台机器各新增4G磁盘一块 |
NFS VIP |
192.168.1.234 |
5.1.2 关闭防火墙&SELinux
//52 & 100机器均执行
[root@micserver2 ~]# systemctl status firewalld // 查看防火墙状态
[root@micserver2 ~]# systemctl stop firewalld // 关闭防火墙
[root@micserver2 ~]# systemctl disable firewalld // 关闭开机启动
[root@micserver2 ~]#
[root@micserver2 ~]#
[root@micserver2 ~]# getenforce // 查看SELinux状态
[root@micserver2 ~]# setenforce 0 // 关闭SELinux
[root@micserver2 ~]# vim /etc/selinux/config // 编辑文件,修改如下:
SELINUX=enforcing改为SELINUX=disabled
5.1.3 节点名称
配置/etc/hosts文件:
52 & 100机器均执行 |
[root@micserver2 ~]# hostname // 查看主机hostname [root@micserver2 ~]# vim /etc/hosts //编辑文件,新增如下(格式ip hostname): 192.168.1.52 micserver2.node4 192.168.1.100node2.micserver |
5.1.4 时间同步
已同步。
5.2 DRBD
DRBD用于同步磁盘数据。
机器磁盘准备一个干净的LVM分区(如/dev/mapper/drbdVG-drbdLV),DRBD虚拟一个/dev/drbdN(如/dev/drbd0)分区,与LVM分区映射。
DRBD主备节点新增一个目录(如/drbdDir),挂载/dev/drbd0分区。
DRBD主备模式下同一时刻只有一个机器挂载。
5.2.1 查看磁盘和分区情况
52 & 100机器均执行 |
[root@micserver2 ~]# fdisk -l // 查看机器原有磁盘和分区情况
磁盘 /dev/sda:268.4 GB, 268435456000 字节,524288000 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000948f4
设备 Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 524287999 261094400 8e Linux LVM
磁盘 /dev/mapper/cl-root:253.4 GB, 253403070464 字节,494927872 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/cl-swap:14.0 GB, 13954449408 字节,27254784 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
[root@micserver2 ~]# |
52 & 100机器均执行 |
[root@micserver2 ~]# df -h //查看挂载情况 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 236G 15G 222G 7% / devtmpfs 7.8G 0 7.8G 0% /dev tmpfs 7.8G 38M 7.8G 1% /dev/shm tmpfs 7.8G 8.5M 7.8G 1% /run tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/sda1 1014M 272M 743M 27% /boot tmpfs 1.6G 0 1.6G 0% /run/user/0 [root@micserver2 ~]# |
52 & 100机器均执行 |
[root@micserver2 ~]# pvs //查看pv信息 PV VG Fmt Attr PSize PFree /dev/sda2 cl lvm2 a-- <249.00g 0 [root@micserver2 ~]# vgs //查看vg信息 VG #PV #LV #SN Attr VSize VFree cl 1 2 0 wz--n- <249.00g 0 [root@micserver2 ~]# lvs //查看lv信息 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 236.00g swap cl -wi-ao---- <13.00g [root@micserver2 ~]# |
5.2.2 新增LVM分区
5.2.2.1 新增磁盘
通过vSphere Client给两台服务器虚拟机各新增一块磁盘。
5.2.2.2 新增LVM分区
使用刚刚新增的磁盘建立新的LVM分区,首先新建基本分区。
52 & 100机器均执行 |
[root@micserver2 ~]# fdisk -l
磁盘 /dev/sda:268.4 GB, 268435456000 字节,524288000 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000948f4
设备 Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 524287999 261094400 8e Linux LVM
磁盘 /dev/sdb:4294 MB, 4294967296 字节,8388608 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 //此/dev/sdb即新增的磁盘
磁盘 /dev/mapper/cl-root:253.4 GB, 253403070464 字节,494927872 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/cl-swap:14.0 GB, 13954449408 字节,27254784 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
|
52 & 100机器均执行 |
[root@micserver2 ~]# fdisk /dev/sdb //开始对新磁盘建立分区 欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。
Device does not contain a recognized partition table 使用磁盘标识符 0x86f49d58 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):m //查看帮助 命令操作 a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition g create a new empty GPT partition table G create an IRIX (SGI) partition table l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)
命令(输入 m 获取帮助): |
52 & 100机器均执行 |
命令(输入 m 获取帮助):n //新增一个分区 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p //新增基本分区 分区号 (1-4,默认 1): //分区号,默认值直接回车 起始 扇区 (2048-8388607,默认为 2048)://默认值直接回车 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-8388607,默认为 8388607)://默认值直接回车 将使用默认值 8388607 分区 1 已设置为 Linux 类型,大小设为 4 GiB
命令(输入 m 获取帮助): |
52 & 100机器均执行 |
命令(输入 m 获取帮助):w //保存修改 The partition table has been altered!
Calling ioctl() to re-read partition table. 正在同步磁盘。 [root@micserver2 ~]# fdisk -l //查看是否生效
磁盘 /dev/sda:268.4 GB, 268435456000 字节,524288000 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000948f4
设备 Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 524287999 261094400 8e Linux LVM
磁盘 /dev/sdb:4294 MB, 4294967296 字节,8388608 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x86f49d58 // 可以看到新增的基本分区 设备 Boot Start End Blocks Id System /dev/sdb1 2048 8388607 4193280 83 Linux
磁盘 /dev/mapper/cl-root:253.4 GB, 253403070464 字节,494927872 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/cl-swap:14.0 GB, 13954449408 字节,27254784 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
[root@micserver2 ~]# |
下面开始LVM分区。
52 & 100机器均执行 |
[root@micserver2 ~]# pvs //查看原有pv信息 PV VG Fmt Attr PSize PFree /dev/sda2 cl lvm2 a-- <249.00g 0 [root@micserver2 ~]# pvcreate /dev/sdb1 //新增pv Physical volume "/dev/sdb1" successfully created. [root@micserver2 ~]# [root@micserver2 ~]# [root@micserver2 ~]# [root@micserver2 ~]# pvs //查看新的pv信息 PV VG Fmt Attr PSize PFree /dev/sda2 cl lvm2 a-- <249.00g 0 /dev/sdb1 lvm2 --- <4.00g <4.00g [root@micserver2 ~]# |
52 & 100机器均执行 |
[root@micserver2 ~]# vgs //查看原有vg信息 VG #PV #LV #SN Attr VSize VFree cl 1 2 0 wz--n- <249.00g 0 [root@micserver2 ~]# vgcreate drbdvg /dev/sdb1 //新增vg Volume group "drbdvg" successfully created [root@micserver2 ~]# vgs //查看新的vg信息 VG #PV #LV #SN Attr VSize VFree cl 1 2 0 wz--n- <249.00g 0 drbdvg 1 0 0 wz--n- <4.00g <4.00g [root@micserver2 ~]# |
52 & 100机器均执行 |
[root@micserver2 ~]# vgdisplay //查看vg详细信息,重点是多少可用PE,后面要用 --- Volume group --- VG Name cl System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size <249.00 GiB PE Size 4.00 MiB Total PE 63743 Alloc PE / Size 63743 / <249.00 GiB Free PE / Size 0 / 0 VG UUID knkWYT-cobv-RkBj-Gil6-O2RM-THUm-7i44VQ
--- Volume group --- VG Name drbdvg System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size <4.00 GiB PE Size 4.00 MiB Total PE 1023 //总共1023个PE Alloc PE / Size 0 / 0 Free PE / Size 1023 / <4.00 GiB //可用1023个PE VG UUID B6WSXC-fiCH-Pc6a-EH43-msvs-VvDu-uyc00F
[root@micserver2 ~]# lvs //查看原有lv信息 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 236.00g swap cl -wi-ao---- <13.00g [root@micserver2 ~]# [root@micserver2 ~]# [root@micserver2 ~]# lvcreate -n drbdlv -l 1023 drbdvg //新增lv,填入1023个PE Logical volume "drbdlv" created. [root@micserver2 ~]# lvs //查看新的lv信息 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 236.00g swap cl -wi-ao---- <13.00g drbdlv drbdvg -wi-a----- <4.00g [root@micserver2 ~]# |
分区类型需要手动修改为Linux LVM,避免以后维护时对分区类型误解。
52 & 100机器均执行 |
[root@micserver2 ~]# fdisk -l //查看分区信息
磁盘 /dev/sdb:4294 MB, 4294967296 字节,8388608 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x86f49d58 //可以看到类型是Linux,需要改为实际的Linux LVM 设备 Boot Start End Blocks Id System /dev/sdb1 2048 8388607 4193280 83 Linux
磁盘 /dev/sda:268.4 GB, 268435456000 字节,524288000 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000948f4
设备 Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 524287999 261094400 8e Linux LVM
磁盘 /dev/mapper/cl-root:253.4 GB, 253403070464 字节,494927872 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/cl-swap:14.0 GB, 13954449408 字节,27254784 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/drbdvg-drbdlv:4290 MB, 4290772992 字节,8380416 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
[root@micserver2 ~]# fdisk /dev/sdb //准备修改 欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。
命令(输入 m 获取帮助):m //查看帮助 命令操作 a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition g create a new empty GPT partition table G create an IRIX (SGI) partition table l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) 命令(输入 m 获取帮助):p //查看分区信息
磁盘 /dev/sdb:4294 MB, 4294967296 字节,8388608 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x86f49d58
设备 Boot Start End Blocks Id System /dev/sdb1 2048 8388607 4193280 83 Linux
命令(输入 m 获取帮助):t //修改 已选择分区 1 //只有一个分区,自动选择 Hex 代码(输入 L 列出所有代码):L //查看类型代码
0 空 24 NEC DOS 81 Minix / 旧 Linu bf Solaris 1 FAT12 27 隐藏的 NTFS Win 82 Linux 交换 / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 隐藏的 C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx 5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据 6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具 8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt 9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问 a OS/2 启动管理器 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad 休 eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC 11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq 诊断 5c Priam Edisk a9 NetBSD f4 SpeedStor 14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f2 DOS 次要 16 隐藏的 FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS 17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fd Linux raid 自动 1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fe LANstep 1c 隐藏的 W95 FAT3 75 PC/IX be Solaris 启动 ff BBT 1e 隐藏的 W95 FAT1 80 旧 Minix Hex 代码(输入 L 列出所有代码):8e //输入8e,即Linux LVM 已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):w //保存修改 The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) 正在同步磁盘。 [root@micserver2 ~]# [root@micserver2 ~]# [root@micserver2 ~]# fdisk -l //查看修改结果
磁盘 /dev/sdb:4294 MB, 4294967296 字节,8388608 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x86f49d58 //修改成功 设备 Boot Start End Blocks Id System /dev/sdb1 2048 8388607 4193280 8e Linux LVM
磁盘 /dev/sda:268.4 GB, 268435456000 字节,524288000 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000948f4
设备 Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 524287999 261094400 8e Linux LVM
磁盘 /dev/mapper/cl-root:253.4 GB, 253403070464 字节,494927872 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/cl-swap:14.0 GB, 13954449408 字节,27254784 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/drbdvg-drbdlv:4290 MB, 4290772992 字节,8380416 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
[root@micserver2 ~]# |
5.2.3 DRBD安装
从ELREPO下载kmod-drbd84和drbd84-utils两个包。
52 & 100机器均执行 |
[root@micserver2 ~]#rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@micserver2 ~]#rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm [root@micserver2 ~]#yum install -y kmod-drbd84 drbd84-utils |
5.2.4 DRBD配置
在52机器修改配置文件,scp发送到100机器。
52 机器执行 |
[root@micserver2 ~]# cat /etc/drbd.conf //查看主配置文件,不需要修改 # You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf"; include "drbd.d/*.res"; [root@micserver2 ~]#
[root@micserver2 ~]# cd /etc/drbd.d //cd到要修改的配置文件路径
[root@micserver2 drbd.d]# cp global_common.conf global_common.conf.orig //备份 [root@micserver2 drbd.d]# vim global_common.conf //修改 # DRBD is the result of over a decade of development by LINBIT. # In case you need professional services for DRBD or have # feature requests visit http://www.linbit.com
global { usage-count no; #是否参与官方数据搜集,yes改为no
# Decide what kind of udev symlinks you want for "implicit" volumes # (those without explicit volume # /dev/drbd/by-resource/ # /dev/drbd/by-resource/ #udev-always-use-vnr; # treat implicit the same as explicit volumes #注释掉
# minor-count dialog-refresh disable-ip-verification # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600; }
common { protocol C; #新增,协议为C handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when choosing your poison. #去掉以下几行注释 pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; # quorum-lost "/usr/lib/drbd/notify-quorum-lost.sh root"; }
startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb }
options { # cpu-mask on-no-data-accessible
# RECOMMENDED for three or more storage nodes with DRBD 9: # quorum majority; # on-no-quorum suspend-io | io-error; }
disk { on-io-error detach; #新增 # size on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout }
net { # protocol timeout max-epoch-size max-buffers # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle } }
[root@micserver2 drbd.d]# vim nfsha.res //新增资源配置文件,服务与文件同名 resource nfsha { #资源nfsha:NFS高可用 on micserver2.node4 { #52机器hostname device /dev/drbd0; #虚拟drbd设备 disk /dev/mapper/drbdVG-drbdLV; #实际LVM磁盘 address 192.168.1.52:7789; #ip:port meta-disk internal; #元数据与资源数据存在一起:disk } on node2.micserver { #100机器 device /dev/drbd0; disk /dev/mapper/drbdVG-drbdLV; address 192.168.1.100:7789; meta-disk internal; } }
[root@micserver2 drbd.d]# scp global_common.conf nfsha.res 192.168.1.100:/etc/drbd.d/ //修改后的配置文件拷贝到100机器 [email protected]'s password: global_common.conf 100% 2670 4.8MB/s 00:00 nfsha.res 100% 399 1.1MB/s 00:00 [root@micserver2 drbd.d]# |
5.2.5 DRBD启动
52 & 100机器均执行 |
[root@micserver2 ~]# drbdadm create-md nfsha //创建元数据 initializing activity log initializing bitmap (128 KB) to all zero Writing meta data... New drbd meta data block successfully created. [root@micserver2 ~]# |
52 & 100机器均执行 |
[root@micserver2 ~]# systemctl start drbd //启动服务 [root@micserver2 ~]# systemctl status drbd //查看服务状态 ● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager. Loaded: loaded (/usr/lib/systemd/system/drbd.service; disabled; vendor preset: disabled) Active: active (exited) since 三 2019-01-16 14:04:50 CST; 2min 9s ago Process: 13212 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS) Main PID: 13212 (code=exited, status=0/SUCCESS)
1月 16 11:35:17 micserver2.node4 systemd[1]: Starting DRBD -- please disable. Unless you are NOT using a cluster manager.... 1月 16 11:35:17 micserver2.node4 drbd[13212]: Starting DRBD resources: [ 1月 16 11:35:17 micserver2.node4 drbd[13212]: create res: nfsha 1月 16 11:35:17 micserver2.node4 drbd[13212]: prepare disk: nfsha 1月 16 11:35:17 micserver2.node4 drbd[13212]: adjust disk: nfsha 1月 16 11:35:17 micserver2.node4 drbd[13212]: adjust net: nfsha 1月 16 11:35:17 micserver2.node4 drbd[13212]: ] 1月 16 14:04:50 micserver2.node4 drbd[13212]: WARN: stdin/stdout is not a TTY; using /dev/console 1月 16 14:04:50 micserver2.node4 drbd[13212]: . 1月 16 14:04:50 micserver2.node4 systemd[1]: Started DRBD -- please disable. Unless you are NOT using a cluster manager.. |
52 & 100机器均执行 |
[root@micserver2 ~]# cat /proc/drbd //查看主备信息 version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Diskless C r----- ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4190044 [root@micserver2 ~]# chkconfig drbd on // 开机启动 |
52 机器执行 |
[root@micserver2 ~]# drbdadm -- --overwrite-data-of-peer primary nfsha // 设为主节点 [root@micserver2 ~]# cat /proc/drbd //查看主备信息 version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:5028864 nr:0 dw:0 dr:5029776 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:257103004 [>....................] sync'ed: 2.0% (251076/255988)M finish: 1:44:35 speed: 40,960 (33,976) K/sec // 出现正在同步时,等待其100%结束。 [root@micserver2 ~]# mkfs.ext4 /dev/drbd0 //设置文件系统格式 [root@micserver2 ~]# mkdir /drbdDir //新建本地目录 [root@micserver2 ~]# mount /dev/drbd0 /drbdDir //挂载 [root@micserver2 ~]# cp /etc/drbd.d/nfsha.res /drbdDir //拷贝一个文件到该目录 |
模拟52机器宕机,切换主备&卸载分区:
52 机器执行 |
[root@micserver2 ~]# umount /drbdDir //卸载 [root@micserver2 ~]# drbdadm secondary nfsha //切为备节点 |
100机器执行 |
[root@node2 drbdDir]# drbdadm primary nfsha //切为主节点 [root@node2 drbdDir]# mount /dev/drbd0 /drbdDir //挂载 [root@node2 drbdDir]# cd /drbdDir //cd到/drbdDir目录 [root@node2 drbdDir]# ls //查看文件nfsha.res是否备份过来 |
5.3 Corosync+Pacemaker
5.3.1 安装
5.3.1.1 安装corosync&pacemaker
52 & 100机器均执行 |
[root@micserver2 ~]# yum install corosync pacemaker -y |
5.3.1.2 安装crm
从以下地址下载相关RPM包并安装:
http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/noarch/
52 & 100机器均执行 |
[root@micserver2 ~]# yum install python-dateutil python-lxml -y [root@micserver2 ~]# rpm -ivh crmsh-3.0.0-6.2.noarch.rpm crmsh-scripts-3.0.0-6.2.noarch.rpm python-parallax-1.0.1-29.1.noarch.rpm python-pssh-2.3.1-7.4.noarch.rpm |
5.3.2 corosync配置
52 机器执行 |
[root@micserver2 ~]# cd /etc/corosync // cd到配置文件目录 [root@micserver2 etc/corosync]# cp corosync.conf.example corosync.conf // 复制模板文件,或直接拷贝以下内容 [root@micserver2 ~]# vim corosync.conf totem { version: 2
crypto_cipher: none crypto_hash: none
interface { ringnumber: 0 bindnetaddr: 192.168.1.0 mcastport: 5405 } transport: udpu } service { name: pacemaker } logging { fileline: off to_stderr: no to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: yes debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } amf { mode: disabled } aisexec { user: root greoup: root } quorum { provider: corosync_votequorum expected_votes: 2 two_nodes: 1 } nodelist { node { nodeid: 1 ring0_addr: 192.168.1.52 name: micserver2.node4 } node { nodeid: 2 ring0_addr: 192.168.1.100 name: node2.micserver } } |
5.3.3 创建通信认证文件
各节点之间通信需要安全认证,需要安全密钥,生成后会自动保存至当前目录下,命名为authkey,权限为400。
52机器执行 |
[root@micserver2 corosync]# corosync-keygen [root@micserver2 corosync]# scp -p authkey corosync.conf 192.168.1.100:/etc/corosync/ |
5.3.4 启动
52 & 100机器均执行 |
[root@micserver2 ~]# systemctl status corosync // 检查corosync状态 [root@micserver2 ~]# systemctl start corosync // 启动corosync [root@micserver2 ~]# systemctl status corosync // 检查corosync状态 [root@micserver2 ~]# [root@micserver2 ~]# systemctl status pacemaker // 检查pacemaker状态 [root@micserver2 ~]# systemctl start pacemaker // 启动pacemaker [root@micserver2 ~]# systemctl status pacemaker // 检查pacemaker状态 [root@micserver2 ~]# [root@micserver2 ~]# chkconfig corosync on // 开机启动 [root@micserver2 ~]# chkconfig pacemaker on // 开机启动 |
5.3.5 查看状态
[root@micserver2 ~]# crm status Stack: corosync Current DC: micserver2.node4 (version 1.1.19-8.el7_6.2-c3c624ea3d) - partition with quorum Last updated: Thu Jan 17 16:01:00 2019 Last change: Thu Jan 17 15:58:55 2019 by hacluster via crmd on micserver2.node4
2 nodes configured 0 resources configured
Online: [ micserver2.node4 node2.micserver ]
No resources
[root@micserver2 ~]# |
5.3.6 查看端口占用
[root@micserver2 ~]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1136/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1368/master tcp6 0 0 :::2375 :::* LISTEN 1139/dockerd tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 1136/sshd tcp6 0 0 ::1:25 :::* LISTEN 1368/master udp 0 0 127.0.0.1:323 0.0.0.0:* 778/chronyd udp 0 0 192.168.1.52:5405 0.0.0.0:* 3671/corosync udp 0 0 192.168.1.52:38244 0.0.0.0:* 3671/corosync udp 0 0 192.168.1.52:46683 0.0.0.0:* 3671/corosync udp6 0 0 ::1:323 :::* 778/chronyd |
5.3.7 查看日志
[root@micserver2 ~]# cd /var/log/cluster/ [root@micserver2 cluster]# ls corosync.log corosync.log-20190114.gz corosync.log-20190115.gz corosync.log-20190116.gz corosync.log-20190117.gz corosync.log.bak corosync.log.bak2 [root@micserver2 cluster]# vim corosync.log |
5.3.8 pacemaker配置
52 机器执行 |
[root@micserver2 ~]# crm configure //进入configure crm(live)configure# property stonith-enabled=false crm(live)configure# property no-quorum-policy=ignore crm(live)configure# rsc_defaults resource-stickiness=100 crm(live)configure# crm(live)configure# show //显示配置信息 node 1: micserver2.node4 node 2: node2.micserver property cib-bootstrap-options: \ no-quorum-policy=ignore \ stonith-enabled=false \ have-watchdog=false \ dc-version=1.1.19-8.el7_6.2-c3c624ea3d \ cluster-infrastructure=corosync rsc_defaults rsc-options: \ resource-stickness=100 \ resource-stickiness=100 crm(live)configure# verify //检查配置是否有效 crm(live)configure# edit //直接编辑配置文件 crm(live)configure# verify crm(live)configure# show node 1: micserver2.node4 node 2: node2.micserver property cib-bootstrap-options: \ no-quorum-policy=ignore \ stonith-enabled=false \ have-watchdog=false \ dc-version=1.1.19-8.el7_6.2-c3c624ea3d \ cluster-infrastructure=corosync rsc_defaults rsc-options: \ resource-stickiness=100 crm(live)configure#commit //提交修改 crm(live)configure#q //退出 |
5.4 NFS
5.4.1 安装
52 & 100机器均执行 |
[root@micserver2 ~]# rpm -qa | grep nfs //检查是否已安装 nfs-utils-1.3.0-0.48.el7_4.1.x86_64 libnfsidmap-0.25-17.el7.x86_64 [root@micserver2 ~]# rpm -qa | grep rpcbind //检查是否已安装 rpcbind-0.2.0-42.el7.x86_64 |
52 & 100机器均执行 |
[root@micserver2 ~]# yum -y install nfs-utils rpcbind //如未安装则安装 |
5.4.2 配置NFS目录
52 & 100机器均执行 |
[root@micserver2 ~]# vim /etc/exports //配置文件修改 /drbdDir 192.168.1.0/24(rw,no_root_squash,sync)
[root@micserver2 ~]# exportfs -r //使修改生效 |
5.4.3 启动服务
52 & 100机器均执行 |
[root@micserver2 ~]# systemctl status nfs ● nfs-server.service - NFS server and services Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled) Active: inactive (dead) [root@micserver2 ~]# systemctl status rpcbind ● rpcbind.service - RPC bind service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled) Active: inactive (dead) [root@micserver2 ~]# systemctl start rpcbind //先启动rpcbind再启动nfs [root@micserver2 ~]# systemctl status rpcbind ● rpcbind.service - RPC bind service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled) Active: active (running) since 四 2019-01-17 16:55:43 CST; 5s ago Process: 3819 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS) Main PID: 3820 (rpcbind) Memory: 596.0K CGroup: /system.slice/rpcbind.service └─3820 /sbin/rpcbind -w
1月 17 16:55:43 micserver2.node4 systemd[1]: Starting RPC bind service... 1月 17 16:55:43 micserver2.node4 systemd[1]: Started RPC bind service. [root@micserver2 ~]# [root@micserver2 ~]# [root@micserver2 ~]# systemctl start nfs [root@micserver2 ~]# systemctl status nfs ● nfs-server.service - NFS server and services Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled) Active: active (exited) since 四 2019-01-17 16:55:56 CST; 4s ago Process: 3847 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS) Process: 3841 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS) Process: 3837 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS) Main PID: 3847 (code=exited, status=0/SUCCESS) Memory: 0B CGroup: /system.slice/nfs-server.service
1月 17 16:55:56 micserver2.node4 systemd[1]: Starting NFS server and services... 1月 17 16:55:56 micserver2.node4 systemd[1]: Started NFS server and services. [root@micserver2 ~]# [root@micserver2 ~]# chkconfig nfs on // 开机启动 |
52 & 100机器均执行 |
[root@micserver2 ~]# rpcinfo -p localhost //查看端口信息 program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100024 1 udp 53063 status 100024 1 tcp 35692 status 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 37232 nlockmgr 100021 3 udp 37232 nlockmgr 100021 4 udp 37232 nlockmgr 100021 1 tcp 39224 nlockmgr 100021 3 tcp 39224 nlockmgr 100021 4 tcp 39224 nlockmgr [root@micserver2 ~]# |
5.4.4 注册Pacemaker资源
以下为crm primitive创建资源的命令说明,进入crm configure后输入help或?即可查看,具体子项查看方式:help primitive。
primitive [description= [[params] attr_list] [meta attr_list] [utilization attr_list] [operations id_spec] [op op_type [
attr_list :: [$id= id_spec :: $id= op_type :: start | stop | monitor |
52机器执行 |
//通过crm操作pacemaker,创建pacemaker资源:NFS VIP crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=192.168.1.234 cidr_netmask=24 op monitor interval=30s timeout=20s on-fail=restart crm(live)configure# verify |
52机器执行 |
//创建DRBD主、备资源 crm(live)configure# primitive drbd ocf:linbit:drbd params drbd_resource=nfsha op monitor role=Master interval=20 timeout=30 op monitor role=Slave interval=30 timeout=30 op start timeout=240 op stop timeout=100 |
52机器执行 |
//DRBD主备模式设置 crm(live)configure# ms ms_drbd drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true //NFS主备资源 primitive storefs ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/drbdDir fstype=ext4 op start timeout=60s op stop timeout=60s op monitor interval=30s timeout=40s on-fail=restart
crm(live)configure# verify crm(live)configure# show node 1: micserver2.node4 node 2: node2.micserver primitive drbd ocf:linbit:drbd \ params drbd_resource=nfsha \ op monitor role=Master interval=20 timeout=30 \ op monitor role=Slave interval=30 timeout=30 \ op start timeout=240 interval=0 \ op stop timeout=100 interval=0 primitive storefs Filesystem \ params device="/dev/drbd0" directory="/drbdDir" fstype=ext4 \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 \ op monitor interval=30s timeout=40s on-fail=restart primitive vip IPaddr \ params ip=192.168.1.234 cidr_netmask=24 \ op monitor interval=30s timeout=20s on-fail=restart ms ms_drbd drbd \ meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true property cib-bootstrap-options: \ no-quorum-policy=ignore \ stonith-enabled=false \ have-watchdog=false \ dc-version=1.1.19-8.el7_6.2-c3c624ea3d \ cluster-infrastructure=corosync rsc_defaults rsc-options: \ resource-stickiness=100 crm(live)configure# |
52机器执行 |
crm(live)configure# group g_nfsha vip storefs //VIP与NFS绑定成组 crm(live)configure# verify |
52机器执行 |
crm(live)configure# colocation c_g_nfsha inf: g_nfsha ms_drbd:Master //NFS约束于DRBD主节点 crm(live)configure# verify |
52机器执行 |
crm(live)configure# colocation storefs_with_drbd_master inf: g_nfsha ms_drbd:Master crm(live)configure# verify |
52机器执行 |
crm(live)configure# order o_g_nfsha inf: ms_drbd:promote g_nfsha:start crm(live)configure# verify crm(live)configure# commit crm(live)configure# q bye [root@micserver2 ~]# |
52 & 100机器均执行 |
[root@micserver2 ~]# crm status Stack: corosync Current DC: node2.micserver (version 1.1.19-8.el7_6.2-c3c624ea3d) - partition with quorum Last updated: Thu Jan 17 18:10:29 2019 Last change: Thu Jan 17 18:09:53 2019 by root via cibadmin on micserver2.node4
2 nodes configured 4 resources configured
Online: [ micserver2.node4 node2.micserver ]
Full list of resources:
Master/Slave Set: ms_drbd [drbd] Masters: [ micserver2.node4 ] Slaves: [ node2.micserver ] Resource Group: g_nfsha vip (ocf::heartbeat:IPaddr): Started micserver2.node4 storefs (ocf::heartbeat:Filesystem): Started micserver2.node4
[root@micserver2 ~]# |
5.4.5 NFS客户端
52机器执行 |
[root@node1 ~]# rpm -qa | grep nfs nfs-utils-1.3.0-0.54.el7.x86_64 libnfsidmap-0.25-19.el7.x86_64 [root@node1 ~]# yum -y install nfs-utils
[root@node1 ~]# showmount -e 192.168.1.234 //显示NFS VIP 的可用挂载点 Export list for 192.168.1.234: /drbdDir 192.168.1.0/24 [root@node1 ~]# mkdir /clientNFSDir [root@node1 ~]# mount -t nfs 192.168.1.234:/drbdDir /clientNFSDir [root@node1 ~]# cd /clientNFSDir/ [root@node1 clientNFSDir]# ls node-v8.9.3-linux-x64.tar README.md [root@node1 clientNFSDir]# |
6 常见报错
6.1 启动Corosync报错
提示使用systemctl status corosync 和 journalctl -xe查看日志。
发现显示:No ring0_addr specified for node
6.1.1 原因分析
配置文件拼写错误,node中ring0_addr写成了ring0_add。
6.1.2 解决方式
配置文件node中ring0_add改为ring0_addr。
6.2 drbdadm create-md nfsha失败
[root@micserver2 ~]# drbdadm create-md nfsha modinfo: ERROR: Module drbd not found. modinfo: ERROR: Module drbd not found. open(/dev/mapper/drbdvg-drbdlv) failed: Device or resource busy
Exclusive open failed. Do it anyways? [need to type 'yes' to confirm] no
open(/dev/mapper/drbdvg-drbdlv) failed: Device or resource busy
Exclusive open failed. Do it anyways? [need to type 'yes' to confirm]
Operation canceled. Command 'drbdmeta 0 v09 /dev/mapper/drbdvg-drbdlv internal create-md 1' terminated with ex [root@micserver2 ~]# |
6.2.1 原因分析
drbd创建服务时,对于的disk(/dev/mapper/drbdvg-drbdlv)必须是干净的,不可以挂载、不可以有文件系统。因此,在DRBD安装前准备分区时不要对LVM分区进行mkfs格式化和挂载(mount)。
6.2.2 解决方式
对于已经格式化的情况,先卸载,再去格式化:
[root@micserver2 ~]# umount /drbddir [root@micserver2 ~]# dd if=/dev/zero of=/dev/mapper/drbdvg-drbdlv bs=1M count=1 |
6.3 DRBD启动失败
Jan 16 13:37:29 node1.micserver systemd[1]: Starting DRBD -- please disable. Unless you are NOT using a cluster manager.... Jan 16 13:37:29 node1.micserver drbd[13092]: Can not load the drbd module. Jan 16 13:37:29 node1.micserver systemd[1]: drbd.service: main process exited, code=exited, status=5/NOTINSTALLED Jan 16 13:37:29 node1.micserver systemd[1]: Failed to start DRBD -- please disable. Unless you are NOT using a cluster manager.. Jan 16 13:37:29 node1.micserver systemd[1]: Unit drbd.service entered failed state. Jan 16 13:37:29 node1.micserver systemd[1]: drbd.service failed. |
6.3.1 原因分析
内核版本过低,不支持kmod-drbd84和drbd84-utils。
6.3.2 解决方式
切换或升级内核版本到3.10.0-957.1.3.el7.x86_64内核版本。
6.4 挂载DRBD失败
mkfs.ext4: Wrong medium type while trying to determine filesystem size |
6.4.1 原因分析
备节点不可以挂载。
6.5 DRBD启动失败,Disk分配失败
adjust disk: nfsha:failed(apply-al:1) |
6.5.1 原因分析
可能是磁盘有脏数据,在52机器执行”drbdadm create-md nfsha”后,再调用”systemctl start drbd”,过20秒在100执行”drbdadm create-md nfsha”后,再调用”systemctl start drbd”,52会出现上述错误。
6.5.2 解决方式
52&100机器均先停止服务“systemctl stop drbd”,然后52&100机器分别执行”drbdadm create-md nfsha”,出现下述提示时输入”yes”
[root@micserver2 ~]# drbdadm create-md nfsha You want me to create a v08 style flexible-size internal meta data block. There appears to be a v09 flexible-size internal meta data block already in place on /dev/mapper/drbdVG-drbdLV at byte offset 268431257600
Valid v09 meta-data found, convert to v08? [need to type 'yes' to confirm] yes
Writing meta data... New drbd meta data block successfully created. |
然后52&100机器分别执行“systemctl start drbd”,解决。
6.6 NFS客户端写无权限
[root@node1 clientNFSDir]# cp ~/pssh-2.3.1-7.4.noarch.rpm /clientNFSDir/ cp: cannot create regular file ‘/clientNFSDir/pssh-2.3.1-7.4.noarch.rpm’: Permission denied [root@node1 clientNFSDir]# |
6.6.1 原因分析
配置NFS路径时指定了all_squash,导致客户端访问时账户名被转为无权限的非root用户。
[root@micserver2 ~]# vim /etc/exports /drbdDir 192.168.1.0/24(rw,no_root_squash,sync,all_squash) |
6.6.2 解决方式
[root@micserver2 ~]# vim /etc/exports /drbdDir 192.168.1.0/24(rw,no_root_squash,sync) [root@micserver2 ~]# exportfs -a [root@micserver2 ~]# systemctl restart nfs
[root@node1 clientNFSDir]# cp ~/pssh-2.3.1-7.4.noarch.rpm /clientNFSDir/ [root@node1 clientNFSDir]# cp ~/python-pssh-2.3.1-7.4.noarch.rpm /clientNFSDir/ [root@node1 clientNFSDir]# ls node-v8.9.3-linux-x64.tar pssh-2.3.1-7.4.noarch.rpm python-pssh-2.3.1-7.4.noarch.rpm README.md [root@node1 clientNFSDir]# [root@micserver2 ~]# cd /drbdDir/ [root@micserver2 drbdDir]# ls node-v8.9.3-linux-x64.tar pssh-2.3.1-7.4.noarch.rpm python-pssh-2.3.1-7.4.noarch.rpm README.md |
6.7 NFS服务端主备切换后,NFS客户端无法挂载
[root@node1 ~]# showmount -e 192.168.1.100 Export list for 192.168.1.100: /setup/nfs/lsbcmccdb * /setup/nfs/blockchain * [root@node1 ~]# cd /clientNFSDir -bash: cd: /clientNFSDir: Stale file handle [root@node1 ~]# |
6.7.1 原因分析
无法挂载,showmount不显示。
100机器被切换为NFS主节点后,查看/etc/exports文件,发现没有/drbdDir 192.168.1.0/24(rw,no_root_squash,sync)。主备节点NFS配置文件都要加。
6.7.2 解决方式
[root@node2 ~]# vim /etc/exports [root@node2 ~]# [root@node2 ~]# [root@node2 ~]# exportfs -a |
6.8 双节点重启后,cat /proc/drbd互相显示对方Unknown
[root@micserver2 ~]# cat /proc/drbd version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r----- ns:0 nr:0 dw:4 dr:2121 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:28 [root@micserver2 ~]# |
[root@node2 ~]# cat /proc/drbd version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:8 [root@node2 ~]# |
6.8.1 原因分析
对于DRBD主备节点互相Unknown,一个节点显示StandAlone,一个节点显示StandAlone或WFConnection,就是脑裂,需要手动恢复。
查看日志:/var/log/message会有“Split-Brain detected but unresolved, dropping connection!”提示。
6.8.2 解决方式
手动在希望丢弃其数据的节点执行:
[root@node2 drbdDir]# drbdadm -- --discard-my-data connect all |
手动在希望保留其数据的节点执行:
[root@micserver2 ~]# drbdadm connect nfsha |
7 联想
此次研究,学到了很多新知识。但是还有很多可以拓展的方向,先记下来后续再研究。
- Corosync&Pacemaker&DRBD&NFS更高级的使用技巧
- Linux基础知识,包括磁盘、分区、网络等
- Rsync+Inotify
- 其它文件共享技术
- 负载均衡,ZooKeeper等技术