LVS+Heartbeat+Ldirectord
案例三:
上个案例中,两台director中时刻保持有一台处于活动状态,其中维护一个ipvsadm转发表,表中的条目一直不会发生变化,若下游的某台realserver忽然失效,但是director上的ipvsadm转发表将依旧把请求发送至失效的服务器来处理数据,将会出现网页访问失败的情况。所以,应该有一种机制,用来探测下游的服务器是否处于活动状态,若某台服务器失效,则自动修改ipvsadm转发表,将该发送给失效服务器的请求发送至活动的服务器来处理。动态转发规则表。
拓扑图:
1.将realserver1 的httpd访问停掉,访问并刷新192.168.10.101将会出现网页访问不到的情况(只能访问web test2)
2.发送至realserver1的转发条目依旧存在
[[email protected] ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:http rr
-> 192.168.10.203:http Route 1 0 3
-> 192.168.10.204:http Route 1 0 4
3.要想实现一种动态的ipvsadm转发规则表,需要安装heartbeat-ldirectord ,它能够将heartbeat与LVS紧密结合,而且能够探测后方的服务器状态,当服务器失效时,自动删除该条转发条目,即对后方的web群集进行探测
[[email protected] ~]# rpm -ivh heartbeat-ldirectord-2.1.4-9.el5.i386.rpm
4.拷贝heartbeat-ldirectord的配置文件/usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf 到/etc/ha.d下,编辑该文件
[[email protected] ~]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
checkinterval=1 每一秒检查一次后方服务器
checktimeout=3 三秒检测不到服务器就删除到该服务器的转发条目
autoreload=yes 修改该文件后,不用重启服务就进行加载该文件内容
fallback=127.0.0.1:80 如果后方的服务器全都无法探测到的话,就将本机作为服务器提供服务,不过本机的服务要处于停止状态,有heartbeat进行控制
logfile="local0" 将ldirectord的日志和/var/log/messages混合
quiescent=yes 静默模式 当无法探测到后方的服务器时就调整到该服务器的条目的权重为0,而不删除该条目,则该服务器将不能访问
56 # request="index.html"
57 # receive="Test Page" 把这两行也要注释掉
5.修改资源文件/etc/ha.d/haresources,定义HA群集的资源
定义node1.a.com为主节点,虚拟ip为10.101 ,将该虚拟地址添加到eth0上,eth0:0 ;资源2为 ldirectord,他的它的配置文件名称为ldirectord.cf
[[email protected] ha.d]# pwd
/etc/ha.d
[[email protected] ha.d]# vim haresources
45 node1.a.com 192.168.10.101/24/eth0/ ldirectord::ldirectord.cf
6.删除ipvsadm的转发数据
[[email protected] ha.d]# ipvsadm -C
[[email protected] ha.d]# ipvsadm -C
同步node2
[[email protected] ha.d]# cp ldirectord.cf node2.a.com:/etc/ha.d
[[email protected] ha.d]# scp haresources node2.a.com:/etc/ha.d
7.分别重启两台节点的heartbeat 服务
[[email protected] ha.d]# service heartbeat restart
[[email protected] ha.d]# service heartbeat restart
在node1.a.com,是node1在使用vip
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:56:00:D6
inet addr:192.168.10.101 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:67 Base address:0x2000
8.查看node1.a.com 的ipvsadm的转发表,发现权重都变为0,默认为1;这会由于调整的静默模式为开启,而测试页面不存在,所以将两个转发条目权重调小
[[email protected] ha.d]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:http rr
-> 192.168.10.203:http Route 0 0 0
-> 192.168.10.204:http Route 0 0 0
-> localhost.localdomain:http Local 1 0 0
在realserver1和realserver2 上创建探测页面:.test.html文件
[[email protected]1~]# cd /var/www/html/
[[email protected]1 html]# vim .test.html
Test ok
[[email protected] html]# vim .test.html
Test ok
9.这时候把server1的httpd关掉还是可以访问到web2,刷新的时候不会出现访问不到。
在director1上查看如下:
[[email protected] ~]# ipvsadm
TCP 192.168.10.101:http rr
-> 192.168.10.203:http Route 0 0 0
-> 192.168.10.204:http Route 1 0 4
10.若后方的两台服务器都失效,则用户将无法访问到页面。这是可以使用回滚fallback,将请求发送到本机(director1)上进行处理。所以在director1和director2上安装httpd服务,并将该服务处于停止状态,然后将httpd加入haresource文件,成为一种资源,然后将/etc/init.d/httpd 复制到 /etc/ha.d/resource.d 下
11.两台director上分别安装httpd服务,并产生页面,将httpd服务处于关闭状态
[[email protected] ha.d]# vim ldirectord.cf
27 fallback=127.0.0.1:80 gate
修改/etc/ha.d/resources,添加httpd
45 node1.a.com 192.168.10.101/24/eth0/ 空格ldirectord::ldirectord.cf 空格httpd
重新启动heartbeat服务,然后停用后方的两台web服务器,访问
12.可以看到访问到director1上了。
此时查看director的转发表和httpd的状态,出现本机的条目
[[email protected] ha.d]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:http rr
-> localhost.localdomain:http Local 1 0 4
-> 192.168.10.203:http Route 0 0 0
-> 192.168.10.204:http Route 0 0 0
13.如果director1的heartbeat出现故障再次访问时就会通知到director2启动
访问就会出现如下:
[[email protected] ha.d]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:http rr
-> 192.168.10.203:http Route 0 0 0
-> 192.168.10.204:http Route 0 0 0
-> localhost.localdomain:http Local 1 0 3
本案例到这已经可以说是完整了。
转载于:https://blog.51cto.com/dg123/1104784