基于DRBD+Corosync+Pacemaker的NFS主备节点高可用方案

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的NFS主备节点高可用方案_第1张图片

其中:

  • DRBD针对分区进行文件监测,实时自动同步文件变化;
  • Corosync负责主备节点工作状态监测,配合Pacemaker进行资源调度等;
  • Pacemaker负责接收Corosync消息,关闭故障主节点服务,启动备节点服务;
  • NFS Server Master 对外提供NFS服务,NFS Server Slave为备节点。NFS Server双节点在Pacemaker中注册虚拟IP(VIP),对NFS Client提供NFS服务。

下图为磁盘、分区、目录等结构关系:

基于DRBD+Corosync+Pacemaker的NFS主备节点高可用方案_第2张图片

如上图,当业务需要,磁盘控件不足时,首先判断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 {} block, implied vnr=0):

       # /dev/drbd/by-resource//   (explicit volumes)

       # /dev/drbd/by-resource/         (default for implict)

       #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 {[:[:]]|@