DRBD

Distrubuted Replicated Block Device 分布式复制块设备
与ipvs和iptables类似 DRBD功能是在内核中完成DRDB
 需要在用户空间定义磁盘设备为DRDB设备 drdbadm
 
一般数据写入磁盘的过程:Service--> Fs--> BufferCache-->Disk Schedule--> Disk Driver--> DiskStorage
DRDB设备写入过程Service--> Fs--> BufferCache-->DRDB-->Disk Schedule--> Disk Driver--> DiskStorage
                                                 |__>TCP/IP -->NIC Driver-->slave NIC Driver-->TCP/IP-->DRDB-->Disk Schedule--> Disk Driver--> DiskStorage
可见DRDB设备中的数据写入是分为两路:一路写入本地磁盘内 一路通过DRDB功能写入从服务器中
 
DRDB有主从和主主两种构建方式
master/master:
  cluster filesystem: GFS2 OCFS2(自带的有HA功能 下两步就不需要)
  HA 
  dlm 分布式锁管理 作为HA的ra来使用
master/slave
master可对DRDB磁盘读写和挂载 slave不能对DRDB磁盘读写和挂载
 
复制模型:
   Protocol A 异步复制协议
    主节点一旦写入完成,数据被发往本地TCP/IP缓存就宣告完成
   Protocol B 半同步
      内存同步,一旦数据发往本地磁盘开始写,并发往对方的接受缓冲区中即宣告完成
   Protocol C 同步复制协议
数据发往本地磁盘,并发往了对方的磁盘中 宣告完成
 
   因为在2.6.18可内核中没有DRBD模块,需要打补丁并重新编译内核添加DRBD模块后才能使用,这里也可以使用kmod-drbd83包直接添加DRBD模块
通过安装drbd的rpm包用户可使用drbdadm命令管理DRBD设备,
   目前在用的drbd版本主要有8.0、8.2和8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd,
kmod-drbd82和kmod-drbd83。各版本的功能和配置等略有差异;我们实验所用的平台为x86且系统为rhel5.4,因此需要同时安装内核模块和管理工具。
我们这里选用最新的8.3的版本(drbd83-8.3.8-1.el5.centos.i386.rpm和kmod-drbd83-8.3.8-1.el5.centos.i686.rpm),下载地址为:http://mirrors.sohu.com/centos/5.6/extras/i386/RPMS/。
 
1)本配置共有两个测试节点,分别node1.magedu.com和node2.magedu.com,相的IP地址分别为172.16.21.11和172.16.21.12;
2)node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sda5,大小为2G;
3)系统为rhel5.4,x86平台;
 
软件安装(两个节点都要安装)
#rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
 
drbdadm 的配置文件是分为两段
/etc/drbd.conf 
  为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,
  主配置文件中仅使用"include"指令将这些配置文件片断整合起来。
