最近尝试了在VMWare8下安装测试drbd+heartbeat主从热备。 经过几番尝试、折腾, 总算配置好了。给大家分享以下:

1. 首先最小化安装CentOS6.3 安装时选择Minimal, 安装好之后。首先更新并安装几个常用组件:

 
  
  1. yum install wget ftp ntp -y 
  2. yum update -y 

2. 安装drbd 8.4.2

由于网上找的rpm包在安装并执行modprobe drbd时总是会导致内核panic, 因此不得不重新在开发机上编译一个。开发机和最小化安装的,准备作为主从热备的虚拟机保持相同的内核版本,在编译之前同样使用yum update -y进行更新, 以免出现内核不兼容崩溃的情况, 为了节约时间, 也可以只更新内核yum update kernel kernel-devel -y。 确保开发机和最小化安装的服务器的uname -r 是同一个rivision,否则modprobe drbd找不到drbd.ko文件。 执行如下命令进行编译:

 
  
  1. cd /tmp 
  2. wget http://oss.linbit.com/drbd/8.4/drbd-8.4.2.tar.gz 
  3. tar xvf drbd-8.4.2.tar.gz 
  4. cd drbd-8.4.2 
  5. mkdir -pv ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 
  6. ./configure 
  7. make rpm 
  8. make km-rpm 
  9. cd ~/rpmbuild/RPMS/i686 

将~/rpmbuild/RPMS/i686目录下RPM包的拷贝出来并移到最小化安装的服务器上。(通过FTP服务器中转或者其他办法)

主要是以下几个包:

drbd-8.4.2-2.el6.i686.rpm

drbd-bash-completion-8.4.2-2.el6.i686.rpm

drbd-heartbeat-8.4.2-2.el6.i686.rpm

drbd-km-2.6.32_279.el6.i686-8.4.2-2.el6.i686.rpm

drbd-udev-8.4.2-2.el6.i686.rpm

drbd-utils-8.4.2-2.el6.i686.rpm

在2台最小化安装的服务器上执行

 
  
  1. yum install drbd-heartbeat-8.4.2-2.el6.i686.rpm \ 
  2. drbd-km-2.6.32_279.el6.i686-8.4.2-2.el6.i686.rpm \ 
  3. drbd-utils-8.4.2-2.el6.i686.rpm \
  4. drbd-heartbeat-8.4.2-2.el6.i686.rpm

DRBD的安装就结束了。

3. 安装Heartbeat 

接着安装Heartbeat, CentOS 6.3中默认不带有Heartbeat包, 因此需要从第三方下载。

 
  
  1. wget ftp://mirror.switch.ch/pool/1/mirror/scientificlinux/6rolling/i386/os/Packages/epel-release-6-5.noarch.rpm 
  2.  
  3. rpm -ivUh epel-release-6-5.noarch.rpm 
  4. yum --enablerepo=epel install heartbeat -y 

执行以下命令安装Heartbeat。安装的是Heartbeat 3.0.0.4版本。 

4. 配置drbd和heartbeat主从节点。 

首先准备网络环境, 配置/etc/hosts文件如下

 
  
  1. echo "192.168.10.151 ha1" >> /etc/hosts 
  2. echo "192.168.10.152 ha2" >> /etc/hosts 

接着关闭iptables和selinux, iptables在调试成功后可以再开启。 但一般实际部署的时候, 设备都在网关防火墙之后,也就不开启iptables防火墙了。

 
  
  1. service iptables stop 
  2. chkconfig iptables off 
  3. sed -i -e "s/=enforcing/=disabled/g" /etc/selinux/config 
  4. setenforce 0 

最后本别在主从节点上做如下配置:

 
  
  1. cat > /etc/drbd.d/global_common.conf << EOF 
  2. global { usage-count no; } 
  3. common {  
  4.   net { protocol C; } # 8.4版本以后使用该语法 
  5.   syncer { rate 20M; } 
  6. EOF 
  7.  
  8. cat > /etc/drbd.d/r0.res << EOF 
  9. resource r0 { 
  10.   device /dev/drbd0; 
  11.   disk /dev/sdb1; 
  12.   meta-disk internal; 
  13.   on ha1 { 
  14.     address 192.168.10.151:7789; 
  15.   } 
  16.   on ha2 { 
  17.     address 192.168.10.152:7789; 
  18.   } 
  19. EOF 
  20.  
  21. cat > /etc/ha.d/ha.cf << EOF 
  22. keepalive 2 
  23. deadtime 10 
  24. warntime 5 
  25. initdead 180 
  26. udpport 11695 
  27. ucast eth0 192.168.10.x #主机这个地方填备机IP, 备机填主机IP。 
  28. node ha1 
  29. node ha2 
  30. auto_failback off 
  31. EOF 
  32.  
  33. cat > /etc/ha.d/authkeys << EOF 
  34. auth 5 
  35. 5 sha1 heartbeat 
  36. EOF 
  37. chmod -v 600 /etc/ha.d/authkeys 
  38.  
  39. cat > /etc/ha.d/haresources << EOF 
  40. ha1 IPaddr::192.168.10.150/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 
  41. EOF 

配置完成过后在两台机器上分别创建drbd元数据并开启drbd服务;除了ha.cf文件的ucast配置两台机器不一样外, 其他都是一样的。

 
  
  1. #在创建元数据之前, 先使用fdisk 给两台机器的 /dev/sdb硬盘分区, 因为配置文件中r0写的是/dev/sdb1.
  2. drbdadm create-md all 
  3. service drbd start
  4. service heartbeat start
  5.  
  6.  
  7. #在主节点上执行以下命令, 配置主节点 
  8. drbdadm -- --overwrite-data-of-peer primary all
  9. mkfs.ext3 -v /dev/drbd0 
  10. mkdir -pv data
  11. mount -v -t ext3 /dev/drbd0 /data

再在两台机器上分别开启heartbeat服务, 配置过程就结束了。 

5. 最后测试以下

首先, 看看执行强制primary后, 数据复制的情况:

 
  
  1. [root@ha1 ~]# cat /proc/drbd  
  2. version: 8.4.2 (api:1/proto:86-101) 
  3. GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@developing-machine, 2012-12-11 00:26:13 
  4.  0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- 
  5.     ns:2242052 nr:0 dw:464508 dr:1782728 al:204 bm:117 lo:1 pe:1 ua:6 ap:0 ep:1 wo:f oos:18741616 
  6.     [=>..................] sync'ed: 10.7% (18300/20472)M 
  7.     finish: 0:05:04 speed: 61,480 (58,484) K/sec 

在主节点ha1上, 放一些测试数据在/data目录下之后,  执行service heartbeat stop 或者 shutdown -h now, 关闭主节点。 再在从节点上查看, 从节点的/data目录包含了之前主节点/data目录下的数据。 测试成功并完成了。