使用心跳和Ldirectord设置负载平衡群集
我们将在CentOS 6上使用Heartbeat和Ldirector设置负载平衡器。
注意
Ldirectord已从RHEL 6默认存储库中删除,并被Piranha取代。
从RHEL 6.6开始,除了Piranha负载平衡软件外,Red Hat还提供对HAProxy和keepalived的支持。
Piranha已从RHEL 7默认存储库中删除,并替换为HAProxy并保持连接状态。
软件
本文使用的软件:
- CentOS的6.7
- Heartbeat 3.0.4
- Ldirectord 3.9.5
- ipvsadm 1.26
网络和IP地址
我们的网络设置如下:
- 10.8.8.0/24-可以访问Internet的LAN。
我们将使用的虚拟机的主机名和角色:
- lvs-ldir01-具有心跳的活动ldirectord路由器,
- lvs-ldir02-具有心跳的备用ldirectord路由器,
- lvs-ldir03/lvs-ldir04-真实服务器,均运行预配置的Apache Web服务器。
有关更多信息,请参见下面的架构。
直接路由Real Server节点配置
在每个真实服务器节点(lvs-ldir03和lvs-ldir04)上,为要用于真实服务器的VIP 10.8.8.45和协议组合运行以下命令:
# iptables -t nat -A PREROUTING -p tcp -d 10.8.8.45 --dport 80 -j REDIRECT
上面的命令将使真实服务器处理发给VIP和端口的数据包。
确保重新启动后保存并还原了防火墙更改:
# service iptables save
Ldirectord设置
Linux Director守护程序(ldirectord)是一个后台进程计算机程序,用于监视和管理Linux虚拟服务器(LVS)集群中的真实服务器。
Ldirectord通过定期请求一个已知的URL并检查响应是否包含预期的字符串来监视实际服务器的运行状况。
尽管ldirectord用于监视和管理LVS群集中的实际服务器,但心跳信号用作负载平衡器(ldirectord)的故障转移监视器。
安装
必须在lvs-ldir01和lvs-ldir02这两个路由器上都重复ldirectord安装步骤。
安装ldirectord的依赖项:
# yum install -y ipvsadm perl-libwww-perl perl-IO-Socket-INET6 perl-Net-SSLeay perl-MailTools
确保已加载IP虚拟服务器Netfilter内核模块:
# modprobe ip_vs
epel5存储库中提供了一个相当旧的(2010-03-21)heartbeat-ldirectord v2.1.4软件包,但现在已将其删除。
我们将使用2013年7月26日发布的ldirectord v3.9.5软件包。
从http://rpm.pbone.net/index.php3/stat/4/idpl/23860919/dir/centos_6/com/ldirectord-3.9.5-3.1.x86_64.rpm.html下载,或者在此处获取(直接链接)并安装。
# rpm -Uvh ldirectord-3.9.5-3.1.x86_64.rpm
在启动时禁用,因为它将由心跳管理:
# chkconfig ldirectord off
配置
创建“ /etc/ha.d/ldirectord.cf”文件并添加以下内容:
# Global Directives checkinterval = 5 checktimeout = 10 autoreload = no logfile = "/var/log/ldirectord.log" #logfile="local0" quiescent = yes ## virtual = x.y.z.w:p # protocol = tcp|udp # scheduler = rr|wrr|lc|wlc # real = x.y.z.w:p gate|masq|ipip [weight] ## Virtual Server for HTTP virtual = 10.8.8.45:80 real = 10.8.8.48:80 gate 1 real = 10.8.8.49:80 gate 1 service = http protocol = tcp request = "lbcheck.html" receive = "found" scheduler = wlc checktype = negotiate
“ virtual =“下的指令必须以[TAB]开头,而不是空格。
真正的Web服务器上必须存在具有“ found”内容的lbcheck.html文件。
有关此处未介绍的配置指令,请参见“ man ldirectord”。
在lvs-ldir01路由器上测试ldirectord:
# /etc/init.d/ldirectord start
我们应该看到这样的东西:
# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.8.8.45:80 wlc -> 10.8.8.48:80 Route 1 0 0 -> 10.8.8.49:80 Route 1 0 0
让我们停止ldirectord服务:
# /etc/init.d/ldirectord stop
心跳设置
心跳是Linux-HA的基本高可用性子系统。
安装方式
必须在lvs-ldir01和lvs-ldir02这两个路由器上都重复心跳安装步骤。
例如,我们可以配置一个路由器节点,然后将rsync config配置到另一路由器节点:
# rsync -ah --progress /etc/ha.d/Hyman@theitroad:/etc/ha.d/
安装心跳:
# yum install -y heartbeat
在启动时启用:
# chkconfig heartbeat on
启用转发:
# sed -i 's/net.ipv4.ip_forward = 1/net.ipv4.ip_forward = 0' /etc/sysctl.conf # sysctl -p
配置
创建“ /etc/ha.d/ha.cf”文件并添加以下内容:
logfile /var/log/ha.log logfacility local0 debug 0 # Disable the Pacemaker cluster manager # crm off|on|respawn crm off # Interval between heartbeat packets keepalive 2 # How quickly Heartbeat should decide that a node in a cluster is dead deadtime 6 # Which port Heartbeat should listen on udpport 694 # Which interfaces Heartbeat sends UDP broadcast traffic on bcast eth0 # Automatically fail back to a "primary" node (deprecated) auto_failback off # What machines are in the cluster. Use "uname -n" node lvs-ldir01.hl.local node lvs-ldir02.hl.local
配置iptables防火墙以允许心跳和HTTP通信:
# iptables -A INPUT -s 10.8.8.0/24 -p udp --dports 694 -j ACCEPT # iptables -A INPUT -s 10.0.0.0/8 -p tcp --dports 80 -j ACCEPT
保存防火墙规则:
# service iptables save
ldirector可以通过心跳轻松启动和停止。
将ldirectord放在“ /etc/ha.d/resource.d/”目录下,然后我们可以在“ /etc/ha.d/haresources”中添加一行,如下所示:
lvs-ldir01.hl.local IPaddr::10.8.8.45 ldirectord::ldirectord.cf
现在,在lvs-ldir01和lvs-ldir02这两个路由器上启动心跳服务:
# /etc/init.d/heartbeat start
此时,应该将虚拟IP分配给主路由器上的eth0接口:
# ip ad show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:ff:46:00 brd ff:ff:ff:ff:ff:ff inet 10.8.8.46/24 brd 10.8.8.255 scope global eth0 inet 10.8.8.45/24 brd 10.8.8.255 scope global secondary eth0 inet6 fe80::a00:27ff:feff:4600/64 scope link valid_lft forever preferred_lft forever
# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.8.8.45:80 wlc -> 10.8.8.48:80 Route 1 0 15 -> 10.8.8.49:80 Route 1 0 16
故障转移测试
在主路由器节点lvs-ldir01上停止heartbear服务:
[Hyman@theitroad ~]# /etc/init.d/heartbeat stop
lvs-ldir02节点应处于活动状态:
[Hyman@theitroad ~]# ip ad show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:ff:47:00 brd ff:ff:ff:ff:ff:ff inet 10.8.8.47/24 brd 10.8.8.255 scope global eth0 inet 10.8.8.45/24 brd 10.8.8.255 scope global secondary eth0 inet6 fe80::a00:27ff:feff:4700/64 scope link valid_lft forever preferred_lft forever
摘录自“ /var/log/ha.log”:
lvs-ldir02.hl.local heartbeat: [4808]: info: mach_down takeover complete. lvs-ldir02.hl.local heartbeat: [4808]: WARN: node lvs-ldir01.hl.local: is dead lvs-ldir02.hl.local heartbeat: [4808]: info: Dead node lvs-ldir01.hl.local gave up resources. lvs-ldir02.hl.local heartbeat: [4808]: info: Link lvs-ldir01.hl.local:eth0 dead.
现在,如果我们在lvs-ldir01节点上启动心跳服务,由于“ auto_failback on”,资源将从lvs-ldir02转移回lvs-ldir01.
故障排除
检查日志“ /var/log/ha.log”和“ /var/log/ldirectord.log”。