DRBD安装说明
安装说明:本方案针对中标麒麟7.2操作系统适配

编译环境准备
- 编译前确认以下包是否安装,如果不存在则进行安装。
elfutils-libs-0.163-3.el7.x86_64
elfutils-0.163-3.el7.x86_64
rpm-build-4.11.3-17.el7.ns7.01.x86_64
cpp-4.8.5-4.el7.ns7.01.x86_64
kernel-headers-3.10.0-327.el7.x86_64
glibc-headers-2.17-106.el7_2.1.ns7.01.x86_64
glibc-devel-2.17-106.el7_2.1.ns7.01.x86_64
libgomp-4.8.5-4.el7.ns7.01.x86_64
gcc-4.8.5-4.el7.ns7.01.x86_64
kernel-devel-3.10.0-327.el7.x86_64
注意:安装kernel-devel 的版本要与你机器上的版本一致。
flex.x86_64
0:2.5.37-3.el7
gcc-c++-4.8.5-4.el7.ns7.01.x86_64
make-3.82-21.el7.x86_64
automake-1.13.4-3.el7.noarch
autoconf-2.69-11.el7.noarch
libxslt-1.1.28-5.el7.x86_64
libxslt-devel.x86_64
0:1.1.28-5.el7
docbook-style-xsl.noarch
0:1.78.1-3.el7
help2man-1.41.1-3.el7.noarch
安装完成后重启服务器 reboot
DRBD安装
- 编译前先创建程序目录,在/root目录下创建
mkdir -p
rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
- drbd-9.0.15-1.tar.gz
[root@mail1 ~]# tar zxvf drbd-9.0.15-1.tar.gz
[root@mail1 ~]# cd drbd-9.0.15-1/
[root@mail1 drbd-9.0.15-1]# make kmp-rpm

- drbdmanage-0.99.18.tar.gz
[root@mail1 ~]# tar zxvf drbdmanage-0.99.18.tar.gz
[root@mail2 drbdmanage-0.99.18]# make rpm

- drbd-utils-9.5.0.tar.gz
[root@mail1 ~]# tar zxvf drbd-utils-9.5.0.tar.gz
修改配置文件
[root@mail1 drbd-utils-9.5.0]# vi drbd.spec.in
#Line 34 加入:
%undefine with_sbinsymlinks

[root@mail2 drbd-utils-9.5.0]# ./configure

[root@mail1 drbd-utils-9.5.0]# make rpm

进入到编译完成的rpm包目录
[root@mail1 drbd-utils-9.5.0]# cd /root/rpmbuild/RPMS/x86_64/
安装编译完成的rpm包
[root@mail1 x86_64]# rpm -Uvh drbd-utils-9.5.0-1.el7.x86_64.rpm
drbd-udev-9.5.0-1.el7.x86_64.rpm drbd-bash-completion-9.5.0-1.el7.x86_64.rpm
kmod-drbd-9.0.15_3.10.0_327-1.x86_64.rpm

[root@mail1 ~]# rpm -Uvh /root/drbdmanage-0.99.18/dist/drbdmanage-0.99.18-1.noarch.rpm

- 安装完成测试是否可以使用drbdadm相关命令,如果可以则证明编译成功(编译过程中无报错)
DRBD配置和测试
环境配置
- 主机名修改
drbd是基于主机名解析的
hostnamectl set-hostname


- 服务器添加第二快网卡,两台服务器直连,进行drbd数据的传输,并添加到host文件中

- 创建数据盘、但不要进行格式化操作,会在进行DRBD启动的时候进行格式化操作、
- drbd配置文件。注意:此配置是drbd8.4的,与drbd9版本的配置差别比较大
drbd的主配置文件/etc/drbd.conf,为了管理的便捷性,在此文件中使用了include指令指定了包含的配置文件段,默认的是 在/etc/drbd.d/目录下。在此目录有全局配置文件global_common.conf和其他配置文件*.res文件。 其中在主配置文件中include全局配置文件的指令只能出现一个,且必须出现在最前面。两个节点的配置文件应尽量完全一致。
- global_common.conf 配置内容如下:
global {
usage-count no;
}
common {
handlers{ # 定义出现以下问题(如splitbrain或out-of-sync错误)时处理策略
pri-on-incon-degr "/usr/lib/drbd/;
/usr/lib/drbd/; echo b > /proc/sysrq-trigger ;
reboot -f";
pri-lost-after-sb "/usr/lib/drbd/;
/usr/lib/drbd/; echo b > /proc/sysrq-trigger ;
reboot -f";
local-io-error
"/usr/lib/drbd/;
/usr/lib/drbd/; echo o > /proc/sysrq-trigger ;
halt -f";
split-brain
"/usr/lib/drbd/ root";
out-of-sync
"/usr/lib/drbd/ root";
}
disk {
on-io-error
detach; # 当发生io错误时,直接拔除备节点设备
resync-rate 600M;
}
protocol C; # 定义使用C协议,即同步复制。可不定义,此为默认
}

