服务器集群之负载均衡集群—LB Cluster (Load Balance)

简介:

什么是负载均衡:

1.负载均衡集群—LB Cluster (Load Balance)

当大量用户并发访问时,将请求转发到不同的机器止实现负载均衡。我们这里使用lvs实现。LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。

什么是IPVS:

        ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术,工作在OSI定义的第四层,可以在编译linux内核的时候将功能整合进去,IPVS是LVS的关键,因为LVS的IP负载平衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。

Director调度器:用户请求先到达的主机。它根据工作模型与调度方法把请求转发到真实服务器上

RS:RealServer,真正响应用户请求的服务器

VIP:Virtual IP,一般为一个公网IP,是用户直接访问的IP,此IP所在的主机不直接提供服务,所以该主机称为Virtual Server,一般为调度器,该IP称为VIP

DIP:Direct IP,与RS通信的IP

RIP:Real IP,真正响应用户请求的服务器IP

CIP:Client IP,客户端IP

LVS的工作模型:

1、VS/NAT(Virtual Server via Network Address Translation)

客户端请求到达Director,Director根据ipvs上生效的调度算法修改报文的目标IP为真实服务器的RIP,然后转发到后端的RS上,RS收到报文后构建响应报文,然后再发到Director,Director再将报文的源IP也就是RIP还原为VIP发给客户端,这一过程与DNAT很相似。

wKiom1O2AxCCBtbgAAIkMhu-JC4821.jpg

NAT: 

1、RealServer应该使用私有IP地址;

2、RealServer的网关应该指向DIP;

3、RIP和DIP应该在同一个网段内;

4、进出的报文都得经过Directory,在高负载下,Directory会成为系统性能瓶颈;

5、支持端口映射;

6、RealServer可以使用任意OS;


2VS/DR(Virtual Server via Direct Routing)

wKiom1O35reAwVQRAAGzkyn5zTQ227.jpg


        因为NAT模型下Director很容易成为整个系统的瓶颈,所以DR模式下Director不再转发响应的报文,相对于响应报文,请求报文要小的多,这样Director就被释放出来了。

        当请求报文到达路由后,路由会发出广播,得到VIP的mac地址,把报文目标MAC改为VIP MAC地址并交给Director,Director根据调度算法选择一个RealServer,把报文中的目标mac改为选择的RealServer的mac,然后发给交换机,交换机根据报文目标mac将报文发向了RealServer,RealServer收到报文后,会检查报文的目标IP,发现目标IP是VIP而本机没有VIP就舍弃报文,所以RS上必须设置个VIP地址,然而这样会导致ARP响应冲突的,我们必须解决这个问题才能实现整个流程,解决这个问题的方法有很多,1、修改路由,使用静态ARP,2、在RS上使用arptables,禁止响应对VIP的ARP广播请求,3、在RS上修改其内核参数,并向VIP配置在与RIP不同的接口的别名上。常用的是第三种,不响应关于它的任何ARP请求,也不向外发送关于VIP的ARP广播,这样就不会导致ARP冲突了。这时当报文到达RS时,RS会接受报文,并响应请求,但是默认情况下,响应报文的源IP是RIP,当这个报文发到Client时,客户端检查报文会发现源IP不是自己请求的IP,会舍弃该报文,所以RS的响应报文源IP应该是VIP,这就需要在RS中加条路由,凡是目标IP是VIP的报文,先从定义VIP那设备出去,这样源IP就是VIP了。响应报文发向Switch,经由Router响应用户,不用经过Director了。这是生产环境中最常用的模型。


DR模式的特点:

1.DIP和RIP必须在同一个物理网络中,它的转发机制是基于Mac地址转发

2.RIP可以使用私有地址(建议使用公网地址)

3.入站报文经过Directory,出站则由RealServer直接响应Client

4.集群节点(Real Server)的网关一定不能指向DIP

5.不支持端口映射

6.绝大多数的操作系统都可以实现Real Server

7.比NAT模型的Director能带动更多的RealServer

 

LVS调度算法:

分为两类:静态算法动态算法

静态:仅根据算法本身调度,不关心RS上的连接状态      

RR(RoundRobin):轮调,所有的请求依次轮流分配到后端RS,如果机器性能不一致则负载均衡失去意义。    

WRR:加权weight,不能反映服务器的状态,WRR在RR的基础上加上了权重,能者多劳,性能好的多分配,性能差的少分配,比例与设置的权重值成正比。

sh:源地址哈希,持久会话。

dh:同一个客户端请求同一个RS,相应也会通过同一个防火墙,解决防火墙的连接追踪问题。 

lc(least connection)Overhead=Active*256+Inactive,计算发给overhead值小的服务器。

wlc:默认的调度算法,Overhead=(Active*256+Inactive)/Weight

sed(shortest Expect Delay):Overhead=(Active+1)*256/Weight

nq(Never Queue)

lblc:(dh+lc) Locality-based Least Connection

