LVS 之 集群设计

1  概述

负载均衡集群设计时要注意两点:一是否需要会话保持;二是否需要共享存储,共享存储分为NAS,SAN,DS(分布式存储)

本文结合实验介绍了lvs-nat,lvs-dr,FWM的实现,同时介绍持久连接的相关配置

2  lvs-nat

设计要点:

(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP

(2)支持端口映射

(3) Director要打开核心转发功能

实验:VS实现LVS-NAT模式的调度

实验环境准备:

iptables,selinux,关闭,服务器时间同步。

内网网段:172.18.0.0/16

外网网段:192.168.32.0/24

RS1和RS2分别开启httpS服务

client配置172网段ip:172.18.50.65

VS配置两个网卡,分别配置172网段和192网段,eth0 ip 172.18.50.72  eth1 ip 192.168.32.72

RS两台配置192网段 RS1 ip:192.168.32.63  RS2 ip: 192.168.32.73

RS1和RS2的网关要指向 VS 的192.168.32.72

client网关指向VS的172.18.50.72

拓扑图如下

在VS上配置如下三条命令

ipvsadm -A  -t 172.18.50.72:443 -s rr

ipvsadm -a  -t 172.18.50.72:443 -r 192.168.32.63:443 -m

ipvsadm -a  -t172.18.50.72:443 -r 192.168.32.73 -m

如果改规则的时候出现报错,内存分配问题(Memory allocation problem),解决办法,清掉规则,全部重新添加

RS上配置https

VS上要启用路由转发功能。

echo 1 > /proc/sys/net/ipv4/ip_forward

转发功能要永久存盘,

centos7写入/etc/sysctl.d/99-sysctl.conf文件里

vim /etc/sysctl.d/99-sysctl.conf

net.ipv4.ip_forward=1

然后重启网络后生效

centos6写入/etc/sysctl.conf文件

/etc/sysctl.conf

net.ipv4.ip_forward=1

安装http和mod_ssl模块

yum –y install httpd mod_ssl

生成证书

注意,证书可以向CA中心申请,这个案例介绍如何生成自己前面的证书的另一个方法

生成自签名的证书

cd /etc/pki/tls/certs

make http.crt

生成证书http.crt和私有http.key,这里生成key时需要输入密码,这样每次重启httpd服务的时候,需要输入密码才能成功启动

去掉证书密码的命令如下

openssl rsa –in http.key –out http2.key

输入密码后可以生成新的

mv http.key http.key.bak

mv http2.key  http.key

这样http.key就没有密码,重启http的时候就不需要输入密码

配置ssl文件,指定证书和私钥的路径

vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/httpd/conf.d/http.crt

SSLCertificateKeyFile /etc/httpd/conf.d/http.key

保存后重启http服务即可

将生成的私钥和证书发到另一台机器上,后端的RS的https服务的key和证书要同一个

后端RS的https服务配置完成后,到此,LVS-NAT配置完成,可以将请求调度到后端的https服务器

测试如下

for i in {1..10};do curl -k https://172.18.50.72;done;

结果为轮询调度63和73这两台RS

3  LVS-DR

dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1)在前端网关做静态绑定

(2)在各RS使用arptables

(3)在各RS修改内核参数,来限制arp响应和通告的级别

.限制响应级别:arp_ignore,选择1

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

.限制通告级别:arp_announce,选择2

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

1:尽量避免将接口信息向非直接连接网络进行通告

2:必须避免将接口信息向非本网络进行通告

VIP建议配置在lo口上比较合理(虽然可以配置在任意网卡,但是建议配置在lo)

实验:VS实现LVS-DR模式的调度

环境如下:

五台机器的ip配置如下

host1-->client: eth1: 172.18.50.65/16

host2-->ROUTER: WAN: eth1:172.18.50.62/16

LAN: eth0:192.168.32.62/24

eth0:1 : 10.10.10.12/24

host3-->VS: eth33:192.168.32.72/24

eth33:1 10.10.10.10/24

host4-->RS1:eth0:192.168.32.63/24

lo:1 10.10.10.10/24

host5-->RS2:eth33:192.168.32.73/24

lo:1 10.10.10.10/24

注意:

RS上取消arp的响应和arp_announce

Router上配置三个ip,开启路由转发功能,同时在网卡eth0上配置独臂路由

VS和RS都配置默认的路由,网关都指向 Router  LAN: eth0:192.168.32.62/24

VS和RS添加默认路由命令:route add default gw 192.168.32.62

DR模型不能基于端口调度

拓扑图如下

RS的一键配置脚本

#!/bin/bash

vip=10.10.10.10

