DRBD + keepalived实现文件实时同步和双机热备 DRBD (分布式复制块设备)可以简单理解为一种数据备份和同步的技术,主要用于提高数据的可用性和安全性。以下是 DRBD 的一些关键点
什么是 DRBD?
数据镜像 :DRBD 能够在两台服务器之间实时复制数据,就像在两个地方同时写同样的东西一样。这样,如果一台服务器发生故障,另一台服务器上的数据依然是最新的,可以继续使用。
块设备 :DRBD 把数据处理成块(block)的形式,这样就可以像使用普通磁盘一样来访问和管理这些数据。
如何工作?
主从模式 :通常配置为一台服务器为“主节点”,另一台为“从节点”。主节点处理所有的读写请求,而从节点则实时接收主节点的数据更新。
网络同步 :两台服务器通过网络连接,DRBD 会把主节点的数据变化实时同步到从节点,这样无论是文件、数据库还是其他数据类型,都是一致的。
故障转移 :如果主节点出现问题,系统可以自动或手动把从节点提升为新的主节点,确保服务的连续性。
使用场景
高可用性 :在需要确保数据始终可用的场合,比如金融、医疗等行业,DRBD 是一个不错的选择。
灾难恢复 :一旦发生数据丢失或服务器故障,DRBD 可以迅速切换到备用节点,减少停机时间。
Keepalived 是一种用于提供高可用性和负载均衡的工具,主要用于保证服务的持续运行。以下是 Keepalived 的一些关键点
什么是 Keepalived?
高可用性管理 :Keepalived 能够监控服务器的健康状态。如果一台服务器出现故障,它可以自动将流量切换到另一台正常工作的服务器,确保服务不会中断。
虚拟IP管理 :Keepalived 可以创建一个虚拟 IP 地址(VIP),让用户通过这个 IP 访问服务。即使后端的实际服务器发生变化,用户依然可以通过同一个虚拟 IP 访问服务。
如何工作?
节点监控 :Keepalived 会定期检查每个节点(服务器)的状态,确保它们正常运行。如果发现某个节点不响应,它会标记该节点为“故障”。
故障转移 :一旦某个节点出现故障,Keepalived 会自动将虚拟 IP 切换到另一台健康的服务器上,用户可以继续访问服务,而不需要知道后端发生了什么变化。
优先级设置 :在多台服务器中,Keepalived 允许你设置优先级,确保某些服务器在正常情况下优先处理流量。
使用场景
网站和应用 :在需要确保网站或应用始终可用的场景,比如电商、社交媒体等,Keepalived 是一个理想的解决方案。
负载均衡 :它可以帮助分配请求到多台服务器,提高系统的处理能力和响应速度。
安装过程 前提条件
两台 Ubuntu 22.04.4 服务器,192.168.5.210 和 192.168.5.147分别命名为 bowei01和 bowei02
两台服务器分别修改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.8make && 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.0make && 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 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 配置
启动 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/ #挂在设备