- 再新建一个配置文件data1.res,里面定义资源。
resource mydrbd {
on {
device /dev/drbd0;
disk /dev/sdb1;
address
192.168.1.1:7789;
meta-disk internal;
}
on {
device /dev/drbd0;
disk /dev/sdb1;
address
192.168.1.2:7789;
meta-disk internal;
}
}
注:在on
hostname段中,hostname必须和uname
-n一致,因为drbd默认是基于主机名进行解析的。
但是,drbd支持基于ip地址的解析,这时drbd根据ip地址进行漂移,ip地址在哪个主机上,就解析到哪个主机上

- 对两节点都进行初始化
drbdadm create-md mydrbd (mydrbd为创建的资源名称)

- 初始化成功后,可以使用下面几个命令来获取drbd的metadata区信息


blockdev --getsz /dev/sdb1

- 在节点上启动drbd
systemctl restart drbd
drbdadm up mydrbd
说明:以下出错的原因是因为drbdadm把错误的配置文件已缓存,我们可以通过 关闭/重启 drbdadm设备来解决。

验证:

- 实现drbd主从同步
在需要设置为主机点的机器上执行:drbdadm primary --force data1
其中"--force"表示强制升级为primary,这会导致本节点的数据强制同步到对端上。
查看状态
drbdadm status mydrbd


Primary状态为主、secondary为从
可以看到本端已经设置为主节点
数据同步和主从角色切换
- 格式化drbd磁盘(只有drbd状态为主才可以进行格式化挂载操作)

- 挂载到数据盘

- 对磁盘进行操作

数据同步和主从角色切换
现在已经有一端是主节点了。drbd的主从节点中,只有主节点是可以挂载并进行读写的。
所以在主节点上挂载drbd设备.
挂载drbd到mnt,然后向其中拷贝一个文件。
- 在主机上卸载磁盘,并将drbd状态设为从

- 在备节点将drbd设置为主、并且格式化挂载对应的磁盘
drbdadm primary mydrbd –force

格式化drbd磁盘
mkfs -t ext4 /dev/drbd0
挂载磁盘到数据目录,查看之前创建的文件是否同步,如果未同步,重新执行一遍流程即可(因为在主机执行数据同步的时候,备机磁盘未格式化无法使用)
测试方法:在两台服务器drbd都格式化的情况下,将其中一台设为主,挂载磁盘并创建文件,然后再将其设置为从,将对应的drbd盘挂载到备机即可看到数据。
如果可以正常同步证明drbd编译配置完成
corosync+Pacemeker高可用
安装配置
- 配置双机信任
mail1

mail2

- 安装集群组件(两台都安装)
yum install -y pacemaker pcs psmisc policycoreutils-python
验证

安装完毕后,会生成一个hacluster用户,供集群使用。
- 启动pcs并设为开机启动 (pcs是pacemaker的命令行管理工具,用来管理同步各个节点的corosync的配置文件)
systemctl start pcsd
systemctl enable pcsd

- 为hacluster设置密码 安装组件生成的hacluster用户,用来本地启动pcs进程,因此我们需要设定密码,每个节点的密码相同。

说明:(报错解决)
[root@node1 ~]# pcs cluster auth node1 node2
Username: hacluster
Password:
Error: Operation timed out
node1: Authorized
Error: Unable to communicate with node2
解决方法:
升级3个与ssl有关的组件:nss、curl、libcurl,3个节点都要升级
[root@node1]# yum update -y nss curllibcurl
- 验证节点(在其中一个节点即可),先设置系统主机名

