在上一篇中介绍了负载均衡及集群的原理,本篇主要介绍下下实现负载均衡的软件之LVS的原理及应用。

一、LVS的介绍

1、  LVS的定义

一般来说,LVS采用三层结构:负载调度器、服务器池、共享存储。工作在TCP/IP协议的四层,其转发是依赖于四层协议的特征进行转发的,由于其转发要依赖于协议的特征进行转发,因此需要在内核的TCP/IP协议栈进行过滤筛选,可想而知,这就需要在内核的模块来完成,而这样的过滤转发规则又是由管理员进行定义的,所以,LVS就是两段式的架构设计,在内核空间中工作的是"ipvs",而在用户空间中工作的,用来定义集群服务规则的是"ipvsadm"。这就很容易想到iptables而LVS正好工作在iptables的input链上。

2、  LVS的组成

ipvsadm:用于管理集群服务的命令行工具,工作于Linux系统中的用户空间。

ipvs:为lvs提供服务的内核模块,工作于内核空间 (相对于是框架,通过ipvsadm添加规则,来实现ipvs功能)。

注:在linux内核2.4.23之前的内核中模块默认是不存在的,需要自己手动打补丁,然后把此模块编译进内核才可以使用此功能。

3、  LVS中每个主机IP地址的定义

VIP:Director用来向客户端提供服务的IP地址,也是DNS解析的IP

RIP:集群节点(后台真正提供服务的服务器)所使用的IP地址

DIP:Director用来和RIP进行交互的IP地址

CIP:公网IP,客户端使用的IP

4、  LVS的三种转发模式

LVS-NAT:网络地址转换 NetworkAddress Translation

LVS-DR:直接路由 Direct Routing

LVS-TUN:IP隧道 IP Tunneling

5、  LVS的三种转发模式特点

NAT

a、  集群节点跟director必须在同一个网段上面

b、  RIP通常是私有地址,仅用于个集群

c、  支持口映射

d、  realsever可以使用任意OS(操作系统)

e、  较大规模应用场景中director已成为系统瓶颈

DR:

a、集群节点跟director必须在同一个物理网络中

b、RIP可以使用公网地址.实现便捷的远程控制服务器

c、director只负责处理入站请求,相应报文则有realserver直接发往客户端

d、realserver不能将网关指向DIP

e、director不支持端口映射

f、大多数操作系统都能应用在realserver上

g、DR比NAT能处理更多的realserver

TUN:

a、各集群节点可以跨越不同的网络

b、RIP必须是公网地址

c、director只负责处理入站请求,相应报文则有realserver直接发往客户端

d、realserver网管不能指向director

e、只有支持隧道共跟那个的os才能用户realserver

不支持端口映射

注:在实际应用中用的不多这里就不再具体演示!

1、  LVS的调度算法

静态调度算法(4种):

(1)rr : round robin :轮叫,轮询  

说明:轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。缺点:是不考虑每台服务器的处理能力。

(2)wrr: weight round robin :加权轮询(以权重之间的比例实现在各主机之间进行调度) 

说明:由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

(3)sh : source hashing : 源地址hash 实现会话绑定sessionaffinity  

说明:简单的说就是有将同一客户端的请求发给同一个real server,源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址。

(4)dh : destination hashing : 目标地址hash  

说明:将同样的请求发送给同一个server,一般用户于缓存服务器说,简单的说,LB集群后面又加了一层,在LB与real server之间加了一层缓存服务器,当一个客户端请求一个页面时,LB发给cache1,当第二个客户端请求同样的页面时,LB还是发给cache1,这就是我们所说的,将同样的请求发给同一个server,来提高缓存的命中率。目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

动态调度算法(6种):

(1)lc :leash-connection 最少连接 

说明:最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。此算法忽略了服务器的性能问题,有的服务器性能好,有的服务器性能差,通过加权重来区分性能,所以有了下面算法wlc。

简单算法:active*256+inactive (谁的小,挑谁)

(2)wlc :加权最少连接  

加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。由于服务器的性能不同,我们给性能相对好的服务器,加大权重,即会接收到更多的请求。

简单算法:(active*256+inactive)/weight(谁的小,挑谁)

(3)sed :最少期望延迟 

说明:不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。

基于wlc算法,简单算法:(active+1)*256/weight (谁的小选谁)

(4).nq :never queue 永不排队  

说明:在上面我们说明了,由于某台服务器的权重较小,比较空闲,甚至接收不到请求,而权重大的服务器会很忙,所此算法是sed改进,就是说不管你的权重多大都会被分配到请求。简单说,无需队列,如果有台real server的连接数为0就直接分配过去,不需要在进行sed运算。

(5).LBLC :基于局部性的最少连接  

说明:基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的目标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。

(6).LBLCR :基于局部性的带复制功能的最少连接   

说明:基于局部性的带复制功能的最少连接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

