drbd详解

来源:互联网 发布:巧手十字绣软件 编辑:程序博客网 时间:2024/05/16 23:57

文章包含理论和实践两部分,各位可有选择的阅读。

一、DRBD简介

DRBD(Distributed Replicated Block Device):叫做分布式复制块设备,这是一种基于软件,无共享,复制的解决方案。在服务器之间的块设备(包括硬盘、分区、逻辑卷)进行镜像。也就是说当某一个应用程序完成写操作后,它提交的数据不仅仅会保存在本地块设备上,DRBD也会将这份数据复制一份,通过网络传输到另一个节点的块设备上,这样,两个节点上的块设备上的数据将会保存一致,这就是镜像功能。

二、DRBD的特性

DRBD具有如下特性:

1)实时性:当某个应用程序完成对数据的修改时,复制功能立即发生

2)透明性:应用程序的数据存储在镜像块设备上是独立透明的,他们的数据在两个节点上都保存一份,因此,无论哪一台服务器宕机,都不会影响应用程序读取数据的操作,所以说是透明的。

3)同步镜像和异步镜像:同步镜像表示当应用程序提交本地的写操作后,数据后会同步写到两个节点上去;异步镜像表示当应用程序提交写操作后,只有当本地的节点上完成写操作后,另一个节点才可以完成写操作。

三、drbd的用户空间管理工具

为了能够配置和管理drbd的资源,drbd提供了一些管理工具与内核模块进行通信

drbdadm:高级的DRBD程序管理套件工具。它从配置文件/etc/drbd.conf中获取所有配置参数。drbdadm为drbdsetup和drbdmeta两个命令充当程序的前端应用,执行drbdadm实际是执行的drbdsetup和drbdeta两个命令。

drbdsetup:drbdsetup可以让用户配置已经加载在内核中运行的DRBD模块,它是底层的DRBD程序管理套件工具。使用该命令时,所有的配置参数都需要直接在命令行中定义,虽然命令很灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用drbdsetup。

drbdmeta:drbdmeta允许用户创建、转储、还原和修改drbd的元数据结构。这个命令也是用户极少用到。

四、DRBD的模式

DRBD有2中模式,一种是DRBD的主从模式,另一种是DRBD的双主模式

1、DRBD的主从模式

这种模式下,其中一个节点作为主节点,另一个节点作为从节点。其中主节点可以执行读、写操作;从节点不可以挂载文件系统,因此,也不可以执行读写操作。在这种模式下,资源在任何时间只能存储在主节点上。这种模式可用在任何的文件系统上(EXT3、EXT4、XFS等等)。默认这种模式下,一旦主节点发生故障,从节点需要手工将资源进行转移,且主节点变成从节点和从节点变成主节点需要手动进行切换。不能自动进行转移,因此比较麻烦。

为了解决手动将资源和节点进行转移,可以将DRBD做成高可用集群的资源代理(RA),这样一旦其中的一个节点宕机,资源会自动转移到另一个节点,从而保证服务的连续性。

2、DRBD的双主模式

这是DRBD8.0之后的新特性

在双主模式下,任何资源在任何特定的时间都存在两个主节点。这种模式需要一个共享的集群文件系统,利用分布式的锁机制进行管理,如GFS和OCFS2。部署双主模式时,DRBD可以是负载均衡的集群,这就需要从两个并发的主节点中选取一个首选的访问数据。这种模式默认是禁用的,如果要是用的话必须在配置文件中进行声明。

五、DRBD的同步协议

DRBD的复制功能就是将应用程序提交的数据一份保存在本地节点,一份复制传输保存在另一个节点上。但是DRBD需要对传输的数据进行确认以便保证另一个节点的写操作完成,就需要用到DRBD的同步协议,DRBD同步协议有三种:

协议A:数据在本地完成写操作且数据已经发送到TCP/IP协议栈的队列中,则认为写操作完成。如果本地节点的写操作完成,此时本地节点发生故障,而数据还处在TCP/IP队列中,则数据不会发送到对端节点上。因此,两个节点的数据将不会保持一致。这种协议虽然高效,但是并不能保证数据的可靠性。

协议B:数据在本地完成写操作且数据已到达对端节点则认为写操作完成。如果两个节点同时发生故障,即使数据到达对端节点,这种方式同样也会导致在对端节点和本地节点的数据不一致现象,也不具有可靠性。

协议C:只有当本地节点的磁盘和对端节点的磁盘都完成了写操作,才认为写操作完成。这是集群流行的一种方式,应用也是最多的,这种方式虽然不高效,但是最可靠。

六、DRBD的资源

在DRBD中,资源是所有可复制移动存储设备的总称,它包括:

资源名称:资源名称可以是除了空白字符以外的任意ASCII码字符

DRBD设备:DRBD的虚拟块设备。在双方节点上,DRBD设备的设备文件命名方式;一般为/dev/drbdN,其主设备号147,N是次设备号

磁盘配置:DRBD内部应用需要本地数据副本,元数据。在双方节点上,为各自提供的存储设备。

网络配置:双方数据同步时所使用的网络属性;

七、metadata

DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了
a,DRBD设备的大小
b,产生的标识
c,活动日志
d,快速同步的位图
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的
1)内部meta data
内部metadata存放在同一块硬盘或分区的最后的位置上
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。
2)外部meta data
外部的metadata存放在和数据磁盘分开的独立的块设备上
优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要人为的干预操作来进行现有node对新硬盘的同步了

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

实战记录

1、写在前面

本次使用drbd提供存储冗余,进行手动切换测试。

2、准备实验环境

服务器A:
主机名:primary
操作系统:CentOS6.6 64位
eth0网卡地址:172.16.87.148
eth1网卡地址:172.16.254.48

服务器B:
主机名:secondary
操作系统:CentOS6.6 64位
eth0网卡地址:172.16.87.168
eth1网卡地址:172.16.254.68

eth0网卡用于管理及对外提供服务,eth1网卡用于节点直接的心跳。

 

3、设置主机名

primary节点设置hostname

hostname primaryvim /etc/sysconfig/network编辑配置文件:HOSTNAME=primary

secondary节点设置hostname

# hostname secondary# vim /etc/sysconfig/network编辑配置文件:HOSTNAME=secondary

4、关闭防火墙和selinux(2台节点都要操作)

关闭iptables

# service iptables stop
# chkconfig iptables off

关闭selinux:

# setenforce 0# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

5、配置hosts文件(2台节点都操作)

# vim /etc/hosts增加内容如下:172.16.87.148 primary172.16.87.168 secondary

6、添加一块2G硬盘sdb作为DRBD,分区为sdb1,大小2G,并在本地系统创建/drbd-data目录,不做挂载操作。(2台都操作)

# fdisk /dev/sdb

----------------

n-p-1-1-"+2G"-w

----------------

#partprobe

# mkdir /drbd-data

7、通过yum安装DRBD(2台都操作)

# cd /usr/local/src/
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
yum -y install drbd83-utils kmod-drbd83 

8、加载并查看DRBD模块 (2台都操作)

# modprobe drbd
modprobe -l | grep drbd
lsmod | grep drbd

安装成功后,在/sbin目录下有drbdadm,drbdmeta,drbdsetup命令,以及/etc/init.d/drbd启动脚本。

7、配置DRBD(2台都操作)

DRBD的配置文件主要分三个部分:global、common和resource。

在运行的时候默认读取配置文件的路径是/etc/drbd.conf,这个文件描述了DRBD的一些配置参数以及设备与硬盘分区的映射关系,默认情况下是空的,不过在DRBD的源代码包中包含了配置文件的样例)。

