DRBD:分布式复制块设备

DRBD---Distributed Replicated Block Device 是一种基于Linux的软件组件, 它是由内核模块和相关程序而组成的,通过网络镜像促进共享存储系统的替换。也就是说:当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证 实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
 
DRBD的工作原理图:

基于DRBD实现MySQL高可用_DRBD

 
下面我们基于DRBD来实现MySQL高可用的目的
环境:Red Hat Enterprise Linux Server release 5.8 
节点1:172.16.9.2 node2.test.com
节点2:172.16.9.3 node3.test.com
 
配置过程:
一、配置高可用的前提
 
1、主机名和'uname -n'的结果保持一致
Node2:
sed -i 's@\(HOSTNAME=\).*@\1node2.test.com@g'
hostname node2.test.com
 
Node3:
sed -i 's@\(HOSTNAME=\).*@\1node3.test.com@g'
hostname node3.test.com
 
2、双方可以解析彼此的主机名:2节点都要配置
  1. vim /etc/hosts 
  2. 172.16.9.2      node2.test.com      node2 
  3. 172.16.9.3      node3.test.com      node3 
3、建立双机互信:2节点上都要配置
  1. ssh-keygen -t rsa -P ""      
  2. ssh-copy-id -i /root/.ssh/id_rsa.pub dr2  root@node3 
4、时间同步:
  1. date '12011340';ssh node3 'date 12011340' 
5、在两节点上分别创建一个磁盘分区以供之后使用(这里不再给出集体步骤)
注:2节点磁盘分区大小必须保持一致
 
二、安装drbd所需的rpm包
drbd共有两部分组成:内核模块和用户空间的管理工具
内核模块相关包:最新版本:drbd83-8.3.13
管理工具相关包:对应版本:kmod-drbd83-8.3.13
下载地址为:http://mirrors.sohu.com/centos/5.8/extras/i386/RPMS/
 
rpm -ivh drbd83-8.3.13-2.el5.centos.i386.rpm kmod-drbd83-8.3.13-1.el5.centos.i686.rpm 
 
提供配置文件,将原来的文件覆盖
cp /usr/share/doc/drbd83-8.3.13/drbd.conf /etc
 
