首页 > drbd

DRBD是一种块设备的实现,与heartbeat的搭配,被广泛用于linux下的高可用(HA)方案中,蚊子的这篇文章是建立在上一篇《drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据》之上的,对于上一篇中不足和潜在问题予以改正。如果有需要在线操作的请以这篇为准。

此篇文章还是介绍如何在已经含有数据的分区或硬盘上搭建drbdheartbeat高可用mysql服务。

在对含有数据的分区或硬盘建立drbd高可用的时候,请确认以下三件事。

1,所在分区或硬盘可以扩容,比如使用lvm
2,所在分区或硬盘上的文件系统支持shrinking
3,如果以上两条都不能满足,请使用外部metadata

蚊子这里使用的是第一种方法,具体请接着往下看

测试环境:

Vmware6.0
             linux01 192.168.211.128  /dev/VG/data分区,存放数据库文件,320M
             linux02 192.168.211.129 /dev/VG/data分区,存放数据库文件,320M

mysql数据路径/data/mysql
因为没有合适的mysql数据所以使用wordpress的数据,wordpress2.8.5
nginx version: nginx/0.8.20
PHP 5.2.11 (cli) (built: Oct 23 2009 21:01:40)

一,准备工作

linux01上完成的内容

1,heartbeat的安装

yum –y install heartbeat heartbeat-devel

2,drbd的安装

tar zxvf drbd-8.3.4.tar.gz
cd drbd-8.3.4
make all
make install
make install-tools

3,准备一个含有mysql数据的硬盘分区

蚊子这里没有现成的mysql数据,就使用wordpress的数据库内容了,mysql的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[root@linux01 ~]# mkfs.ext3 /dev/VG/data

挂载分区
[root@linux01 ~]# mount /dev/VG/data  /data/

初始化数据库

[root@linux01 mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql
Installing MySQL system tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK
Filling help tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK

在此处安装wordpress,将wordpress数据库安装到blog库中,如下
[root@linux01 mysql]# ll /data/mysql/
total 20572
drwx—— 2 mysql mysql     4096 Oct 27 17:26 blog
-rw-rw—- 1 mysql mysql 10485760 Oct 27 17:25 ibdata1
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile0
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile1
-rw-rw—- 1 mysql root      1247 Oct 27 17:25 linux01.err
-rw-rw—- 1 mysql mysql        5 Oct 27 17:25 linux01.pid
drwx—— 2 mysql root      4096 Oct 27 17:25 mysql
drwx—— 2 mysql root      4096 Oct 27 17:25 test

卸载/data分区
[root@linux01 ~]# umount /data/

4,备份分区前1M空间

[root@linux01 mysql]# dd if=/dev/VG/data of=/root/back bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.049084 seconds, 21.4 MB/s

5,计算metadata容量并扩展分区,计算近似值如下公式

计算出来的近似值是1M左右,因为蚊子环境的lvm最小PE-size就是32Mb,所以扩展一个pe就行了

lvextend –l +1 /dev/VG/data

6,清空分区前1M空间

[root@linux01 mysql]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0131647 seconds, 79.7 MB/s

7,创建drbd.conf文件,内容如下

global {

    usage-count yes;
}

common {
  syncer { rate 10M; }
}

resource r0 {

  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/heartbeat/drbd-peer-outdater -t 5";

  }

  disk {
    on-io-error   detach;
  }

  net {

    after-sb-0pri disconnect;

    after-sb-1pri disconnect;

    after-sb-2pri disconnect;

    rr-conflict disconnect;

  }

  syncer {
    rate 10M;
    al-extents 257;

  }

  on linux01 {
    device     /dev/drbd0;
    disk       /dev/VG/data;
    address    192.168.211.128:7788;
    flexible-meta-disk  internal;
  }

  on linux02 {
    device    /dev/drbd0;
    disk      /dev/VG/data;
    address   192.168.211.129:7788;
    meta-disk internal;
  }
}

8,初始化drbd磁盘

[root@linux01 mysql]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[root@linux01 mysql]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

确认drbd是否启动
[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-22 21:01:53
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将当前机器上的drbd设为primary
[root@linux01 mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-22 21:01:53
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

9,恢复分区第一分区,这也是保证数据还在的关键一步

[root@linux01 mysql]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.113655 seconds, 9.2 MB/s

10,重启drbd服务

[root@linux01 mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

到此为止,linux01上的准备工作就做好了,下面看下linux02上的操作

因为linux02是备份用的,基本不用怎么设置,如果分区里面含有数据的话,就直接执行下面的操作就行

1,heartbeat的安装

yum –y install heartbeat heartbeat-devel

2,drbd的安装

tar zxvf drbd-8.3.4.tar.gz
cd drbd-8.3.4
make all
make install
make install-tools

3,初始化drbd

拷贝linux01上/etc/drbd.conf到linux02上的/etc下

[root@linux02 ~]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0141756 seconds, 74.0 MB/s

扩展分区
[root@linux02 ~]# lvextend –l +1 /dev/VG/data

创建metadata
[root@linux02 ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[root@linux02 ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-22 21:01:33
0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r—-
    ns:0 nr:184320 dw:184320 dr:0 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:405448
        [=====>…………..] sync’ed: 32.0% (405448/589768)K
        finish: 0:00:34 speed: 11,696 (10,240) K/sec

现在两台机器上的准备工作都完毕了,进入到下面一个阶段

二,drbd,Heartbeat和mysql整合工作

两台机器上的公共操作

编辑ha.cf文件,内容如下

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 5
warntime 10
initdead 10
ucast eth0 192.168.211.129    #在两台机器上的内容是不一样的,都是指向对方的ip地址
auto_failback on
node    linux01
node    linux02
ping 192.168.211.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

编辑authkeys文件,内容如下

auth 1
1 crc

修改此文件权限为600

编辑haresources,内容如下

linux01 drbddisk::r0 Filesystem::/dev/drbd0::/data 192.168.211.120 mysqld

第一个字段是主机名,是uname -n得到的
第二个字段作用是当前主机设置为primary
第三个字段作用将/dev/drbd0 mount到/data目录上
第四个字段作用是启动VIP
第五个字段启动mysql进程

这个文件在启动的时候是由左往右启动,停止就是相反的由右往左停止。

分配权限:

chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta

三,启动测试阶段

到现在,全部配置就已经完成了,可以进行测试了

现在两台机器上都启动heartbeat,可以看到第一台机器的状态

VIP已经启动
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:71:2E:11 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0×2000

mysql已经顺利启动
2845 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux01.pid
2945 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux01.err –pid-file=/data/mysql/linux01.pid –socket=/tmp/mysql.sock –port=3306

drbd0设备mount上了
/dev/drbd0            567M   38M  501M   8% /data

这时停止linux01上的heartbeat,看下linux02上的状态

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:50:E4:62 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0×2000

[root@linux02 ~]# ps ax|grep mysql|grep -v grep
2582 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux02.pid
2682 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux02.err –pid-file=/data/mysql/linux02.pid –socket=/tmp/mysql.sock –port=3306

[root@linux02 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG-root    6919612   1866388   4696056  29% /
/dev/sda1               101086     12072     83795  13% /boot
tmpfs                   127772         0    127772   0% /dev/shm
/dev/drbd0              580540     38872    512180   8% /data

这时如果在linux02上也启动nginx的话,使用vip是可以正常访问wordpress的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

使用以上方法,蚊子已经成功把公司线上两台数据库成功做成drbd+heartbeat高可用的方式了,目前稳定运行一周了。

阅读全文

今天蚊子我来说说drbdmetadata,同时感谢“系统架构师群”中的sigma,多亏了和他的讨论,让我对drbd理解又更深了一步。

DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了

a,DRBD设备的大小
b,产生的标识
c,活动日志
d,快速同步的位图

metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的

内部meta data

内部metadata存放在同一块硬盘或分区的最后的位置上

优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。

外部meta data

外部的metadata存放在和数据磁盘分开的独立的块设备上

优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了

如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了。

可以通过下面的命令来计算metadata需要占用的扇区数

Cs是数据磁盘的扇区数

你可以使用"blockdev –getsz device.”命令查到扇区数,cho $(( $(blockdev –getsize64 device) / 512))这个方法更可信一点,支持块设备大小超过2TB

Ms也是用扇区数描述的,如果要转化成MB,就除以2048

下面的公式可以近似得到metadata占用的容量,直接用MB表示,而不是扇区数

以上内容基本来自官方文档,下面说说蚊子理解,先看一张图

 

蚊子要说的是在已有数据的硬盘或分区上做drbd的内容,图中绿,蓝,红三色的部分是原含有数据的分区,其中绿色部分是前1M的内容,用于记录已有数据分区的分区表,按蚊子前面的文章,此处需要先备份绿色的部分,然后对绿,蓝,红三色的空间进行create-md操作,这时会在蓝色区域的最后部分创建metadata,也就是红色的部分,这是蚊子继续做的操作是将备份的绿色部分使用dd命令写回drbd0,这时问题也就出现了,绿色部分记录的磁盘大小是绿蓝红三色总共的大小,而创建drbd的metadata后,drbd认为我可以使用的空间是绿蓝两色的,虽然按蚊子前面的文档mount上可以使用,但如果磁盘快用完的时候,对于文件系统ext3来说,还有空间,但对于drbd来说已经写不进去了,就会产生潜在的问题。

下面来看看正确的做法。看图

步骤:

1,先dd备份绿色部分
2,根据上面的公式计算出metadata占用容量
3,使用lvm给分区扩容
4,dd清空分区绿色部分
5,创建metadata
6,使用dd命令在drbd块设备上恢复备份的绿色部分

经过这几步,隐患就消除了,因为绿色部分只包括蓝和绿的总和空间大小

下面来看看在一块新的硬盘或分区上创建drbd块设备的图

这个图相当于是一块新的分区或硬盘,蓝黄就是硬盘或分区的总容量,在创建完metadata以后,实际可用容量就只有蓝色部分了。

这也就是为什么官方文档上说,如果现有设备不支持扩容或文件系统不支持shrinking就只能使用外部metadata的缘故了

阅读全文

随着两篇drbd相关文章的完成,蚊子drbd的理解更进了一层,本篇文章就在前两篇的基础上结合了Heartbeat来搭建一个mysql高可用的应用,并保留原有mysql数据的内容。

先来介绍一下蚊子的环境吧

Vmware6.0
             linux01 192.168.211.128
             linux02 192.168.211.129

mysql数据路径/data/mysql
因为没有合适的mysql数据所以使用wordpress的数据,wordpress2.8.5
nginx version: nginx/0.8.20
PHP 5.2.11 (cli) (built: Oct 23 2009 21:01:40)

一,准备工作

linux01上完成的内容

1,准备一个含有mysql数据的硬盘分区

蚊子这里没有现成的mysql数据,就使用wordpress的数据库内容了,mysql的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[root@linux01 ~]# mkfs.ext3 /dev/VG/data

挂载分区
[root@linux01 ~]# mount /dev/VG/data  /data/

初始化数据库

[root@linux01 mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql
Installing MySQL system tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK
Filling help tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK

在此处安装wordpress,将wordpress数据库安装到blog库中,如下
[root@linux01 mysql]# ll /data/mysql/
total 20572
drwx—— 2 mysql mysql     4096 Oct 27 17:26 blog
-rw-rw—- 1 mysql mysql 10485760 Oct 27 17:25 ibdata1
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile0
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile1
-rw-rw—- 1 mysql root      1247 Oct 27 17:25 linux01.err
-rw-rw—- 1 mysql mysql        5 Oct 27 17:25 linux01.pid
drwx—— 2 mysql root      4096 Oct 27 17:25 mysql
drwx—— 2 mysql root      4096 Oct 27 17:25 test

卸载/data分区
[root@linux01 ~]# umount /data/

2,备份分区第一扇区

[root@linux01 mysql]# dd if=/dev/VG/data of=/root/back bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.049084 seconds, 21.4 MB/s

3,清空分区第一扇区

[root@linux01 mysql]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0131647 seconds, 79.7 MB/s

4,创建drbd.conf文件,内容如下

global {

    usage-count yes;
}

common {
  syncer { rate 10M; }
}

resource r0 {

  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/heartbeat/drbd-peer-outdater -t 5";

  }

  disk {
    on-io-error   detach;
  }

  net {

    after-sb-0pri disconnect;

    after-sb-1pri disconnect;

    after-sb-2pri disconnect;

    rr-conflict disconnect;

  }

  syncer {
    rate 10M;
    al-extents 257;

  }

  on linux01 {
    device     /dev/drbd0;
    disk       /dev/VG/data;
    address    192.168.211.128:7788;
    flexible-meta-disk  internal;
  }

  on linux02 {
    device    /dev/drbd0;
    disk      /dev/VG/data;
    address   192.168.211.129:7788;
    meta-disk internal;
  }
}

5,初始化drbd磁盘

[root@linux01 mysql]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[root@linux01 mysql]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

确认drbd是否启动
[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-22 21:01:53
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将当前机器上的drbd设为primary
[root@linux01 mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[root@linux01 mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-22 21:01:53
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

6,恢复分区第一分区,这也是保证数据还在的关键一步

[root@linux01 mysql]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.113655 seconds, 9.2 MB/s

7,重启drbd服务

[root@linux01 mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

到此为止,linux01上的准备工作就做好了,下面看下linux02上的操作

因为linux02是备份用的,基本不用怎么设置,如果分区里面含有数据的话,就直接执行下面的操作就行

拷贝linux01上/etc/drbd.conf到linux02上的/etc下

[root@linux02 ~]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0141756 seconds, 74.0 MB/s

[root@linux02 ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[root@linux02 ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-22 21:01:33
0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r—-
    ns:0 nr:184320 dw:184320 dr:0 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:405448
        [=====>…………..] sync’ed: 32.0% (405448/589768)K
        finish: 0:00:34 speed: 11,696 (10,240) K/sec

现在两台机器上的准备工作都完毕了,进入到下面一个阶段

二,drbd,Heartbeat和mysql整合工作

两台机器上的公共操作

yum -y install heartbeat heartbeat-devel

编辑ha.cf文件,内容如下

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 5

warntime 10
initdead 10
ucast eth0 192.168.211.129    #在两台机器上的内容是不一样的,都是指向对方的ip地址
auto_failback on
node    linux01
node    linux02
ping 192.168.211.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

编辑authkeys文件,内容如下

auth 1
1 crc

修改此文件权限为600

编辑haresources,内容如下

linux01 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 192.168.211.120 mysqld

第一个字段是主机名,是uname -n得到的
第二个字段作用是当前主机设置为primary
第三个字段作用将/dev/drbd0以ext3格式mount到/data目录上
第四个字段作用是启动VIP
第五个字段启动mysql进程

这个文件在启动的时候是由左往右启动,停止就是相反的由右往左停止。

分配权限:

chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta

三,启动测试阶段

到现在,全部配置就已经完成了,可以进行测试了

现在两台机器上都启动heartbeat,可以看到第一台机器的状态

VIP已经启动
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:71:2E:11 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0x2000

mysql已经顺利启动
2845 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux01.pid
2945 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux01.err –pid-file=/data/mysql/linux01.pid –socket=/tmp/mysql.sock –port=3306

drbd0设备mount上了
/dev/drbd0            567M   38M  501M   8% /data

这时停止linux01上的heartbeat,看下linux02上的状态

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:50:E4:62 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0x2000

[root@linux02 ~]# ps ax|grep mysql|grep -v grep
2582 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux02.pid
2682 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux02.err –pid-file=/data/mysql/linux02.pid –socket=/tmp/mysql.sock –port=3306

[root@linux02 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG-root    6919612   1866388   4696056  29% /
/dev/sda1               101086     12072     83795  13% /boot
tmpfs                   127772         0    127772   0% /dev/shm
/dev/drbd0              580540     38872    512180   8% /data

这时如果在linux02上也启动nginx的话,使用vip是可以正常访问wordpress的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

阅读全文

书接上文,在上篇《在已有数据的的硬盘上创建drbd高可用复制》一文中,蚊子试验了在一块含有数据的新硬盘上保证不破坏原有数据的前提下建立drbd复制,结果是成功的,同时,蚊子又留了一个问题,让我们回顾一下这个问题:

“蚊子这个试验是使用的一块独立硬盘做的测试,所以头1024字节就是这块硬盘的第一个扇区,如果要是在原有的一块大硬盘的一个独立分区里做的话,不知道这个头1024字节是那部分数据,这样做会不会有问题。”

带着这个问题,昨晚蚊子用虚拟机做了一个实验。

试验目的:在已有硬盘的不同分区上建立drbd复制,同时保证原有数据不丢失,不损坏。
试验环境:vmware模拟环境
192.168.211.128(linux01) CentOS release 5.3 (Final) 留出512M用于建立drbd
192.168.211.129(linux02) CentOS release 5.3 (Final) 留出512M用于建立drbd
drbd-8.3.4版本源码编译安装
试验步骤:

请参考《在已有数据的的硬盘上创建drbd高可用复制》这篇文章,这里不再赘述,唯一可能不同的地方就是不在需要创建pv和vg,直接把空余的512Mb硬盘创建一个lv就行了。

结论:经过蚊子试验,按照上篇的方法,同样可以在保证原有分区数据的情况下建立起drbd复制,有兴趣的朋友可以亲自去试验。同样如果需要在生产环境这样操作请做好相应的备份。

提出问题:

对于这个实验,蚊子同样也有一个疑问,因为创建的数据只有几k而已,如果是在一个装满数据的硬盘或者分区,不知道蚊子这样的方法是否可行,有条件的朋友可以测试一下。

阅读全文

关注drbd也有段时间了,不过蚊子一直没时间亲自操刀过,最近需要解决数据库备份的问题,所以有时间亲自实践了一下。

网上搜了很多资料都说drbd必须在一个干净的block设备上创建,但我的数据库已经在线运行了,所以这种办法可能不太合适,所以自己研究了一下如何在不影响原有数据的情况下配置drbd。今天算是小有成绩了,特来给大家分享一下。

试验目的:在已有数据的硬盘上创建drbd复制
试验环境:vmware模拟环境
192.168.211.128(linux01) CentOS release 5.3 (Final)
192.168.211.129(linux02) CentOS release 5.3 (Final)
drbd-8.3.4版本源码编译安装

试验步骤:

1,添加需要同步的硬盘

首先在虚拟机上为每个系统添加一块新的独立的虚拟硬盘,大小512MB,然后每台机器上执行以下相同的操作

pvcreate /dev/sdb
vgcreate vgtest /dev/sdb
lvcreate -l 127 -n data vgtest

2,格式化分区

然后在linux02并且仅在这台机器上将新建的lv格式化成ext3格式的分区,另外一台机器不用

[root@linux02 ~]# mkfs.ext3 /dev/vgtest/data
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
130048 inodes, 520192 blocks
26009 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
64 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

3,创建文件

将格式化好的分区mount到/data目录下,并在此目录下创建5个有内容的文件,并卸载/data分区,操作如下

[root@linux02 ~]# mount /dev/vgtest/data /data/
[root@linux02 ~]# cd /data/
[root@linux02 data]# for ((i=0;i<=4;i++))
> do
> echo “00$i”>$i
> done
[root@linux02 data]# ll
total 17
-rw-r–r– 1 root root     4 Oct 20 13:45 0
-rw-r–r– 1 root root     4 Oct 20 13:45 1
-rw-r–r– 1 root root     4 Oct 20 13:45 2
-rw-r–r– 1 root root     4 Oct 20 13:45 3
-rw-r–r– 1 root root     4 Oct 20 13:45 4
[root@linux02 data]# cd
[root@linux02 ~]# umount /data/

4,备份头1024自己的数据

为了实现在已经有数据的硬盘上创建drbd,蚊子现在备份/dev/vgtest/data分区的头1024字节的数据,操作如下

dd if=/dev/vgtest/data of=/root/back bs=1M count=1

5,创建drbd相应的设备

下面就来开始创建相应的drbd相关的设备及相应的配置

配置如下:

global {

usage-count yes;
}

common {
syncer { rate 10M; }
}

resource r0 {

protocol C;

handlers {
pri-on-incon-degr “echo o > /proc/sysrq-trigger ; halt -f”;

pri-lost-after-sb “echo o > /proc/sysrq-trigger ; halt -f”;

local-io-error “echo o > /proc/sysrq-trigger ; halt -f”;

outdate-peer “/usr/lib/heartbeat/drbd-peer-outdater -t 5”;

}

startup {

}

disk {
on-io-error   detach;
}

net {

after-sb-0pri disconnect;

after-sb-1pri disconnect;

after-sb-2pri disconnect;

rr-conflict disconnect;

}

syncer {
rate 10M;

al-extents 257;

}

on linux01 {
device     /dev/drbd0;
disk       /dev/vgtest/data;
address    192.168.211.128:7788;
meta-disk  internal;

}

on linux02 {
device    /dev/drbd0;
disk      /dev/vgtest/data;
address   192.168.211.129:7788;
meta-disk internal;
}
}

两台主机上的drbd.conf配置文件相同。下面就可以启动drbd了

linux01上的操作

[root@linux01 ~]# dd if=/dev/zero of=/dev/vgtest/data bs=1M count=1
[root@linux01 ~]# modprobe drbd

[root@linux01 ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[root@linux01 ~]# drbdadm up r0
可以通过查看/proc/drbd来确认现在drbd的状态,显示如下

[root@linux01 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-16 20:22:50
0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r—-
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:520140

linux02上的操作

[root@linux02 ~]# modprobe drbd
[root@linux02 ~]# drbdadm create-md r0
[root@linux02 ~]# drbdadm up r0
查看状态如下

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-20 12:08:30
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—-
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:520140

现在可以看到,两台设备都是从设备,现在需要设置一台机器为主设备,因为我们在linux01上创建了文件,所以由linux01担当primary设备,操作如下

[root@linux01 ~]# drbdsetup /dev/drbd0 primary –o
查看状态如下

[root@linux01 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-16 20:22:50
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r—-
ns:186368 nr:0 dw:0 dr:186368 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:333772
[======>………….] sync’ed: 36.3% (333772/520140)K
finish: 0:00:32 speed: 10,236 (9,808) K/sec

由此看到当前设备已经变成primary了

再来看看linux02上的变化

[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-20 12:08:30
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—-
ns:0 nr:520140 dw:520140 dr:0 al:0 bm:32 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

这样在linux01上/dev/drbd0就已经是可写的设备了,如果是一块新的硬盘,就可以对drbd0设备进行格式化的操作了,但由于我们已经在linux01上创建了数据,为了保留数据,我们不能进行格式化,现在就需要用到刚才备份出来的头1024字节的数据了,操作如下

[root@linux01 ~]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.203191 seconds, 5.2 MB/s

然后mount到/data目录看下

[root@linux01 ~]# mount /dev/drbd0 /data/
执行之后并没有报错,使用df看下状态

[root@linux01 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7744976   3900480   3444728  54% /
/dev/sda1               101086     12075     83792  13% /boot
tmpfs                    62800         0     62800   0% /dev/shm
/dev/drbd0              503780     10550    467221   3% /data

可以看到,已经可以成功mount使用了。

6,检查原有数据是否存在

现在就来验证一下原有创建的数据是否存在吧,操作如下

[root@linux01 ~]# ll /data/
total 22
-rw-r–r– 1 root root     4 Oct 16 20:25 0
-rw-r–r– 1 root root     4 Oct 16 20:25 1
-rw-r–r– 1 root root     4 Oct 16 20:25 2
-rw-r–r– 1 root root     4 Oct 16 20:25 3
-rw-r–r– 1 root root     4 Oct 16 20:25 4
drwx—— 2 root root 12288 Oct 16 20:25 lost+found

由此看到,原来/data目录下的数据还是存在的,看下文件的内容

[root@linux01 ~]# cat /data/3
003

内容也是存在的

到此,在原有数据的硬盘上创建drbd就已经成功了,接下来测试同步数据是否成功

7,测试同步数据

由上可知,原数据保留下来了,那么新的数据和原有数据是否可以同步到linux02上呢,下面就来验证一下,操作如下

先在linux01上创建数据文件5

[root@linux01 ~]# echo “005”>/data/5
[root@linux01 ~]# cat /data/5
005

卸载/data目录
[root@linux01 ~]# umount /data/

将linux01上的drbd0设置为secondary
[root@linux01 ~]# drbdsetup /dev/drbd0 secondary
[root@linux01 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux01, 2009-10-16 20:22:50
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r—-
ns:521197 nr:0 dw:1057 dr:521249 al:3 bm:34 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将linux02上的drbd0设置为primary
[root@linux02 ~]# drbdsetup /dev/drbd0 primary -o
[root@linux02 ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@linux02, 2009-10-20 12:08:30
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—-
ns:0 nr:521197 dw:521197 dr:0 al:0 bm:32 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

mount到/data目录上
[root@linux02 ~]# mount /dev/drbd0 /data/
[root@linux02 ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7744976   2878792   4466416  40% /
/dev/sda1               101086     12073     83794  13% /boot
tmpfs                    62800         0     62800   0% /dev/shm
/dev/drbd0              503780     10551    467220   3% /data

查看/data目录下数据
[root@linux02 ~]# ll /data/
total 24
-rw-r–r– 1 root root     4 Oct 16 20:25 0
-rw-r–r– 1 root root     4 Oct 16 20:25 1
-rw-r–r– 1 root root     4 Oct 16 20:25 2
-rw-r–r– 1 root root     4 Oct 16 20:25 3
-rw-r–r– 1 root root     4 Oct 16 20:25 4
-rw-r–r– 1 root root     4 Oct 16 20:39 5
drwx—— 2 root root 12288 Oct 16 20:25 lost+found
[root@linux02 ~]# cat /data/5
005
[root@linux02 ~]# cat /data/4
004

到此,蚊子对于在已有数据的硬盘上创建drbd同步的测试就做完了,这样看来就算硬盘上已有数据,也是可行的。有兴趣的朋友可以亲自尝试一下,正式环境操作前请做好备份工作。但在我试验的时候蚊子我还是有个疑问的。

蚊子这个试验是使用的一块独立硬盘做的测试,所以头1024字节就是这块硬盘的第一个扇区,如果要是在原有的一块大硬盘的一个独立分区里做的话,不知道这个头1024字节是那部分数据,这样做会不会有问题。

带着这个问题,蚊子还有有第二版的测试文档的。另外安装官方文档,如果硬盘已有数据,建议使用external meta data。

阅读全文

网上看到了这篇文章,对于drbd概念的理解还是很有帮助的。

DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

    在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。

底层设备支持

    DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在商脉内创建文件系统。DRBD所支持的底层设备有以下这些类:

    1、一个磁盘,或者是磁盘的某一个分区;

    2、一个soft raid 设备;

    3、一个LVM的逻辑卷;

    4、一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;

    5、其他任何的块设备。

    配置简介

    1、全局配置项(global)

        基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http协议发送信息到linbit公司的服务器上面。

    2、公共配置项(common)

        这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等。

    3、资源配置项(resource)

        resource项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。每一个resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。实际上,在drbd的整个集群中,每一个节点上面的 drbd.conf文件需要是完全一致的。

        另外,resource还有很多其他的内部配置项:

        net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。

        startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)

        syncer:同步相关的设置。可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的数据一致性(verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:drbdsetup /dev/drbd0 syncer -r 100M。这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,你需要通过 drbdadm adjust resource_name 来让drbd按照配置中的rate来工作。

资源管理

    1、增加resource的大小:

    当遇到我们的drbd resource设备容量不够的时候,而且我们的底层设备支持在线增大容量的时候(比如使用lvm的情况下),我们可以先增大底层设备的大小,然后再通过 drbdadm resize resource_name来实现对resource的扩容。但是这里有一点需要注意的就是只有在单primary模式下可以这样做,而且需要先在所有节点上都增大底层设备的容量。然后仅在primary节点上执行resize命令。在执行了resize命令后,将触发一次当前primary节点到其他所有secondary节点的re-synchronization。

    如果我们在drbd非工作状态下对底层设备进行了扩容,然后再启动drbd,将不需要执行resize命令(当然前提是在配置文件中没有对disk参数项指定大小),drbd自己会知道已经增大了容量。

    在进行底层设备的增容操作的时候千万不要修改到原设备上面的数据,尤其是drbd的meta信息,否则有可能毁掉所有数据。

    2、收缩resource容量:

    容量收缩比扩容操作要危险得多,因为该操作更容易造成数据丢失。在收缩resource的容量之前,必须先收缩drbd设备之上的容量,也就是文件系统的大小。如果上层文件系统不支持收缩,那么resource也没办法收缩容量。

    如果在配置drbd的时候将meta信息配置成internal的,那么在进行容量收缩的时候,千万别只计算自身数据所需要的空间大小,还要将drbd的meta信息所需要的空间大小加上。

    当文件系统收缩好以后,就可以在线通过以下命令来重设resource的大小:drbdadm — –size=***G resize resource_name。在收缩的resource的大小之后,你就可以自行收缩释放底层设备空间(如果支持的话)。

    如果打算停机状态下收缩容量,可以通过以下步骤进行:

        a、在线收缩文件系统

        b、停用drbd的resource:drbdadm down resourcec_name

        c、导出drbd的metadata信息(在所有节点都需要进行):drbdadm dump-md resource_name > /path_you_want_to_save/file_name

        d、在所有节点收缩底层设备

        e、更改上面dump出来的meta信息的la-size-sect项到收缩后的大小(是换算成sector的数量后的数值)

   f、如果使用的是internal来配置meta-data信息,则需要重新创建meta-data:drbdadm create-md resource_name

   g、将之前导出并修改好的meta信息重新导入drbd(摘录自linbit官方网站的一段导入代码):

    drbdmeta_cmd=$(drbdadm -d dump-md test-disk)

            ${drbdmeta_cmd/dump-md/restore-md} /path_you_want_to_save/file_name
        h、启动resource:drbdadm up resource_name

磁盘损坏

    1、detach resource

        如果在resource的disk配置项中配置了on_io_error为pass_on的话,那么drbd在遇到磁盘损坏后不会自己detach底层设备。也就是说需要我们手动执行detach的命令(drbdadm detach resource_name),然后再查看当前各节点的ds信息。可以通过cat /proc/drbd来查看,也可以通过专有命令来查看:drbdadm dstat resource_name。当发现损坏的那方已经是Diskless后,即可。如果我们没有配置on_io_error或者配置成detach的话,那么上面的操作将会由自动进行。

        另外,如果磁盘损坏的节点是当前主节点,那么我们需要进行节点切换的操作后再进行上面的操作。

    2、更换磁盘

        当detach了resource之后,就是更换磁盘了。如果我们使用的是internal的meta-data,那么在换好磁盘后,只需要重新创建 mata-data(drbdadm create-md resource_name),再将resource attach上(drbdadm attach resource_name),然后drbd就会马上开始从当前primary节点到本节点的re-synchronisation。数据同步的实时状况可以通过 /proc/drbd文件的内容获得。

        不过,如果我们使用的不是internal的meta-data保存方式,也就是说我们的meta-data是保存在resource之外的地方的。那么我们在完成上面的操作(重建meta-data)之后,还需要进行一项操作来触发re-synchnorisation,所需命令为:drbdadm invalidate resource_name 。

   节点crash(或计划内维护)

    1、secondary节点

        如果是secondary接待你crash,那么primary将临时性的与secondary断开连接,cs状态应该会变成WFConnection,也就是等待连接的状态。这时候primary会继续对外提供服务,并在meta-data里面记录下从失去secondary连接后所有变化过的 block的信息。当secondary重新启动并连接上primary后,primary –> secondary的re-synchnorisation会自动开始。不过在re-synchnorisation过程中,primary和 secondary的数据是不一致状态的。也就是说,如果这个时候primary节点也crash了的话,secondary是没办法切换成 primary的。也就是说,如果没有其他备份的话,将丢失所有数据。

    2、primary节点

        一般情况下,primary的crash和secondary的crash所带来的影响对drbd来说基本上是差不多的。唯一的区别就是需要多操作一步将 secondary节点switch成primary节点先对外提供服务。这个switch的过程drbd自己是不会完成的,需要我们人为干预进行一些操作才能完成。当crash的原primary节点修复并重新启动连接到现在的primary后,会以secondary存在,并开始re- synchnorisation这段时间变化的数据。

        在primary节点crash的情况下,drbd可以保证同步到原secondary的数据的一致性,这样就避免了当primary节点crash之后,secondary因为数据的不一致性而无法wcitch成primary或者即使切换成primary后因为不一致的数据无法提供正常的服务的问题。

    3、节点永久性损坏(需要更换机器或重新安装相关软件的情况)

        当某一个节点因为硬件(或软件)的问题,导致某一节点已经无法再轻易修复并提供服务,也就是说我们所面对的是需要更换主机(或从OS层开始重新安装)的问题。在遇到这样的问题后,我们所需要做的是重新提供一台和原节点差不多的机器,重新开始安装os,安装相关软件,从现有整提供服务的节点上copy出 drbd的配置文件(/etc/drbd.conf),创建meta-data信息,然后启动drbd服务,以一个secondary的身份连接到现有的 primary上面,后面就会自动开始re-synchnorisation。

    split brain的处理

    split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。

    如果我们在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,具体解决策略是根据配置中的设置来进行的。

    如果没有配置split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:

    a、首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:

        drbdadm secondary resource_name

        drbdadm — –discard-my-data connect resource_name

    b、在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)

        drbdadm connect resource_name

    当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。

meta data存放地点的比较

    1、internal meta-data(meta-data和数据存放在同一个底层设备之上)

    优点:一旦meta-data创建之后,就和实际数据绑在了一起,在维护上会更简单方便,不用担心meta-data会因为某些操作而丢失。另外在硬盘损坏丢失数据的同时,meta-data也跟着一起丢失,当更换硬盘之后,只需要执行重建meta-data的命令即可,丢失的数据会很容易的从其他节点同步过来。

    缺点:如果底层设备是单一的磁盘,没有做raid,也不是lvm等,那么可能会造成性能影响。因为每一次写io都需要更新meta-data里面的信息,那么每次写io都会有两次,而且肯定会有磁头的较大寻道移动,因为meta-data都是记录在dice设备的最末端的,这样就会造成写io的性能降低。

    2、external meta data(meta-data存放在独立的,与存放数据的设备分开的设备之上)

    优点:与internal meta-data的缺点完全相对,可以解决写io的争用问题。

    缺点:由于meta-data存放在与数据设备分开的地方,就意味着当磁盘损坏更换磁盘之后,必须手动发起全量同步的操作。也就是管理维护会稍微麻烦那么一点点,很小的一点点。

    如果我们希望在已经存在数据的设备上面建立drbd的资源,并且不希望丢失该设备上面的数据,又没办法增大底层设备的容量,而且上层文件系统又没办法收缩的话,我们就只能将meta data创建成external方式。

阅读全文