需求
一部分的数据需要高可用,需要能够在两台机器上面都有,数据变化不是很多,主要是一些配置的数据,配合pacemaker进行服务的高可用的服务
分析
pacemaker能够实现的是服务的一些控制,ip的一些控制,但是对数据并不能进行转移,所有需要有一个底层的存储的高可用,这里选择使用drbd
安装
yum install drbd
下载内核模块
https://linbit.com/linbit-software-download-page-for-linstor-and-drbd-linux-driver/#drbd-9
这个是下载地址,目前使用的新的9的版本
[root@lab202 root]# wget https://pkg.linbit.com//downloads/drbd/9/drbd-9.1.4.tar.gz?_ga=2.224371998.420225483.1634529780-675209462.1634529780 --no-check-certificate
[root@lab202 drbd-9.1.4]# tar -xvf drbd-9.1.4.tar.gz
[root@lab202 drbd-9.1.4]# cd drbd-9.1.4
[root@lab202 drbd-9.1.4]# rpmbuild -bb drbd-kernel.spec
修改配置文件
[root@lab202 drbd.d]# cat global_common.conf
global {
usage-count yes;
udev-always-use-vnr; # treat implicit the same as explicit volumes
}
common {
handlers {
# disconnected /bin/true;
}
startup {
}
options {
# on-no-quorum suspend-io | io-error;
}
disk {
# c-min-rate disk-timeout
}
net {
protocol C;
transport "tcp";
after-sb-0pri discard-least-changes;
after-sb-1pri consensus;
after-sb-2pri disconnect;
}
}
上面大部分是默认配置,动了几个配置
protocol C;
同步复制协议。只有在确认本地和远程磁盘写入之后,主节点上的本地写入操作才被视为完成。因此,单个节点的丢失不会导致任何数据丢失。数据丢失当然是不可避免的,即使采用这个复制协议,如果所有节点(例如:它们的存储子系统)同时遭到不可逆转的破坏, 数据也可能丢失。
DRBD设置中最常用的复制协议是protocol C。
transport “tcp”;
通过tcp来进行节点间的传输,也支持rdma
故障后发生脑裂的控制
after-sb-0pri discard-least-changes;
after-sb-1pri consensus;
after-sb-2pri disconnect;
after-sb-0pri
裂脑被检测到,但此时资源在任何主机上都不是主要角色。
after-sb-1pri
裂脑被检测到,此时资源在一个主机上扮演主要角色。
after-sb-2pri
裂脑被检测到,此时资源在两个主机上都处于主要角色。此选项接受与 after-sb-1pri 相同的关键字,但 discard-secondary 和 consensus 除外。
- discard-least-changes:丢弃并回滚发生较少更改的主机上的更改。
- consensus:应用 after-sb-0pri 中指定的相同恢复策略。如果在应用这些策略后可以选择裂脑受害者,则自动解决。否则,行为就像指定了 disconnect 一样。
- disconnect:与 after-sb-0pri 一样,只需调用 split brain 处理程序脚本(如果已配置),断开连接并以断开模式继续。
资源配置文件
[root@lab202 drbd.d]# cat rc0.res
resource r0 {
on lab202 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.0.202:7789;
meta-disk internal;
}
on lab203 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.0.203:7789;
meta-disk internal;
}
}
处理脑裂的脚本
[root@lab202 drbd.d]# cat primary.sh
drbdadm disconnect r0
drbdadm connect r0
[root@lab202 drbd.d]# cat secondary.sh
drbdadm disconnect r0
drbdadm secondary r0
drbdadm connect r0
备注
资源同一时刻只能在一台机器上面进行访问
两台机器执行
drbdadm create-md <resource>
drbdadm up <resource>
选择一台做下面的命令,选择主
drbdadm primary --force <resource>
状态查询
[root@lab202 drbd.d]# drbdadm status r0
r0 role:Primary
disk:UpToDate
lab203 role:Secondary
peer-disk:UpToDate
[root@lab203 ~]# drbdadm status r0
r0 role:Secondary
disk:UpToDate
lab202 role:Primary
peer-disk:UpToDate
自带包的里面的启动脚本存在问题,修改如下:
[root@lab203 ~]# cat /usr/lib/systemd/system/drbd.service
[Unit]
Description=Distributed Replicated Block Device
After=systemd-modules-load.service network.target
[Service]
Type=oneshot
RemainAfterExit=yes
# load config
ExecStart=/usr/sbin/drbdadm adjust all
# user interruptible version of wait-connect all
#ExecStart=/usr/sbin/drbdadm wait-con-int
# become primary if configured
#ExecStart=/usr/sbin/drbdadm up all
# disconnect and detach all resources
ExecStop=/usr/sbin/drbdadm down all
[Install]
WantedBy=multi-user.target
这个会自己判断自己是不是主还是备份的系统,后续的,拿到priamry的ip,pacemaker去判断自己是主的情况下把节点挂载起来,不是主的,把节点挂载点给卸载掉,把正常情况下的ip的切换给跑通