使用Piranha设置负载平衡LVS(NAT)集群

时间:2020-03-21 11:42:33  来源:igfitidea点击:

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

}
}