[关闭]
@wenshizhang 2016-07-29T09:57:57.000000Z 字数 6861 阅读 587

DRBD

suse实习 集群


什么是DRBD

DRBD (Distributed Replicated Block Device)是 Linux 平台上的分散式存储系统。通常用于高可用(high availability, 以下简称HA)集群。DRBD 类似于磁盘阵列的RAID 1(镜像),只不过RAID 1 是在同一台电脑上,而DRBD是分布在不同的电脑上,通过网络连接。

DRBD核心模组是由分布在不同电脑上的不同分区组成,在这些分区中指定一个primary disk,剩下的都是secondary,这些secondary disk对集群来说是透明的,集群只能感知到primary disk的存在并且在其上进行读写操作。既然DRBD 是为了消除存储单点效应,那么这些disk中的数据应该具有一致性。DRBD负责这些分区之间数据的同步操作。如果有一块磁盘down了,pacemaker会负责在其他的分区中选择一个出来作为primary,并且把相应的文件或者设备(看起来比较抽象,后面搭建演示中会解释)迁移到新的primary disk上。

为什么集群需要DRBD

drbd结构图

先回顾下上次周报中搭建的高可用(High Availability,后面简称HA)集群,三个节点,一块共享存储,为了解决不同节点的写并发,在共享存储上搭载了OCFS2文件系统,stonith设备是sbd。还记得吗?
HA集群通俗说,就是为了不论什么情况下,都要保证集群服务正常。所以高可用集群用了很多冗余的手段来保证这点。节点有备份,如果一个节点down了,还有其他的。所以,存储这么重要的东西,HA集群怎么可能会没有备份呢?
所以DRBD就是为了消除集群的单点效应。

配置DRBD

DRBD的核心模组是由分散在不同节点上的分区组成的,需要在不同的节点上创建节歌分区,但并不要求每一个节点都创建。我还是使用之前搭建的集群,在每个节点上都创建一个分区,然后就可以搭建DRBD了。

查看disk

上图可以看到,我在三台虚拟机上都创建了一个大小4G的磁盘,用来配置DRBD。如果这个磁盘是新创建的,那就不同担心,如果这个磁盘并不是新创建的,而是以前的磁盘复用,有可能这个磁盘上有其他的文件系统,那后面对尕creat-md的时候很有可能不成功。因此,保险起见,先把这些盘都格式化一遍。

  1. dd if=/dev/zero of=/dev/sdb bs=4M count=1024

1.修改DRBD的配置文件

这个在每个分区所在的节点上都要修改,在/etc/drbd.d/global_common.conf文件中添加图中绿色部分:

修改globle文件

在每个node(拥有DRBD存储的每一个node)上,新建文件/etc/drbd.d/r0.res(其中r0是resource的名称,配置文件resource名称可以修改,但是后缀res不能改),文件内容如图:

resource配置文件

文件中第一行表示drbd设备名称,第二行表示drbd要求的分区,第三行meta-disk,后面分别是各个node的地址和node id,最后是全部的核心模组。修改完配置文件以后,为了检查是否正确,可以通过drbd把配置文件dump出来看看,如果配置文件修改错误了,dump会报错并给出提示信息,根据信息修改就可以了。正确的配置文件dump输出如图:

resource dump

2.初始并格式化drbd资源

初始化drbd resource,初始化meta-data存储在每一个节点上,强制当前node为resource的primary disk。查看此drbd resource的状态。现在可以看到,当前node上的数据是最新的,shiwen2和shiwen3都还没连接上,还需要设置这两个节点,这里要注意一点,每一个drbd resource只能有一个primary disk,已经在一个node上设置了primary disk 后面就不需要了。

init resource

每一个node都设置完了以后,使用drbdadm查看resource的状态。

drbdadm status
lsblk

drbd搭建成功,看到了drbd的存储,接下来需要利用这个分区创建一个iscsi的target,用来作共享存储,最后在共享存储上搭载一个OCFS2。当然也可以直接在drbd上面搭载一个OCFS2,这就很有局限性,只支持两个节点的drbd。

3.利用drbd分区创建iscsi target

其实从原理上说,有了DRBD并不需要再建一个iscsi target作共享存储了。不管哪个节点只要在DRBD 上的读写操作,都是在primary disk的操作,并且DRBD自己会同步到其他的disk上,这就相当于每个节点都是在同一个disk上读写。那为什么还要重复创建一个iscsi target呢?原因很简单,因为DRBD对OCFS2的支持并不是很好,DRBD官方文档建议如果要搭建OCFS2的时候最好中间再加一层iscsi target。
综上,理论上说可以直接在DRBD上搭载OCFS2文件系统,但是为了更好的兼容,选择在DRBD上搭建一个 iscsi target,然后在搭载OCFS2文件系统。
这次有了一个分区,创建target时候选择创建iblock target(iblock target和fileio target不同之处就是前者用采用磁盘作为存储,后者采用文件作为存储)。创建过程如图。

create targer1
create target2

后面就是跟上次报告中一样,在每一个node上login share storage,然后在share storage 搭载一个OCFS2。搭建成功如图:

OCFS2搭建成功

从上图中看到ocfs2 resource agent已经成功启动了。这里drbd+iscsi target +ocfs2已经搭建成功。

DRBD搭载NFS

前面说为了解决多节点并发写的问题,需要一个特殊的文件系统。这个文件系统可以是OCFS2或者NFS,上面演示了DRBD搭载OCFS2,现在来看看如何搭载NFS。到我写这个文档为止,NFS Server都没能成功start。先来看看步骤吧。
这里还需要一个DRBD,我准备复用之前的DRBD,只需要把之前的OCFS2资源清掉就可以了。或者可以使用另外一个更简单粗暴的办法,把这个盘删除了,新建一个磁盘。

1.清除ocfs2配置

删除前ocfs2配置

上图是删除前的ocfs2的配置,需要把dlm和ocfs2-1这两个resource agent。下面是删除后:
resource 删除后
删除后commit就可以。

2.pacemaker的基本配置

pacemaker基本配置

3.配置resource agent

1.在/etc/drbd.d/创建文件nfs.res,文件内容如下:
nfs.res文件内容
文件内容和之前类似,指明drbd设别名称和drbd核心模组的挂载点(如果每个节点不一样,就分别在每个节点的address下指明挂载点),每个节点的address和id等等。
2.查看文件/etc/drbd.conf文件中是否包含include "/etc/drbd.d/nfs.res"
3.把nfs.res文件和/drbd.conf文件同步到其他节点上

  1. scp /etc/drbd.conf shiwen2:/etc/
  2. scp /etc/drbd.d/nfs.res shiwen2:/etc/drbd.d/

4.DRBD设置

1.初始化元数据(meta-data)存储

  1. drbdadm create-md nfs

2.up对应的resource(启动drbd)

  1. drbdadm up nfs

在每一个节点上执行完上面两步,drbd应该成功启动了。成功图示:
drbd 初步成功

3.设置一个primary disk,只需要在primary node上执行

  1. drbdadm primary nfs

这时候DRBD就已经成功搭建了,需要稍等片刻,因为DRBD成功初期需要进行数据同步,这需要时间。

5.配置LVM

1.修改/etc/lvm/lvm.conf文件中的fileter

  1. filter = [ "a|/dev/drbd.*|", "r|.*|" ]

2.在DRBD设备上创建卷组

  1. pvcreate /dev/drbd/by-res/nfs/0
  2. #把DRBD资源初始化为一个LVM的物理卷
  3. vgcreate nfs /dev/drbd/by-res/nfs/0
  4. #创建nfs卷组包含这个物理卷
  5. lvcreate -n sales -L 2G nfs
  6. lvcreate -n devel -L 2G nfs
  7. #在上面创建的卷组中创建两个逻辑卷
  8. vgchange -ay nfs
  9. #激活nfs卷组
  10. mkfs.ext3 /dev/nfs/sales
  11. mkfs.ext3 /dev/nfs/devel
  12. #在两个逻辑卷中创建文件系统

6.配置NFS Server需要的集群resource

下面的配置都是在crm configure中,在root权限下进入crm configure。
1.配置DRBD

  1. crm(live)#configure
  2. crm(live)configure# primitive drbd_nfs \
  3. ocf:linbit:drbd \
  4. params drbd_resource="nfs" \
  5. op monitor interval="15" role="Master" \
  6. op monitor interval="30" role="Slave"
  7. crm(live)configure# ms ms-drbd_nfs drbd_nfs \
  8. meta master-max="1" master-node-max="1" clone-max="2" \
  9. clone-node-max="1" notify="true"
  10. crm(live)configure# commit

2.NFS kernel server resource

  1. crm(live)configure#primitive nfsserver \
  2. systemd:nfs-server \
  3. op monitor interval="30s"
  4. crm(live)configure# clone cl-nfsserver nfsserver
  5. crm(live)configure# commit

3.LVM和文件系统resource

  1. crm(live)configure#primitive lvm_nfs \
  2. ocf:heartbeat:LVM \
  3. params volgrpname="nfs" \
  4. op monitor interval="30s"
  5. crm(live)configure# primitive fs_devel \
  6. ocf:heartbeat:Filesystem \
  7. params device=/dev/nfs/devel \
  8. directory=/srv/nfs/devel \
  9. fstype=ext3 \
  10. op monitor interval="10s"
  11. crm(live)configure# primitive fs_sales \
  12. ocf:heartbeat:Filesystem \
  13. params device=/dev/nfs/sales \
  14. directory=/srv/nfs/sales \
  15. fstype=ext3 \
  16. op monitor interval="10s"

4.把LVM 文件系统resource 加入pacemaker resource group

  1. crm(live)configure# group g-nfs \
  2. lvm_nfs fs_devel fs_sales
  3. crm(live)configure# order o-drbd_before_nfs inf: \
  4. ms-drbd_nfs:promote g-nfs:start
  5. crm(live)configure# colocation c-nfs_on_drbd inf: \
  6. g-nfs ms-drbd_nfs:Master
  7. crm(live)configure# commit

5.NFS Export Resources

  1. crm(live)configure#primitive exportfs_root \
  2. ocf:heartbeat:exportfs \
  3. params fsid=0 \
  4. directory="/srv/nfs" \
  5. options="rw,crossmnt" \
  6. clientspec="10.9.9.0/24" \
  7. op monitor interval="30s"
  8. #这里假设NFS Server的IP地址就是10.9.9.0/24
  9. crm(live)configure# clone cl-exportfs_root exportfs_root
  10. crm(live)configure#order o-root_before_nfs Mandatory: \
  11. cl-exportfs_root g-nfs:start
  12. crm(live)configure# colocation c-nfs_on_root inf: \
  13. g-nfs cl-exportfs_root
  14. crm(live)configure# commit
  15. crm(live)configure#primitive exportfs_sales \
  16. ocf:heartbeat:exportfs \
  17. params fsid=1 \
  18. directory="/srv/nfs/sales" \
  19. options="rw,mountpoint" \
  20. clientspec="192.168.122.100/24" \
  21. wait_for_leasetime_on_stop=true \
  22. op monitor interval="30s"
  23. crm(live)configure# primitive exportfs_devel \
  24. ocf:heartbeat:exportfs \
  25. params fsid=2 \
  26. directory="/srv/nfs/devel" \
  27. options="rw,mountpoint" \
  28. clientspec="192.168.122.100/24" \
  29. wait_for_leasetime_on_stop=true \
  30. op monitor interval="30s"
  31. crm(live)configure#modgroup g-nfs add \
  32. exportfs_devel exportfs_sales
  33. crm(live)configure#commit
  34. crm(live)configure#primitive ip_nfs \
  35. ocf:heartbeat:IPaddr2 \
  36. params ip=192.168.122.152 \
  37. cidr_netmask=24 \
  38. op monitor interval="30s
  39. #这里假设
  40. crm(live)configure#modgroup g-nfs add ip_nfs
  41. crm(live)configure#commit

8.到这里应该就是配置成功了,但是,现实是各种resource 起不来。如图:

失败场景

上面我演示的只是一万次失败场景中的一个成功场景,第一次做的时候会有千奇百怪的失败场景。下面列出几个我还能回忆起来并且还原出来的:

1.sbd失败

stonith设备是集群的必备组件之一,我们这里选择的stonith设备是sbd。fencing过程就是,sbd定时(默认每隔1.2s)给每个节点发送心跳包,节点收到心跳包以后要发送一个回复消息。sbd专门有一个deamon来接收每个节点发送的回复消息。如果没有收到哪个节点发送的回复,sbd的另一个deamon就把这个节点报告给pacemaker,pacemaker决定是不是要shoot这个节点。如果sbd设备出现了问题,pacemaker服务就无法正常启动。如图,下面就是sbd设备异常导致pacemaker不能启动的情况。

sbd异常

下图可以看出shiwen1节点上三个resource 都是start状态,但是shiwen2和shiwen3节点上的stonith都没起来。这时候查看系统日志:

sbd异常查看日志

日志显示全是iscsi连接错误,因为sbd是用iscsi作的target,现在找不到这个target了。只要把这个target重新login就可以。
后面再补充。

2.resource删除错误

如果删除的resource正在使用中也会报错,如图:
reousce delete error

需要先在resource中先使resource stop以后才能使用edit编辑。

3.crm configure错误

crm configure需要在集群已经成功启动的情况下才能去配置resource agent,如果集群没起来,就会报下面的错误。
crm configure error

只要在每一个节点上启动了pacemaker,crm configure就可以了。

4.DRBD设备忙

如果DRBDdisk是复用之前的,在DRBD creat-md的时候很容易出现这个错误。显示drbd 设备忙。通过lsblk查看drbd disk下面还挂着一个drbd设备。所以需要先删除这个drbd0这个device
drbd dev
按照下面步骤,或者简单粗暴的关机重启后删除对应的resource 配置文件。

  1. drbdadm status #查看drbd当前的状态
  2. drbdadm secondry r0 #把resource的primary disk 变成secondry
  3. drbdadm down r0 #把resource down

更好的排版参见:https://www.zybuluo.com/wenshizhang/note/443888

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注