ldirectord来管理lvs,可以定时检查后端realserver,发现故障后自动清除,恢复后自动加入lvs表,让我们来感受下吧。
lvs端:
node1
eth0:192.168.3.124
eth0:192.168.8.124用于heartbeat心跳
vip:192.168.3.233
node2
eth0:192.168.3.126
eth0:192.168.8.126用于heartbeat心跳
vip:192.168.3.233
realserver端:
web1
eth0:192.168.3.128
eth0:0:192.168.8.128
vip:192.168.3.233
web2
eth0:192.168.3.129
eth0:0:192.168.8.129
vip:192.168.3.233
一.建议先配置lvs,没问题后再继续配置其他部分
在node1和node2上配置lvs nat模式,以node1为例
注:先在node1上建一个vip做lvs测试用,测试无误后再删掉,然后使用heartbeat的vip,这样可以给我们降低错误率
lvs端node1配置:
ifconfig eth0:1 192.168.3.233 netmask 255.255.255.0
ipvsadm -A -t 192.168.3.233:80 -s wrr
ipvsadm -A -t 192.168.3.233:80 -r 192.168.8.128:80 -g
ipvsadm -A -t 192.168.3.233:80 -r 192.168.8.129:80 -g
realserver端web1,web2配置:
ip route add 192.168.3.0 via 192.168.3.233
注:将realserver的网关指向vip 192.168.2.233
配置完成后测试:
[root@usvr-126 ha.d]# curl 192.168.3.233/1.html
hello,192.168.3.128
[root@usvr-126 ha.d]# curl 192.168.3.233/1.html
hello,192.168.3.129
以上说明lvs配置成功,取消eth0:1即可,ifdown eth0:1;需要在node2上做同样配置。
二.配置ldirectord
rpm -ql heartbeat-ldirectord
cp /usr/share/doc/ldirectord-1.0.4/ldirectord.cf /etc/ha.d
vim /etc/ha.d/ldirectord.cf
# Global Directives
checktimeout=20 #判定real server出错的时间间隔。
checkinterval=10 #指定ldirectord在两次检查之间的间隔时间。
fallback=127.0.0.1:80 #当所有的real server节点不能工作时,web服务重定向的地址。
autoreload=yes #是否自动重载配置文件,选yes时,配置文件发生变化,自动载入配置信息。
logfile="/var/log/ldirectord.log" #设定ldirectord日志输出文件路径。
quiescent=no #当选择no时,如果一个节点在checktimeout设置的时间周期内没有响应,ldirectord将会从LVS的路由表中直接移除real server,此时,将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果选择为yes,当某个real server失效时,ldirectord将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时连接跟踪记录和程序连接模板仍然保留在Director上。
# Sample for an http virtual service
virtual=192.168.3.233:80 #指定虚拟的IP地址和端口号,注意,在virtual行后面的行必
real=192.168.8.128:80 masq #指定Real Server服务器地址和端口,同时设定LVS工作模式,用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
real=192.168.8.129:80 masq
fallback=127.0.0.1:80 masq
service=http #指定服务的类型,这里是对http服务做负载均衡。
request="ipvsadm.html" #ldirectord将根据指定的Real Server地址,结合该选项给出的请求路径,发送访问请求,检查Real Server上的服务是否正常运行,确保这里给出的页面地址是可访问的,不然ldirectord会误认为此节点已经失效,发生错误监控现象。
receive="test ok" #指定请求和应答字串。
scheduler=wrr #指定调度算法,这里是rr(轮叫)算法。
protocol=tcp #指定协议的类型,LVS支持TCP和UDP协议。
checktype=negotiate #指定Ldirectord的检测类型,默认为negotiate。
checkport=80 #指定监控的端口号。
# virtualhost=www.gaojf.com #虚拟服务器的名称,随便指定。
需要在web1,web2上设置ipvsadm.html
echo "test ok" > ipvsadm.html
node1上ldirectord配置好后,copy到node2上一份即可。
三.配置heartbeat
heartbeat配置参见前面的博文“heartbeat实现nginx热备”,在此只需改下/etc/ha.d/haresources资源,其他不需要动。如下:
nod1端/etc/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth0 192.168.8.126
auto_failback on
node usvr-124.cityre.cn
node usvr-126.cityre.cn
ping 192.168.3.1
respawn hacluster /usr/lib64/heartbeat/ipfail
node2端/etc/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth0 192.168.8.124
auto_failback on
node usvr-124.cityre.cn
node usvr-126.cityre.cn
ping 192.168.3.1
respawn hacluster /usr/lib64/heartbeat/ipfail
node1和node2端的/etc/ha.d/haresources
usvr-124.cityre.cn IPaddr::192.168.3.233/24/eth0 ldirectord::ldirectord.cf
注:需要在node1和node2中写入对方的host
192.168.3.124 usvr-124.cityre.cn
192.168.3.126 usvr-126.cityre.cn
注:这里的vip就是我们lvs的vip,这样才能实现vip的漂移。
四.测试
heartbeat配置完成后启动service heartbeat start
1.查看vip是否启动
[root@usvr-124 ha.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:89:a2:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.124/24 brd 192.168.3.255 scope global eth0
inet 192.168.8.124/24 brd 192.168.8.255 scope global eth0:0
inet6 fe80::250:56ff:fe89:a216/64 scope link
valid_lft forever preferred_lft forever
[root@usvr-124 ha.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:89:a2:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.124/24 brd 192.168.3.255 scope global eth0
inet 192.168.8.124/24 brd 192.168.8.255 scope global eth0:0
inet 192.168.3.233/24 brd 192.168.3.255 scope global secondary eth0
inet6 fe80::250:56ff:fe89:a216/64 scope link
valid_lft forever preferred_lft forever
2.查看lvs表
[root@usvr-124 ha.d]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.3.233:80 wrr
-> 192.168.8.128:80 Masq 1 0 0
-> 192.168.8.129:80 Masq 1 0 0
3.将web1端的nginx停掉,大约20秒,继续查看lvs表
[root@usvr-124 ha.d]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.3.233:80 wrr
-> 192.168.8.129:80 Masq 1 0 0
发现node1端192.168.8.128:80已经从lvs表中清楚,说明ldirectord起作用了。
4.将web1端的nginx重新启动,继续查看lvs表
[root@usvr-124 ha.d]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.3.233:80 wrr
-> 192.168.8.128:80 Masq 1 0 0
-> 192.168.8.129:80 Masq 1 0 0
发现node1又重新加入到lvs表中。
5.将web1,web2端的nginx全部停掉,继续查看lvs表
[root@usvr-124 nginx1.6]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.3.233:80 wrr
-> 127.0.0.1:80 Local 1 0 0
当所有的lvs的realserver节点全部down掉,会有node1上的127.0.0.1:80启动,当访问vip时
curl 192.168.3.233/1.html 会出现“页面正在维护”,来提高用户体验。
6.若node1宕机,node2会接管vip
在node1上service heartbeat stop
在node2上查看ip
[root@usvr-126 ha.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:89:91:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.126/24 brd 192.168.3.255 scope global eth0
inet 192.168.8.126/24 brd 192.168.8.255 scope global eth0:0
inet 192.168.3.233/24 brd 192.168.3.255 scope global secondary eth0
inet6 fe80::250:56ff:fe89:91a0/64 scope link
valid_lft forever preferred_lft forever
7.在node2上查看lvs表
[root@usvr-126 ha.d]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.3.233:80 wrr
-> 192.168.8.128:80 Masq 1 0 0
-> 192.168.8.129:80 Masq 1 0 0
总结:
1.node1和node2上lvs不会同时运行,当vip在node1上时,lvs在node2上是停止的;当vip在node2上时,lvs在node1上是停止的。
2.ldirectord不必非配对使用,我们也可以单独使用来管理lvs,也就是说在heartbeat资源文件中不用加入ldirectord