一般情况下global_common.conf(本次实验文件所在目录/etc/drbd.d/)文件仅包含global和common部分配置(理解为全局配置),在/etc/drbd.d/*.res的文件定义于一个资源(理解为主机定义)。

其实可以将DRBD配置整合到drbd.conf文件中,不过这样做在资源比较多的情况下会变得混乱。

配置global_common.conf
#cd /etc/drbd.d/
# cp global_common.conf global_common.conf.bk
# vi global_common.conf

global {
        usage-count no;

}

common {
        protocol C;

        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";

                fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }

        startup {

                wfc-timeout 120;
                degr-wfc-timeout 120;
        }

        disk {

                on-io-error detach;
   fencing resource-only;
        }

        net {

   cram-hmac-alg "sha1";
    shared-secret "test
"; 
        }

        syncer {

                rate 200M;
        }
}

配置说明:

global {

               usage-count no;      #否参加DRBD使用者统计,默认为yes

           }

           common {

               protocol C;            # 使用什么协议两台主机的同步方式为完全同步

               handlers {

                       #定义处理机制程序,/usr/lib/drbd/ 里有大量的程序脚本,但是不一定靠谱

               }

               startup {

                       #定义启动超时等

               }

               disk {

                       #磁盘相关公共设置,比如I/O,磁盘故障了怎么办

               }

               net {

                       #定义网络传输、加密算法等

               }

               syncer {

                       rate 1000M;         #定义网络传输速率

               }

           }

----------------------------------------------------------------------------------------------------------
定义资源(*.res)
vi /etc/drbd.d/web.res 
resource web {
  on primary{
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   172.16.87.148:7789;
    meta-disk internal;
  }
  on secondary {
    device    /dev/drbd0;
    disk      /dev/sdb1;
    address   172.16.87.168:7789;
    meta-disk internal;
  }
}

配置说明:

[root@ZhongH100 drbd.d]# vi web.res #写入下面的内容,具体视情况做更改
resource web { #这个web是定义资源的名字
    on node1 {          #on开头,后面是主机名称

        device/dev/drbd0;          #drbd设备名称

        disk/dev/sdb1;             #drbd0使用的磁盘分区为sdb1
        address x.x.x.x:7789;   #设置drbd监听地址与端口
        meta-disk internal;
    }
    on node2 {          #on开头,后面是主机名称
        device/dev/drbd0;          #drbd设备名称
        disk/dev/sdb1;             #drbd0使用的磁盘分区为sdb1
        address x.x.x.x:7789;   #设置drbd监听地址与端口
        meta-disk internal;
    }
}
-------------------------------------------------------------------------------------------------------

将配置文件拷贝到另一台主机,两台主机的配置文件是一模一样的

# scp -p  /etc/drbd.d/*  secondary:/etc/drbd.d/
8、DRBD的启动(2台都操作)

1、初始化资源

# drbdadm create-md web
创建meta data ,名称为web  ,需要与资源名称相同。

2、启动服务及查看运行状态

 启动服务 service drbd start

 查看启动状态 cat /proc/drbd


此刻两台设备都处于Secondary/Secondary状态,下面登录在148主设备上,执行如下命令。

# drbdadm primary all      #这台设备成为所有资源的主。
如果命令失败,执行下一条
# drbdadm  -- --overwrite-data-of-peer primary all  #把此节点设置为主节点,且从头开始同步数据
# watch -n1 'cat /proc/drbd'   对于同步的数据,可以开启新的窗口,监控数据同步状态。

ds是磁盘状态信息 dw是磁盘写信息 dr是磁盘读信息。

9、格式化并挂载DRBD设备(主设备)

注意:所有的读写操作,包括对DRBD设备的格式化及挂载都必须在Primary主机进行,即primary;Secondary主机不能进行任何操作,即使读操作也不可以,连格式化和挂载也不可以。

1、格式化drbd

# mkfs.ext4 /dev/drbd0
##备用节点会进行DRBD设备格式化的同步
##千万不要再在备用节点去进行DRBD设备的格式化

2、挂载drbd

# mount /dev/drbd0  /drbd-data


10、DRBD角色切换:

     DRBD角色切换有两种方法(模拟故障)

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@primary ~]# cd /drbd-data/
[root@primary drbd-data]# ll
total 16
drwx------ 2 root root 16384 Jun 29 08:13 lost+found
[root@primary drbd-data]# touch file{1..5}
[root@primary drbd-data]# ll
total 16
-rw-r--r-- 1 root root     0 Jun 29 10:25 file1
-rw-r--r-- 1 root root     0 Jun 29 10:25 file2
-rw-r--r-- 1 root root     0 Jun 29 10:25 file3
-rw-r--r-- 1 root root     0 Jun 29 10:25 file4
-rw-r--r-- 1 root root     0 Jun 29 10:25 file5
drwx------ 2 root root 16384 Jun 29 08:13 lost+found

   方法一:

1
2
3
4
5
6
7
8
9
10
11
12
148服务器
[root@primary ~]# umount /dev/drbd-data          #卸载/dev/drbd0
[root@primary ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       19G  1.1G   17G   7% /
tmpfs                  58M     0   58M   0% /dev/shm
/dev/sda1             477M   43M  409M  10% /boot
[root@primary ~]# drbdadm secondary web          #将148设置为Secondary状态
[root@primary ~]# cat /proc/drbd | grep ro
version: 8.3.16 (api:88/proto:86-97)
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
168
[root@slave ~]# drbdadm primary web           #将148设置为Primary状态
[root@slave ~]# cat /proc/drbd | grep ro
version: 8.3.16 (api:88/proto:86-97)
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
[root@slave ~]# mount /dev/drbd0 /drbd-data/      #挂载/dev/drbd0
###注意:此时的/dev/drbd0千万不要再去格式化,主备两台主机从头至尾只需要格式化一次,即:在一开始的Primary主机格式化一次
[root@slave ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       19G  1.1G   17G   6% /
tmpfs                  58M     0   58M   0% /dev/shm
/dev/sda1             477M   43M  409M  10% /boot
/dev/drbd0            8.8G   21M  8.3G   1% /drbd-data
[root@slave ~]# cd /drbd-data/
[root@slave drbd-data]# ll               #查看数据有没有同步
total 16
-rw-r--r-- 1 root root     0 Jun 29 10:25 file1
-rw-r--r-- 1 root root     0 Jun 29 10:25 file2
-rw-r--r-- 1 root root     0 Jun 29 10:25 file3
-rw-r--r-- 1 root root     0 Jun 29 10:25 file4
-rw-r--r-- 1 root root     0 Jun 29 10:25 file5
drwx------ 2 root root 16384 Jun 29 08:13 lost+found

    方法二:

1
2
3
4
5
6
7
8
9
10
148
[root@primary ~]# /etc/init.d/drbd stop          #将148的drbd服务stop掉
Stopping all DRBD resources: 
.
[root@primary ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       19G  1.1G   17G   7% /
tmpfs                  58M     0   58M   0% /dev/shm
/dev/sda1             477M   43M  409M  10% /boot
1
2
3
4
5
6
7
8
9
10
11
12
168
[root@slave ~]# drbdadm  -- --overwrite-data-of-peer primary all       #将168设置为Primary
[root@slave ~]# mount /dev/drbd0 /drbd-data/             #挂载
[root@slave ~]# cd /drbd-data/
[root@slave drbd-data]# ll
total 16
-rw-r--r-- 1 root root     0 Jun 29 10:25 file1
-rw-r--r-- 1 root root     0 Jun 29 10:25 file2
-rw-r--r-- 1 root root     0 Jun 29 10:25 file3
-rw-r--r-- 1 root root     0 Jun 29 10:25 file4
-rw-r--r-- 1 root root     0 Jun 29 10:25 file5
drwx------ 2 root root 16384 Jun 29 08:13 lost+found

【完】