负载均衡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,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
26天前
|
域名解析 移动开发 负载均衡
阿里云DNS常见问题之DNS负载均衡调加权模式失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
3月前
|
负载均衡 Dubbo 应用服务中间件
【Dubbo 解析】Dubbo支持几种负载均衡策略?
【1月更文挑战第11天】【Dubbo 解析】Dubbo支持几种负载均衡策略?
|
6月前
|
负载均衡 应用服务中间件 Linux
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
178 0
|
1月前
|
负载均衡 网络协议 安全
技术浅析:基于云的DNS负载均衡如何实现?
技术浅析:基于云的DNS负载均衡如何实现?
43 6
|
1月前
|
负载均衡 算法 Java
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
|
3月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
205 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
180 1
|
6月前
|
负载均衡 应用服务中间件 nginx
71分布式电商项目 - nginx高可用以及lvs+nginx负载均衡(资料)
71分布式电商项目 - nginx高可用以及lvs+nginx负载均衡(资料)
41 0
|
6月前
|
存储 负载均衡 网络协议
企业实战(13)LVS负载均衡DR(直接路由)模式实战详解(二)
企业实战(13)LVS负载均衡DR(直接路由)模式实战详解(二)
107 0

推荐镜像

更多