IT技术博客大学习 共学习 共进步

DRBD远程实时双机热备系统配置完全手册

忘我的追寻 2013-09-23 23:10:39 浏览 2,362 次

   今天本来想按照之前的计划,分析一下drbd的源码,看到/proc/drbd文件的实现方式时,就想打开drbd服务切实看一下,结果发现几年前配置过的drbd已经不能再使用了,还是先把配置过程完整再尝试一下,以便记录在这里分享出来。

   首先需要准备两台虚拟机,可以使用vmware或者virtualos。本文主要针对drbd的配置和使用过程,虚拟机安装部分不作详述。

   步骤:

   (一)安装虚拟机

   安装配置Linux OS,目前桌面版的Linux系统都是免费的,可以很容易获取到安装镜像源。常用的有:Ubutun、Fedora和OpenSuse,可以自行选用。

   (二)给虚拟机配置网络

   最好都能上外网,以便下载安装常用软件包。

   (三)安装drbd软件

   上述的Linux桌面发行版自带的安装源中都能找到drbd的安装包。如果没有,那么需要自行下载源码编译安装,这样安装过程中一般会出现不少问题,Google或者百度能解决。

   这里以我的两个虚拟机为例:    

   visual_machine_linux  

   在做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管理的磁盘,对于虚拟机很方便,直接添加硬盘即可。添加步骤:

  • 打开虚拟机的设置对话框:

       wps_clip_image-26891

  • 点击add按钮

       wps_clip_image-27328

  • 一路next即可。

  • 添加完成后的虚拟机配置如下:

       wps_clip_image-27459  

       启动虚拟机

       使用fdisk -l命令会发现系统中多了一块硬盘设备:

    [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: 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.conf文件

       两台虚拟机都配置完毕后,可以配置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资源

       执行如下两条命令创建drbd资源:

       [root@Shentar ~]# drbdadm create-md r0  

       [root@t ~]# drbdadm create-md r0

       其中r0是配置文件中指定的资源名。

       (七)初次启动drbd

  • 启动两台虚拟机上面的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]:    

       等待另一台启动后,会自动完成启动。

  • 查看系统进程,会发现多了3个drbd相关的进程:

  • [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
  • 对drbd虚拟设备做文件系统:

  •     [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创建系统用户时比较容易出现,也比较隐藏。

  • 现在就可以挂载使用drbd的虚拟磁盘设备/dev/drbd2 了。

  •     [root@t/]#mkdirdrbd2/    [root@t/]#mount/dev/drbd2/drbd2

       无出错提示,则挂载成功。

       下面就可以在用户态下使用drbd的分区了。

  • 做一个最简单的试验,在主节点创建一个文件,然后倒换到备,在备上面查看该文件:

  •     [root@t/drbd2]#echo'hellodrbd!'>./justatest.txt    [root@t/drbd2]#catjustatest.txt    hellodrbd!
  • 然后倒换drbd。

  •    在主端执行如下命令:

        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不会自动倒换,需要在双机控制应用程序中写监控和倒换脚本来控制。

建议继续学习

  1. 仅仅只备份是不够的 (阅读 5,701)
  2. 使用scp在windows和Linux之间互传文件 (阅读 5,223)
  3. rsync自动输入密码实现数据备份 (阅读 5,023)
  4. rman备份对各种数据块操作 (阅读 4,402)
  5. mydumper的使用和源代码分析 (阅读 4,061)
  6. MySQL 备份和其恢复机制原理简述 (阅读 4,021)
  7. 使用 rsync 或 unison 备份或同步支持 ssh 的 web 主机 (阅读 3,961)
  8. 不可靠的EXP远程备份 (阅读 3,800)
  9. linux 定期自动备份mysql的shell (阅读 3,601)
  10. Zmanda让MySQL的备份与恢复更加方便快捷灵活 (阅读 3,560)