您的位置:首页 > 其它

集群负载技术之LVS应用详解

2016-07-14 10:07 429 查看
一、LB常用解决方案
1. 硬件负载均衡解决方案:
F5公司: BIG-IP
Citrix公司: Netscaler
A10公司: A10
Array
Redware
2. Linux: LVS
1. 完成Linux Virtual Server作者 (章文嵩,花名段正明,就职于阿里)
2. ipvs工作于netfilter框架上
3. ipvs: 框架,工作在内核中,工作在input链上,需要依赖于规则完成转发。 如果发现发往本机INPUT链的请求,如果能匹配到集群规则,直接转发至post-routing链发出主机。
4. 规则:简单来说就是把ip加端口定义为ipvs集群服务,ipvs会为此请求定义一个或多个后端服务目标地址未必会改,但是报文会被强行转发给后端的服务器。
5. ipvs组件: ipvsadm(用户空间,用来编写规则) + ipvs(内核空间)
6. ipvs工作在第四层:
1)成为四层交换、四层路由。 做第四层转发。
2)只能基于ip和port转发,无法在应用层,session级别转发
3)不用到达应用层空间,就能转发
7. lvs 性能很好,但是由于只第四层,不能到用户空间,因此不能进行更加精细的控制。 在精细控制方面,haproxy和Ngnix可以更好的实现。
8. lvs通常作为总入口,更精细化的切割可能使用,haproxy或者Nginx实现
9. 报文的信息流: CIP<–>VIP–DIP<–>RIP
1) CIP: Client ip
2) VIP: virtual ip
3) DIP: Director IP
4) RIP: Real server Ip
客户端请求,被VIP端口接收后,从DIP接口被转发出去,并转发至RIP
二、LVS类型:
1. NAT(dNAT):
访问过程如下
1) CIP访问VIP
2) VIP接收报文后,做dNAT,指向某一个RIP
3) RIP拿到接收到报文后进行回应
4) 此时需要,RIP网关指向DIP,也就是Director server. 否则若在互联网上,即便报文是可以回应给CIP客户端,但是由于CIP并没有请求RIP服务器,因此报文会被丢弃。
NAT特性
1) RS应该使用私有地址
2) RS的网关必须指向DIP
3) RIP 和 DIP 必须在一同意网段内
4) 进出的报文,无论请求还是响应,都必须经过Director Server, 请求报文由DS完成目标地址转换,响应报文由DS完成源地址转换
5) 在高负载应用场景中,DS很可能成为系统性能瓶颈。
6) 支持端口映射。
7) 内部RS可以使用任意支持集群服务的任意操作系统。




2. DR
1)让前端路由将请求发往VIP时,只能是Dirctor上的VIP
禁止RS响应对VIP的ARP广播请求:
(1)在前端路由上实现静态MAC地址VIP的绑定;
前提:得有路由器的配置权限;
缺点:Directory故障转时,无法更新此绑定;
(2)arptables
前提:在各RS在安装arptables程序,并编写arptables规则
缺点:依赖于独特功能的应用程序
(3)修改Linux内核参数
前提:RS必须是Linux;
缺点:适用性差;

Linux的工作特性:IP地址是属于主机,而非某特定网卡;也就是说,主机上所有的网卡都会向外通告
需要先配置参数,然后配置IP,因为只要IP地址配置完成则开始想外通告mac地址
为了使响应报文由配置有VIP的lo包装,使源地址为VIP,需要配置路由经过lo网卡的别名,最终由eth0发出

两个参数的取值含义:
arp_announce:定义通告模式
0: default, 只要主机接入网络,则自动通告所有为网卡mac地址
1: 尽力不通告非直接连入网络的网卡mac地址
2: 只通告直接进入网络的网卡mac地址
arp_ignore:定义收到arp请求的时响应模式
0: 只有arp 广播请求,马上响应,并且响应所有本机网卡的mac地址
1: 只响应,接受arp广播请求的网卡接口mac地址
2: 只响应,接受arp广播请求的网卡接口mac地址,并且需要请求广播与接口地址属于同一网段
3: 主机范围(Scope host)内生效的接口,不予响应,只响应全局生效与外网能通信的网卡接口
4-7: 保留位
8: 不响应一切arp广播请求
配置方法:
全部网卡
arp_ignore 1
arp_announce 2
同时再分别配置每个网卡,eth0和lo
arp_ignore 1
arp_annource 2
2) 特性
(1)RS是可以使用公网地址,此时可以直接通过互联网连入,配置,监控RS服务器
(2)RS的网不能指向DIP
(3)RS跟DS要在同一物理网络内,最好在一同一网段内
(4)请求报文经过Director但是相应报文不经过Director
(5)不支持端口映射
(6)RS可以使用,大多数的操作系统,至少要可以隐藏VIP