lblcr:Replicated and Locality-based least Connection,可以实现缓存服务器彼此之间互相复制缓存对象,是lblc的改进版,可以使对负载均衡的损耗降到最低。


实验一、现在我们来实现工作于VS/NAT模型的负载均衡

我通过使用ipvsadm工具管理ipvs,先安装程序。

  • yum install ipvsadm -y

ipvsadm:

  • ipvsadm -A|E -t|u|f service-address [-s scheduler]

添加一个集群服务,一个服务地址必须唯一,定义方式三组合一,IP地址、端口和协议,二者选一。

这官方的翻译有点难懂哈,其实格式就是IP:端口。

  • -A, --add-service

Add a virtual service. A service  address  is  uniquely  defined  by  a

triplet:  IP  address, port number, and protocol. Alternatively, a vir-

tual service may be defined by a firewall-mark.

  • -E:编辑

  • -t:tcp

  • -u:udp

  • -f:firewall mark

  • service-address:VIP:Port

  • -s:指定调度算法

  • -C:清空规则

  • -Z:重置计数器

  • -L:查看

        -n

        --rate:查看速率

        --stats:查看状态

        --timeout:查看超时信息

        -c:显示连接

example:ipvsadm -A -t 172.16.100.3:80 -s rr

  • ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]

添加一个真实服务器到集群

  • -a, --add-server

Add a real server to a virtual service.

编辑一个集群里的真实服务器

  • -e, --edit-server

Edit a real server in a virtual service.

从集群删除一个服务器

  • -d, --delete-server

Remove a real server from a virtual service.

  • -r, --real-server 指定RealServer地址

  • -g:dr模型(默认)

  • -i:tun模型

  • -m:nat模型

  • -w:weight

将一个服务器添加到集群:

example:ipvsadm -a -t 172.16.100.3:80 -r 192.168.10.2 -m 

从集群删除一个服务器:

example:ipvsadm -d -t 172.16.100.3:80 -r 192.168.10.7

保存:

service ipvsadm save

/etc/sysconfig/ipvsadm

ipvsadm -S > /paht/to/ipvsadm.rules    保存规则

ipvsadm -R < /path/to/ipvsadm.rules    恢复规则

实验环境拓扑:

wKioL1O2B6yR0AkvAAGcwj1erMw542.jpg


配置Web服务,配置IP地址这些我就省略了。

配置Director虚拟IP。

  • ifconfig eth0:0 192.168.1.220/24

添加一个集群

  • ipvsadm -A -t 192.168.1.220:80 -s rr

添加RealServer到集群

  • ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.2 -m

  • ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.3 -m

查看列表

  • ipvsadm -L -n

wKiom1O2FPLBNhxJAAHHzS5QvFQ591.jpg

开启数据包转发功能

  • echo '1' > /proc/sys/net/ipv4/ip_forward

现在我们用浏览器测试,第一次访问。

wKioL1O2FczTn2ttAAE-6tdxf5Y400.jpg

测试第二次访问。

wKiom1O2FhuhXMslAAE4vc_7Wgw606.jpg


查看状态

  • ipvsadm -L -n --stats

wKiom1O2F3rBMJVeAAHUkTzfb1Q203.jpg

由此可以看出他们的连接都是平均的。

现在我们换一个调度算法。

  • ipvsadm -E -t 192.168.1.220:80 -s wrr

修改服务器权重

  • ipvsadm -e -t 192.168.1.220:80 -r 172.16.1.2 -m -w 2

查看列表

  • ipvsadm -L -n

wKiom1O2I_zCpzD6AAGI3R6ZksE134.jpg现在对服务器进行压测,再看一下状态。

wKiom1O2JeDSSM_KAAIVKeJBdM8531.jpg

实验二、实现工作于VS/DR模型的负载均衡

环境拓扑:

wKioL1O4mNSy0mibAAGsGotJ2Uk847.jpg

配置两台Web服务器,已经配置IP地址,过程我就省略了。

RealServer的配置:

  • echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

  • echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

  • ifconfig lo:0 192.168.1.200  broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev lo:0

Director配置:

  • ifconfig eth0:1 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev eth0:1

  • iptables -F

  • iptables -Z

  • ipvsadm -C

  • ipvsadm -A -t 192.168.1.200:80 -s wlc

  • ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2

  • ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.11 -g -w 3

  • ipvsadm -L -n

wKioL1O4wTyD0hIVAAG4TaDoSsg794.jpg

进行压力测试,查看状态。

wKioL1O4xvChGVn2AALF2-qFDyA709.jpg

LVS Persistent 

    由于http是无状态的连接,客户每次请求会被当做新请求,比如我们登录了一个论坛,以刷新页面,服务器会把你当新访问,你还得重新登录,这样很不方便,尤其在电子商务类的网站上,好不容易选了好多商品准备付款,刷新了一次或者网页跳转了一次信息都丢失了。为了追踪客户的状态,才有了cookies 和session。cookies是什么?它是动态网站发给每个客户端的一个识别码SessionID,识别码是有有效期的。session中文意思是会话,服务器端发给客户端一个识别码,服务器端会也会把这个识别码保存到文件上,这个文件包含了客户端的识别码与一些客户端访问过页面的信息,所以我们登录论坛后,服务器会给我们发一个SessionID,浏览器会自己保存下来,当我们再次访问的时候,httpd请求首部会包含你的SessionID,服务器收到请求报文后会查看该SessionID,如果服务器上有该sessionID并在有效期内,则验证通过,刚才的访问状态还会存在,如果登录信息,比如购物车中的商品。

