### 介绍
DRBD(Distributed Replicated Block Device)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
#### DRBD的工作原理
```bash
+-----------+
| 文件系统 |
+-----------+
|
V
+--------------+
| 块设备层 |
| (/dev/drbd1) |
+--------------+
| |
| |
V V
+-------------+ +------------+
| 本地硬盘 | | 远程硬盘 |
| (/dev/hdb1) | | (/dev/hdb1)|
+-------------+ +------------+
host1 host2
```
#### DRBD单主和双主模式
单主模式:`一个集群内一个资源在任何给定的时间内仅有一个primary角色,另一个为secondary。文件系统可以是ext3、ext4、xfs等`
双主模式:`对于一个资源,在任何给定的时刻该集群都有两个primary节点,也就是drbd两个节点均为primary,因此可以实现并发访问。使用共享集群文件系统例如gfs和ocfs系统`
#### DRBD的复制模式
三种模式:
`协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。`
`协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。`
`协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。`
**在使用时,一般用协议C。由于协议C是本地和对方写成功时再认为写入成功,因此会有一定时延。**
### 准备环境:
所有节点:
- 系统: `CentOS7.6`
- 同步硬盘:`/dev/vdb1`
主节点:
- IP/主机:`172.16.0.3(node1)`
从节点:
- IP/主机:`172.16.0.4(node2)`
### 安装DRBD
#### `node1和node2执行`
导入GPG key和安装elrepo库
```bash
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
```
安装drbd软件包
```bash
yum install drbd90-utils kmod-drbd90 -y
```
加载drbd模块
```bash
modprobe drbd
echo drbd > /etc/modules-load.d/drbd.conf #开机加载drbd模块
```
### 配置DRBD
#### `node1和node2执行`
配置global_common.conf文件
```bash
vim /etc/drbd.d/global_common.conf
```
```bash
global {
usage-count no; #是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量,改为no
}
common {
protocol C; #DRBD的同步复制协议
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";
}
startup {
}
options {
}
disk {
on-io-error detach; #配置I/O错误处理策略为分离,添加这一行
}
net {
cram-hmac-alg "sha1"; #drbd同步验证方式
shared-secret "test"; #drbd同步密码信息
}
syncer {
rate 1024M; #设置主备节点同步时的网络速率,添加这个选项
}
}
```
配置资源文件
```bash
vim /etc/drbd.d/test.res
```
```bash
resource test {
protocol C;
meta-disk internal;
device /dev/drbd1;
syncer {
verify-alg sha1;
}
on node1 {
disk /dev/vdb;
address 172.16.0.3:7789;
}
on node2 {
disk /dev/vdb;
address 172.16.0.4:7789;
}
```
初始化meta数据
```bash
drbdadm create-md test
```
启动和开启DRBD
```bash
systemctl start drbd
systemctl enable drbd
```
#### `node1节点执行`
```bash
drbdadm up test
drbdadm primary test #如果遇到任何错误,执行:drbdadm primary test --force
```
#### `node2节点执行`
```bash
drbdadm up test
```
查看DRBD状态
```bash
cat /proc/drbd
```
```
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:10557016 nr:8 dw:299576 dr:10266018 al:78 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
```
 
### 测试DRBD
格式化存储
```bash
mkfs.ext4 /dev/drbd1
```
挂载
```bash
mount /dev/drbd1 /mnt
```
创建测试数据
```bash
touch /mnt/f{1..5}
ls -l /mnt/
```
```
-rw-r--r-- 1 root root 0 Jul 22 08:59 f1
-rw-r--r-- 1 root root 0 Jul 22 08:59 f2
-rw-r--r-- 1 root root 0 Jul 22 08:59 f3
-rw-r--r-- 1 root root 0 Jul 22 08:59 f4
-rw-r--r-- 1 root root 0 Jul 22 08:59 f5
```
#### 交换主从
`node1执行`
```bash
umount /mnt
```
```bash
drbdadm secondary test
```
`node2执行`
```bash
drbdadm primary test
```
挂载
```bash
mount /dev/drbd1 /mnt
```
查看数据
```bash
ls -l /mnt
```
```
-rw-r--r-- 1 root root 0 Jul 22 08:59 f1
-rw-r--r-- 1 root root 0 Jul 22 08:59 f2
-rw-r--r-- 1 root root 0 Jul 22 08:59 f3
-rw-r--r-- 1 root root 0 Jul 22 08:59 f4
-rw-r--r-- 1 root root 0 Jul 22 08:59 f5
```
 
### 管理命令
查看资源的状态
```bash
drbdadm cstate resouce_name #resouce_name为资源名
```
```
资源的连接状态;一个资源可能有以下连接状态中的一种
StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点建立网络连接
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态
StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS
StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行
```
查看资源的角色
```bash
drbdadm role resouce_name
```
```
Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上
Secondary 次:资源目前为次,正常接收对等节点的更新
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态
```
查看硬盘状态命令
```bash
drbdadm dstate resouce_name
```
```
本地和对等节点的硬盘有可能为下列状态之一:
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,但是已经过时
DUnknown:当对等节点网络连接不可用时出现这种状态
Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态
```
启动、停止资源
```bash
drbdadm up resouce_name #启动资源
drbdadm down resouce_name #停止资源
```
升级和降级资源
```bash
drbdadm primary resouce_name #升级资源角色为主
drbdadm secondary resouce_name #升级资源角色为从
drbdadm -- --overwrite-data-of-peer primary resouce_name #同步资源
```
`注意:在单主模式下的DRBD,两个节点同时处于连接状态,任何一个节点都可以在特定的时间内变成主;但两个节点中只能一为主,如果已经有一个主,需先降级才可能升级;在双主模式下没有这个限制`
**参考:**
`https://github.com/chenzhiwei/linux/tree/master/drbd`
`https://www.learnitguide.net/2016/07/how-to-install-and-configure-drbd-on-linux.html`
`http://yallalabs.com/linux/how-to-install-and-configure-drbd-cluster-on-rhel7-centos7/`
`https://wiki.centos.org/zh/HowTos/Ha-Drbd`