3. LVS TUN: IP隧道,IP报文中套IP报文
1)RIP,DIP,VIP都必须是公网地址
2)RS网关不会指向DIP
3)请求报文经过Director,但相应报文一定不经过Director
4)不支持端口映射
5)RS的OS必须得支持隧道功能



4. FULLNAT: 必须内核打补丁才能使用,使得各RS主机可以跨vlan. 源IP和目标IP都修改。




5.LVS应用缺陷
不能检测后端服务器的健康状况,总是发送连接到后端。
Session持久机制:
1、session绑定:始终将同一个请求者的连接定向至同一个RS(第一次请求时仍由调度方法选择);没有容错能力,有损均衡效果;
2、session复制:在RS之间同步session,因此,每个RS持集群中所有的session;对于大规模集群环境不适用;
3、session服务器:利用单独部署的服务器来统一管理session;

三、ipvsadmin使用方法:
1.安装ipvsadmin管理工具
# yum -y install ipvsadm
2.相关命令
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
3.集群服务相关命令参数
-A: 添加一个集群服务
-t: tcp
-u: udp
-f: firewall mark,
通常用于将两个或以上的服务绑定为一个服务进行处理时使用
例如httpd和https
iptables mongo表一起使用

service-address:
-t IP:port
-u ip:port
-f firewall_mark

-s 调度方法,默认为wlc
-p timeout: persistent connection, 持久连接
-E 修改定义过的集群服务
-D -t|u|f service-address:删除指定的集群服务
4.RS相关
-a:向指定的Cluster services中添加RS
-t|-u|-f service-address:指明将RS添加至哪个Cluster Service中
-r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
LVS类型:
-g: Gateway模式,就是DR模型(默认)
-i: ipip模式,TUN模型
-m: masquerade地址伪装自动完成后半段的原地址转换,NAT
指定RS权重:
-w # 省略权重为1
-e: 修改指定的RS属性
-d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS
5.清空所有的集群服务
-C
6.保存规则:(或使用重定向输出)
ipvsadm-save
ipvsadm -R
7.载入指定规则:(使用输入重定向)
ipvsadm-restore
ipvsadm -R
8.查看ipvs规则等
-L [options]
-n: 数字格式显示IP地址
-c: 显示连接数相关信息
--stats: 显示统计数据
--rate: 速率
--exact:显示统计数据的精确值
--timeout: 超时时间
-Z: 计数器清零;
四、LVS模型应用实现:
1.LVS-NAT架构模型实现:
(1)集群环境:
Client主机:Windows 7

Director主机: Centos 6.5 VIP:172.16.100.8 DIP:192.168.12.1

RealServer1主机: Centos 6.5 RIP:192.168.12.11

RealServer2主机: Centos 6.5 RIP:192.168.12.12
拓扑图如下:



网络环境部署如下:
1.Director:双网卡
eth0:172.16.100.8/16 --作为VIP地址
eth1:192.168.12.1/24

2.RS1:
eth0:192.168.12.11/24

3.RS2:
eth0:192.168.12.12/24

注:Director的eth1网络与RS1,RS2的eth0网络模拟在同一物流网络内
客户端为物理机windows 7,在172.16.0.0网络内
1.为RS添加网关指向Director主机
RS1:
# ifconfig eth0 192.168.12.11/24 up
# route add default gw 192.168.12.1

RS2:
# ifconfig eth0 192.168.12.12/24 up
# route add default gw 192.168.12.1
注意:添加路由条目后,主机之间相互ping测试。
2.Director修改内核参数,开启路由转发功能
(1)修改配置文件开启路由转发功能
--永久生效修改配置文件
# vim /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
--执行马上生效
# sysctl -p

