欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何在Linux集群中设置并使用ipvsadm命令

最编程 2024-08-10 20:43:44
...

    在日常的使用中,一台服务器足够胜任很多的工作,但是当很多人同时访问的时候就会显得稍有些无力,这个时候。可以有两种解决的方法,第一种是不断的改善这台服务器的性能,但是总是会有一个上限存在,而且提升的效果并不明显。另外一种方法就是使用多台服务器,来均摊需要处理的任务,这就是集群,通过一定的组合方式,将很多功能一样的服务器祖喝道一起,但是使用时感受不到他们的差异。组合的方式目前有四种,分别是lvs-nat、lvs-dr、lvs-tunnel和热心网友提供的lvs-fullnat,在Linux内核中仅支持前三种,最后一种如果想要使用需要自己重新编译内核。在开始介绍之前我们需要了解几个常用术语:

1
2
3
4
5
6
vs:virtual server,构成集群的调度器(中心节点)
rs:real server,用户只能找到vs,但是真正提供服务的是rs
CIP:Client IP,客户端的IP地址,即请求发送方的IP地址
VIP:Virtual Server IP,,虚拟服务器的虚拟IP地址,客户端访问的目的地址
DIP:Director IP,调度器IP地址,向后方Real Server转发客户端请求时使用的IP地址
RIP:Real Server IP,后方真实服务器的IP地址

    简单来说就是当用户访问服务器的时候首先访问到的是调度器,然后由调度器查看有哪一台集群中的服务器是相对空闲,那么就将请求送到这一台服务器上进行处理。用户的地址叫做CIP,用户访问的地址叫做VIP,调度器上用于访问集群的地址叫做DIP,集群中各个服务器的地址叫做RIP。下面开始依次介绍各种集群方式。

一、lvs-nat

    这种方式构建集群的架构如图所示:

    首先由客户端的CIP发起请求,由调度器分发到后端服务器上进行处理,在处理之后返回处理结果。具体是哪个主机由调度器根据算法进行选择,根据lvs在调度时是否考虑各RS当前的负载状态,可以将调度算法分为两类,分别是静态算法和动态算法,静态算法是事先就将分配的过程安排好,而动态算法是在实时的处理过程中根据服务器的忙碌程度进行分配。(每种架构方式使用的基本都是如下算法,后边不再重复说明)

静态算法,根据算法本身的特点进行调度,注重起点公平,包括以下几种:

1
2
3
4
RR:RoundRobin,轮询(一人一个任务,但是有的服务器性能好,有的差,所以这种分配方式不太好)
WRR:Weighted RR,加权轮询(有额外的权重干扰分配结果)(能力越大责任越大)(权重高,代表工作能力强,就会被多分配任务)
SH:Source Hashing,源地址哈希,将来自于同一个IP地址的请求始终发往后端第一次被挑中的RS,从而可以实现会话绑定,例如购物等操作,最好要保持在同一台服务器上
DH:Destination Hashing,目的地址哈希,将发往同一个目标地址的请求,始终发送至后端第一次被挑中的RS,一般用于正向代理服务器集群

动态算法,主要根据每个RS当前的负载状态进度调度,注重结果公平,包括以下几种:

(后端RS的负载情况,用Overhead表示,使用这个变量可以来实时的观测任务最好分配给哪台服务器,通过active connection(活动的连接数)和inavtive connection(不活动的连接数)来进行计算

1
LC:least connections,最少连接数

计算公式:Overhead=activeconnections*256+inactiveconnections

注意:第一次调度时,按照在ipvsadm中配置的顺序自上而下进行分配

1
WLC:Weighted LC,加权最小连接(如果在部署时未指定,默认为这个)

计算公式:Overhead=(activeconnections*256+inactiveconnections)/weight

注意:第一次调度时,按照在ipvsadm中配置的顺序自上而下进行分配,权重在第一次调度时不发挥作用

1
SED:Shortest Expection Delay,最短期望延迟

计算公式:Overhead=(activeconnections+1)*256/weight

注意:SED可以解决起点不公平的问题,但是在权重差距比较大时,可能会导致不公平

    例如:weight一个1,一个10,那么为10的会连续获得多个任务

1
2
3
NQ:Never Queue,改进版的SED算法,首次调度时,根据后端RS的权重依次为每台RS分配一个连接;然后再按照SED算法调度;必然会保证后端每台RS至少有一个 activeconnection;
LBLC:Locality-Based Least Connections:基于本地的最少连接,动态的DH算法
LBLCR:LBLC with Replication,带有复制功能的LBLC

    集群部署时最难的是理解架构方式,在理解了之后,部署是十分简单的,在lvs-nat的方式下,我们只需要将各个网段设置好,使相同网段之间能够ping通即可,然后在调度器上使用“ipvsadm”命令(在内核中有ipvs,是实现集群的功能,主要工作在INPUT链上,ipvs(INPUT):内核中的TCP/IP协议栈上的组件,而ipvsadm用来编写规则送给ipvs(类似于防火墙的iptables软件的功能,是用户空间中的用于编写ipvs规则的组件)查看内核中是否支持ipvs功能:~]# grep -i -C 10 "ipvs" /boot/config*):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ipvsadm:
     格式:
         ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
         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]
         ipvsadm -d -t|u|f service-address -r server-address
         ipvsadm -L|l [options]
         ipvsadm -Z [-t|u|f service-address]
         ipvsadm -- set  tcp tcpfin udp
         ipvsadm --start-daemon state [--mcast-interface interface]
                 [--syncid syncid]
         ipvsadm --stop-daemon state
         ipvsadm -h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
管理集群服务:增,删,改(对集群整体的处理)
   增加lvs集群服务:ipvsadm -A -t|u|f service-address [-s scheduler] [-p [timeout]]
     -t:基于TCP协议的集群服务
         service-address:与VIP绑定的套接字
     -u:基于UDP服务的集群服务
         service-address:与VIP绑定的套接字

推荐阅读