今天本来想按照之前的计划,分析一下drbd的源码,看到/proc/drbd文件的实现方式时,就想打开drbd服务切实看一下,结果发现几年前配置过的drbd已经不能再使用了,还是先把配置过程完整再尝试一下,以便记录在这里分享出来。
首先需要准备两台虚拟机,可以使用vmware或者virtualos。本文主要针对drbd的配置和使用过程,虚拟机安装部分不作详述。
步骤:
(一)安装虚拟机
安装配置Linux OS,目前桌面版的Linux系统都是免费的,可以很容易获取到安装镜像源。常用的有:Ubutun、Fedora和OpenSuse,可以自行选用。
(二)给虚拟机配置网络
最好都能上外网,以便下载安装常用软件包。
(三)安装drbd软件
上述的Linux桌面发行版自带的安装源中都能找到drbd的安装包。如果没有,那么需要自行下载源码编译安装,这样安装过程中一般会出现不少问题,Google或者百度能解决。
这里以我的两个虚拟机为例:
在做drbd实验之前,需要对虚拟机做快照备份,防止中途OS崩溃无法启动后可以回退。
系统配置: 虚拟机1 [root@t ~]# hostname t [root@t ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:07:3D:A8 inet addr:192.168.1.104 Bcast:255.255.255.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe07:3da8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:280652 errors:0 dropped:0 overruns:0 frame:0 TX packets:2326851 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:26215565 (25.0 MiB) TX bytes:3493042943 (3.2 GiB) Interrupt:19 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) [root@t ~]# cat /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 192.168.1.104 localhost.localdomain localhost localhost t ::1 localhost6.localdomain6 localhost6 192.168.1.106 Shentar 192.168.1.104 ME [root@t ~]# 虚拟机2 [root@Shentar /]# hostname Shentar [root@Shentar /]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:39:C4:28 inet addr:192.168.1.106 Bcast:255.255.255.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe39:c428/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2327200 errors:0 dropped:0 overruns:0 frame:0 TX packets:280717 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3492827412 (3.2 GiB) TX bytes:26300053 (25.0 MiB) Interrupt:19 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) [root@Shentar /]# cat /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 192.168.1.106 localhost.localdomain localhost localhost Shentar ::1 localhost6.localdomain6 localhost6 192.168.1.104 t 192.168.1.106 ME(四)在配置好了虚拟机之后,给每个虚拟机增加一块硬盘,用作drbd的镜像源。
准备供drbd管理的磁盘,对于虚拟机很方便,直接添加硬盘即可。添加步骤:
打开虚拟机的设置对话框:
点击add按钮
一路next即可。
添加完成后的虚拟机配置如下:
启动虚拟机
使用fdisk -l命令会发现系统中多了一块硬盘设备:
[root@Shentar ~]# fdisk -lDisk /dev/sdc: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/sdc doesn't contain a valid partition table
注:这里的显示内容中已经将其他无关的磁盘信息删除。对新加的硬盘创建分区,按照如下步骤执行即可:
[root@Shentar ~]# fdisk /dev/sdc Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-391, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-391, default 391): Using default value 391 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@Shentar ~]# fdisk -l Disk /dev/sdc: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x2a28d263 Device Boot Start End Blocks Id System /dev/sdc1 1 391 3140676 83 Linux启动两台虚拟机上面的drbd服务。
查看系统进程,会发现多了3个drbd相关的进程:
在其中一个节点执行如下命令,强制置主:
对drbd虚拟设备做文件系统:
现在就可以挂载使用drbd的虚拟磁盘设备/dev/drbd2 了。
做一个最简单的试验,在主节点创建一个文件,然后倒换到备,在备上面查看该文件:
然后倒换drbd。
两台虚拟机都配置完毕后,可以配置drbd.conf文件了。我的两台虚拟机的配置文件如下
[root@Shentar ~]# cat /etc/drbd.conf # # please have a a look at the example configuration file in # /usr/share/doc/packages/drbd.conf # resource r0 { protocol C; startup { wfc-timeout 2000; degr-wfc-timeout 6000; } syncer { rate 50M; } disk { on-io-error pass_on; } on Shentar { device /dev/drbd2; disk /dev/sdc1; address 192.168.1.106:7789; meta-disk internal; } on t { device /dev/drbd2; disk /dev/sdc1; address 192.168.1.104:7789; meta-disk internal; } }两台虚拟机的配置完全一样即可。
执行如下两条命令创建drbd资源:
[root@Shentar ~]# drbdadm create-md r0
[root@t ~]# drbdadm create-md r0
其中r0是配置文件中指定的资源名。
(七)初次启动drbd
/etc/init.d/drbd start
先启动的一台虚拟机会等待另外一台,一直停留在如下等待画面:
[root@t ~]# /etc/init.d/drbd start Starting DRBD resources: [ d(r0) s(r0) n(r0) ].......... *************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 6000 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 2000 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 30]: 等待另一台启动后,会自动完成启动。
[root@t ~]# proc PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 2 0 0 ? -1 S< 0 0:00 [kthreadd] 2 2966 0 0 ? -1 S 0 0:00 \_ [drbd2_worker] 2 2975 0 0 ? -1 S 0 0:00 \_ [drbd2_receiver] 2 3014 0 0 ? -1 S 0 0:00 \_ [drbd2_asender] 我的理解,drbd2_worker为本地磁盘管理内核线程,drbd2_receiver为接受对端同步数据的线程,drbd2_asender为本地发送数据到对端内核线程。
此时,使用drbd内核线程的状态,会发现二者已经建立联系:
[root@t ~]# cat /proc/drbd version: 8.3.5 (api:88/proto:86-91) GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@t, 2010-05-22 10:36:02 2: 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:3140544 检查drbd是否创建了设备drbd2:
[root@t ~]# l /dev/drbd2 brw-r----- 1 root disk 147, 2 2013-07-14 16:04 /dev/drbd2 [root@t ~]# 说明drbd的磁盘设备已经创建成功了。
/proc/drbd 文件是内核线程写的,当用户态打开该文件时,内核线程会将此时本端监控到的连接状态反馈给用户。PS:从这里可以看出,我的drbd是在2010年编译安装的,这个时间也够久远了。
到这里已经可以确认drbd安装、配置成功了。
但是还需要强制指定一端为主,并在新的drbd设备上面创建文件系统,方能挂载到系统使用。
[root@t ~]# drbdsetup /dev/drbd2 primary -o
此时再查看drbd的工作状态,会发现两台主机的drbd之间已经在同步数据了,同步速度为50M/s,这个速度是配置文件中指定的。
[root@t~]#cat/proc/drbd version:8.3.5(api:88/proto:86-91) GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02 2:cs:SyncSourcero:Primary/Secondaryds:UpToDate/InconsistentCr---- ns:372792nr:0dw:0dr:380960al:0bm:22lo:1pe:13ua:256ap:0ep:1wo:boos:2768160 [=>..................]sync'ed:12.0%(2768160/3140544)K finish:0:01:06speed:41,376(41,376)K/sec不必等待同步完成,已经可以在主端创建文件和使用了,但是在数据同步完成之前不能倒换或者强制重启的动作,否则会出现主备数据不一致的问题,导致“脑裂”出现。
数据同步完成后,状态显示为:
[root@t~]#cat/proc/drbd version:8.3.5(api:88/proto:86-91) GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02 2:cs:Connectedro:Primary/Secondaryds:UpToDate/UpToDateCr---- ns:3140544nr:0dw:0dr:3140544al:0bm:192lo:0pe:0ua:0ap:0ep:1wo:boos:0 [root@t~]#mkfs.ext3/dev/drbd2 mke2fs1.40.8(13-Mar-2008) Warning:256-byteinodesnotusableonoldersystems Filesystemlabel= OStype:Linux Blocksize=4096(log=2) Fragmentsize=4096(log=2) 196608inodes,785136blocks 39256blocks(5.00%)reservedforthesuperuser Firstdatablock=0 Maximumfilesystemblocks=805306368 24blockgroups 32768blockspergroup,32768fragmentspergroup 8192inodespergroup Superblockbackupsstoredonblocks: 32768,98304,163840,229376,294912 Writinginodetables:done Creatingjournal(16384blocks):done Writingsuperblocksandfilesystemaccountinginformation:done Thisfilesystemwillbeautomaticallycheckedevery38mountsor 180days,whichevercomesfirst.Usetune2fs-cor-itooverride.注意,文件系统只在一端做即可,另一端会在数据同步完成后就自动有文件系统了。同样创建的文件的权限也会同步到对端。因此两边操作系统的同名用户的用户id和组id也要完全一样,否则会出现同名用户创建的文件到了对端后出现该用户无法访问的问题。该问题在不指定用户id创建系统用户时比较容易出现,也比较隐藏。
[root@t/]#mkdirdrbd2/ [root@t/]#mount/dev/drbd2/drbd2无出错提示,则挂载成功。
下面就可以在用户态下使用drbd的分区了。
[root@t/drbd2]#echo'hellodrbd!'>./justatest.txt [root@t/drbd2]#catjustatest.txt hellodrbd!在主端执行如下命令:
cd/ umount/drbd2 drbdadmsecondaryall [root@t/drbd2]#cd/ [root@t/]#umount/drbd2 [root@t/]#drbdadmsecondaryall [root@t/]#cat/proc/drbd version:8.3.5(api:88/proto:86-91) GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02 2:cs:Connectedro:Secondary/Secondaryds:UpToDate/UpToDateCr---- ns:3256620nr:0dw:116076dr:3140673al:41bm:221lo:0pe:0ua:0ap:0ep:1wo:boos:0 [root@t/]#在备端执行如下命令:
[root@Shentar/drbd2]#drbdadmprimaryall [root@Shentar/]#mkdir/drbd2 [root@Shentar/]#mount/dev/drbd2/drbd2然后再查看备端的文件是否同步成功:
[root@Shentar/drbd2]#cd/ [root@Shentar/]#cd/drbd2/ [root@Shentar/drbd2]#catjustatest.txt hellodrbd! [root@Shentar/drbd2]#可以看到备端没有作文件系统,但是可以直接挂载磁盘,并打开主端同步过来的文件。
(八)后面就可以在drbd上面架数据库或者其他对文件持久化要求比较高的应用了。
Drbd在文件系统下层,直接管理块设备的块,因此如果是上层应用自身将数据结构破坏,那么坏的数据也会被同步到对端。如果是一端磁盘损坏,那么倒换后,也许数据还是好的,可以继续起上层应用,起到容灾的作用。Drbd不会自动倒换,需要在双机控制应用程序中写监控和倒换脚本来控制。