注:LVS默认调度算法是 wlc 。

2、  定义集群服务规则的ipvsadm命令

(1)管理集群服务   

ipvsadm –A|E|D  -t |u|f server-adddress [-s scheduler]

-t :tcp协议的集群         service-address后面必须写成ip:port

-u :udp协议的集群        service-address后面必须写成ip:port

-f :fwm 防火墙的标记     service-address后面必须写成marknumber

-s :指定调试算法

-A添加 –E 修改 –D删除

(2)管理集群服务中的realserver

ipvsadm –a|e|d  -t|u|f server-adddress -r server-address  [-g|i|m]  [-w weight]

-t|u|f service-address 实现定义好的某集群服务

-rserver-address 某rs的地址在nat模型中可使用ip:port实现端口映射

[-g|i|m] lvs类型:

-g :DR   -i : TUN -m : NAT   [-w weight] 指定权重

-a添加  -e修改 –d删除

(3).查看

ipvsadm -L | ipvsadm  -l ....

-n        显示主机地址和端口为数字格式

--stats     显示进出站数据

--rate      显示速率

--timeout  显示每一个tcp  tcpfin udp 的超时时间值

--deamon  显示进程信息

--sort     显示排序规则默认是升序的

-c        显示多少个客户连接进来

(4).删除所有集群服务: 

清空ipvs规则

ipvsadm –C

(5).保存定义的规则:

service ipvsadm save

ipvsadm -S    > /path/to/somefile

(6).载入此前的规则

ipvsadm -R

ipvsadm -R < /path/to/somefile

二、LVS-NAT模式演示

简单实验拓扑如下:

Web Server 1测试页

Web Server 2测试页

lvs主机上的操作:

[root@lvs ~]# yum -y install kernel-devel  popt-static gcc libnl* libpopt* (请根据实际情况安装)
[root@lvs ~]# ln -s/usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux
[root@lvs ~]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
[root@lvs ~]# tar -zxf ipvsadm-1.24.tar.gz
[root@lvs ~]# cd ipvsadm-1.24
[root@lvs ipvsadm-1.24]# make &&make install

开启ip转发

[root@lvs ~]# vim /etc/sysctl.conf
把net.ipv4.ip_forward = 0改为net.ipv4.ip_forward= 1
[root@lvs ~]# sysctl –p

配置lvs-nat模型

[root@lvs ~]# ipvsadm -A -t192.168.2.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t192.168.2.200:80 -r 192.168.1.10 -m -w 3
[root@lvs ~]# ipvsadm -a -t192.168.2.200:80 -r 192.168.1.20 -m -w 1
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port          Forward Weight ActiveConn InActConn
TCP 192.168.2.200:80 rr-> 192.168.1.20:80             Masq    1      0         0        -> 192.168.1.10:80             Masq    3      0         0
[root@lvs ~]#

保存lvs规则

[root@lvs ~]# /etc/init.d/ipvsadm save
Saving IPVS table to/etc/sysconfig/ipvsadm:               [确定]
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.2.200:80 -s rr
-a -t 192.168.2.200:80 -r 192.168.1.20:80-m -w 1
-a -t 192.168.2.200:80 -r 192.168.1.10:80-m -w 3
[root@lvs ~]#

通过VIP访问

刷新(由于设置的权重一样,所以刷一下会变一下。)

三、LVS-DR 模式演示

1、  IP规则

Director:

eth0 192.168.1.100 DIP

eth0:0 192.168.1.188 VIP

RS1:

eth0: 192.168.1.10 RIP

lo0:0 192.168.1.188 VIP

RS2:

eth0: 192.168.1.20 RIP

lo0:0 192.168.1.188 VIP

2、关闭arp响应

web1上:

[root@web1 ~]# sysctl -w net.ipv4.conf.eth0.arp_announce=2
net.ipv4.conf.eth0.arp_announce = 2
[root@web1 ~]# sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~]# echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@web1 ~]# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore

web2上:

[root@web2 ~]# sysctl -w net.ipv4.conf.eth0.arp_announce=2
net.ipv4.conf.eth0.arp_announce = 2
[root@web2 ~]# sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@web2 ~]# echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@web2 ~]# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore

说明:

arp_ignore: 定义接收到ARP请求时的响应级别;

0:只要本地配置的有相应地址,就给予响应;

1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应;

arp_ignore = 1

arp_announce:定义将自己地址向外通告时的通告级别;

0:将本地任何接口上的任何地址向外通告;

1:试图仅向目标网络通告与其网络匹配的地址;

2:仅向与本地接口上地址匹配的网络进行通告;

arp_announce = 2

3、配置VIP

directory上:

[root@lvs ~]# ifconfig eth0:0 192.168.1.188 netmask 255.255.255.0

web1上:

[root@web1 ~]# ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up

在web2上:

[root@web2 ~]# ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up

4、增加路由

directory上:

[root@lvs ~]# route add -host 192.168.1.188  dev eth0:0

web1上:

[root@web1 ~]# route add -host 192.168.1.188  dev lo:0

web2上:

[root@web2 ~]#
route add -host 192.168.1.188  dev lo:0

5、配置lvs-dr

[root@lvs ~]# ipvsadm -A -t192.168.1.188:80 -s wlc
[root@lvs ~]# ipvsadm -a -t192.168.1.188:80 -r 192.168.1.10 -g -w 2
[root@lvs ~]# ipvsadm -a -t192.168.1.188:80 -r 192.168.1.20 -g -w 1
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port          Forward Weight ActiveConn InActConn
TCP 192.168.1.188:80 wlc-> 192.168.1.20:80             Route   1      0         0        -> 192.168.1.10:80             Route   2      0         0
[root@lvs ~]#

6、测试

刷新访问VIP 192.168.1.188

NAT模式中,real server的网关必须要指定为DIP;DR模式中一般不指定网关(网关指定为DIP也是ok的)

转载于:https://blog.51cto.com/linuxnote/1654750

构建负载均衡服务器之二 LVS详解及应用相关推荐

  1. 运维工程师必备之负载 均衡集群及LVS详解

    原文地址:运维工程师必备之负载 均衡集群及LVS详解作者:蚁巡运维平台 来源: chrinux 的BLOG 时间: 2013-07-01 14:00 此博文主要介绍集群和负载均衡的基本理论和类别,内容 ...

  2. 运维工程师必备之负载均衡集群及LVS详解

    此博文主要介绍集群和负载均衡的基本理论和类别,内容看着比较枯燥.无味的,但是要想成为一个好的linux运维工程师,这些基本理论是必须理解透彻,才会在后来的系统调优和集群架构中得心应手,所以想成为lin ...

  3. 构建高可用服务器之 Keepalive参数详解

    keepalived有三类配置区域,注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域, 全局配置(Global Configuration).VRRPD配置.LVS配置! Configu ...

  4. 使用LVS实现负载均衡原理及安装配置详解

    使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均 ...

  5. 负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解

    负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负载均衡的基 ...

  6. Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分...

    Nginx反向代理.动静分离.负载均衡及rewrite隐藏路径详解 (Nginx Apache MySQL Redis) 楓城浪子原创,转载请标明出处! 更多技术博文请见个人博客:https://fe ...

  7. LVSKeepalived—集群、负载均衡、企业高可用详解

    LVS负载均衡集群及配置 负载均衡概述 1.集群 通过集群(cluster)技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对高的收益,其任务调度则是集群系统中的核心技术. 集群搭建 ...

  8. 构建高可用服务器之二 Keepalive参数详解

    keepalived有三类配置区域,注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域,全局配置(Global Configuration).VRRPD配置.LVS配置 ! Configu ...

  9. XxlJob(二) 负载均衡用法及实现原理详解

    目录 一.配置一个应用执行器 二.同一台机器上模拟负载均衡 1. 环境准备 2. 触发任务,选择轮询策略 3. 机器实例动态伸缩 三.负载均衡原理解析 1.  根据应用名查找地址列表 ​2. Exec ...

最新文章

  1. matplotlib画图
  2. 详解MariaDB数据库的触发器
  3. 1 0.99999的悖论_悖论向量中文版下载_悖论向量中文版单机游戏下载
  4. boost::exception的用法测试
  5. 顶峰Android手机视频转换器,顶峰3GP手机视频转换器
  6. c语言判断字符串是不是回文_LeetCode 热题 HOT 100 5. 最长回文子串
  7. 判断该网页是在什么设备打开。
  8. 这本书人手一本,杠精能少97%?
  9. JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)
  10. bianma 水平 技巧
  11. Tricks Device 最短路+最大流
  12. [转载] python mongodb update
  13. 国网B接口调阅实时视频(INVITE)接口描述和消息示例
  14. sql插入数据时自动插入时间
  15. 基于时域线性插值法计算信号的周期
  16. 计算机网络重置,怎么重置电脑网络连接
  17. Centos+Aria2+AriaNg+Trancers更新
  18. 移动端适配 postcss-pxtorem插件使用
  19. MATLAB:一维插值算法
  20. 弱口令审计-工具用法大全

热门文章

  1. 感恩节里我成了一个不解风情的爸爸
  2. 一句话总结贝叶斯分类器
  3. 一句话总结卷积神经网络
  4. 干货丨卷积神经网络工作原理的直观解释
  5. 业界丨2018年能干大事儿的5家人工智能初创公司
  6. 「机器学习」彻底搞懂CNN
  7. 《用Python进行自然语言处理》第8章 分析句子结构
  8. If using all scalar values, you must pass an index
  9. 计算机科学界至今未解决的四大难题
  10. 被称为“第五代 AI”的神经形态计算进展到哪一步了?