但是负载均衡以后,客户端请求可能被调度到不同的RealServer,而其他的RealServer中并没有该客户端的Session认证文件,这样就又无法追踪客户状态了,所以LVS引入了持久连接,它会启用一段内存空间生成一个hash表用来保存客户端与服务器的请求状态,凡是来自同一个IP的客户端都会被调度同一个RealServer,当然这个持久连接是有有效期的。持久连接有三种:


PCC Persistent client connections 持久客户端连接,将IP的所有请求都转发到一个RS。

定义方式:

  • ipvsadm -A -t 172.16.1.3:0 -s rr -p

  • ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.2 -g

  • ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.3 -g

这里端口写的是0,表示所有端口请求都定义到一个服务器。


PPC persistent port connections  将IP中的一个服务转发到一个RS


PFM—— 基于防火墙标记的持久连接,可以将几个服务定义为同一种标记转发。  

iptables为定义的服务报文打上防火墙标记,凡是有该防火墙标记的服务请求LVS都会根据他们的来源IP把他们调度到同一个RS上。

要想实现给一个数据包打标,需要在mangle表的PREROUTING链上实现。

example:

iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 80 -j MARK --set-mark 10 (0-99)均可

iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 443 -j MARK --set-mark 10

在定义集群的时候,则可以使用-f选项。

  • ipvsadm -A -f 10 -s rr -p 

实验三、构建一个DR模型的集群,VIP与RIP不在同一个子网内,并且使用防火墙标记的持久连接,来实现同一个IP来访问时,http与https的请求都发往一个RS。

实验环境拓扑:

wKioL1O5h7HQK8qsAAGPQ6Q4qkQ084.jpg

配置Web服务器,和配置https,我这里就省略了。

RealServer配置内核参数,配置VIP。

  • echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

  • echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

  • ifconfig lo:0 192.168.1.200  broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev lo:0

Director配置IP。

  • ifconfig eth0 172.16.0.100/16 

  • route add -net default gw 172.16.0.1

Director配置防火墙标记。

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

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

Director配置VIP和主机路由。

  • echo 1 >  /proc/sys/net/ipv4/ip_forward

  • ifconfig eth0:1 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev eth0:1

  • Director配置IPVSec

  • ipvsadm -A -f 6 -s rr -p

  • ipvsadm -a -f 6 -r 172.16.0.12 -g

  • ipvsadm -a -f 6 -r 172.16.0.11 -g

注意如果路由不知道如何找到VIP,可以在路由上加一条规则。

  • route add -host 192.168.1.200 gw 172.16.0.100

这时我们来测试下,访问www.tuchao.com。

wKioL1O5hmCQYL29AAFkm2mrXD0135.jpg

换成https协议再测试

wKioL1O5hqfQUuN1AAFGPpfihUo448.jpg

哈,实验成功,这就完成了基于防火墙标记的持久连接,实现了当一个IP请求http与https,lvs都会转发给一台RealServer。

太晚了,明天还要上班,以后这篇文章我以后还会再做完善。

有问题欢迎与我交流QQ1183710107



本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1434362


相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
Kubernetes 安全 Docker
在 K8s 集群中创建 DERP 服务器
在 K8s 集群中创建 DERP 服务器
|
6月前
|
存储 负载均衡 调度
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
278 0
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
178 0
|
3月前
|
Rust Ubuntu Linux
【一起学Rust | 进阶篇 | RMQTT库】RMQTT消息服务器——安装与集群配置
【一起学Rust | 进阶篇 | RMQTT库】RMQTT消息服务器——安装与集群配置
126 0
|
1天前
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
7 1
|
4天前
|
存储 Java 网络安全
ZooKeeper【搭建 03】apache-zookeeper-3.6.0 伪集群版(一台服务器实现三个节点的ZooKeeper集群)
【4月更文挑战第10天】ZooKeeper【搭建 03】apache-zookeeper-3.6.0 伪集群版(一台服务器实现三个节点的ZooKeeper集群)
12 1
|
1月前
|
消息中间件 存储 Kafka
Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
【2月更文挑战第19天】Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
140 1
|
3月前
|
负载均衡 算法 前端开发
SLB-负载均衡器(Load Balancer)
SLB-负载均衡器(Load Balancer)
51 0
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
3月前
|
存储 关系型数据库 分布式数据库
在PolarDB中,集群地址对应一个代理服务器,主地址也是对应一个代理服务器吗?
在PolarDB中,集群地址对应一个代理服务器,主地址也是对应一个代理服务器吗?
32 0