(2)重定向方法开启路由转发功能
--临时生效
# echo 1 > /proc/sys/net/ipv4/ip_forward
3.在RS1和RS2上搭建web服务,并在Director验证服务
RS1上:
# echo 'Web from RS1' > /var/www/html/index.html
# service httpd start

RS2上:
# echo 'Web from RS2' > /var/www/html/index.html
# service httpd start

Director上验证
# curl 192.168.12.11
web from RS1
# curl 192.168.11.12
web from RS2
4.在Director添加集群服务
# ipvsadm -A -t 172.16.100.8:80 -s wlc
# ipvsadm -a -t 172.16.100.8:80  -r 192.168.12.11:80 -m -w 1
# ipvsadm -a -t 172.16.100.8:80  -r 192.168.12.12:80 -m -w 3
5.通过物理机windows7客户端访问172.16.100.8,正常状态可以实现轮寻两个RS主机的主页如下所示:





6.查询LVS记录状态信息
访问几次后,查看统计数据如下,大概接入报文比例3:1, 说明wlc生效
# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
-> RemoteAddress:Port
TCP  172.16.100.8:http                  49      190      101    17164     8753
-> 192.168.12.11:http                 22       84       45     7547     3925
-> 192.168.12.12:http                 27      106       56     9617     4828
2.LVS-DR架构模型实现(DIP,RIP为私有地址):
为了节约公网地址,DR模型下VIP可用公网地址,RIP用内网地址,将网关都指向同一个路由器,以此来实现DR模型的LVS负载均衡.
(1)集群环境:
Client主机:Windows XP eth0:172.16.100.10 eth1:192.168.12.254(作为gateway)

Director主机: Centos 6.5 VIP:172.16.100.8 DIP:192.168.12.10

RealServer1主机: Centos 6.5 RIP:192.168.12.11 lo:0,VIP:172.16.100.8

RealServer2主机: Centos 6.5 RIP:192.168.12.12 lo:0,VIP:172.16.100.8
拓扑图如下:



网络环境部署如下:

172.16.100.X模拟为外网; 192.168.12.X模拟为内网

Client(Gateway):
eth0:172.16.100.10(Host-Only)
eth1:192.168.12.254(Host-Only)

Director:
VIP:172.16.100.8(eth0:0)
Gateway:192.168.12.254
DIP:192.168.12.10(eth0,Host-Only)

RS1:
RIP:192.168.12.11(eth0,Host-Only)
Gateway:192.168.12.254(如果通过虚拟机配置,请到网络连接中修改网关地址)
VIP:172.16.100.8(lo:0)

RS2:
RIP:192.168.12.12(eth0,Host-Only)
Gateway:192.168.12.254(如果通过虚拟机配置,请到网络连接中修改网关地址)
VIP:172.16.100.8(lo:0)
1.配置Client客户端步骤如图1、2所示:



------------------------------------------------------------------------------------




2.配置Director主机
# ifconfig eth0 192.168.12.10/24 up
# echo 1 > /proc/sys/net/ipv4/ip_forward
# ifconfig eth0:0 172.16.100.8 netmask 255.255.255.255 broadcast 172.16.100.8 up
# route add -host 172.16.100.8 dev eth0:0
# ifconfig eth0:0 172.16.100.8/16 up
# ipvsadm -A -t 172.16.100.8:80 -s rr
# ipvsadm -a -t 172.16.100.8:80 -r 192.168.12.11 -g
# ipvsadm -a -t 172.16.100.8:80 -r 192.168.12.12 -g
3.部署RS1主机
# echo 'Web from RS1' > /var/www/html/index.html
# service httpd start
# ifconfig eth0 192.168.12.11/24 up
# route add default gw 192.168.12.254
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# ifconfig lo:0 172.16.100.8 netmask 255.255.255.255 broadcast 172.16.100.8 up
# route add -host 172.16.100.8 dev lo:0
4.部署RS2主机
# echo 'Web from RS2' > /var/www/html/index.html
# service httpd start
# ifconfig eth0 192.168.12.12/24 up
# route add default gw 192.168.12.254
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# ifconfig lo:0 172.16.100.8 netmask 255.255.255.255 broadcast 172.16.100.8 up
# route add -host 172.16.100.8 dev lo:0
5.Client客户端测试如下:






6.查询[b]Director主机ipvs规则状态信息[/b]
[b]

[/b]
[b]--------------------------------------------------------------------------------------[/b]
[b]以上为LVS-DR架构DIP和RIP为私有地址模型搭建.[/b]


[b][b]3.LVS-DR架构模型实现(DIP,VIP,RIP为公网地址):[/b][/b]

(1)集群环境:Client主机:Windows XP eth0:172.16.100.2
Director主机: Centos 6.5 VIP:172.16.100.6 DIP:172.16.100.5RealServer1主机: Centos 6.5 RIP:172.16.100.7 lo:0,VIP:172.16.100.6
RealServer2主机: Centos 6.5 RIP:172.16.100.8 lo:0,VIP:172.16.100.6拓扑图如下:[b][b]

[/b][/b]
1.配置Director主机
# ifconfig eth0 172.16.100.5/16 up
# ifconfig eth0:0 172.16.100.6/16 up
# route add -host 172.16.100.6 dev eth0:0
# ipvsadm -A -t 172.16.100.6:80 -s wlc
# ipvsadm -a -t 172.16.100.6:80 -r 172.16.100.7 -g -w 2
# ipvsadm -a -t 172.16.100.6:80 -r 172.16.100.8 -g -w 1

2.部署RS1主机
# echo 'Web from RS1' > /var/www/html/index.html
# service httpd start
# ifconfig eth0 172.16.100.7/16 up
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# ifconfig lo:0 172.16.100.6 netmask 255.255.255.255 broadcast 172.16.100.6 up
# route add -host 172.16.100.6 dev lo:0
3.部署RS2主机
# echo 'Web from RS2' > /var/www/html/index.html
# service httpd start
# ifconfig eth0 172.16.100.8/16 up
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# ifconfig lo:0 172.16.100.6 netmask 255.255.255.255 broadcast 172.16.100.6 up
# route add -host 172.16.100.6 dev lo:0
4.Client客户端测试如下:








5.查询ipvs规则状态信息
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.100.6:80 wlc
-> 172.16.100.7:80              Route   2      0          52
-> 172.16.100.8:80              Route   1      0          26
-------------------------------------------------------------------------------------------
以上为LVS-DR架构DIP、VIP、RIP为公网地址模型搭建.

3.LVS持久性连接:
LVS持久连接:
PCC:将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS;
PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS;
PFMC: 端口绑定,port affinity--基于防火墙标记,将两个或以上的端口绑定为同一个服务

实验集群环境:Client主机:Windows XP eth0:172.16.100.2
Director主机: Centos 6.5 VIP:172.16.100.6 DIP:172.16.100.5RealServer1主机: Centos 6.5 RIP:172.16.100.7 lo:0,VIP:172.16.100.6
RealServer2主机: Centos 6.5 RIP:172.16.100.8 lo:0,VIP:172.16.100.6拓扑图如下:
[b][b]

[/b][/b]
(1)普通非持久连接配置:
# ipvsadm -A -t 172.16.100.6:80 -s rr
# ipvsadm -a -t 172.16.100.6:80 -r 172.16.100.7 -g
# ipvsadm -a -t 172.16.100.6:80 -r 172.16.100.8 -g


(2)普通持久性连接配置
定义访问80端口的持久连接规则,发现此时同一个IP访问80端口,都转发给同一个RS响应,同理22号端口的ssh服务也可以类似配置。
# ipvsadm -C
# ipvsadm -A -t 172.16.100.6:80 -s rr -p 600
# ipvsadm -a -t 172.16.100.6:80 -r 172.16.100.7 -g
# ipvsadm -a -t 172.16.100.6:80 -r 172.16.100.8 -g
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.100.6:80 rr persistent 600
-> 172.16.100.7:80              Route   1      0          0
-> 172.16.100.8:80              Route   1      0          0
在指定时间以内,来自同一个客户端的请求都转发到同一个RS(172.16.100.6:0 表示任意端口)
# ipvsadm -C
# ipvsadm -A -t 172.16.100.6:0 -s rr -p 600
# ipvsadm -a -t 172.16.100.6:0 -r 172.16.100.7 -g
# ipvsadm -a -t 172.16.100.6:0 -r 172.16.100.8 -g
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.100.6:0 rr persistent 600
-> 172.16.100.7:0               Route   1      0          0
-> 172.16.100.8:0               Route   1      1          14
:此时可以观察到,通过同一台客户端不管是访问ssh还是web服务都指向了同一个RS的IP