pcs cluster auth node1 node2 (输完命令后需要进行账户密码验证,并且对应的node和node2需要配置到hosts文件里边)

- 生成corosync配置文件(在其中一个节点即可)
pcs cluster setup --name mycluster node1 node2

以上建立一个名为mycluster集群,生成并同步corosync配置文件,生成的文件为/etc/corosync/corosync.conf
注意:若在另一个节点生成需要重新验证节点。
- 启动集群并设为自启动(在其中一个节点即可)
#all参数会使每个节点都启动,若没有all则只在本地生效

- 查看集群状态

- 查看corosync相关状态


corosync-cmapctl | grep members




- 查看pacemaker进程

11. 查看整个集群所有组件的状态


- 检查配置文件是否正确

为保证数据安全性,pacemaker默认启动stonith,但是我们没有配置stonith,因此报错。我们先暂时禁用stonith,等会再配置stonith
#禁用stonith,再次检查配置文件正常
[root@pcmk-1 ~]# pcs property set stonith-enabled=false
[root@pcmk-1 ~]# crm_verify -L
- 添加虚拟ip资源–vip(漂移ip)
[root@node2 ~]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.244.144 cidr_netmask=32 op monitor interval=30s

在这里我们以192.168.244.144作为浮动IP,名字为ClusterIP 并且告诉集群每30秒检查它一次。
其中ocf: heartbeat:IPaddr2。这告诉Pacemaker三件事情,第一个部分ocf,指明了这个资源采用的标准(类型)以及在哪能找到它。第二个部分标明这个资源脚本的在ocf中的名字空间,在这个例子中是heartbeat。最后一个部分指明了资源脚本的名称。
- 运行下面的命令来获得可用的资源

运行下面的命令来获得可用的ocf资源提供者

如果你想看特定一个ocf资源提供者的所有可用资源代理
pcs resource agents ocf:heartbeat

- 查看IP资源状态

故障迁移
- 停止node1节点

- 查看VIP是否漂移到node2

注意:当node1重新启动后,会自动加入集群中,但是vip不会再次漂移到node1;但是pacemaker老版本中,vip会重新漂移到恢复后的节点。
- 防止资源在节点恢复后迁移
资源在节点恢复后再迁移到原节点往往需要一点时间,此时会无法对外提供服务;当在数据库间迁移时,会需要更长的时间。但是我们可以通过stickiness来解决,pacemaker默认所有节点的stickiness都为0,我们最通常更改默认情况下的stickiness就足够了
pcs resource defaults resource-stickiness=100
pcs resource defaults

DRBD存储资源配置
说明:该手册确保corosync+pacemaker+drbd浮动IP可正常切换的状态下进行一下配置。
注意:确保以下包均已安装在操作
集群属性
- 投票属性
pcs property set no-quorum-policy=ignore
集群故障时候服务迁移
由于两个节点无stonith设备
pcs property set stonith-enabled=false
在node1恢复后,为防止node2资源迁回node01(迁来迁去对还是会对业务有一定影响)
# pcs resource defaults resource-stickiness=100
# pcs resource defaults

设置资源超时时间
pcs resource op defaults timeout=90s
pcs resource op defaults

创建资源
- 创建文件
pcs cluster cib drbd_cfg
创建DRBD资源
pcs -f drbd_cfg resource create DRBD ocf:linbit:drbd drbd_resource=mydrbd op monitor interval=60s –force
clone资源
pcs -f drbd_cfg resource master DRBDClone DRBD master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
查看配置
pcs -f drbd_cfg resource show

提交配置
pcs cluster cib-push drbd_cfg


配置cluster使drbd_data跟随ClusterIP运行在同一个节点上
pcs constraint colocation add DRBDClone with ClusterIP INFINITY
更新配置(主备机同步配置文件,都更新)


DRBDClone作为master运行在node1,而slave运行在node2
pacemaker集群配置filesystem
drbd配置完成后,需要挂载到master节点的挂载目录上,当master节点stop后,新提升为master的机器需要重新挂载filesystem,因此在cluster配置filesystem资源。
从cib创建资源文件
pcs cluster cib fs_cfg
创建drbd资源并制定相关策略
pcs -f fs_cfg resource create drbd_fs Filesystem device="/dev/drbd0" directory="/data" fstype="ext4"
#文件系统要跟随DRBDClone
pcs -f fs_cfg constraint colocation add drbd_fs with DRBDClone INFINITY with-rsc-role=Master