配置/etc/drbd.d/global-common.conf,修改为对应以下内容
  1. global { 
  2.         usage-count no; 
  3.         # minor-count dialog-refresh disable-ip-verification 
  4.  
  5. ##########中间没做修改,为默认############### 
  6.  
  7.         disk { 
  8.                 on-io-error detach; 
  9.                 #fencing resource-only; 
  10.         } 
  11.  
  12.         net { 
  13.                 cram-hmac-alg "sha1"; 
  14.                 shared-secret "mydrbdlab"; 
  15.         } 
  16.  
  17.         syncer { 
  18.                 rate 1000M; 
  19.         } 
定义一个资源mydrbd;
  1. resource mydrbd { 
  2.         on node2.test.com { 
  3.         device /dev/drbd0; 
  4.         disk /dev/sda5; 
  5.         address 172.16.9.2:7789; 
  6.         meta-disk internal; 
  7.         }    
  8.         on node3.test.com { 
  9.         device /dev/drbd0; 
  10.         disk /dev/sda5; 
  11.         address 172.16.9.3:7789; 
  12.         meta-disk internal; 
  13.         }    
配置的文件全部同步到另外一个节点之上
  1. scp -r /etc/drbd.* node3:/etc/ 
初始化资源并启动服务(2节点都要配置)
  1. drbdadm create-md mydrbd 
  2. service drbd start 
查看启动状态
  1. drbd-overview 
  2. 0:mydrbd  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----  
查看状态,同步已经开始
  1. [root@node2 ~]# drbd-overview 
  2.   0:mydrbd  SyncTarget Secondary/Secondary Inconsistent/UpToDate C r-----  
  3.     [=>..................] sync'ed: 13.9% (4120/4776)M 
将当前节点设置为主节点
  1. drbdsetup /dev/drbd0 primary –o 
再次查看状态
  1. [root@node2 ~]# drbd-overview 
  2.   0:mydrbd  Connected Primary/Secondary UpToDate/UpToDate C r-----  
当前节点已经是主节点
 
对drbd设备进行格式化(只能在主节点上进行)
  1. mke2fs -j -L DRBD /dev/drbd0 
一切配置完成就可以挂载使用了
 
三、安装配置mysql(这些步骤全部在主节点上完成)
这里使用的是绿色版mysql-5.5.28-linux2.6-i686.tar.gz
解压到/usr/local路径下
tar xvf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/
创建挂载drbd设备的目录及mysql用户
  1. mkdir /data/mydata -pv 
  2. groupadd -r -g 333 mysql 
  3. useradd -r -g 333 -u 333 mysql 
  4. chown -R mysql:mysql /data/mydata 
挂载drbd设备
  1. mount /dev/drbd0 /data/mydata 
配置mysql
  1. cd /usr/local 
  2. ln -sv mysql-5.5.28-linux2.6-i686 mysql 
  3. cd mysql 
  4. chown -R root:mysql . 
初始化mysql
  1. scripts/mysql_install_db --user=myql --datadir=/data/mydata 
提供脚本和配置文件
  1. cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
  2. cp support-files/my-large.cnf /data/mydata/my.cnf 
编辑两个文件,在里面添加
  1. datadir=/data/mydata 
提供mysql的路径
  1. vim /etc/profile.d/mysql.sh 
  2. export PATH=$PATH:/usr/local/mysql/bin 
  3.  
  4. source /etc/profile.d/mysql.sh   #使之生效 
 
一切配置完毕,启动mysql服务
service mysqld start
进入mysql,手动创建一个数据库(方便后续测试)
退出mysql,并关闭服务,不让其开机自动启动
  1. service mysqld stop 
  2. chkconfig mysqld off 
切换主备节点,在另一个节点上配置mysql(注:不必再一次初始化mysql了)
挂载drbd设备,配置mysql过程和第一个节点一样,配置后可以登录mysql看下是否有刚刚创建的数据库;如果一切正常,停止mysql服务,不让其自动启动。
 
四、配置高可用服务(这里采用corosync + pacemaker)
 
安装高可用所需要的rpm包:下载地址:http://clusterlabs.org/rpm/
cluster-glue-1.0.6-1.6.el5.i386.rpm      
libesmtp-1.0.4-5.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm  
pacemaker-1.1.5-1.1.el5.i386.rpm
corosync-1.2.7-1.1.el5.i386.rpm           
pacemaker-cts-1.1.5-1.1.el5.i386.rpm
corosynclib-1.2.7-1.1.el5.i386.rpm        
pacemaker-libs-1.1.5-1.1.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
 
这里包含所有依赖的包,yum 安装即可:
yum –y localinstall –nogpgcheck *rpm
修改配置文件:
  1. cd  /etc/corosync 
  2. cp corosync.conf.example corosync.conf 
  3.  
  4. vim corosync.conf 
  5. 添加如下内容 
  6. service { 
  7.     ver:  0 
  8.     name: pacemaker 
  9.  
  10. aisexec { 
  11.     user:   root 
  12.     group:  root 
  13.  
  14. 同时将原来内容做下修改: 
  15. secauth: on 
  16. bindnetaddr: 172.16.0.0     #修改为主机所在网段 
  17. to_syslog: no 
生成节点间通信时用到的认证密钥文件:
  1. corosync-keygen 
将corosync.conf和authkey复制至另一节点:
  1. scp -r corocync.conf authkey node3:/etc/corosync/ 
分别为两个节点创建corosync生成的日志所在的目录:
  1. mkdir /var/log/cluster 
  2. ssh node3  'mkdir /var/log/cluster' 
接下来就可以启动corosync服务了
  1. Service corosync start 
  2. Ssh node3 'service corosync start' 
五、定义资源
 
首先定义高可用集群的一些属性
  1. crm  
  2. ccrm(live)# configure 
  3. crm(live)configure# property no-quorum-policy=ignore    #取消法定票数的机制 
  4. crm(live)configure# property stonith-enabled=false  #禁用隔离设备 
接下来定义drbd资源
  1. crm(live)configure# primitive drbd ocf:linbit:drbd params drbd_resource="mydrbd" op start timeout=240 op stop timeout=240  
  2.  #根据自己需要定义资源的名字,类型等 
  3. crm(live)configure# master ms_mydrbd drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" 
  4. #master关键字定义主从资源,后面指定资源name,meta 指定额外参选数,master-max指定最多有几个master, 
  5. #master-node-max指定一个节点最多运行几个master,clone-max指定有几个clone资源, 
  6. #clone-node-max指定一个节点最多运行几个clone资源,notify指当出现故障时是否通知对方 
定义文件系统资源
  1. crm(live)configure# primitive myFS ocf:heartbeat:Filesystem params device="dev/drbd0" directory="/data/mydata" fstype="ext3" op start timeout=60 op stop timeout=60 
定义资源约束
  1. crm(live)configure# colocation myFS_on_ms_mydrbd inf: myFS ms_mydrbd:Master 
  2. crm(live)configure# order myFS_after_ms_mydrbd mandatory: ms_mydrbd:promote myFS:start 
  3. #将资源系统和drbd资源绑定在一个节点上,并定义其启动次序 
  4. crm(live)configure# verify 
  5. crm(live)configure# commit 
查看刚定义的资源的状态
  1. crm status 
  2. ============ 
  3. Last updated: Mon Nov 12 16:45:35 2012 
  4. Stack: openais 
  5. Current DC: node2.test.com - partition with quorum 
  6. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
  7. 2 Nodes configured, 2 expected votes 
  8. 2 Resources configured. 
  9. ============ 
  10.  
  11. Online: [ node3.test.com node2.test.com ] 
  12.  
  13.  Master/Slave Set: ms_mydrbd [drbd] 
  14.      Masters: [ node3.test.com ] 
  15.      Slaves: [ node2.test.com ] 
  16.  myFS   (ocf::heartbeat:Filesystem):    Started node3.test.com 
定义IP资源及与其相关的约束
  1. crm(live)configure# primitive IP ocf:heartbeat:IPaddr params ip=172.16.66.1 
  2. crm(live)configure# colocation IP_with_ms_mydrbd_master inf: IP ms_mydrbd:Master 
查看状态
  1.  crm status 
  2. ============ 
  3. Last updated: Mon Nov 12 16:54:25 2012 
  4. Stack: openais 
  5. Current DC: node2.test.com - partition with quorum 
  6. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
  7. 2 Nodes configured, 2 expected votes 
  8. 4 Resources configured. 
  9. ============ 
  10.  
  11. Online: [ node3.test.com node2.test.com ] 
  12.  
  13.  Master/Slave Set: ms_mydrbd [drbd] 
  14.      Masters: [ node3.test.com ] 
  15.      Slaves: [ node2.test.com ] 
  16.  myFS   (ocf::heartbeat:Filesystem):    Started node3.test.com 
  17.  MYSQL  (lsb:mysqld):   Started node3.test.com 
  18.  IP (ocf::heartbeat:IPaddr):    Started node3.test.com 
这时就可以看到资源在node3 上已经启动起来了,进入mysql测试能否正常运行,可以的话一个简单的基于DRBD的mysql高可用就完工了!!
 
 
测试高可用资源能否实现故障转移,接下来可以手动将node3 故障:
  1. crm node standby 
  2. ##等待一会看资源是否转移 
  3. crm(live)# status 
  4. ============ 
  5. Last updated: Mon Nov 12 17:09:50 2012 
  6. Stack: openais 
  7. Current DC: node2.test.com - partition with quorum 
  8. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f 
  9. 2 Nodes configured, 2 expected votes 
  10. 4 Resources configured. 
  11. ============ 
  12.  
  13. Node node3.test.com: standby 
  14. Online: [ node2.test.com ] 
  15.  
  16.  Master/Slave Set: ms_mydrbd [drbd] 
  17.      Masters: [ node2.test.com ] 
  18.      Stopped: [ drbd:1 ] 
  19.  myFS   (ocf::heartbeat:Filesystem):    Started node2.test.com 
  20.  MYSQL  (lsb:mysqld):   Started node2.test.com 
  21.  IP (ocf::heartbeat:IPaddr):    Started node2.test.com 
看到资源转移成功,说明高可用集群构建成功!!