mask='255.255.255.0'

dev=lo:1

rpm -q httpd &> /dev/null || yum -y install httpd&>/dev/null

service httpd start &> /dev/null && echo"The httpd Server is Ready!"

#echo "

`hostname`

" >/var/www/html/index.html

case $1 in

start)

echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce

echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $dev$vip netmask $mask broadcast $vip up

route add -host$vip dev $dev

echo "The RSServer is Ready!"

;;

stop)

ifconfig $devdown

echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore

echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce

echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "The RSServer is Canceled!"

;;

*)

echo "Usage:$(basename $0) start|stop"

exit 1

;;

esac

VS的一键配置脚本

#!/bin/bash

vip='10.10.10.10'

iface='ens33:1'

mask='255.255.255.0'

port='80'

rs1='192.168.32.63'

rs2='192.168.32.73'

scheduler='wrr'

type='-g'

rpm -q ipvsadm &> /dev/null || yum -y installipvsadm &> /dev/null

case $1 in

start)

ifconfig $iface$vip netmask $mask broadcast $vip up

iptables -F

ipvsadm -A -t${vip}:${port} -s $scheduler

ipvsadm -a -t${vip}:${port} -r ${rs1} $type -w 2

ipvsadm -a -t${vip}:${port} -r ${rs2} $type -w 1

echo "The VSServer is Ready!"

;;

stop)

ipvsadm -C

ifconfig $ifacedown

echo "The VSServer is Canceled!"

;;

*)

echo "Usage:$(basename $0) start|stop"

exit 1

;;

esac

测试如下

for i in {1..10};do curl   http://172.18.50.72;done;

结果为轮询调度63和73这两台RS

注意,以上环境为生产环境的实际配置,如果不用要把VIP也设置为私有ip,如192.168.32.66,那么在路由器上就不需要多配置一个eth0:1的ip了,路由器上只需要配置两个ip就可以,其他配置都不变。

4  FireWallMark

.FWM:FireWall  Mark

.MARK target可用于给特定的报文打标记

同一类服务实现统一调度。如http和https,这里需要加上Mark标记

默认工作模式是dr,默认的调度算法是wlc

--set-mark  value

# value是在防火墙的策略上会显示为16进制数,可以随便定义,如这里定义value值是12,但是在防火墙上通过命令iptables –vnL  -t mangle 看到的是0xc,是十六进制

.借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度

.实现方法:

.在Director主机打标记:

iptables  -t mangle -A PREROUTING -d $vip  -p $proto  -m multiport  --dports $port1,$port2,… -j MARK --set-markNUMBER

LVS上定义如下

.在Director主机基于标记定义集群服务和管理RS:

ipvsadm  -A  -f   NUMBER [options1]

这里的iptions1可以定义算法,如跟上-s wrr

ipvsadm -a -f  NUMBER  -r  real-server  [options2]

这里的iptions2可以定义集群的类型,如-g表示dr模型

实验

在vs上配置

iptables -t mangle -A PREROUTING -d 192.168.32.66 -p tcp -m multiport--dports 80,443 -j MARK --set-mark 12

ipvsadm –A  -f  12  -s  wrr

ipvsadm -a -f 12 -r  192.168.32.63  -g -w 3

ipvsadm -a  -f 12 -r 192.168.32.73  –g

RS配置可以参考LVS-dr的脚本配置

测试

for i in {1..10};docurl  -k https://192.168.32.66;curl http://192.168.32.66;done;

结果是轮询调度后端RS的http和https服务。

5  持久连接

来自同一个服务的请求尽可能发到同一台后端的RS上处理。这里可以实现session绑定

注意LVS的算法,默认只有sh能够实现根据session来实现调度。其他的调度算法不能实现session绑定。但是sh的第一次是随机的,不能根据权重调度。

综合sh和其他算法,用持久连接的技术来实现。这是一个折中的方法。

-p  [timeout]这个选项来实现持久连接,默认是360s,和man帮助里不一样,man里是300s,实际默认是360s

.session绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs  sh算法无法实现

.持久连接(lvs  persistence)模板:实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS

ipvsadm  -A|E    -t|u|f  service-address  [-s scheduler]  [-p [timeout]]

.持久连接实现方式:

.每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度

.每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port  Affinity

.每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式.但是实际生产不这么定义,因为这样相当于是把后端的服务都发布到公网了。

例子

ipvsadm  -E  -f  12 -s wrr -p 20

#这里的-p后面接数字20表示20秒内,同一客户端将会被调度到同一服务器上,如果跟数字20,就是默认的360

推荐阅读更多精彩内容