设置启动顺序
# pcs -f fs_cfg constraint order promote DRBDClone then start drbd_fs
查看资源状态
pcs -f fs_cfg resource show


更新cluster并查看状态
pcs cluster cib-push fs_cfg
pcs status

drbd及drbd的文件系统都在cluster中建立完毕
故障迁移
模拟master故障,我们只需将master节点状态变成standby即可,在这种状态下corosync和pacemaker仍然会运行,但是不允许资源运行,因此在master上的资源会移动到slave,此时slave会提升为master,并接管源master上的所有资源。此种模式一般在管理状态下使用,例如用于升级cluster中的安装包等。
pacmker处于standby状态
pcs cluster standby node1
注意:此时node1的drbd状态是down的,因此资源没有运行。
查看集群状态

此时所有的资源已经转移到node2上了
恢复node1,资源并不会恢复到node1上。
pcs cluster unstandby node1
注意:此时drbd的状态都为UpToDate,因为node1的资源已经运行


多DRBD资源配置

[root@mail1 drbd.d]# cat mydrbd.res
resource mydrbd {
volume 0 {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
}
volume 1 {
device /dev/drbd1;
disk /dev/sdc1;
meta-disk internal;
}
on {
address 192.168.1.1:7790;
}
on {
address 192.168.1.2:7790;
}
}
[root@mail1 drbd.d]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 49.5G 0 part
├─nlas-root 253:0 0 47.5G 0 lvm /
└─nlas-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 40G 0 disk
└─sdb1 8:17 0 30G 0 part
└─drbd0 147:0 0 30G 1 disk
sdc 8:32 0 10G 0 disk
└─sdc1 8:33 0 10G 0 part
└─drbd1 147:1 0 10G 1 disk
sr0 11:0 1 1024M 0 rom
[root@mail1 drbd.d]# pcs config
Cluster Name: mycluster
Corosync Nodes:
node1 node2
Pacemaker Nodes:
node1 node2
Resources:
Master: DRBDClone
Meta Attrs: master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
Resource: DRBD (class=ocf provider=linbit type=drbd)
Attributes: drbd_resource=mydrbd
Operations: start interval=0s timeout=240 (DRBD-start-interval-0s)
promote interval=0s timeout=90 (DRBD-promote-interval-0s)
demote interval=0s timeout=90 (DRBD-demote-interval-0s)
stop interval=0s timeout=100 (DRBD-stop-interval-0s)
monitor interval=60s (DRBD-monitor-interval-60s)
Group: mail
Resource: drbd_fs (class=ocf provider=heartbeat type=Filesystem)
Attributes: device=/dev/drbd0 directory=/opt/anymacro fstype=ext4
Operations: start interval=0s timeout=60 (drbd_fs-start-interval-0s)
stop interval=0s timeout=60 (drbd_fs-stop-interval-0s)
monitor interval=20 timeout=40 (drbd_fs-monitor-interval-20)
Resource: drbd2_fs (class=ocf provider=heartbeat type=Filesystem)
Attributes: device=/dev/drbd1 directory=/opt/anymacro/mail1 fstype=ext4
Operations: start interval=0s timeout=60 (drbd2_fs-start-interval-0s)
stop interval=0s timeout=60 (drbd2_fs-stop-interval-0s)
monitor interval=20 timeout=40 (drbd2_fs-monitor-interval-20)
Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: ip=192.168.119.130 cidr_netmask=32
Operations: start interval=0 timeout=240s (ClusterIP-start-interval-0)
stop interval=0op timeout=240s (ClusterIP-stop-interval-0op)
monitor interval=60s timeout=60s (ClusterIP-monitor-interval-60s)
Resource: procfs1 (class=ocf provider=heartbeat type=Filesystem)
Attributes: device=/proc directory=/opt/anymacro/proc fstype= options=bind
Operations: start interval=0s timeout=60 (procfs1-start-interval-0s)
stop interval=0s timeout=60 (procfs1-stop-interval-0s)
monitor interval=20 timeout=40 (procfs1-monitor-interval-20)
Resource: anyclumail (class=lsb type=anyclumail)
Operations: monitor interval=60s timeout=60s (anyclumail-monitor-interval-60s)
start interval=0 timeout=240s (anyclumail-start-interval-0)
stop interval=0op timeout=240s (anyclumail-stop-interval-0op)
Stonith Devices:
Fencing Levels:
Location Constraints:
Resource: mail
Enabled on: node2 (score:INFINITY) (role: Started) (id:cli-prefer-mail)
Ordering Constraints:
start drbd_fs then start drbd2_fs (kind:Mandatory) (id:order-drbd_fs-drbd2_fs-mandatory)
start drbd2_fs then start ClusterIP (kind:Mandatory) (id:order-drbd2_fs-ClusterIP-mandatory)
start ClusterIP then start procfs1 (kind:Mandatory) (id:order-ClusterIP-procfs1-mandatory)
start procfs1 then start anyclumail (kind:Mandatory) (id:order-procfs1-anyclumail-mandatory)
stop anyclumail then start procfs1 (kind:Mandatory) (id:order-anyclumail-procfs1-mandatory)
stop procfs1 then start ClusterIP (kind:Mandatory) (id:order-procfs1-ClusterIP-mandatory)
stop ClusterIP then start drbd2_fs (kind:Mandatory) (id:order-ClusterIP-drbd2_fs-mandatory)
stop drbd2_fs then start drbd_fs (kind:Mandatory) (id:order-drbd2_fs-drbd_fs-mandatory)
Colocation Constraints:
drbd_fs with DRBDClone (score:INFINITY) (with-rsc-role:Master) (id:colocation-drbd_fs-DRBDClone-INFINITY)
drbd2_fs with drbd_fs (score:INFINITY) (id:colocation-drbd2_fs-drbd_fs-INFINITY)
Resources Defaults:
resource-stickiness: 100
migration-threshold: 1
Operations Defaults:
timeout: 90s
Cluster Properties:
cluster-infrastructure: corosync
cluster-name: mycluster
dc-version: 1.1.13-10.el7-44eb2dd
have-watchdog: false
last-lrm-refresh: 1597914451
no-quorum-policy: ignore
stonith-enabled: false
PCS添stonith
- 增加fence设备
pcs stonith create ipmi-fence-node1 fence_ipmilan parms lanplus=’true’ pcmk_host_list=’node1’ pcmk_host_check=’static-list’ action=’reboot’ ipaddr=’192.168.1.3’ login=’admin’ passwd=’Password@_’ op monitor interval=30s
pcs stonith create ipmi-fence-node2 fence_ipmilan parms lanplus=’true’ pcmk_host_list=’node2’ pcmk_host_check=’static-list’ action=’reboot’ ipaddr=’192.168.1.4’ login=’admin’ passwd=’Password@_’ op monitor interval=30s

