使用Piranha设置负载平衡LVS(NAT)集群
Linux虚拟服务器(LVS)系统使用专用的路由和负载平衡技术为生产服务提供了高度可用且可扩展的解决方案,该技术可以通过Piranha配置工具进行配置。
软件
本文使用的软件:
- CentOS的6.7
- Piranha 0.8.6
- ipvsadm 1.26
LVS集群
Linux LVS集群由两个基本组组成:LVS路由器和真实服务器。
为了防止单点故障,每个组将包含两个成员系统。
根据CentOS文档,活动路由器在群集中扮演两个角色:
- 为了平衡真实服务器上的负载,
- 在每个真实服务器上检查服务的完整性。
备用路由器的工作是监视活动路由器,并在发生故障时承担其角色。
LVS组件
脉冲:这是控制过程,将启动所有与LVS路由器相关的所有其他守护程序。
在引导时,守护程序由“ /etc/rc.d/init.d/pulse”脚本启动。
然后,它读取配置文件'/etc/sysconfig/ha/lvs.cf'。
在活动路由器上,脉冲启动LVS守护程序。
在备用路由器上,pulse通过以用户可配置的间隔执行简单的心跳来确定活动路由器的运行状况。
lvs:lvs守护程序在活动LVS路由器上运行,一旦被脉冲调用。
它读取配置文件“ /etc/sysconfig/ha/lvs.cf”,调用ipvsadm实用程序来构建和维护IPVS路由表,并为每个已配置的LVS服务分配一个保姆进程。
如果nanny报告真实服务器已关闭,则lvs指示ipvsadm实用程序从IPVS路由表中删除真实服务器。
ipvsadm:此服务更新内核中的IPVS路由表。
nanny:nanny监视守护程序在活动的LVS路由器上运行。
通过此守护程序,活动路由器确定每个真实服务器的运行状况,并可选地监视其工作负载。
为每个真实服务器上定义的每个服务运行一个单独的过程。
Piranha配置工具:这是基于Web的工具,用于监视,配置和管理LVS集群。
这是维护“ /etc/sysconfig/ha/lvs.cf”LVS集群配置文件的默认工具。
/etc/sysconfig/ha/lvs.cf:这是LVS群集配置文件。
所有守护程序直接或者间接地从此文件获取其配置信息。
网络和IP地址
我们的网络设置如下:
- 10.8.8.0/24-无法访问Internet但使用本地DHCP服务器的内部网络,
- 10.10.1.1/24-可以访问Internet的LAN。
我们将使用的虚拟机的主机名和角色:
- lvs-01-活动的LVS路由器,
- lvs-02-备用LVS路由器,
- lvs-03/lvs-04-真实服务器,均运行带有SSL的预配置Apache Web服务器。
有关更多信息,请参见下面的架构。
LVS-01和LVS-02节点的网络配置
lvs-01节点上的网络配置:
[Hyman@theitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static PEERDNS=no USERCTL=no IPADDR=10.10.1.31 NETMASK=255.255.255.0 GATEWAY=10.10.1.1
[Hyman@theitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes BOOTPROTO=dhcp PEERDNS=yes USERCTL=no
lvs-01上的路由表:
[Hyman@theitroad ~]# ip ro 10.10.1.0/24 dev eth0 proto kernel scope link src 10.10.1.31 10.8.8.0/24 dev eth1 proto kernel scope link src 10.8.8.31 169.254.0.0/16 dev eth0 scope link metric 1002 169.254.0.0/16 dev eth1 scope link metric 1003 default via 10.10.1.1 dev eth0
lvs-02节点上的网络配置:
[Hyman@theitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static PEERDNS=no USERCTL=no IPADDR=10.10.1.32 NETMASK=255.255.255.0 GATEWAY=10.10.1.1
[Hyman@theitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes BOOTPROTO=dhcp PEERDNS=yes USERCTL=no
lvs-02上的路由表:
[Hyman@theitroad ~]# ip ro 10.10.1.0/24 dev eth0 proto kernel scope link src 10.10.1.32 10.8.8.0/24 dev eth1 proto kernel scope link src 10.8.8.32 169.254.0.0/16 dev eth0 scope link metric 1002 169.254.0.0/16 dev eth1 scope link metric 1003 default via 10.10.1.1 dev eth0
LVS-03和LVS-04真实服务器节点的网络配置
lvs-03节点上的网络配置:
[Hyman@theitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static PEERDNS=no USERCTL=no IPADDR=10.8.8.33 NETMASK=255.255.255.0 GATEWAY=10.8.8.30
lvs-03上的路由表:
[Hyman@theitroad ~]# ip ro 10.8.8.0/24 dev eth1 proto kernel scope link src 10.8.8.33 169.254.0.0/16 dev eth1 scope link metric 1002 default via 10.8.8.30 dev eth1
lvs-04节点上的网络配置:
[Hyman@theitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static PEERDNS=no USERCTL=no IPADDR=10.8.8.34 NETMASK=255.255.255.0 GATEWAY=10.8.8.30
lvs-04上的路由表:
[Hyman@theitroad ~]# ip ro 10.8.8.0/24 dev eth1 proto kernel scope link src 10.8.8.34 169.254.0.0/16 dev eth1 scope link metric 1002 default via 10.8.8.30 dev eth1
LVS路由器安装
配置LVS-01节点
启用IP转发:
# sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/' /etc/sysctl.conf # sysctl -p
安装ipvsadm和Piranha软件包:
# yum install -y piranha ipvsadm
确保已加载IP虚拟服务器Netfilter内核模块:
# modprobe ip_vs
设置Piranha配置工具的密码:
# /usr/sbin/piranha-passwd
设置密码后,启动piranha-gui服务:
# /etc/init.d/piranha-gui start
请注意,在使用Piranha配置工具完成配置之前,我们不需要启动脉冲服务。
在LVS路由器上,需要设置四种服务才能在启动时激活:
# chkconfig piranha-gui on # chkconfig pulse on # chkconfig iptables on # chkconfig sshd on
多端口服务和防火墙标记需要iptables服务。
SSH服务用于远程登录,我认为这应该可以自我解释。
添加防火墙规则以允许HTTP访问Piranha WebUI:
# iptables -A INPUT -s 10.8.8.0/24 -p tcp --dport 3636 -j ACCEPT
为我们正在平衡的流量(HTTP和HTTPS)添加一条规则:
# iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
配置LVS-02节点
安装ipvsadm:
# yum install -y ipvsadm
启用服务:
# chkconfig pulse on # chkconfig iptables on # chkconfig sshd on
从lvs-01节点复制'sysctl.conf':
[Hyman@theitroad ~]# scp /etc/sysctl.conf Hyman@theitroad:/etc/
为我们正在平衡的流量(HTTP和HTTPS)添加一条规则:
# iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
使用Piranha完成NAT路由配置后(请参见本文的以下部分),请从lvs-01节点复制“ lvs.cf”文件:
[Hyman@theitroad ~]# scp /etc/sysconfig/ha/lvs.cf Hyman@theitroad:/etc/sysconfig/ha/
多端口服务
我们将使用多端口服务(HTTP和HTTPS),因此需要使用防火墙标记将不同但相关的协议捆绑在一起。
但是,分配防火墙标记的工作必须由Piranha配置工具之外的网络数据包过滤器iptables执行。
在两个路由器lvs-01和lvs-02上分配防火墙标记:
# iptables -t mangle -A PREROUTING -p tcp -d 10.10.1.30/32 -m multiport --dport 80,443 -j MARK --set-mark 80
其中10.10.1.30是我们的公共虚拟IP地址。
保存iptables规则,以便它们在重新启动后得以恢复:
# service iptables save
使用Piranha的LVS NAT路由配置
将网络浏览器导航到http://10.8.8.31:3636/。
配置主服务器并选择NAT网络类型。
提供NAT路由器详细信息。
10.8.8.30是我们的NAT虚拟IP。
添加并配置虚拟服务器。
10.10.1.30是我们的公共虚拟IP地址。
防火墙标记用于捆绑端口80上的HTTP连接和端口443上的HTTPS连接。
持久性就像一个计时器。
设置为30秒。
当客户端连接到服务时,LVS会记住30s的最后一次连接。
添加并激活真实服务器。
通过添加lvs-02节点的IP地址来配置冗余。
现在,当所有内容都已配置并保存后,在lvs-01节点上启动Pulse服务:
# service pulse start
此时,我们应该能够通过HTTP和HTTPS浏览公共虚拟IP 10.10.1.30。
在lvs-02节点上启动脉冲服务。
它应该充当备份节点。
检查活动的lvs-01节点上的LVS状态:
# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 80 wlc persistent 30 -> 10.8.8.33:80 Masq 1 1 14 -> 10.8.8.34:80 Masq 1 0 34
lvs.cf
下面显示了“ /etc/sysconfig/ha/lvs.cf”的内容,以供参考。
[Hyman@theitroad ~]# cat /etc/sysconfig/ha/lvs.cf serial_no = 3 primary = 10.10.1.31 service = lvs backup_active = 1 backup = 10.10.1.32 heartbeat = 1 heartbeat_port = 539 keepalive = 2 deadtime = 6 network = nat nat_router = 10.8.8.30 eth1:0 nat_nmask = 255.255.255.0 debug_level = NONE monitor_links = 1 syncdaemon = 0 virtual http_server { active = 1 address = 10.10.1.30 eth0:1 vip_nmask = 255.255.255.255 fwmark = 80 port = 80 persistent = 30 send = "GET/HTTP/1.0\r\n\r\n" expect = "HTTP" use_regex = 0 load_monitor = none scheduler = wlc protocol = tcp timeout = 6 reentry = 15 quiesce_server = 0 server lvs-03 { address = 10.8.8.33 active = 1 weight = 1 } server lvs-04 { address = 10.8.8.34 active = 1 weight = 1 } }