当前位置: 首页 > 工具软件 > DRBD > 使用案例 >

基于DRBD实现存储高可用配置

孟树
2023-12-01

基于DRBD+Pacemaker+Corosync的存储主备配置

1. 功能介绍

1.1 DRBD

DRBD是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像。
当用户将数据写入本地磁盘时,数据也会被发送到网络中另一台主机的磁盘上,从而实现本地主机(主节点)与远程主机(备节点)之间数据的实时同步。
DRBD是一种基于linux内核模块实现的快级别的同步复制技术,可以与SAN达到相同的共享存储效果。
DRBD具有部署简单、切换逻辑简单、保证数据强一致性等优点,但也存在对IO性能影响较大、从库不提供读操作等缺点。

1.2 Pacemaker

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、提供统一的、脚本化的集群管理工具,方便管理和维护集群。

1.3 Corosync

在Linux环境下,Corosync是一个广泛使用的开源集群管理工具,通常与其他资源管理器组合使用。它可以通过简单的配置文件定义信息传递的方式和协议等。虽然Corosync在2008年才正式推出,但它实际上是Openais项目的一个子项目。Openais于2002年推出,由于过于庞大而分裂成两个子项目,其中一个子项目就是可以实现高可用心跳信息传输的Corosync,它的代码的大约60%来自于Openais。Corosync可以提供完整的高可用功能,但要实现更复杂的功能,需要使用Openais。未来的发展方向是Corosync,因此在新的项目中,一般采用Corosync。hb_gui可以提供良好的高可用管理功能,可以实现图形化管理。此外,RHCS的luci+ricci套件和基于Java开发的LCMC集群管理工具都提供相关的图形化界面。

2. 配置主备

2.1 环境准备

主机名	        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

2.2 关闭selinux

查看selinux状态

[root@lvm-cluster-1 ~]# getenforce
Disabled

临时关闭,设置SELinux 成为permissive模式

setenforce 0

永久关闭

vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled
设置后需要重启才能生效

2.3 安装DRBD

安装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

2.4 配置DRBD

将每台机器的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

2.5 初始化DRBD

在每台机器上执行:

确认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/

2.6 安装Pacemaker和Corosync

安装相关组件

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
 类似资料: