DRBD + keepalived实现文件实时同步和双机热备

DRBD(分布式复制块设备)可以简单理解为一种数据备份和同步的技术,主要用于提高数据的可用性和安全性。以下是 DRBD 的一些关键点

什么是 DRBD?

  • 数据镜像:DRBD 能够在两台服务器之间实时复制数据,就像在两个地方同时写同样的东西一样。这样,如果一台服务器发生故障,另一台服务器上的数据依然是最新的,可以继续使用。
  • 块设备:DRBD 把数据处理成块(block)的形式,这样就可以像使用普通磁盘一样来访问和管理这些数据。

如何工作?

  1. 主从模式:通常配置为一台服务器为“主节点”,另一台为“从节点”。主节点处理所有的读写请求,而从节点则实时接收主节点的数据更新。
  2. 网络同步:两台服务器通过网络连接,DRBD 会把主节点的数据变化实时同步到从节点,这样无论是文件、数据库还是其他数据类型,都是一致的。
  3. 故障转移:如果主节点出现问题,系统可以自动或手动把从节点提升为新的主节点,确保服务的连续性。

使用场景

  • 高可用性:在需要确保数据始终可用的场合,比如金融、医疗等行业,DRBD 是一个不错的选择。
  • 灾难恢复:一旦发生数据丢失或服务器故障,DRBD 可以迅速切换到备用节点,减少停机时间。

Keepalived 是一种用于提供高可用性和负载均衡的工具,主要用于保证服务的持续运行。以下是 Keepalived 的一些关键点

什么是 Keepalived?

  • 高可用性管理:Keepalived 能够监控服务器的健康状态。如果一台服务器出现故障,它可以自动将流量切换到另一台正常工作的服务器,确保服务不会中断。
  • 虚拟IP管理:Keepalived 可以创建一个虚拟 IP 地址(VIP),让用户通过这个 IP 访问服务。即使后端的实际服务器发生变化,用户依然可以通过同一个虚拟 IP 访问服务。

如何工作?

  1. 节点监控:Keepalived 会定期检查每个节点(服务器)的状态,确保它们正常运行。如果发现某个节点不响应,它会标记该节点为“故障”。
  2. 故障转移:一旦某个节点出现故障,Keepalived 会自动将虚拟 IP 切换到另一台健康的服务器上,用户可以继续访问服务,而不需要知道后端发生了什么变化。
  3. 优先级设置:在多台服务器中,Keepalived 允许你设置优先级,确保某些服务器在正常情况下优先处理流量。

使用场景

  • 网站和应用:在需要确保网站或应用始终可用的场景,比如电商、社交媒体等,Keepalived 是一个理想的解决方案。
  • 负载均衡:它可以帮助分配请求到多台服务器,提高系统的处理能力和响应速度。

安装过程

前提条件
  1. 两台 Ubuntu 22.04.4 服务器,192.168.5.210 和 192.168.5.147分别命名为 bowei01和 bowei02

  2. 两台服务器分别修改host文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    root@bowei01:/etc# vim /etc/hosts
    1、两台服务器
    192.168.5.147 bowei02
    192.168.5.210 bowei01

    127.0.0.1 localhost
    127.0.1.1 bowei01
    192.168.5.147 bowei02
    # The following lines are desirable for IPv6 capable hosts
    ::1 ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    --------------------------------------------------------------------------------------
    root@bowei02:~# vim /etc/hosts
    127.0.0.1 localhost
    127.0.1.1 bowei02
    192.168.5.21 bowei01
    # The following lines are desirable for IPv6 capable hosts
    ::1 ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters

    3.确保两台服务器之间的网络平常

    1
    2
    3
    4
    5
    root@bowei02:~# ping bowei01
    PING bowei01 (192.168.5.21) 56(84) bytes of data.
    From bowei02 (192.168.5.147) icmp_seq=1 Destination Host Unreachable
    From bowei02 (192.168.5.147) icmp_seq=2 Destination Host Unreachable
    From bowei02 (192.168.5.147) icmp_seq=3 Destination Host Unreachable

    4.安装drbd所需要的,因为DRBD编译在内核里的,所以也要安装linux-headers

    1
    2
    3
    #uname -r 看下内核版本
    5.15.0-94-generic 我的内核版本
    #apt-get install flex linux-headers-5.15.0-94-generic

下载源码编译安装

drbd需要两个安装报:drbd drbd-utils 安装包路径:/usr/local/src

drbd 安装

1
2
3
4
wget https://pkg.linbit.com//downloads/drbd/9/drbd-9.2.8.tar.gz
tar -zxvf drbd-9.2.8.tar.gz
cd drbd-9.2.8
make && make install

drbd-utils 安装

1
2
3
4
wget https://pkg.linbit.com//downloads/drbd/utils/drbd-utils-9.27.0.tar.gz
tar -zxvf drbd-utils-9.27.0.tar.gz
cd drbd-utils-9.27.0
make && make install

安装配置路径:/usr/local/drbd/etc/drbd.d

如果在安装 DRBD 或其依赖时遇到 configure: error: Need keyutils ubuntu 错误,这通常意味着缺少 keyutils 库。你可以通过以下步骤来解决此问题:

安装 keyutils

在 Ubuntu 上,你可以通过以下命令安装 keyutils

1
2
sudo apt update
sudo apt install keyutils

确保开发包已安装

1
sudo apt install libkeyutils-dev

备份配置文件

1
cp /usr/local/drbd/etc/drbd.d/global_common.conf{,.bak} 

查看磁盘分区:sudo fdisk -l

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
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: gpt
Disk identifier: 8D36168C-3E55-4138-BCF9-588DB7E5EDB2

Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
/dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem

Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 10 GiB, 10737418240 bytes, 20971520 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

如果没有逻辑卷可以考虑新增逻辑卷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 将新加的磁盘分区
fdisk /dev/sdb

# 按照提示创建一个 Linux LVM 类型的分区
"n" --> "p" --> "1" --> "回车" --> "回车" --> "t" --> "8e" --> "w"

# 刷新磁盘信息
partprobe

# 创建 pv
pvcreate /dev/sdb1

# 扩容 vg
vgextend ubuntu-vg /dev/sdb1

# 创建 lv
lvcreate -l 100%Free -n data ubuntu-vg

创建资源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vim /usr/local/drbd/etc/drbd.d/r1.res    #编辑资源配置文件

resource r1 {
on bowei01 {
device /dev/drbd1; # device 指定的參数最后必须有一个数字,用于 global 的 minor-count,否则会报错。device指定drbd应用层设备。
disk /dev/mapper/ubuntu--vg-data; # 新建的 LV 分区磁盘
address 192.168.5.210:7789; # DRBD 监听的地址和端口,端口可以自定义。
meta-disk internal;
}

on bowei02 {
device /dev/drbd1;
disk /dev/mapper/ubuntu--vg-data; # 新建的 LV 分区磁盘
address 192.168.5.147:7789;
meta-disk internal;
}
}

在bowei01、bowei02上初始化资源、启动drbd:

1
drbdadm create-md r1

创建服务文件

1
sudo nano /etc/systemd/system/drbd.service

添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=DRBD Distributed Replicated Block Device
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/drbd/sbin/drbdadm up all
ExecStop=/usr/local/drbd/sbin/drbdadm down all
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

重新加载 systemd 配置

1
systemctl daemon-reload

启动 DRBD 服务

1
2
3
systemctl enable drbd #开机启动
systemctl start drbd #手动启动
systemctl status drbd #状态查看

查看状态 systemctl status drbd

查看组状态 cat /proc/drbd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看 DRBD 状态
systemctl status drbd

# 查看 资源组 cat /proc/drbd
root@bowei01:~# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 211FB288A383ED945B83420

1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent 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:41937628

root@bowei02:~# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 211FB288A383ED945B83420

1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent 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:41937628

由上面两台主机的DRBD状态查看结果里的ro:Secondary/Secondary表示两台主机的状态都是备机状态,ds是磁盘状态

将 bowei01 服务器配置为 DRBD 的主节点,进行初始化设备同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# drbdsetup /dev/drbd1 primary --force 设置直节点
root@bowei01:# drbdsetup /dev/drbd1 primary --force
root@bowei01:# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: C7B8F7076B8D6DB066D84D9

1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:39144 nr:0 dw:0 dr:41264 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:29549420
[>....................] sync'ed: 0.2% (28856/28892)M
finish: 2:05:38 speed: 3,912 (3,912) K/sec
root@bowei01:/usr/local/drbd/etc/drbd.d#

说明:
ro 在主从服务器上分别显示 Primary/Secondary 和 Secondary/Primary
ds显示 UpToDate/UpToDate 表示主从配置成功

查看系统资源:drbdadm status

验证DRBD主备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bowei01 主节点挂载 drbd1,创建测试数据
# 格式化 drbd1
mkfs.ext4 /dev/drbd1

# 创建挂载目录
mkdir /data

# 挂载设备 drbd1
mount /dev/drbd1 /data

# 查看挂载信息
root@bowei01:/usr/local/drbd/etc/drbd.d# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 388M 1.6M 387M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 9.8G 4.3G 5.0G 47% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 1.8G 258M 1.4G 16% /boot
tmpfs 388M 4.0K 388M 1% /run/user/0
/dev/drbd1 28G 24K 27G 1% /data

# 创建测试文件
touch /data/{test1,test2,test3}
echo "test" > /data/test.txt

特别注意:

从节点(Secondary)上不允许对 DRBD 设备进行任何操作,包括只读,所有的读写操作只能在主节点(Primary)上进行。
只有当主节点(Primary)挂掉时,从节点(Secondary)才能提升为主节点(Primary)。

主节点切换,将 bowei01 节点关机,然后将bowei02节点设置为主节点 主节点关机或下载会主动取消挂在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@bowei02:/usr/local/drbd/etc/drbd.d# drbdadm primary r1
--== Thank you for participating in the global usage survey ==--
The server's response is:

you are the 230th user to install this version
root@bowei02:/usr/local/drbd/etc/drbd.d# mkdir /data
root@bowei02:/usr/local/drbd/etc/drbd.d# mount /dev/drbd1 /data/
root@bowei02:/usr/local/drbd/etc/drbd.d# cat /data/
cat: /data/: Is a directory
root@bowei02:/usr/local/drbd/etc/drbd.d# cd /data/
root@bowei02:/data# ll
total 28
drwxr-xr-x 3 root root 4096 Sep 27 09:40 ./
drwxr-xr-x 21 root root 4096 Sep 27 09:49 ../
drwx------ 2 root root 16384 Sep 27 09:38 lost+found/
-rw-r--r-- 1 root root 0 Sep 27 09:40 test1
-rw-r--r-- 1 root root 0 Sep 27 09:40 test2
-rw-r--r-- 1 root root 0 Sep 27 09:40 test3
-rw-r--r-- 1 root root 5 Sep 27 09:40 test.txt

# 在 bowei02 节点创建测试数据
echo 'bowei02' > /data/test2

注意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
drbdsetup /dev/drbd1 primary --force 和 drbdadm primary r1 这两个命令都涉及到将 DRBD 资源设置为 primary 状态,但它们之间存在一些关键的区别,主要体现在使用的工具、操作对象以及上下文环境上。

drbdsetup vs drbdadm
工具不同:
drbdsetup:这是一个底层的 DRBD 配置工具,允许用户直接配置已经加载到正在运行的内核的 DRBD 模块。它通常用于更直接、更底层的配置和管理任务。
drbdadm:这是 DRBD 程序套件的高层次管理工具,它从配置文件(如 /etc/drbd.conf)中读取配置参数,并据此执行更高级别的管理操作。它提供了更易于使用、更人性化的接口来管理 DRBD 资源。
操作对象不同:
drbdsetup /dev/drbd1 primary --force:这个命令直接针对 /dev/drbd1 这个特定的 DRBD 设备进行操作,将其强制设置为 primary 状态。这里的操作是直接的,不依赖于配置文件中的资源名称。
drbdadm primary gitlab:这个命令通过资源名称(在这个例子中是 r1)来操作 DRBD 资源。它首先查找配置文件中的 r1 资源定义,然后根据该定义来执行相应的操作。这意味着你需要在配置文件中有一个名为 r1 的资源,并且该资源应该与 /dev/drbd1 或其他某个 DRBD 设备相关联。
上下文环境:
使用 drbdsetup 时,你可能需要更直接地控制 DRBD 的行为,尤其是在进行故障排除或需要绕过某些配置限制时。然而,这也增加了出错的风险,因为直接操作可能会忽略配置文件中的某些重要设置。
使用 drbdadm 时,你更依赖于配置文件的正确性。如果配置文件中的资源定义有误或缺失,那么 drbdadm 命令可能会失败。但是,这也使得管理变得更加一致和可预测,因为所有的操作都基于相同的配置文件。
结论
如果你需要直接、快速地操作 DRBD 设备,并且了解可能的后果和限制,那么可以使用 drbdsetup。
如果你希望通过更高级别、更易于管理的接口来操作 DRBD 资源,并且希望所有操作都基于一致的配置文件,那么应该使用 drbdadm

启动bowei01 服务器,然后再切换 bowei01 为主节点,bowei02 为备节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# bowei02 取消挂载 drbd1 设备
root@bowei02:~# umount /data

# 将 bowei02 角色配置为 从
root@bowei02:~# drbdadm secondary gitlab

# 将 bowei01 角色设置为主
root@bowei01:~# drbdadm primary gitlab

# bowei01 挂载 drbd 设备
root@bowei01:~# mount /dev/drbd1 /data/

# bowei01 服务器查看刚才在 bowei02 上修改文件是否正常
root@bowei01:~# cat /data/test2
bowei02

常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
查看磁盘分区:sudo fdisk -l
systemctl enable drbd #开机启动
systemctl start drbd #手动启动
systemctl status drbd #状态查看
systemctl stop drbd #手动停止
查看组状态 cat /proc/drbd
drbdsetup /dev/drbd1 primary --force 设置直节点
umount /data #取消挂在
drbdadm secondary r1 #设置从资源
drbdadm primary r1 #设置主资源
mount /dev/drbd1 /data/ #挂在设备