首页 > 代码库 > heartbeat+ldirectord+lvs nat

heartbeat+ldirectord+lvs nat

ldirectord来管理lvs,可以定时检查后端realserver,发现故障后自动清除,恢复后自动加入lvs表,让我们来感受下吧。

lvs端:

node1

eth0:192.168.3.124

eth0:192.168.8.124用于heartbeat心跳

node2

eth0:192.168.3.126

eth0:192.168.8.126用于heartbeat心跳

realserver端:

web1

eth0:192.168.3.128

eth0:0:192.168.8.128 

web2

eth0:192.168.3.129

eth0:0:192.168.8.129 


一.建议先配置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


heartbeat+ldirectord+lvs nat