- 集群功能验证
切换前检查
查看当前集群状态,集群内各资源已正常运行使用(尚缺少fence设备)

禁用节点验证
将node1设置为standby(不使用),资源组正常切换至node2上运行
pcs cluster standby node1 node1
standby状态下,资源组在node2上正常运行才能证明资源切换正常

创建资源文件系统
根据实际文件系统情况创建
pcs resource create procfs1 ocf:heartbeat:Filesystem device='/proc' directory='/data' fstype='' options='bind'
pcs resource create sysfs ocf:heartbeat:Filesystem device='sys' directory='/data' fstype='' options='sysfs'
pcs resource create sysfs ocf:heartbeat:Filesystem device='/dev' directory='/opt/spamgate/dev' fstype='' options='bind'

创建服务脚本
根据实际业务调整服务脚本
pcs resource create anyclumail lsb:anyclumail
配置服务启动及停止顺序
默认资源(该环境为虚拟环境,没有添加fence设备,如果有fence设备,应该先启动fence):


1. 设置资源启动顺序:
Drbd_fs -> ClusterIP -> procfs1 -> anyclumail
pcs constraint order drbd_fs then ClusterIP
pcs constraint order ClusterIP then procfs1
pcs constraint order procfs1 then anyclumail
查看设置的启动顺序

- 设置资源停止顺序:
Anyclumail -> procfs1 -> ClusterIP -> drbd_fs
pcs constraint order stop anyclumail then procfs1
pcs constraint order stop procfs1 then ClusterIP
pcs constraint order stop ClusterIP then drbd_fs



