负载均衡lvs 解析-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

负载均衡lvs 解析

简介:

一, 传统一台服务器无法满足现有的业务需求时,通常是增加新的服务器来解决。将这些服务器组合成一个整体,逻辑意义上的整体,向外提供同一种服务。也就今天要给大家介绍的集群。集群的目的实现负载均衡,也是说当一个请求来了,后台的第一台服务器提供服务,第二个请求来了之后,后台的第二台服务器提供服务。现在问题就出现,要怎么做才能让第一个请求到第一台服务器上,而第二个请求到第二台服务器上。如果我们在后台服务器的前面专门用一台服务器来接受用户的请求,由这台服务器来分配请求到后台的服务器。用来专门接受用户请求在这称之为Director(调度器),后台提供服务的服务器叫做Real Server(提供服务的真实服务器)。如下图所示:

102014557.jpg

二,上面好像解决了客户端的请求,但是当服务器响应完客户端请求时,返回给客户端用数据包是否由前端Director响应给用户,还是由RS自己响应客户端。那此时就需要定义Director工作在哪种模型下。如果工作在nat模型,则返回客户端的数据包需要由Director响应用户,如果工作在DR模型下,则返回用RS自己直接响应用户请求。

三,众所周知,Director有硬件和软件之分,而硬件的价格并不是每个公司都能够买得起,那么此时就只能退而求其次,用一台服务器,在上面安装软件,来达到负载均衡的目的。

四,既然用软件来解决这个问题,那先介绍一个lvs,lvs是一款开源软件,由国人编写的。lvs的全称为linux virtual system(linux虚拟系统)。lvs工作在一台服务器上,而这台服务器只处理用户请求,本身并不提供服务。lvs两分成两段代码:ipvs与ipvsadm,ipvs工作在内核,ipvsadm工作在用户空间用于定义服务。

五,那lvs工作在用户空间还是内核空间。答案肯定是工作在内核空间,假如lvs工作在用户空间,当客户端请求到达到Director时,数据包进入Director时先要经过prerouting链,prerouting链做出路由判断后,请求本机资源,那此时将经过input链进入本机。如果这样的话,Director没有启到应有的作用。况且Director本身也不提供服务。因此lvs必须工作在内核空间,那工作在内核空间的哪个位置,lvs在判断用户请求时,根据协议与目标端口做用户请求的资源做出判定。lvs也称4层交换,那么lvs就只能工作在Input链上,当用户请求到达到input链时,发现请求的一个集群服务,此时就会把请求送达给后面提供服务的RS。lvs基于netfilter框架来实现,因此与input链会有冲突。

六:director根据什么来分配用户请求,此时需要在director定义调度算法,调度算法分为静态与动态。静态算法只根据用户请求来决定哪台rs来响应,而动态算法根据当前rs的连接个数,来决定哪台rs响应。

fixed静态算法有四种:

1,round-robin  rr:轮询的方式,固定调度算法

2,weighted round-robin: wrr:加权轮询,根据rs服务器的权值来分配请求

3,destination hashing  dh:目标地址哈希  当director后面直接连接的是缓存服务器时,客户端第一次访问的是哪个缓存服务器,则下次directo还是会分配访问之前那台缓存服务器来响应,提高缓存命中率。

4,source hashing      sh:源地址哈希

dynamic动态算法有六种:

1,LC:least contect 最少负载 
计算负载:overhead(负载)=active*256+inactive(活动的连接数(正在处理的请求)*256+非活动的连接(处理空闲状态))

2,wlc:加权lc:上面的值除以权重值,得到值越小,则director会将请求给谁。

3,sed(shortest expected delay)最少期望延迟,不考虑非活动连接。

overhead=(active+1)*256/weight(+1为了避免权重值较小的服务器获得连接)得到值越小,则越优先获得请求

4,nq:(never queue永不排队):不考虑非活动的连接,如果某个rs空闲,则不管权重值的大小,都会将请求分配给rs。

