DRBD+Pacemaker+NFS+KVM+K8S之drbd篇

Posted luckyLiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRBD+Pacemaker+NFS+KVM+K8S之drbd篇相关的知识,希望对你有一定的参考价值。

一、DRBD介绍

DRBD的全称为:Distributed Replicated Block Device (DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。与心跳连接结合使用,也可以把它看作是一种网络RAID。

两种同步方式:DRBD replication(同步,用的最多), DRBD synchronization(异步) 

DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。 目前,DRBD每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。
一个DRBD系统由两个以上节点构成,与HA集群类似,也有主用节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备。
在主节点写入的数据通过drbd设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点相应 的drbd设备,最终写入备用节点的磁盘设备中,在备用节点上,drbd只是将数据从drbd设备写入到备用节点 的磁盘设备中。

大部分现行高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要任何硬 件的投资。因为它在IP网络中运行(IP SAN),因此,利用DRBD作为共享存储设备,要节约很多成本,因为 在价格上IP网络要比专用的存储网络经济的多。

在 DRBD 设备上创建文件系统之前,必须先设置 DRBD 设备。只能通过 /dev/drbd 设备(而非原始设 备)操纵用户数据,因为 DRBD 使用原始设备的最后 128 MB 储存元数据。确保仅在 /dev/drbd 设备上 创建文件系统,而不在原始设备上创建。主机上的DRBD设备挂载到一个目录上进行使用.备机的DRBD设备无法 被挂载,因为它是用来接收主机数据的,由DRBD负责操作.
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中。 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会 保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。


DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台linux服务器之间共享块设 备,共享文件系统和数据。类似于一个网络RAID1的功能,如图所示:

DRBD+Pacemaker+NFS+KVM+K8S之drbd篇_linux

二、DRBD的模式

DRBD有2中模式,一种是DRBD的主从模式,另一种是DRBD的双主模式(这里演示的是主从模式)

三、DRBD官网网站和文档

官方网站:https://linbit.com/drbd/ 官网有windows版本,自己去了解

文档: https://linbit.com/man/v84/?linbitman=drbd.conf.5.html 配置文件drbd.conf介绍,如果要研究深一点一定要看。 https://linbit.com/user-guides/

四、DRBD底层设备支持

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备就像是一块物理的磁盘,可以在上面创建文件系统。 DRBD所支持的底层设备有以下这些类:

  • 一个磁盘或磁盘的某一个分区;
  • soft raid 设备;
  • LVM的逻辑卷;
  • EVMS卷;
  • 其他任何的块设备。

DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中。 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会 保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。

五、目的

搭建两台centos服务器,实现两个服务器之间a分区数据同步。

六、搭建环境

  • 2台centos 8.2,

内核是4.18.0-193.el8.x86_64,等会儿下面升级过后内核4.18.0-365.el8.x86_64,其实4.18.0也是stream linux的旧版本的内核,下面是后面升级好之后的截图,尽量保证内核在4.18.0大版本 DRBD+Pacemaker+NFS+KVM+K8S之drbd篇_数据_02

  • drbd-9.0.32

七、基础设置

#主备都要执行。关闭防火墙,selinux,设置主机名,源,解析文件hosts
systemctl disable --now firewalld.service
setenforce 0
sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config
hostnamectl set-hostname drbd1和drbd2
hostname drbd1和drbd2

cat > /etc/yum.repos.d/iso.repo <<END # cat > 是覆盖文件内容,需要备份的自己备份。
[AppStream]
name=AppStream
baseurl=http://mirrors.163.com/centos/8-stream/AppStream/x86_64/os/
enabled=1
gpgcheck=0

[BaseOS]
name=BaseOS
baseurl=http://mirrors.163.com/centos/8-stream/BaseOS/x86_64/os/
enabled=1
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/
gpgcheck=0
END
yum clean all
yum makecache

mkdir /root/bak
cp /etc/hosts /root/bak #备份
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6A
192.168.68.14 drbd1
192.168.68.15 drbd2
192.168.68.16 drbd3
EOF

八、DRBD双节点部署

主备都要执行,且配置文件要一致。

yum -y group install "Development Tools" #会报个错,重新执行1次就好了
yum -y install drbd wget vim net-tools lvm2
cd
wget https://pkg.linbit.com/downloads/drbd/9.0/drbd-9.0.32-1.tar.gz
tar xf drbd-9.0.32-1.tar.gz
[root@drbd1 <sub>]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@drbd1 </sub>]# uname -a
Linux drbd1 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@drbd1 <sub>]#yum update kernel -y #其实就是4.18.0-193.el8.x86_64升级到4.18.0-365.el8.x86_64 ,大版本不变
[root@drbd1 </sub>]#reboot -f
[root@drbd1 <sub>]# uname -a #上面更新过内核了,需要重启机器才看到
Linux drbd1 4.18.0-365.el8.x86_64

cd drbd-9.0.32-1/ && make && make install
modprobe drbd
lsmod |grep drbd #查看是否内核加载成功

#配置文件
echo drbd > /etc/modules-load.d/drbd.conf
sed -i /options/a\\auto-promote yes; /etc/drbd.d/global_common.conf
sed -i /net/a\\protocol C; /etc/drbd.d/global_common.conf #使用同步C方式同步

#自己添加一块硬盘3个g
[root@drbd1 </sub>]# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1f2f59f0

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 41943039 39843840 19G 8e Linux LVM

Disk /dev/sdb: 3 GiB, 3221225472 bytes, 6291456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@drbd1 <sub>]# pvcreate /dev/sdb #创建物理盘
Physical volume "/dev/sdb" successfully created.
[root@drbd1 </sub>]# vgcreate nfs /dev/sdb #创建磁盘组
Volume group "nfs" successfully created
[root@drbd1 <sub>]#
[root@drbd1 </sub>]# lvcreate -n nfs -L 2G nfs #创建一个2G逻辑卷

#resource配置文件
[root@drbd2 drbd.d]# cat /etc/drbd.d/nfs.res #资源文件
resource nfs
meta-disk internal;
device /dev/drbd1;

net
verify-alg sha256;


on drbd1 #drbd1一定要是机器的Hostname,不能乱写,还有一种根据ip同步的方式,后面我附录了官网的学习文档。
address 192.168.68.14:7788;
disk /dev/nfs/nfs;

on drbd2
address 192.168.68.15:7788;
disk /dev/nfs/nfs;



[root@drbd1 drbd.d]# drbdadm status
nfs role:Primary
disk:UpToDate
drbd2 role:Secondary
peer-disk:UpToDate #表示正常状态

[root@drbd1 drbd.d]# mkfs.xfs /dev/drbd1 #只需要在主机器格式化

#其它常用的命令:
drbdadm status
drbdadm connect
drbdadm disconnect
drbdadm up,down

#其实drbd就4个常用的命令工具:
drbdadm(常用) drbdsetup(常用) drbdmeta drbdmon

#补充:
两个磁盘的同步,有时候可能需要半小时,看网络速度,我们测试过1T同步1小时,这算快了。平常测试容量就2个G,同步1分钟完成。

九、配置文件

[root@drbd1 <sub>]ls /etc/drbd.d/global_common.conf #全局配置文件,里面定义了使用同步的方式,主备节点的ip地址,端口等等。
[root@drbd1 </sub>]# cat /etc/drbd.conf #说明包含全局配置文件,和带res结尾的文件
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

十、来自drbd-utils包列表

/usr/sbin/drbdadm    #Administration tool for DRBD管理员管理工具
/usr/sbin/drbdmeta
/usr/sbin/drbdmon
/usr/sbin/drbdsetup #使用官方参考文档:https://linbit.com/man/v84/?linbitman=drbdsetup.8.html

/etc/drbd.conf #配置文件
/etc/drbd.d #配置文件的目录,里面有res文件,conf文件,也可以定义其它的文件
/etc/drbd.d/global_common.conf #全局配置文件

/usr/share/doc/drbd-utils/drbd.conf.example #示例文件

十一、3个状态

11.1 查看磁盘状态

# drbdadm dstate <resource>
UpToDate/UpToDate

#在磁盘状态信息中,本地节点的磁盘状态总是标记在第一位,远程节点标记在结尾。这两端节点的状态信息都可能为以下值:

Diskless:没有为DRBD驱动分配底层块设备。这意味着资源可能从没有和它的底层块设备进行关联绑定(attach),也可能是手动detach解除了关联,还可能是出现了底层IO错误时自动detach。
Attaching:读取元数据时的一个短暂的状态。
Failed:本地块设备故障时的一个短暂的状态,下一个状态是:Diskless。
Negotiating:在已连接的DRBD设备上还要进行Attach时的一个短暂的状态。
Inconsistent:数据不一致。在双方节点(还未进行全盘同步之前)刚创建新的资源时会立即进入此状态。在某一端(目标段)正接收同步数据时,也会进入不一致状态。
Outdated:资源的数据是一致的,但是数据过期了。(例如,已经同步后secondary下线了,之后又上线了,在还没开始重新同步的时候就是Outdated状态)
DUnknown:用于标识对端节点没有连接时的磁盘状态。
Consistent:连接断开时的数据处于一致性状态,当连接建立后,将决定数据是UpToDate还是Outdated状态。
UpToDate:资源的数据是一致的,且数据是最新的。这是drbd数据正常时的状态。

11.2 角色状态

[root@drbd1 ~]# drbdadm role data1
Primary/Unknown
Primary/Unknown
#在角色状态信息中,本地节点总是标记在第一位,远程节点标记在结尾。

#节点角色状态有:
Primary #资源的primary角色,该角色状态下的drbd设备可以进行挂载、读、写等。在没有启用多主复制模型(dual-primary mode),只能有一个primary节点。
Secondary #资源的secondary角色。该角色状态下的drbd设备会接收来自primary端的数据更新(除非和对端不是primary)。且该角色的drbd设备不可挂载、不可读、不可写。
Unknown #资源的角色未知。本地节点的角色状态绝对不可能会是这种状态。只有对端节点断开连接时对端节点才处于Unknown状态。

11.3 常见的连接状态:

有以下几种连接状态,其中常用到的用<strong>表示:

WFConnection #</strong>当前节点正在等待对端节点出现。例如对方节点`drbdadm down`后,本节点将处于本状态。<strong>
StandAlone #无连接。出现这种状态可能是因为:未连接过、使用`drbdadm disconnect`断开连接、节点由于身份验证的原因未成功加入drbd集群使得连接被删除、脑裂后断开连接。</strong>
Disconnecting #断开连接的一个临时过渡状态。它很快就会切入下一状态就是StandAlone。
Unconnected #尝试再次发起TCP连接时的一个临时连接状态(是连接超时后再次发送连接请求产生的状态),它的下一个状态可能是WFConnection,也可能是WFReportParams。
Timeout #和对端通信超时时的临时状态。下一个状态就是Unconnection。
BrokenPipe #和对端连接丢失时的临时状态。下一个状态是Unconnection。
NetworkFailure #和对端连接丢失时的临时状态。下一个状态是Unconnection。(没错,和上面的一样)
ProtocolError #和对端连接丢失时的临时状态。下一个状态是Unconnection。(没错,还是和上面的一样)
TearDown #对端关闭TCP连接时的临时状态。下一个状态是Unconnection。
Connected #<strong>DRBD连接已经建立完成,数据镜像已经激活成功。这个状态是drbd正常运行时的状态。</strong>
WFReportParams #TCP连接已经建立完成,该节点正在等待对端的第一个数据包。
StartingSyncS #全盘数据同步中。只有在初始化时才应该全盘同步。下一个状态是:SyncSource或PauseSyncS。
StartingSyncT #全盘数据同步中。只有在初始化时才应该全盘同步。下一个状态是:WFSyncUUID。
WFBitMapS #部分数据正在同步。下一个状态是:SyncSource或PauseSyncS。
WFBitMapT #部分数据正在同步。下一个状态是:WFSyncUUID。
WFSyncUUID #同步马上就要开始了。下一个状态:SyncTarget或PauseSyncT。
SyncSource #<strong>正在同步,且本节点是数据同步的源端。</strong>
SyncTartget #<strong>正在同步,且本节点是数据同步的目标端。</strong>
PauseSyncS #本节点是同步的源端节点,但同步过程当前被暂停。出现这种状态的原因可能是当前同步进程依赖于另一个同步进程完成,或者使用`drbdadm pause-sync`手动中断了同步操作。
PauseSyncT #本节点是同步的目标端,但同步过程当前被暂停。出现这种状态的原因可能是当前同步进程依赖于另一个同步进程完成,或者使用`drbdadm pause-sync`手动中断了同步操作。
VerifyS #正在进行在线设备验证,且本节点将成为验证的源端。
VerifyT #正在进行在线设备验证,且本节点将成为验证的目标端。

十二、附录:我本地的配置文件

[root@drbd2 drbd.d]# cat /etc/drbd.d/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 yes;

# Decide what kind of udev symlinks you want for "implicit" volumes
# (those without explicit volume <vnr> block, implied vnr=0):
# /dev/drbd/by-resource/<resource>/<vnr> (explicit volumes)
# /dev/drbd/by-resource/<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
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.

# IMPORTANT: most of the following scripts symlink to "notify.sh" which tries to send mail via "mail".
# If you intend to use this notify.sh script make sure that "mail" is installed.
#
# 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";
# disconnected /bin/true;


startup
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb


options
auto-promote yes;
# 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
# 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 C;
# 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

十三、DRBD三节点部署

3个node节点,这个空了再实践。

DRBD+Pacemaker+NFS+KVM+K8S之drbd篇_linux_03

十四、有空研究:

1、主机关机了,会自动切换到备机,多久时间切换泥。备机变为主要手动挂载磁盘才可以看到数据。

2、一个主机有多个磁盘分别同步,比如主机1有a,b;主机2也有a,b,他们分别一对一对应。配置文件写法可参考 https://linbit.com/man/v84/?linbitman=drbd.conf.5.html

3、两个分区同步的速度可以在配置文件设置。

4、 磁盘的扩容怎么做?后面工作用到的时候自己研究。

5、两个主机之间通过ip地址方式同步也是可以的,不是通过主机名,配置文件有介绍 https://linbit.com/man/v84/?linbitman=drbd.conf.5.html

以上是关于DRBD+Pacemaker+NFS+KVM+K8S之drbd篇的主要内容,如果未能解决你的问题,请参考以下文章

pacemaker+mysql+drbd

高可用分布式存储(Corosync+Pacemaker+DRBD+MooseFS)

Pacemaker+Corosync+Drbd快速配置指南

drbd+corosync+pacemaker构建高可用MySQL集群

corosync+pacemaker+drbd+mfs高可用

Drbd+Pacemaker实现高可用