/etc/drbd.d/* 包含有global_common.conf 和.res结尾的文件
global_common.conf是全局配置文件主要定义global段和common段
global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。
目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,
common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。
而每一个.res的文件用于定义一个资源。
 
这里有一个配置样例;
 1)复制样例配置文件为即将使用的配置文件
 cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc
 2)配置/etc/drbd.d/golbal-common.conf
 
  1.     global { 
  2.         usage-count no; 
  3.         # minor-count dialog-refresh disable-ip-verification 
  4. common { 
  5.         protocol C; 
  6.  
  7.         handlers { 
  8.                 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"; 
  9.                 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"; 
  10.                 local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; 
  11.                 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; 
  12.                 # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 
  13.                 # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; 
  14.                 # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; 
  15.                 # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; 
  16.         } 
  17.         startup { 
  18.                 wfc-timeout 120; 
  19.                 degr-wfc-timeout 120; 
  20.         } 
  21.         disk { 
  22.                 on-io-error detach; 
  23.                                 fencing resource-only; 
  24.         } 
  25.         net { 
  26.                                 cram-hmac-alg "sha1"; 
  27.                                 shared-secret "mydrbdlab"; 
  28.         } 
  29.  
  30.         syncer { 
  31.                 rate 1000M; 
  32.         } 
 
3)定义一个资源/etc/drbd.d/web.res,内容如下:
resource web {     //web为资源名可以和文件名不一致
 
  1.   on node1.magedu.com { 
  2.     device    /dev/drbd0; 
  3.     disk      /dev/sda5; 
  4.     address   172.16.21.11:7789; 
  5.     meta-disk internal; 
  6.   } 
  7.   on node2.magedu.com { 
  8.     device    /dev/drbd0; 
  9.     disk      /dev/sda5; 
  10.     address   172.16.21.12:7789; 
  11.     meta-disk internal; 
  12.   } 
   
     以上的文件在两个节点上必须相同,因此,可以使用scp命令同步到另一个节点中
 
在两个节点上初始化已定义的资源并启动服务:
  1)初始化资源,在node1和node2分别执行:
  #drbdadm create-md web     这里的web对应.res文件中的resource名称
  2)启动服务 在node2和node2分别执行
    #servivce drbd start
  3) 指定一个为Primary节点(在node1上执行)
    #drbdadm -- --overwirte-data-of-peer primary web
  4) drdb-overview  数据同步过程已经开始 需要一段时间 结果会显示为
    0:web  Connected Primary/Secondary UpToDate/UpToDate C r---- 
 
创建文件系统
  #mke2fs 0j /dev/drbd0
  #mount /dev/drbd0 /mydata
[root@node2 mysql]# drbd-overview 
  0:web  Connected Primary/Secondary UpToDate/UpToDate C r---- /mydata ext3 1.9G 66M 1.7G 4% 
 
测试:
   在node1的/mydata 目录中touch一个文件
   然后 
   #umount /mydata
   #drbdadm secondary web 
   在node2中
   #drbdadm primary web
   #mount /dev/drbd0
   #ls /mydata   即可查看到刚才touch到的文件
 至此DRBD建立成功
 
 
 在此基础上实现mysql数据库的基于DRBD,需要利用Corosync+Pacemaker高可用集群,使得mysql在一个节点出现故障时,立即转移到另一节点
 而当故障节点恢复后又能重新上线提供服务,并且保证了mysql数据库的数据能同步。
 这种方案实现起来较iSCASC 的方式廉价,但却能提供接近99.5%的高可用性  
 
依然利用上面已经建立的DRBD节点中添加Corosync和Pacemaker来提供HA
 一、node1和node2能互相解析对方的主机名称  可临时在hosts中添加
 二、 双节点需要建立互信认证:
  建立双机互信机制:
 
  1.     node1: 
  2. ssh-keygen -t rsa 
  3. ssh-copy-id -i .ssh/id_rsa.pub root@172.16.21.22 
  4.     node2: 
  5. ssh-keygen -t rsa 
  6. ssh-copy-id -i .ssh/id_rsa.pub root@172.16.21.21 
 
 三、HA搭建:
   安装:
    cluster-glue-1.0.6-1.6.el5.i386.rpm       
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm  
corosync-1.2.7-1.1.el5.i386.rpm           pacemaker-1.0.11-1.2.el5.i386.rpm
corosynclib-1.2.7-1.1.el5.i386.rpm        pacemaker-libs-1.0.11-1.2.el5.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm          perl-TimeDate-1.16-5.el5.noarch.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm     resource-agents-1.0.4-1.1.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm
 
yum localinstall --nogpgcheck *.rpm    //使用yum解决依赖关系 安装以上的软件包 ,node1和node2中都要安装
 
 四、 配置样例:corosync.conf:
 
  1.     cd /detc/corosync 
  2.    cp /etc/corosnc/corosync.conf.example corosync.conf 
  3.     totem { 
  4.         version: 2 
  5.         secauth: on 
  6.         threads: 0 
  7.         interface { 
  8.                 ringnumber: 0 
  9.                 bindnetaddr: 172.16.0.0 
  10.                 mcastaddr: 226.94.2.1 
  11.                 mcastport: 5405 
  12.         } 
  13.  
  14. logging { 
  15.         fileline: off 
  16.         to_stderr: no 
  17.         to_logfile: yes 
  18.         to_syslog: yes 
  19.         logfile: /var/log/cluster/corosync.log 
  20.         debug: off 
  21. # Please read the corosync.conf.5 manual page 
  22. compatibility: whitetank 
  23.  
  24. totem { 
  25.         version: 2 
  26.         secauth: on 
  27.         threads: 0 
  28.         interface { 
  29.                 ringnumber: 0 
  30.                 bindnetaddr: 172.16.0.0 
  31.                 mcastaddr: 226.94.2.1 
  32.                 mcastport: 5405 
  33.         } 
  34.  
  35. logging { 
  36.         fileline: off 
  37.         to_stderr: no 
  38.         to_logfile: yes 
  39.         to_syslog: yes 
  40.         logfile: /var/log/cluster/corosync.log 
  41.         debug: off 
  42.         timestamp: on 
  43.         logger_subsys { 
  44.                 subsys: AMF 
  45.                 debug: off 
  46.         } 
  47.  
  48. amf { 
  49.         mode: disabled 
  50. service { 
  51.         ver:  0 
  52.         name: pacemaker 
  53.          use_mgmtd: yes 
  54. aisexec { 
  55.         user:   root 
  56.         group:  root 
 
上述配置文件在两个节点中都要一样 
            
#service corosync start
 
五、在一个节点中安装mysql(node1)
 
    #groupadd -r mysql
    #useradd -g mysql -r -M -s /sbin/nologin mysql
    #chowm _R mysql:mysql /mydata/data
  
  安装mysql并初始化数据库
 
   1、解压软件包:
    #tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
    #ln -sv mysql-5.5.20-linux2.6-i686 mysql
    #cd /usr/local/mysql
   2、初始化数据库
    #chown mysql:mysql ./*
    #scripts/mysql_install_db --user=mysql --datadir=/mydata
    #chown -R root ./*
   3、为mysql提供主配置文件:
   #cd /usr/local/mysql
   #cp support-files/my-large.cnf /etc/my.cnf
     并修改此文件中thread_concurrency 的值为你的CPU个数乘以2
     添加mysql数据文件的存放位置:
     datadir = /mydata
   4、为mysql 提供sysv服务脚本:
     cp support-files/mysql.server /etc/rc.d/init.d/mysqld
 在node2中不需要初始化数据库,只需要解压软件提供脚本和配置文件即可:
    #groupadd -r mysql
    #useradd -g mysql -r -M -s /sbin/nologin mysql
    #chowm _R mysql:mysql /mydata/data
    1、解压软件包:
    #tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
    #ln -sv mysql-5.5.20-linux2.6-i686 mysql
    #cd /usr/local/mysql
   2、为mysql提供主配置文件:
   #cd /usr/local/mysql
   #cp support-files/my-large.cnf /etc/my.cnf
     并修改此文件中thread_concurrency 的值为你的CPU个数乘以2
     添加mysql数据文件的存放位置:
     datadir = /mydata
   3、为mysql 提供sysv服务脚本:
     cp support-files/mysql.server /etc/rc.d/init.d/mysqld
 
 
六、 添加资源: 
 
  1. #crm configure 
  2. crm(live)configure# edit  
  3. node node1.magedu.com \ 
  4.         attributes standby="off" 
  5. node node2.magedu.com \ 
  6.         attributes standby="off" 
  7. primitive IP ocf:heartbeat:IPaddr \ 
  8.         params ip="172.16.21.100" 
  9. primitive drbd ocf:linbit:drbd \ 
  10.         params drbd_resource="web" \ 
  11.         op monitor interval="29s" role="Master" \ 
  12.         op monitor interval="31s" role="Slave" \ 
  13.         op start interval="0" timeout="240s" \ 
  14.         op stop interval="0" timeout="100s" 
  15. primitive fs_drbd ocf:heartbeat:Filesystem \ 
  16.         params device="/dev/drbd0" directory="/mydata" fstype="ext3" \ 
  17.         op start interval="0" timeout="60" \ 
  18.         op stop interval="0" timeout="60" \ 
  19.         meta target-role="Started" 
  20. primitive mysqld lsb:mysqld 
  21. ms ms_drbd drbd \ 
  22. meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" 
  23. colocation IP_and_fs_drbd inf: IP fs_drbd 
  24. colocation fs_on_drbd_master inf: fs_drbd ms_drbd:Master 
  25. colocation mysqld_and_on_drbd_master inf: mysqld ms_drbd:Master 
  26. order fs_after_drbd_master inf: ms_drbd:promote fs_drbd:start 
  27. order fs_after_mysqld_start inf: fs_drbd:start mysqld:start 
  28. order ip_before_drbd inf: IP:start ms_drbd:promote 
  29. property $id="cib-bootstrap-options" \ 
  30.         dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \ 
  31.         cluster-infrastructure="openais" \ 
  32.         expected-quorum-votes="2" \ 
  33.         stonith-enabled="false" \ 
  34.         no-quorum-policy="ignore" 
  35. rsc_defaults $id="rsc-options" \ 
  36.         resource-stickiness="100" 
    //定义了IP  drbd  fs_drbd mysqld  四个资源,需要在同一个节点中使用  他们的启动次序是 IP fs_drbd drbd mysqld 
 
  1. crm(live)configure# commit  
  2.  
  3. crm(live)configure# bye 
  4.  
  5. [root@node1 ~]# crm status 
  6. ============ 
  7. Last updated: Sat Apr 14 11:16:08 2012 
  8. Stack: openais 
  9. Current DC: node2.magedu.com - partition with quorum 
  10. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  11. 2 Nodes configured, 2 expected votes 
  12. 4 Resources configured. 
  13. ============ 
  14.  
  15. Online: [ node1.magedu.com node2.magedu.com ] 
  16.  
  17.  fs_drbd    (ocf::heartbeat:Filesystem):    Started node2.magedu.com 
  18.  Master/Slave Set: ms_drbd 
  19.      Masters: [ node2.magedu.com ] 
  20.      Slaves: [ node1.magedu.com ] 
  21.  IP (ocf::heartbeat:IPaddr):    Started node2.magedu.com 
  22.  mysqld (lsb:mysqld):   Started node2.magedu.com 
七、测试:
  

在mysql中添加用户权限主机在172.16网段内

 

在node1中执行 crm node standby  
并在node1中登录mysql