-- HA 高可用集群 high availablity 双机热备 client VIP 心跳 主 ------------------------》 备 httpd httpd 脑裂 split-brain 心跳:主和备每隔一定时间会有一个通讯信息,称之为心跳;主要作用的就是备机监控主机是否alive; 心跳线:串口或者RJ-45连接 vip:浮动IP(虚拟IP),floating IP;谁接管服务,就在谁那里;它就是上层程序要访问的IP,如果主崩溃,备会使用send_arp的形式抢到vip。 vip是高可用集群的一种资源(resource) 脑裂: 当一些特殊情况,比如说心跳线(只有一根的情况)断了,主其实并没有崩溃,但是备机检测不到心跳,会认为主机崩溃,也会接管VIP。那么两边都会有VIP,脑裂就产生了。 或者如:心跳间隔为2秒,死亡时间为1秒,这种也会脑裂 心跳间隔为2秒,死亡时间为4秒,但因为一些网络的原因,备机并没有在4秒内收到心跳,也会认为主挂掉,也会脑裂 brain-split 问题:如果做的是httpd的HA集群,那么这两个httpd家目录的内容要一致,方法有: 1,rsync远程实时同步(目录实时同步) drbd(磁盘实时同步) 2,共享存储(nfs,gfs2,ocfs2) 3,分布式存储(mfs,hdfs,glusterfs) 等等 HA集群 只要是在/etc/init.d/下的服务都可以做HA集群 能做HA集群的软件很多,如 rhcs (红帽集群套装,red hat cluster suite) IBM hacmp heartbeat keepalived untralmonkey piranha 等 ======================================================================= 使用两台KVM实现heartbeat高可用httpd服务 client vip 192.168.122.100 master --- slave 192.168.122.2 192.168.122.3 实验前准备:两台都做 1,关闭iptables,selinux,并一定做成开机也自动关闭 iptables -F iptables -F -t nat iptables -F -t mangle /etc/init.d/iptables save chkconfig iptables on setenforce 0 vim /etc/selinux/config SELINUX=disabled 2,时间同步 rdate -s 192.168.122.1 3,主机名三步 一定要绑定/etc/hosts 192.168.122.2 master.cluster.com 192.168.122.3 slave.cluster.com 4,建议两边的网卡名字一致(如两边都为eth0,如果是克隆的虚拟机,可以使用udev改成一致) 5,把网卡IP配置成静态IP,并chkconfig NetworkManager off和chkconfig network on 第一大步: 两台上安装heartbeat(heartbeat相关的组件和依赖包都比较多) # 笔记目录/arch/heartbeat_soft/ --我的软件包路径 heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-devel-3.0.4-2.el6.x86_64.rpm heartbeat-libs-3.0.4-2.el6.x86_64.rpm repodata 把这个目录拷过去自己做yum源,再使用yum install heartbeat*安装到主和备两台机器上 --下面是我的完整yum配置(iso自动挂载到/misc/cd下,heartbeat_soft目录默认在根目录下) [server] name=server baseurl=file:///misc/cd/Server enabled=1 gpgcheck=0 [loadbalancer] name=loadbalancer baseurl=file:///misc/cd/LoadBalancer enabled=1 gpgcheck=0 [HighAvailability] name=HighAvailability baseurl=file:///misc/cd/HighAvailability enabled=1 gpgcheck=0 [ScalableFileSystem] name=ScalableFileSystem baseurl=file:///misc/cd/ScalableFileSystem enabled=1 gpgcheck=0 [ResilientStorage] name=ResilientStorage baseurl=file:///misc/cd/ResilientStorage enabled=1 gpgcheck=0 [heartbeat] name=heartbeat baseurl=file:///heartbeat_soft enabled=1 gpgcheck=0 第二大步:先只在master上进行配置,配完后,再拷到slave上 安装完软件包后,配置文件默认会有模块在/usr/share/doc/heartbeat-3.0.4/下,需要拷到/etc/ha.d/下 cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/ cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/ cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/ 1,修改主配置文件 # vim /etc/ha.d/ha.cf # cat /etc/ha.d/ha.cf |grep -v ^# |grep -v ^$ debugfile /var/log/ha-debug --debug日志,一般来说不用开调试日志 logfile /var/log/ha-log --日志 logfacility local0 --日志设备,但需要在/etc/rsyslog.conf里去配置 keepalive 2 --心跳时间 deadtime 10 --心跳死亡时间,也就是说多少秒收不到心跳认为死亡 warntime 6 --收不到心跳后多少秒,会在日志里写入一个警告,必须小于deadtime initdead 20 --特殊情况网络重启多少秒后,才开始计算上面的心跳,防止网络初始化还没有完毕,就到了心跳死亡时间,会造成认为死亡的错误结果 udpport 694 --端口 ucast eth0 192.168.122.3 --使用点播方式来进行心跳通迅,IP写的是对方的IP,而非本机IP(也可以选择组播,但我在rhel6.5上测试组播通迅有些不稳定的情况,会莫名其妙出现脑裂情况) auto_failback on --slave接管了服务,master重新启动后,会自动再次接管服务成为master node master.cluster.com node slave.cluster.com --master和slave的主机名,注意要匹配uname -n 2,修改认证信息配置文件 # vim /etc/ha.d/authkeys auth 1 --表示使用第一种认证方式 1 crc --注意:此文件需要权限为600(root可读可写),否则后面启heartbeat启不来 # chmod 600 /etc/ha.d/authkeys --验证方式从crc,md5,sha1顺序,安全性越来越高,但消耗的资源越高;如果架构物理网络是内网比较安全,用第一种就可以了 3,修改资源配置文件 # vim /etc/ha.d/haresources --在最后加上下面一句配置 master.cluster.com IPaddr::192.168.122.100/24/eth0:0 httpd --前面的主机名为master的主机名 192.168.122.100/24为浮动IP eth0:0是表示获得浮动IP的网卡号 httpd是表示高可用的服务 master配置完毕 第三大步slave的配置 1,因为主和备的配置完全相同,所以到配置文件SCP到slave,不用做任何修改 # scp /etc/ha.d/ha.cf 192.168.122.3:/etc/ha.d/ # scp /etc/ha.d/authkeys 192.168.122.3:/etc/ha.d/ # scp /etc/ha.d/haresources 192.168.122.3:/etc/ha.d/ 2,在备这边把验证配置文件的权限也改为600 # chmod 600 /etc/ha.d/authkeys 3,修改slave端的ha.cf配置文件 # vim /etc/ha.d/ha.cf --修改slave端的ha的主配置文件 ucast eth0 192.168.122.2 --把IP换成master的IP --注意:如果你用的是组播,就不需要做修改对方IP的操作。但我这里做的是点播,所以才需要修改。 第四大步:测试HA集群 测试前要注意: 验证1,因为本实验高可用的服务为httpd,所以两台上要装上httpd服务 yum install httpd* -y 验证2,但注意先不用启动httpd,只在两台写上不同的主页文件方便测试 # echo 'master' > /var/www/html/index.html # echo 'slave' > /var/www/html/index.html 验证3,启动heartbeat服务 /etc/init.d/heartbeat start (--不需要手动启动httpd) master 和 slave都要启 验证4,查看master是否获得浮动IP eth0:0 192.168.122.100 查看master是否帮你启动了httpd服务 lsof -i:80 验证5, 测试备是否能接管服务 在master ifconfig eth0 down 然后在 slave端查看是否获得浮动IP eth0:0 192.168.122.100 验证6,测试master恢复正常后,是否自动能够再接管回来 在master ifconfig eth0 up 然后过几秒发现master端又抢回来了浮动IP eth0:0 192.168.122.100 验证7, 手工进行资源的切换 #/usr/share/heartbeat/hb_standby --手工把资源让给另一台 #/usr/share/heartbeat/hb_takeover --手工把资源从另一台抢过来 --这两个命令以前有些版本是在/usr/lib/heartbeat/下 验证8,验证脑裂split-brain 现在虚拟机环境下无法通过剪断网线来模拟线的故障(而不是网卡的故障) 但如果是关掉网卡,比如关掉主上的网卡(单心跳线),VIP和资源肯定会跳到备上去,而主就一个网卡都断掉了,主也没有资源了,这就是切换了,而不是脑裂 可以尝试在从slave服务器上写下面一句iptables规则,把UDP的694的数据包丢掉,造成从slave收不到主master的心跳,但主并没有挂掉,会产生两边都会有资源的情况(就是脑裂) # iptables -A INPUT -p udp --dport 694 -s 主的网卡IP -j DROP 使用iptables做到了脑裂的现象,在客户端可以使用下面两条命令多次测试 # arp -d 192.168.122.100 --在客户端把vip对应的mac地址记录去掉 # elinks -dump 192.168.122.100 --然后再连 多次测试的结果是有可能连到主master,也有可能连到从slave,所以脑裂的影响可以清楚的看到了 做完上面脑裂测试后还原的做法:在SLAVE上把iptables规则清除后,就可以自动还原到正常状态了 脑裂会造成连接不同的服务器,对后端共享存储的数据会造成不一致 防止脑裂的方式有很多: 双心跳线等(冗余) fence --可以使用下面的架构,就不会出现这种问题 192.168.122.100 eth0:0 外网浮动IP   192.168.122.2 192.168.122.3 eth0---心跳----eth0 master slave eth1---心跳----eth1  192.168.100.2  192.168.100.3 把两台服务器关闭加一个网卡,做成双心跳 只要在两边的ha.cf多加一句ucast eth1 对方IP(如果是组播,就加一句mcast eth1 新组播地址),重启heartbeat就可以了 然后验证: 在从slave上 # iptables -A INPUT -p udp --dport 694 -s 主的其中一个网卡的IP -j DROP 结果:不会产生脑裂 如果是单心跳 在从slave上 # iptables -A INPUT -p udp --dport 694 -s 主的唯一网卡的IP -j DROP 结果:会产生脑裂 --所以双心跳线路是防止脑裂的一种方法 测试九,验证ipfail ping_group 节点1(192.168.122.4) 节点2(192.168.122.5) 192.168.122.100 eth0:0 外网浮动IP   192.168.122.2 192.168.122.3 eth0---心跳----eth0 master slave eth1---心跳----eth1  192.168.100.2  192.168.100.3 验证这个情况: 1,单心跳线的情况,上图中不用看eth1对eth1这条心跳线; 如果master上eth0挂,肯定资源会切换到slave 2,换成双心跳线,如果master上eth0挂,那么资源就不会切换到slave,因为只断了一根心跳 3,按上面的第2点的情况,如果VIP是eth0:0,也就是说就在eth0上,那么按照第2点讲的不切换就又不行了,因为eth0都挂了eth0:0也不能用了 4,所以这时候就可以让两边的eth0都ping一个IP(一般为网关).这样的话eth0挂掉,虽然他还有另一个心跳;但它会发现你ping不通这个IP了,而slave的eth0还能ping通这个IP,所以heartbeat软件就知道是你的网卡出了问题; 就算你还有一个心跳没断,它仍然会把资源切换到slave 5,如果ping的这个IP挂了,master的eth0在这时也挂了,这时候,它无法判断你eth0网卡是否挂掉,也不会切换到slave;所以光ping一个IP还不行,你得使用ping_group去ping多个ip才行 6,如果你服务器有多网卡,或者vip不是使用的eth0:0,而是另外一个物理网卡;或者你所有的网卡都做了双网卡绑定(这样就避免了网卡坏掉的单点故障);那么上面5点情况你就都不用考虑了,也就是说用不着ipfail功能了 验证上面的过程 1,先把主和备这两台虚拟机各再加一个网卡 192.168.122.100 eth0:0 外网浮动IP   192.168.122.2 192.168.122.3 eth0---心跳----eth0 master slave eth1---心跳----eth1  192.168.100.2  192.168.100.3 2, 两边的配置如下(因为用组播不是点播,所以两边配置完全一样) 在原来的ha.cf配置文件的基础上加上下面三句 ping_group group1 192.168.122.1 192.168.122.190 --这里找两个可以ping通的IP做测试,实际情况可以写网关,路由器等的IP   respawn hacluster /usr/lib64/heartbeat/ipfail --注意这个路径里为lib64,默认的是lib,所以需要改一下 apiauth ipfail gid=haclient uid=hacluster 3,验证过程: 在不加上面三句的情况下启动heartbeat服务,在master上ifconfig eth0 down,会出现不会切换资源,整个架构无法访问的情况 在加上上面三句的情况下启动heartbeat服务,在master上ifconfig eth0 down,会出现资源切换到从slave机,整个架构还是ok的情况。 所以ipfail的功能得以体现 测试十:验证看门狗(watchdog) 继续在上例的基础上(双心跳加ipfail),做下面测试 1,先在master上killall -9 heartbeat(不是服务器挂了,也不是网卡坏了,而是进程不正常的被kill),然后会出现脑裂的情况 (因为master上的heartbeat是被kill的,所以资源httpd和VIP不会被关闭,但进程没了,所以slave收不到心跳,也会抢资源,造成脑裂) 2,所以解决方法 下面步骤在两台上都做 # /etc/init.d/heartbeat stop # vim /etc/ha.d/ha.cf watchdog /dev/watchdog --打开看门狗这句配置 # /etc/init.d/heartbeat start # modprobe softdog --加载软件看门狗模块 # lsmod |grep softdog softdog 9941 2 # echo "10" > /proc/sys/kernel/panic --把时间改成10秒 --上面只是临时修改成10秒,重启后又会变为0 # vim /etc/sysctl.conf kernel.panic = 10 --加上这一句 # sysctl -p --使之生效 # chkconfig --add heartbeat # chkconfig heartbeat on --一定要实现开机自启动,否则开机10秒后,会不断重启 上面的都做好后 # 在master上使用killall -9 heartbeat 杀掉所有heartbeat进程 # 然后等待十秒,master会自动重启,并且启动后,并从备机抢回资源(要求是配置了auto_failback on);如果抢不回来,可能是你的iptables或selinux没有设置开机自动关闭 测试十一:在主上只关闭httpd服务(不是关闭heartbeat) 可以利用shell辅助,如监控httpd,如果它挂了,则重启master机器等 ================================================================== 上面的讲解并没有包含heartbeat的所有功能 还有如: Stonith (shoot the other node in the head) Ldirector (heartbeat集成lvs) --------------------------------------------------------------------- 双心跳 + ipfail + watchdog + 双服务互为主备架构 192.168.122.100 eth0:0 httpd浮动IP   192.168.122.2 192.168.122.3 eth0---心跳----eth0 master slave eth1---心跳----eth1  192.168.100.2  192.168.100.3 eth1:0 mysqld浮动IP 192.168.100.100 配置过程和上面一致 但是在haresources里面有两句了 master.cluster.com IPaddr::192.168.122.100/24/eth0:0 httpd slave.cluster.com IPaddr::192.168.100.100/24/eth1:0 mysqld yum install mysql* -y --安装mysql 两边重启heartbeat --也是不需要启动mysqld服务,自动会帮你启动 /etc/init.d/heartbeat restart =============================================================================== drbd (distributed replicated block device) ,号称“网络raid-1“,开源,由linbit公司开发。 网络 /dev/sdb ---- /dev/sdc 1 当数据写入本地的drdb磁盘上,会以相同的形式记录在通过网络连接的另一个drbd磁盘上 在高可用(HA)中使用DRDB功能,可以代替使用一个共享磁盘组。 rsync 共享存储 drbd 工作原理: 文件系统 | | 块设备层 /dev/drbd0 | | | |--------------------| 本地磁盘 远程磁盘 /dev/sdb1 /dev/sdb1 架构图: 1.1.1.3 1.1.1.4 本地磁盘 本地磁盘 /dev/sdb1-------/dev/sdb1  主 drbd技术 备    主机名 drbd01 drbd02 第一步:在两台虚拟机3和4上都加一块磁盘 /dev/sdb ,大小在这里自定义 并使用fdisk /dev/sdb  分一个/dev/sdb1出来,只partprobe(在rhel6就做partx -a)一下就行,不用去格式化;两边的sdb1最好一样大 或者不分/dev/sdb1也可以,那么后面就直接对/dev/sdb来做drbd 第二步:安装前准备 1,主机名 2,关闭iptables,selinux 3, 时间同步 第三步:安装drbd软件包(两边服务器都要做下面的步骤) /share/soft/cluster/drbd-8.3.8.1.tar.gz tar xf /share/soft/cluster/drbd-8.3.8.1.tar.gz -C /usr/src cd /usr/src/drbd-8.3.8.1/ # ./configure --编译需要一些依赖性(flex,gcc等) # make rpm --使用这条安装出rpm包,都会默认自动把rpm包放到/root/rpmbuild/RPMS/x86_64/下(rhel5下的路径为/usr/src/redhat);但如果是新安装的系统,/root/下的rpmbuild目录会不存在 --解决目录不存在的做法: 上面的make rpm命令虽然报错,但会在当前目录下产生drbd.spec # rpmbuild -ba drbd.spec --这样去执行一下,报错 error: File /root/rpmbuild/SOURCES/drbd-8.3.8.1.tar.gz: No such file or directory # ls /root/rpmbuild/ --虽然上一条命令报错,但下面的目录产生了 BUILD BUILDROOT RPMS SOURCES SPECS SRPMS --然后就可以执行make rpm # make rpm # make km-rpm --这一条就是编译出模块 # rpm -ivh /root/rpmbuild/RPMS/x86_64/drbd-* --使用这条命令把它们都安装上 # modprobe drbd # lsmod |grep drbd --确认模块存在,否则后面启不了服务 第四步:配置drbd [root@drbd01 ~]# cp /usr/share/doc/drbd-utils-8.3.8.1/drbd.conf.example /etc/drbd.conf cp: overwrite `/etc/drbd.conf'? y --拷贝模版配置文件 [root@drbd01 ~]# vim /etc/drbd.conf --此配置文件比较复杂,下面只列出需要修改的地方 global { usage-count no; --作者统计信息,改为no } common { syncer { rate 100M; } --主备节点网络同步速率,改为100M } resource r0 { protocol C; --可以换成B协议 cram-hmac-alg "sha1";  shared-secret "FooFunFactory"; --设置主备机之间通信使用的信息算法 #handlers { # pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f"; # pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f"; #local-io-error "echo o > /proc/sysrq-trigger ; halt -f"; # outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";  #} --把handlers {} 全注释掉 syncer { rate 100M;   --也改为100M    # after "r2";   --注释掉这句,因为我们这里只有一个资源 } on drbd01 { --注意drbd01是主机名 device /dev/drbd0; disk /dev/sdb1; address 1.1.1.3:7788; flexible-meta-disk internal; } on drbd02 { device /dev/drbd0; disk /dev/sdb1; address 1.1.1.4:7788; meta-disk internal; } } --因为这里只定义一个资源(也就是只做一个网络raid1),所以把下面的resoucre r1 { }整个注释或者删除 # cat /etc/drbd.conf |grep -v "#"|grep -v ^$  --最后得到的配置文件如下 global { usage-count no; } common { syncer { rate 100M; } } resource r0 { protocol C; startup { } disk { on-io-error detach; } net { cram-hmac-alg "sha1"; shared-secret "FooFunFactory"; after-sb-0pri disconnect; after-sb-1pri disconnect; after-sb-2pri disconnect; rr-conflict disconnect; } syncer { rate 100M; al-extents 257; } on drbd01 { device /dev/drbd0; disk /dev/sdb1; address 1.1.1.3:7788; flexible-meta-disk internal; } on drbd02 { device /dev/drbd0; disk /dev/sdb1; address 1.1.1.4:7788; meta-disk internal; } } --如果使用的是rhel6.3,把它的原配置文件/etc/drbd.conf清空,然后贴上上面的这一大段配置文件,你只需要修改IP和主机名(如果你的磁盘不用/dev/sdb1,使用/dev/sdb,那也改一下) drbd02上的配置文件一样,所以这里直接scp过去 scp /etc/drbd.conf 1.1.1.4:/etc/ 第五步: drbd的启动 [root@drbd01 ~]# drbdadm create-md r0 --在两台主机的sdb1的分区,创建供drbd记录信息的数据块,两台都要做 Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. [root@drbd02 ~]# drbdadm create-md r0 Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. [root@drbd01 ~]# /etc/init.d/drbd start --启动drbd服务,两边都启,只启一个的话启不来的 [root@drbd02 ~]# /etc/init.d/drbd start # ps -ef |grep drbd --启完服务后,就会看到有三个进程 root 21420 1 0 15:51 ? 00:00:00 [drbd0_worker] --主进程 root 21433 1 0 15:51 ? 00:00:00 [drbd0_receiver] --从上的数据接收进程 root 21434 1 0 15:51 ? 00:00:00 [drbd0_asender] --主上的数据发送进程 # cat /proc/drbd   --两边都查看当前drbd状态;都是secondary表示没有主从之分,数据状态是inconsistent,表示不一致 version: 8.0.16 (api:86/proto:86) GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34 0: cs:Connected st: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 resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 第六步: 所以下面要定义主从磁盘 --下面我把drbd01这台机的/dev/sdb1磁盘定义为主 [root@drbd01 ~]# drbdsetup /dev/drbd0 primary -o [root@drbd01 ~]# cat /proc/drbd   --可以看到正在同步,第一次同步速度较慢(磁盘越大,速度越慢);现在可以看到状态为st:Primary/Secondary,数据状态同步完成后,就会变成UpToDate/UpToDate version: 8.0.16 (api:86/proto:86) GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:853552 nr:0 dw:0 dr:861728 al:0 bm:51 lo:1 pe:211 ua:256 ap:0 [=>..................] sync'ed: 10.2% (7360/8188)M finish: 0:08:09 speed: 15,328 (15,976) K/sec resync: used:1/61 hits:53339 misses:53 starving:0 dirty:0 changed:53 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 第七步: 现在可以把主机上的DRBD设备格式化并挂载使用,但是备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作 在主(drbd01)上的操作 [root@drbd01 ~]# mkfs.ext4 /dev/drbd0 [root@drbd01 ~]# mount /dev/drbd0 /mnt/ [root@drbd01 ~]# echo '123' > /mnt/123 [root@drbd01 ~]# echo '456' > /mnt/456  --创建两个文件,用于测试 在从 (drbd02)上的操作 [root@drbd02 ~]# /etc/init.d/drbd stop  --停服务 Stopping all DRBD resources: . [root@drbd02 ~]# mount /dev/sdb1 /mnt/ --挂载/dev/sdb1 [root@drbd02 ~]# ls /mnt/ 123 456 lost+found [root@drbd02 ~]# cat /mnt/123 123 [root@drbd02 ~]# cat /mnt/456 --可以看到数据过来了,表示drbd工作OK 456 --这里验证数据是否同步到备要注意的有: --如果你上面配置的是/dev/sdb而不是/dev/sdb1,那么在rhel5上,可以直接mount /dev/sdb /mnt; --在rhel6上,需要指定文件系统类型mount -t ext4 /dev/sdb /mnt(如果格成ext3,就把ext4换成ext3就可以) 第8步: drbd的主备切换,保持两边drbd服务是启动运行状态再进行下面操作 [root@drbd02 ~]# umount /mnt/ [root@drbd02 ~]# /etc/init.d/drbd start --这两步是把第7步的操作给还原 在主(drbd01)上的操作 [root@drbd01 ~]# umount /dev/drbd0 [root@drbd01 ~]# drbdadm secondary r0  --drbd01上的降级操作 [root@drbd01 ~]# cat /proc/drbd --查看状态,又成了Secondary/Secondary,两台机又都成了备机了 version: 8.0.16 (api:86/proto:86) GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34 0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r--- ns:8650764 nr:0 dw:265160 dr:8385757 al:106 bm:585 lo:0 pe:0 ua:0 ap:0 resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:66184 misses:106 starving:0 dirty:0 changed:106 在从(drbd02)上的操作 [root@drbd02 ~]# drbdadm primary r0  --drbd02上的升级操作 [root@drbd02 ~]# cat /proc/drbd --再次查看状态就是drbd02为主,drbd01为从 version: 8.0.16 (api:86/proto:86) GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- ns:0 nr:8 dw:8 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 切换过后,反向验证,也是OK的,步骤如下 [root@drbd02 ~]# mount /dev/drbd0 /mnt [root@drbd02 ~]# ls /mnt/ 123 456 lost+found [root@drbd02 ~]# echo 789 > /mnt/789 --在drbd02上挂载,再写一个文件789 [root@drbd01 ~]# /etc/init.d/drbd stop Stopping all DRBD resources: . [root@drbd01 ~]# mount /dev/sdb1 /mnt/ [root@drbd01 ~]# ls /mnt/ 123 456 789 lost+found --在drbd01上停服务,挂载/dev/sdb1,查看数据也同步过去了 [root@drbd01 ~]# umount /mnt/ [root@drbd01 ~]# /etc/init.d/drbd start --再把drbd01上把服务启起来 ------------------------------------------------------------------------------ drbd+heartbeat+mysql client 1.1.1.1 (真实机) | | heartbeat vip 1.1.1.5 mysql mysql 1.1.1.3 1.1.1.4 /dev/sdb1 ------ /dev/sdb1 drbd技术 --两台/dev/sdb1挂载到mysql的datadir 安装过程,在上面的基础上两台机安装heartbeat,可以使用centos的rpm版 的heartbeat(这个是需要去ceotos的站点去下载。www.mirror.centos.org); 但是如果是去www.linux-ha.org下载heartbeat包,则是源码版,并且编译过程有点特殊 1,安装heartbeat 过程省略 ===================================================== 第二步:修改配置文件,只有haresources这个配置文件有点特殊 # vim /etc/ha.d/ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 10 warntime 6 initdead 120 udpport 694 ucast eth0 1.1.1.4 auto_failback on node drbd01 node drbd02 # vim /etc/ha.d/authkeys auth 1 1 crc # chmod 600 /etc/ha.d/authkeys # vim /etc/ha.d/haresources drbd01 IPaddr::1.1.1.5/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext4 mysqld --定义drbd01为主,浮动IP为1.1.1.5/24 drbddisk::r0 --r0为/etc/drbd.conf里定义的资源名  自动挂载/dev/drbd0 到/data --/data为两个mysqld数据库的/datadir 调度的服务为mysqld (也就是rpm版mysql) --把配置好的三个配置文件拷到从 # scp /etc/ha.d/ha.cf drbd02:/etc/ha.d/ # scp /etc/ha.d/authkeys drbd02:/etc/ha.d/ # scp /etc/ha.d/haresources drbd02:/etc/ha.d/ --因为做的是点播,所以要修改从上的配置文件 # vim /etc/ha.d/ha.cf ucast eth0 1.1.1.3 --改成主的IP # chmod 600 /etc/ha.d/authkeys ==================================================== 第三步:安装mysql,并修改好对应的数据目录 mysql使用rpm版来做 两边都要mkdir /data chown mysql.mysql /data vim /etc/my.cnf datadir=/data --把datadir改为/data 两边的/etc/hosts都写好双方的主机名和IP对应 两边mysql不需要启动(初始化都可以不需要) ====================================================== 第四步:启服务进行验证 保证drbd服务是启动运行状态  mysqld 服务是关闭状态 然后两边启动heartbeat 验证:会自动在主上把/dev/drbd0挂载到/data上,并保存mysqld的数据 --因为我这里的mysql数据是新的,所以在主上登录,并授权一个用户,用于远程登录测试 mysql> grant all on *.* to 'li'@'%' identified by '123'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; --客户端使用下面命令登录VIP进行测试 # mysql -h 1.1.1.5 -u li -p123 验证heartbeat高可用; 在主上/etc/init.d/network stop 停网络模拟主崩溃; 就会发现原来的从机得到了 vip, 并且自动把/dev/drbd0挂载到/data上,数据和主上的一样