5,LBLC:基于本地的最少连接,与静态的dh实现效果一样。

6,LBLCR:对lblc的改进,带复制的基于本地的最少连接,缓存服务器可以相互交换缓存,使用cdp协议来交换,当客户端第一次访问第一台缓存服务器,如果下次访问是第二台缓存服务器,则第二台缓存服务器去会第一缓存服务器复制缓存到本机。但是需要支持cpd协议的操作系统才有能实现。

六,下面介绍Director工作在nat模型实现步骤

实上环境:redhat 5.8,三台虚拟机,两台rs提供web服务,客户机物理机。

114859871.jpg

nat模型

由于数据包进出都经过director,当director将请求转发到rs上时,需要做地址转换,因此rs的网关需要指向director内网网卡。director的eth1与rs通信用虚拟网卡vmnet2。

1,先对director做好配置,查看本机的内核是否支持ipvs


  1. [root@server30 ~]# grep -i  ipvs /boot/config-2.6.18-308.el5  

  2. # IPVS transport protocol load balancing support

  3. # IPVS scheduler

  4. # IPVS application helper

如果出现ipvs,那表示内核已经将ipvs编译进内核,如果没有需要重新编译内核。安装ipvsadm: yum -y install ipvsadm

2,对director提供两块网卡,并配置如上图的IP,其中eth0的IP与客户端的IP在同一网段,并将director的转发功能打开,执行
[root@server30 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

3,添加集群服务:


  1. [root@server30 ~]# ipvsadm -A -t 192.168.0.32:80 -s rr 定义集群服务

  2. [root@server30 ~]#ipvsadm -a -t 172.16.100.1:80 -r 192.168.200.2 -m

  3. [root@server30 ~]#ipvsadm -a -t 172.16.100.1:80 -r 192.168.200.3 -m
    提供服务的rs,-t表示tcp,-m表示nat模型。

4,对两台rs安装好http,yum -y install httpd。并启动服务service httpd start,并提供测试页,为了验证效果给rs1提供的主页中包含rs1,给rs2提供的主页为rs2。

5,给两台rs分别设置ip与默认网关,给rs1设置地址如下
ifconfig eth0 192.168.200.2
route add default gw 192.168.200.1
给rs2设置只需要将192.168.200.2修改成192.168.200.3

6,需要保证rs1,rs2与director能够相互ping通。

7,在客户机的浏览器中输入192.168.0.32,并刷新查看每次显示的出的内容就可以知道,有没有启动负载均衡的效果。

8,由于NAT模型中,出去的数据包也要经过director,因此会造成director成为整个集群的瓶颈。在这种模型下,director最多也就只能负载10台服务器。

七,dr模型

在dr模型中,由于director只接收客户端的请求,此时对director是一种极大的解脱,那么此种情况下,director能够负载多达上百台服务器。

在dr 模型中只有进来的用数据包经过dr,出去的数据由rs自己响应用户的请求,由于用户请求的是vip(eth0),如果rs只有一个rip(eth1)的话,用户根本就不会接收来自rip返回的资源。那么此时就需要解决一个问题rs上也需要一个vip,那么当rs响应用户请求时,用vip去响应用户请求就OK。此时会有疑问,既然rs也有vip,那数据包进来的时,怎么才能让director的vip网卡来响应,并由他决定分配哪台rs来响应用户的请求。当用户的请求到达路由器时,路由器会发送一个arp广播包的方式来响查找vip,由于rs也有vip,因此rs也能够响应用户的请求。如果这样那director并没启到应有的作用。如果不让rs响应路由器arp广播包,那么当用户的请求到达director时,directory发现用户的请求是一个集群服务,那此时就需要将用户的请求转发到rs的rip,此过程修改dircetor中vip的mac为rs的rip mac。为不让rs的vip来不响应前端路由。就将vip配置在rs的lo网卡上,并配置两个内核参数,只要apr包请求vip在哪,由于arp包只能经过rip,linux默认情况下会如果有请求通过rip来获取vip,rip会响应,但是启用两个内核参数之后 ,则rip不予于响应,只有对rip自身的请求,rip才响应。因此当用户请求到达前面路由时,路由器会发送arp包广播包,rs能收到,但是并不响应,只有director响应,此时director发现用户请求的是集群服务,那此时就将请求转发到其中的一台rs上,现在的问题是director怎么把请求转发到其中一台rs上,在请求包中,肯定会封装源mac,目标mac(vip),由于director与rs在同一局域网此时是通信只需通过mac通信就ok,那么此时director会将目标mac修改成rs的rmac,再将请求包发送给交换机,那么此时交换发现目标mac是rs的mac,此时就rs就接收请求。当然有人肯定会问,director怎么知道rs的mac,在director中已经定义好rs服务器的ip,那director只要将发送arp广播包,询问rip的mac是多少。当rs接收请求之后发现源ip为cip,目标ip为vip,那么此时会将请求转送到lo上vip。并将响应包通过网关发送出去。在目前的系统上,由于请求是哪个网卡进来那么就从哪块网卡出去。那么就会重新封装数据包,源ip为rip,目标ip为cip,注意是响应包。但是cip请求的vip,因此cip会拒收。此时我们要怎么样才能让源ip为vip。rs接收请求包,发现是请求lo,那么此时交给lo,因此我们可以强制设置一条规则只要是请求lo的,就由lo做为源地址响应。这条规则就是路由。

内核中两个参数:

(1)arp_announce : 对网络接口上本地IP地址发出的ARP回应作出相应级别的限制

arp_announce 默认等0,不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

arp_announce=1尽量避免不在该网络接口子网段的本地地址

arp_anounce=2对查询目标使用最适当的本地地址

(2)arp_ignore :定义对目标地址为本地IP的ARP询问不同的应答模式

arp_ignore默认等于0,回应任何网络接口上对任何本地IP地址的arp查询请求

arp_ignore=1 只回答目标IP地址是来访网络接口本地地址的ARP查询请求

203112647.jpg

根据上图的配置,三台服务器都只需要一块网卡,并且在同一个物理网络中,在director中,vip配置在eth0:0上,在rs上,vip配置你lo:0上。既然在同一物理网络中,那么他们之间是以桥连的方式来通信。

1,对director做好配置:清空之前的配置


  1. ipvsadm -C

  2. ifconfig eth0:0 192.168.0.241 broadcast 192.168.0.241 up

  3. route add -host 172.16.100.1 dev eth0:0

  4. echo 1 > /proc/sys/net/ipv4/conf/forward

  5. ipvsadm -A -t 192.168.0.241:80 -s rr

  6. ipvsadm -A -t 192.168.0.241:80 -r 192.168.0.242 -g (-g可以省略,因为默认就dr)

  7. ipvsadm -A -t 192.168.0.241:80 -r 192.168.0.242 -g

2,对rs1,rs2做配置,下面是对rs1的配置


  1. echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

  2. echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

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

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

  5. ifconfig eth0 192.168.0.242

  6. ifconfig lo:0 172.16.100.1(vip) broadcast 172.16.100.1 netmask 255.255.255.255 up

  7. route add -host 172.16.100.1 dev lo:0

3,此时可以在IE浏览器中输入192.168.0.241测试,,如果第一次网页出现RS1,并刷新一次页面,第二次出现的是RS2,则负载均衡的效果达到了。

八,下面介绍lvs的持久连接,持久连接类型:

(1)pcc持久客户端连接:只要是同一个用户发起的请求,不管请求的哪个端口,都会被永久的定义第一次被访问到的real server

(2)ppc持久端口连接:根据用户请求的端口来判定,从而定向到不同服务器。

(3)pnp持久防火墙标记:实际是iptables的mangle功能,它能实现将通过本机的数据包,打上一个独特的标记。标记通常使用0-99之间的数字

(4) ftp的持久连接:定义一个范围的端口,ftp工作在被动模式下,给他定义一段范围的端口。

九, 在lvs中实现http与https服务。

要实现https协议,需要安装在两台rs上安装ssl_mod,三台虚拟以桥接的方式通信。

(1)director做为CA服务器


  1. vim /etc/pki/tls/openssl.cnf 编辑其中一行dir          = /etc/pki/CA

  2. cd /etc/pki/CA

  3. mkdir crl certs newcerts

  4. echo 01 > serial

  5. touch index.txt

  6. (umask 077; openssl genrsa 1024 > private/cakey.pem)

  7. openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655

  8. Country Name (2 letter code) [GB]:cn

  9. State or Province Name (full name) [Berkshire]:ha

  10. Locality Name (eg, city) [Newbury]:zz

  11. Organization Name (eg, company) [My Company Ltd]:magedu

  12. Organizational Unit Name (eg, section) []:tech

  13. Common Name (eg, your name or your server's hostname) []:ca.magedu.com

  14. Email Address []:

(2)在director 定义好集群服务


  1. iptables -t mangle -A PREROUTING -d 192.168.0.241 -p tcp --dport 80 -j MARK --set-mark 6

  2. iptables -t mangle -A PREROUTING -d 192.168.0.241 -p tcp --dport 443 -j MARK --set-mark 6

  3. ipvsadm -A -f 6 -s rr -p 1800(定义持久连接为1800秒)

  4. ipvsadm -a -f 6 -r 192.168.0.242 -g

  5. ipvsadm -a -f 6 -r 192.168.0.243 -g

(2)在rs1申请证书请求,并与rs2共用


  1. mkdir /etc/httpd/ssl

  2. cd /etc/httpd/ssl

  3. (umask 077;openssl genrsa 1024 > httpd.key)

  4. [root@rs1 ssl]# openssl req -new -key httpd.key -out httpd.csr

  5. Country Name (2 letter code) [GB]:cn

  6. State or Province Name (full name) [Berkshire]:ha

  7. Locality Name (eg, city) [Newbury]:zz

  8. Organization Name (eg, company) [My Company Ltd]:magedu  

  9. Organizational Unit Name (eg, section) []:tech

  10. Common Name (eg, your name or your server's hostname) []:www.magedu.com

  11. Email Address []:

  12. Please enter the following 'extra' attributes

  13. to be sent with your certificate request

  14. A challenge password []:

  15. An optional company name []:

  16. 将证书传送到director上,进行签发

  17. scp httpd.csr  192.168.0.32:/tmp

(3)在director上签发证书:


  1. cd /tmp

  2. openssl ca -in httpd.csr -out httpd.crt -days 3655

  3. scp httpd.crt 192.168.0.242:/etc/httpd/ssl 传送回rs1

(4)此时签署完了,如果rpm包安装httpd,则需要要yum -y install mod_ssl,在两台rs都要执行。

(5)在rs1上,编辑vim /etc/httpd/conf.d/ssl.conf,修改下面两行。并重启httpd
SSLCertificateFile "/etc/httpd/ssl/httpd.crt" 
SSLCertificateKeyFile "/etc/httpd/ssl/httpd.key"

(6)将rs1上配置好的传送到rs2
scp -rp /etc/httpd/ssl/ 192.168.0.243:/etc/httpd
scp  /etc/httpd/conf.d/ssl.conf 192.168.0.243:/etc/httpd/conf.d/

(7)配置win 下hosts文件添加一行:
192.168.0.241    www.magedu.com
(8)在浏览器中输入192.168.0.241与https://www.magedu.com测试,测试的结果是如果第一次网页显示是rs1,则输入https://www.magedu.com的也是rs1。这样才达到效果。










本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/948738,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章