码迷,mamicode.com
首页 > 其他好文 > 详细

LVS 之 集群设计

时间:2017-10-25 11:21:22      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:lvs-nat lvs-dr fwm 持久连接

1  概述

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

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

2  lvs-nat

设计要点:

(1) RIPDIP在同一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;

结果为轮询调度6373这两台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

拓扑图如下 

技术分享

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 "<h1>`hostname`</h1>" >/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;

结果为轮询调度6373这两台RS

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

4  FireWallMark

.FWMFireWall  Mark

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

同一类服务实现统一调度。如httphttps,这里需要加上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

 

 


本文出自 “阳光运维” 博客,请务必保留此出处http://ghbsunny.blog.51cto.com/7759574/1975813

LVS 之 集群设计

标签:lvs-nat lvs-dr fwm 持久连接

原文地址:http://ghbsunny.blog.51cto.com/7759574/1975813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!