DRBD是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像。
当用户将数据写入本地磁盘时,数据也会被发送到网络中另一台主机的磁盘上,从而实现本地主机(主节点)与远程主机(备节点)之间数据的实时同步。
DRBD是一种基于linux内核模块实现的快级别的同步复制技术,可以与SAN达到相同的共享存储效果。
DRBD具有部署简单、切换逻辑简单、保证数据强一致性等优点,但也存在对IO性能影响较大、从库不提供读操作等缺点。
Pacemaker是Linux环境下最广泛使用的开源集群资源管理器。它利用集群基础架构(Corosync或Heartbeat)提供的消息和集群成员管理功能,实现了节点和资源级别的故障检测和恢复,从而最大程度保证集群服务的高可用性。在逻辑功能方面,Pacemaker负责管理集群中软件服务的全生命周期,其规则驱动的资源管理能力,可以精确描述和表达集群资源之间的关系,包括资源的顺序和位置等关系。Pacemaker适用于任何规模的集群,并且由于其强大的资源依赖模型,可以对任何形式的软件资源进行管理,只需要为其自定义资源代理。需要指出的是,Pacemaker只是资源管理器,不提供集群心跳信息。由于任何高可用集群都必须具备心跳监测机制,因此,Pacemaker的心跳机制主要基于Corosync或Heartbeat来实现。
pacemaker的主要功能包括以下几方面:
1、能够检测和恢复节点和服务级别的故障,以保证高可用性。
2、不需要共享存储,且与存储无关。
3、支持任何能够用脚本控制的资源作为集群服务,与资源无关。
4、支持节点 STONITH功能以确保集群数据完整性和防止集群脑裂。
5、适用于大型和小型集群。
6、支持 Quorum机制和资源驱动类型的集群。
7、支持几乎所有类型的冗余配置。
8、自动同步各个节点的配置文件。
9、允许设置集群范围内的 Ordering、Colocation和Anti-colocation等约束。
10、提供高级服务类型支持,例如:
- Clone功能,即允许多个节点上运行相同的服务;
- Multi-state功能,即支持运行在多状态下的服务,在不同的高可用模式下切换,如Active/Active或Active/Passive。
11、提供统一的、脚本化的集群管理工具,方便管理和维护集群。
在Linux环境下,Corosync是一个广泛使用的开源集群管理工具,通常与其他资源管理器组合使用。它可以通过简单的配置文件定义信息传递的方式和协议等。虽然Corosync在2008年才正式推出,但它实际上是Openais项目的一个子项目。Openais于2002年推出,由于过于庞大而分裂成两个子项目,其中一个子项目就是可以实现高可用心跳信息传输的Corosync,它的代码的大约60%来自于Openais。Corosync可以提供完整的高可用功能,但要实现更复杂的功能,需要使用Openais。未来的发展方向是Corosync,因此在新的项目中,一般采用Corosync。hb_gui可以提供良好的高可用管理功能,可以实现图形化管理。此外,RHCS的luci+ricci套件和基于Java开发的LCMC集群管理工具都提供相关的图形化界面。
主机名 IP 角色 OS Disk DRBD Device
lvm-cluster-1 192.168.1.10 Master /dev/sdb1 /dev/drbd1
lvm-cluster-2 192.168.1.11 Slave /dev/sdb1 /dev/drbd1
- 192.168.1.100 Vip - -
确保每台主机上都有一个空分区/dev/sdb1
查看selinux状态
[root@lvm-cluster-1 ~]# getenforce
Disabled
临时关闭,设置SELinux 成为permissive模式
setenforce 0
永久关闭
vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled
设置后需要重启才能生效
安装8.4版本的drbd工具集:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum install -y kmod-drbd84 drbd84-utils
将每台机器的hostname映射成IP地址,在每台机器上执行:
echo "192.168.1.10 lvm-cluster-1" >> /etc/hosts
echo "192.168.1.11 lvm-cluster-2" >> /etc/hosts
载入drbd模块
modprobe drbd
lsmod | grep drbd
创建drbd资源配置
> vi /etc/drbd.d/lvm-cluster.res
resource lvm-cluster {
protocol C;
on lvm-cluster-1 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.1.10:7788;
meta-disk internal;
}
on lvm-cluster-2 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.1.11:7788;
meta-disk internal;
}
}
更新全局配置
>vi /etc/drbd.d/global_common.conf
common {
handlers {
...
# 取消掉以下注释
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";
...
}
options {
}
disk {
# 优化读写性能参数
on-io-error detach;
no-disk-flushes;
no-disk-barrier;
c-plan-ahead 10;
c-fill-target 24M;
c-min-rate 10M;
c-max-rate 100M;
}
net {
# 优化读写性能参数
max-epoch-size 20000;
max-buffers 36k;
sndbuf-size 1024k;
rcvbuf-size 2048k;
}
}
将空白磁盘分区:
> fdisk /dev/sdb
n > p > 1 > 回车 > 回车 > w
[root@lvm-cluster-1 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x9b139b4d.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1048575999, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1048575999, default 1048575999):
Using default value 1048575999
Partition 1 of type Linux and of size 500 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
查看已建立的分区/dev/sdb1
fdisk -l
防火墙放开端口7788和7789,7788为/etc/drbd.d/lvm-cluster.res中定义的访问端口,7789为drbd服务通信端口
firewall-cmd --zone=public --add-port=7788/tcp --permanent
firewall-cmd --zone=public --add-port=7789/tcp --permanent
firewall-cmd --reload
在每台机器上执行:
确认drbd服务关闭
systemctl stop drbd
drbdadm create-md lvm-cluster
systemctl start drbd
如果 drbd 资源未启动,可以执行:drbdadm up lvm-cluster
设置 drbd 开机自启动
systemctl enable drbd
选择其中一个节点执行下面命令,命令执行成功,该节点将成为 DRBD 主节点,另一节点成为备用节点,并开始第一次状态和数据同步。
drbdadm primary lvm-cluster --force
cat /proc/drbd
drbdadm status lvm-cluster
同步需要花费一定的时间,磁盘越大,花费时间越久;
同步结束后,需要格式化分区,在主节点执行:
mkfs.ext3 /dev/drbd1
手动测试挂载目录:
创建挂载点
mkdir /opt/data/
挂载磁盘
mount /dev/drbd1 /opt/data/
测试文件写入,10G:
cd /opt/data/
touch test
dd if=/dev/zero of=test bs=1M count=10000
当前主节点执行
取消挂载:
umount /dev/drbd1
如果提示被占用,可以执行:
安装 lsof 和 fuser
yum -y install lsof fuser
查看设备占用pid
lsof | grep /dev/drbd1
fuser -m -v /dev/drbd1
查看进程
ps aux | grep pid
强制关闭
kill pid
切换主备查看效果
drbdadm secondary lvm-cluster
cat /proc/drbd
备节点执行
drbdadm primary lvm-cluster
cat /proc/drbd
备节点挂载目录(注意挂载点目录需要存在)
mount /dev/drbd1 /opt/data/
安装相关组件
vi /etc/yum.repos.d/crmsh.repo
[network_ha-clustering_Stable]
name=Stable High Availability/Clustering packages (CentOS_CentOS-7)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/repodata/repomd.xml.key
enabled=1
yum install -y crmsh pacemaker corosync
防火墙放开指定端口:
firewall-cmd --zone=public --add-port=3121/tcp --permanent
firewall-cmd --zone=public --add-port=5405/udp --permanent
firewall-cmd --reload
3121为pacemaker服务端口
5405为corosync服务端口
配置corosync
[root@lvm-cluster-1 ~]# cd /etc/corosync/
[root@lvm-cluster-1 corosync]# cp corosync.conf.example corosync.conf
[root@lvm-cluster-1 corosync]# vi corosync.conf
totem {
version: 2
crypto_cipher: aes256
crypto_hash: sha1
interface {
ringnumber: 0
bindnetaddr: 192.168.1.10
mcastaddr: 239.255.1.1
mcastport: 5405
ttl: 1
}
}
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
}
}
quorum {
provider: corosync_votequorum
}
nodelist {
node {
ring0_addr: lvm-cluster-1
nodeid: 1
}
node {
ring0_addr: lvm-cluster-2
nodeid: 2
}
}
生成corosync密钥
[root@lvm-cluster-1 corosync]# corosync-keygen
[root@lvm-cluster-1 corosync]# scp authkey root@lvm-cluster-2:/etc/corosync/
[root@lvm-cluster-1 corosync]# scp corosync.conf root@lvm-cluster-2:/etc/corosync/
启动corosync和pacemaker
[root@lvm-cluster-1 ~]# systemctl start corosync
[root@lvm-cluster-1 ~]# systemctl start pacemaker
设置服务开机自启动
systemctl enable corosync
systemctl enable pacemaker
查看集群状态
[root@lvm-cluster-1 corosync]# crm_mon
Stack: corosync
Current DC: lvm-cluster-1 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Fri Jul 5 21:48:22 2019
Last change: Fri Jul 5 21:45:52 2019 by hacluster via crmd on lvm-cluster-1
2 nodes configured
0 resources configured
Online: [ lvm-cluster-1 lvm-cluster-2 ]
No active resources
关闭stonish设备
[root@lvm-cluster-1 ~]# crm
crm(live)# configure
crm(live)configure# show
node 1: lvm-cluster-1
node 2: lvm-cluster-2
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.19-8.el7_6.4-c3c624ea3d \
cluster-infrastructure=corosync
crm(live)configure# property stonith-enabled=false
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# property start-failure-is-fatal=false
crm(live)configure# property default-action-timeout=180s
crm(live)configure# rsc_defaults resource-stickiness=100
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node 1: lvm-cluster-1
node 2: lvm-cluster-2
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.19-8.el7_6.4-c3c624ea3d \
cluster-infrastructure=corosync \
stonith-enabled=false \
no-quorum-policy=ignore \
start-failure-is-fatal=false \
default-action-timeout=180s
rsc_defaults rsc-options: \
resource-stickiness=100
添加Virtual IP资源
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.1.100 op monitor 30s
crm(live)configure# commit
添加DRBD磁盘资源
# 配置drbd资源主从资源
crm(live)configure# primitive drbd_storage ocf:linbit:drbd params drbd_resource="lvm-cluster" op monitor interval="29s" role="Master" op monitor interval="31s" role="Slave"
# 配置drbd主从配置
crm(live)configure# ms ms_drbd_storage drbd_storage meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
# 配置drbd自动挂载
crm(live)configure# primitive drbd ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/opt/data" fstype=ext3
crm(live)configure# commit
绑定VIP和DRBD资源,并设置先启动VIP后启动DRBD,设置vip在主从选举后启动:
crm(live)configure# group vip_drbd vip drbd
crm(live)configure# order vip_after_drbd inf: ms_drbd_storage:promote vip_drbd:start
crm(live)configure# commit
模拟crm节点离线在线
crm node standby lvm-cluster-2
crm node online lvm-cluster-2
查看状态
crm_mon