(3)通过防火墙标记实现持久连接配置--实现http:80与https:443两端口绑定为同一服务
Director主机做CA服务器配置如下:
配置https:443服务:

1.创建证书中心:
--在public主机上创建证书中心
# cd /etc/pki/CA/
--生成私钥
# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签证书,由于需要输入大量用户信息,因此编辑证书的配置文件,在私有的CA上创建证书要注意所有的用户信息要和CA中的一致,从国家到部门都要相同,否则会造成证书无法使用。
--根据实验要求修改配置文件如下:
# vim /etc/pki/tls/openssl.cnf
[ req_distinguished_name ]
countryName_default          = CN
stateOrProvinceName_default     = GUANGDONG
localityName_default    = GUANGZHOU
0.organizationName_default       = JUST.LTD
organizationalUnitName_default     = IT
生成自签证书--以CAserver的身份自建CA证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
Country Name (2 letter code) [CN]:
State or Province Name (full name) [GUANGDONG]:
Locality Name (eg, city) [GUANGZHOU]:
Organization Name (eg, company) [JUST.LTD]:
Organizational Unit Name (eg, section) [IT]:
Common Name (eg, your name or your server's hostname) []:www.samlee.com
创建证书编号
# touch {index.txt,serial}
# echo 01 > serial
给Web服务器生成key、证书请求、证书:
--创建私钥
# cd /etc/pki/CA/
# (umask 077;openssl genrsa -out http.key 2048)
--生成证书申请
# openssl req -new -key http.key -out http.csr
Country Name (2 letter code) [CN]:
State or Province Name (full name) [GUANGDONG]:
Locality Name (eg, city) [GUANGZHOU]:
Organization Name (eg, company) [JUST.LTD]:
Organizational Unit Name (eg, section) [IT]:
Common Name (eg, your name or your server's hostname) []:www.samlee.com
--在证书服务器上对master的证书进行签发
# openssl ca -in http.csr -out http.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jun 23 00:09:31 2016 GMT
Not After : Jun 21 00:09:31 2026 GMT
Subject:
countryName               = CN
stateOrProvinceName       = GUANGDONG
organizationName          = JUST.LTD
organizationalUnitName    = IT
commonName                = master.samlee.com
Data Base Updated    --看到此项出现说明证书签发成功了
配置RS1\RS2服务器--(rpm安装的httpd服务配置)
# yum -y install mod_ssl
# scp -p root@172.16.100.5:/etc/pki/CA/http.key /etc/httpd/ssl/
# scp -p root@172.16.100.5:/etc/pki/CA/http.crt /etc/httpd/ssl/
# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/ssl/http.crt
SSLCertificateKeyFile /etc/httpd/ssl/http.key
# service httpd restart
基于https服务的持久连接配置如下
# ipvsadm -A -t 172.16.100.6:443 -s rr
# ipvsadm -a -t 172.16.100.6:443 -r 172.16.100.7 -g
# ipvsadm -a -t 172.16.100.6:443 -r 172.16.100.8 -g
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.100.6:443 rr
-> 172.16.100.7:443             Route   1      0          1
-> 172.16.100.8:443             Route   1      0          0
基于防火墙标记实现多端口绑定http和https服务,同时也做到了负载均衡
# iptables -t mangle -A PREROUTING -d 172.16.100.6 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8
# iptables -t mangle -A PREROUTING -d 172.16.100.6 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8
# ipvsadm -A -f 8 -s rr -p 600
# ipvsadm -a -f 8 -r 172.16.100.7 -g -w 2
# ipvsadm -a -f 8 -r 172.16.100.8 -g -w 5
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  8 rr persistent 600
-> 172.16.100.7:0               Route   2      0          15
-> 172.16.100.8:0               Route   5      0          41
测试如下:






以上为LVS应用所有内容。

本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1826261
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: