@wenshizhang
2016-07-29T09:57:57.000000Z
字数 6861
阅读 587
suse实习
集群
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上。
先回顾下上次周报中搭建的高可用(High Availability,后面简称HA)集群,三个节点,一块共享存储,为了解决不同节点的写并发,在共享存储上搭载了OCFS2文件系统,stonith设备是sbd。还记得吗?
HA集群通俗说,就是为了不论什么情况下,都要保证集群服务正常。所以高可用集群用了很多冗余的手段来保证这点。节点有备份,如果一个节点down了,还有其他的。所以,存储这么重要的东西,HA集群怎么可能会没有备份呢?
所以DRBD就是为了消除集群的单点效应。
DRBD的核心模组是由分散在不同节点上的分区组成的,需要在不同的节点上创建节歌分区,但并不要求每一个节点都创建。我还是使用之前搭建的集群,在每个节点上都创建一个分区,然后就可以搭建DRBD了。
上图可以看到,我在三台虚拟机上都创建了一个大小4G的磁盘,用来配置DRBD。如果这个磁盘是新创建的,那就不同担心,如果这个磁盘并不是新创建的,而是以前的磁盘复用,有可能这个磁盘上有其他的文件系统,那后面对尕creat-md的时候很有可能不成功。因此,保险起见,先把这些盘都格式化一遍。
dd if=/dev/zero of=/dev/sdb bs=4M count=1024
这个在每个分区所在的节点上都要修改,在/etc/drbd.d/global_common.conf文件中添加图中绿色部分:
在每个node(拥有DRBD存储的每一个node)上,新建文件/etc/drbd.d/r0.res(其中r0是resource的名称,配置文件resource名称可以修改,但是后缀res不能改),文件内容如图:
文件中第一行表示drbd设备名称,第二行表示drbd要求的分区,第三行meta-disk,后面分别是各个node的地址和node id,最后是全部的核心模组。修改完配置文件以后,为了检查是否正确,可以通过drbd把配置文件dump出来看看,如果配置文件修改错误了,dump会报错并给出提示信息,根据信息修改就可以了。正确的配置文件dump输出如图:
初始化drbd resource,初始化meta-data存储在每一个节点上,强制当前node为resource的primary disk。查看此drbd resource的状态。现在可以看到,当前node上的数据是最新的,shiwen2和shiwen3都还没连接上,还需要设置这两个节点,这里要注意一点,每一个drbd resource只能有一个primary disk,已经在一个node上设置了primary disk 后面就不需要了。
每一个node都设置完了以后,使用drbdadm查看resource的状态。
drbd搭建成功,看到了drbd的存储,接下来需要利用这个分区创建一个iscsi的target,用来作共享存储,最后在共享存储上搭载一个OCFS2。当然也可以直接在drbd上面搭载一个OCFS2,这就很有局限性,只支持两个节点的drbd。
其实从原理上说,有了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不同之处就是前者用采用磁盘作为存储,后者采用文件作为存储)。创建过程如图。
后面就是跟上次报告中一样,在每一个node上login share storage,然后在share storage 搭载一个OCFS2。搭建成功如图:
从上图中看到ocfs2 resource agent已经成功启动了。这里drbd+iscsi target +ocfs2已经搭建成功。
前面说为了解决多节点并发写的问题,需要一个特殊的文件系统。这个文件系统可以是OCFS2或者NFS,上面演示了DRBD搭载OCFS2,现在来看看如何搭载NFS。到我写这个文档为止,NFS Server都没能成功start。先来看看步骤吧。
这里还需要一个DRBD,我准备复用之前的DRBD,只需要把之前的OCFS2资源清掉就可以了。或者可以使用另外一个更简单粗暴的办法,把这个盘删除了,新建一个磁盘。
上图是删除前的ocfs2的配置,需要把dlm和ocfs2-1这两个resource agent。下面是删除后:
删除后commit就可以。
1.在/etc/drbd.d/
创建文件nfs.res,文件内容如下:
文件内容和之前类似,指明drbd设别名称和drbd核心模组的挂载点(如果每个节点不一样,就分别在每个节点的address下指明挂载点),每个节点的address和id等等。
2.查看文件/etc/drbd.conf
文件中是否包含include "/etc/drbd.d/nfs.res"
3.把nfs.res
文件和/drbd.conf
文件同步到其他节点上
scp /etc/drbd.conf shiwen2:/etc/
scp /etc/drbd.d/nfs.res shiwen2:/etc/drbd.d/
1.初始化元数据(meta-data)存储
drbdadm create-md nfs
2.up对应的resource(启动drbd)
drbdadm up nfs
在每一个节点上执行完上面两步,drbd应该成功启动了。成功图示:
3.设置一个primary disk,只需要在primary node上执行
drbdadm primary nfs
这时候DRBD就已经成功搭建了,需要稍等片刻,因为DRBD成功初期需要进行数据同步,这需要时间。
1.修改/etc/lvm/lvm.conf文件中的fileter
filter = [ "a|/dev/drbd.*|", "r|.*|" ]
2.在DRBD设备上创建卷组
pvcreate /dev/drbd/by-res/nfs/0
#把DRBD资源初始化为一个LVM的物理卷
vgcreate nfs /dev/drbd/by-res/nfs/0
#创建nfs卷组包含这个物理卷
lvcreate -n sales -L 2G nfs
lvcreate -n devel -L 2G nfs
#在上面创建的卷组中创建两个逻辑卷
vgchange -ay nfs
#激活nfs卷组
mkfs.ext3 /dev/nfs/sales
mkfs.ext3 /dev/nfs/devel
#在两个逻辑卷中创建文件系统
下面的配置都是在crm configure中,在root权限下进入crm configure。
1.配置DRBD
crm(live)#configure
crm(live)configure# primitive drbd_nfs \
ocf:linbit:drbd \
params drbd_resource="nfs" \
op monitor interval="15" role="Master" \
op monitor interval="30" role="Slave"
crm(live)configure# ms ms-drbd_nfs drbd_nfs \
meta master-max="1" master-node-max="1" clone-max="2" \
clone-node-max="1" notify="true"
crm(live)configure# commit
2.NFS kernel server resource
crm(live)configure#primitive nfsserver \
systemd:nfs-server \
op monitor interval="30s"
crm(live)configure# clone cl-nfsserver nfsserver
crm(live)configure# commit
3.LVM和文件系统resource
crm(live)configure#primitive lvm_nfs \
ocf:heartbeat:LVM \
params volgrpname="nfs" \
op monitor interval="30s"
crm(live)configure# primitive fs_devel \
ocf:heartbeat:Filesystem \
params device=/dev/nfs/devel \
directory=/srv/nfs/devel \
fstype=ext3 \
op monitor interval="10s"
crm(live)configure# primitive fs_sales \
ocf:heartbeat:Filesystem \
params device=/dev/nfs/sales \
directory=/srv/nfs/sales \
fstype=ext3 \
op monitor interval="10s"
4.把LVM 文件系统resource 加入pacemaker resource group
crm(live)configure# group g-nfs \
lvm_nfs fs_devel fs_sales
crm(live)configure# order o-drbd_before_nfs inf: \
ms-drbd_nfs:promote g-nfs:start
crm(live)configure# colocation c-nfs_on_drbd inf: \
g-nfs ms-drbd_nfs:Master
crm(live)configure# commit
5.NFS Export Resources
crm(live)configure#primitive exportfs_root \
ocf:heartbeat:exportfs \
params fsid=0 \
directory="/srv/nfs" \
options="rw,crossmnt" \
clientspec="10.9.9.0/24" \
op monitor interval="30s"
#这里假设NFS Server的IP地址就是10.9.9.0/24
crm(live)configure# clone cl-exportfs_root exportfs_root
crm(live)configure#order o-root_before_nfs Mandatory: \
cl-exportfs_root g-nfs:start
crm(live)configure# colocation c-nfs_on_root inf: \
g-nfs cl-exportfs_root
crm(live)configure# commit
crm(live)configure#primitive exportfs_sales \
ocf:heartbeat:exportfs \
params fsid=1 \
directory="/srv/nfs/sales" \
options="rw,mountpoint" \
clientspec="192.168.122.100/24" \
wait_for_leasetime_on_stop=true \
op monitor interval="30s"
crm(live)configure# primitive exportfs_devel \
ocf:heartbeat:exportfs \
params fsid=2 \
directory="/srv/nfs/devel" \
options="rw,mountpoint" \
clientspec="192.168.122.100/24" \
wait_for_leasetime_on_stop=true \
op monitor interval="30s"
crm(live)configure#modgroup g-nfs add \
exportfs_devel exportfs_sales
crm(live)configure#commit
crm(live)configure#primitive ip_nfs \
ocf:heartbeat:IPaddr2 \
params ip=192.168.122.152 \
cidr_netmask=24 \
op monitor interval="30s
#这里假设
crm(live)configure#modgroup g-nfs add ip_nfs
crm(live)configure#commit
8.到这里应该就是配置成功了,但是,现实是各种resource 起不来。如图:
上面我演示的只是一万次失败场景中的一个成功场景,第一次做的时候会有千奇百怪的失败场景。下面列出几个我还能回忆起来并且还原出来的:
stonith设备是集群的必备组件之一,我们这里选择的stonith设备是sbd。fencing过程就是,sbd定时(默认每隔1.2s)给每个节点发送心跳包,节点收到心跳包以后要发送一个回复消息。sbd专门有一个deamon来接收每个节点发送的回复消息。如果没有收到哪个节点发送的回复,sbd的另一个deamon就把这个节点报告给pacemaker,pacemaker决定是不是要shoot这个节点。如果sbd设备出现了问题,pacemaker服务就无法正常启动。如图,下面就是sbd设备异常导致pacemaker不能启动的情况。
下图可以看出shiwen1节点上三个resource 都是start状态,但是shiwen2和shiwen3节点上的stonith都没起来。这时候查看系统日志:
日志显示全是iscsi连接错误,因为sbd是用iscsi作的target,现在找不到这个target了。只要把这个target重新login就可以。
后面再补充。
如果删除的resource正在使用中也会报错,如图:
需要先在resource中先使resource stop以后才能使用edit编辑。
crm configure需要在集群已经成功启动的情况下才能去配置resource agent,如果集群没起来,就会报下面的错误。
只要在每一个节点上启动了pacemaker,crm configure就可以了。
如果DRBDdisk是复用之前的,在DRBD creat-md的时候很容易出现这个错误。显示drbd 设备忙。通过lsblk查看drbd disk下面还挂着一个drbd设备。所以需要先删除这个drbd0这个device
按照下面步骤,或者简单粗暴的关机重启后删除对应的resource 配置文件。
drbdadm status #查看drbd当前的状态
drbdadm secondry r0 #把resource的primary disk 变成secondry
drbdadm down r0 #把resource down