来源:http://www.linuxidc.com/Linux/2013-07/87960.htm
大纲
一、集群定义
二、集群类型
三、LB(负载均衡)集群
四、LVS-NAT 模式演示
五、LVS-DR 模式演示
六、LVS 持久连接
注:测试环境CentOS 6.4 X86_64
相关阅读:
LVS+Keepalive 集群安装部署文档 http://www.linuxidc.com/Linux/2013-06/86587.htm
Hadoop + Hive + Map +reduce 集群安装部署 http://www.linuxidc.com/Linux/2013-07/86959.htm
Nginx Tomcat 集群负载均衡解决笔记 http://www.linuxidc.com/Linux/2013-07/86827.htm
Linux中集群的基本概念 http://www.linuxidc.com/Linux/2013-05/83955.htm
在 Ubuntu 上安装 SLURM 集群资源管理器 http://www.linuxidc.com/Linux/2013-02/80029.htm
一、集群定义
集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。集群系统的主要优点:高可扩展性、高可用性、高性能、高性价比。
二、集群类型
1.scale on:向上扩展
将服务器的内存容量调大和cpu数量增加些(简单说升级服务器硬件)
缺点:在一定的范围之内它的性能是上升的趋势,但是超出范围之后就是下降的趋势。因为随着它的cpu的个数增加我们需要给我们的cpu仲裁,而且随着cpu个数的增加资源竞争性越大。
2.scale out:向外扩展
一台服务器应付不过来,我们就再增加一台服务器。
优点:增减服务器很方便,而且没有向上扩展随着增加性能下降。
向外扩张的工作模式:当客户端向服务器端发送请求,服务器端只拿出来一台服务器来相应我们的客户端的请求。
(1).LB:Load Balancing:负载均衡集群
负载均衡集群中有一个分发器或者叫调度器,我们将其称之为Director,它处在多台服务器的上面,分发器根据内部锁定义的规则或调度方式从下面的服务器群中选择一个以此来响应客户端发送的请求。
(2).HA:High Availability 高可用集群
高可用集群是服务的可用性比较高,当我们某台服务器死机后不会造成我们的服务不可用。其工作模式则是将一个具有故障的服务转交给一个正常工作的服务器,从而达到服务不会中断。一般来说我们集群中工作在前端(分发器)的服务器都会对我们的后端服务器做一个健康检查,如果发现我们服务器当机就不会对其在做转发。
衡量标准:可用性=在线时间/(在线时间+故障处理时间)
99%、99.9%、99.99%、99.999%
(3).HP:Hight Performance 高性能
高性能的集群是当某一个任务量非常大的时候,我们做一个集群共同来完成这一个任务。这种处理方式我们称为并行处理集群,并行处理集群是将大任务划分为小任务,分别进行处理的机制。一般这样的集群用来科学研究与大数据运算等方面的工作。现在比较火的Hadoop就是使用的并行处理集群。
说明:三种集群之间的区别
负载均衡着重在于提供服务并发处理能力的集群,高可用以提升服务在线的能力的集群。高性能着重用于处理一个海量任务。
三、LB(负载均衡)集群
1.LB 分类
(1).硬件LB(比较出名的)
F5 公司的 BIG-IP系列
Citrix 公司的 NetScaler系列
A10 公司的 AX系列
(2).软件LB
四层:LVS(Linux Virtual Server)注:国人开发的
七层:Nginx,HAProxy
2.LVS定义
一般来说,LVS采用三层结构:负载调度器、服务器池、共享存储。工作在TCP/IP协议的四层,其转发是依赖于四层协议的特征进行转发的,由于其转发要依赖于协议的特征进行转发,因此需要在内核的TCP/IP协议栈进行过滤筛选,可想而知,这就需要在内核的模块来完成,而这样的过滤转发规则又是由管理员进行定义的,所以,LVS就是两段式的架构设计,在内核空间中工作的是"ipvs", 而在用户空间中工作的,用来定义集群服务规则的是"ipvsadm"。这就很容易想到iptables而LVS正好工作在iptables的input链上。
3.LVS组成
ipvsadm:用于管理集群服务的命令行工具,工作于Linux系统中的用户空间。
ipvs:为lvs提供服务的内核模块,工作于内核空间 (相对于是框架,通过ipvsadm添加规则,来实现ipvs功能)。
注:在linux内核2.4.23之前的内核中模块默认是不存在的,需要自己手动打补丁,然后把此模块编译进内核才可以使用此功能。
4.LVS中每个主机IP地址的定义
VIP:Director用来向客户端提供服务的IP地址,也是DNS解析的IP
RIP:集群节点(后台真正提供服务的服务器)所使用的IP地址
DIP:Director用来和RIP进行交互的IP地址
CIP:公网IP,客户端使用的IP
5.LVS的三种转发模式
LVS-NAT:网络地址转换 Network address translation
LVS-DR:直接路由 Direct routing
LVS-TUN:IP隧道 IP tunneling
6.LVS的三种转发模式特点
NAT:
集群节点跟director必须在同一个网段上面
RIP通常是私有地址,仅用于个集群
支持口映射
realsever可以使用任意OS(操作系统)
较大规模应用场景中director已成为系统瓶颈
DR:
集群节点跟director必须在同一个物理网络中
RIP可以使用公网地址.实现便捷的远程控制服务器
director只负责处理入站请求,相应报文则有realserver直接发往客户端
realserver不能将网关指向DIP
director不支持端口映射
大多数操作系统都能应用在real server上
DR比NAT能处理更多的real server
TUN:
各集群节点可以跨越不同的网络
RIP必须是公网地址
director只负责处理入站请求,相应报文则有realserver直接发往客户端
realserver网管不能指向director
只有支持隧道共跟那个的os才能用户realserver
不支持端口映射
注:在实际应用中用的不多这里就不再具体演示!
7.LVS的调度算法
静态调度算法(4种):
(1).rr : round robin :轮叫,轮询
说明:轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。缺点:是不考虑每台服务器的处理能力。
(2).wrr: weight round robin :加权轮询(以权重之间的比例实现在各主机之间进行调度)
说明:由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
(3).sh : source hashing : 源地址hash 实现会话绑定session affinity
说明:简单的说就是有将同一客户端的请求发给同一个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 。
8.定义集群服务规则的ipvsadm命令
(1).管理集群服务
添加
ipvsadm -A -t|u|f server-adddress [-s scheduler]
-t :tcp协议的集群 service-address后面必须写成ip:port
-u :udp协议的集群 service-address后面必须写成ip:port
-f :fwm 防火墙的标记 service-address后面必须写成mark number
-s :指定调试算法
|
修改
1
|
ipvsadm -E -t|u|f server-adddress
|
删除
1
|
ipvsadm -D -t|u|f server-adddress
|
(2).管理集群服务中的realserver
添加
1
2
3
4
5
6
7
8
|
ipvsadm -a -t|u|f server-adddress -r server-address [-g|i|m] [-w weight]
-t|u|f service-address 实现定义好的某集群服务
-r server-address 某rs的地址在nat模型中可使用ip:port实现端口映射
[-g|i|m] lvs类型:
-g : DR
-i : TUN
-m : NAT
[-w weight] 指定权重
|
修改
1
|
ipvsadm -e -t|u|f server-adddress
|
删除
1
|
ipvsadm -d -t|u|f server-adddress
|
(3).查看
1
2
3
4
5
6
7
8
|
ipvsadm -L | ipvsadm -l ....
-n 显示主机地址和端口为数字格式
--stats 显示进出站数据
--rate 显示速率
--timeout 显示每一个tcp tcpfin udp 的超时时间值
--deamon 显示进程信息
-- sort 显示排序规则 默认是升序的
-c 显示多少个客户连接进来
|
(4).删除所有集群服务:
清空ipvs规则
1
|
ipvsadm -C
|
(5).保存定义的规则:
1
2
|
service ipvsadm save
ipvsadm -S > /path/to/somefile
|
(6).载入此前的规则
1
2
|
ipvsadm -R
ipvsadm -R < /path/to/somefile
|
四、LVS-NAT 模式演示
注:测试环境
虚拟机:VMware 9.0
操作系统:CentOS 6.4 X86_64
实验图:
1. ip 规则
Director IP:
外网:172.16.100.1
内网:192.168.10.1
RS IP:
RS1: 192.168.10.10
RS2: 192.168.10.11
网关指向:192.168.10.1
2.安装软件
Director:
1
|
[root@master ~] # yum install -y ipvsadm-1.25-10.el6.x86_64
|
RS1:
1
2
|
[root@master ~] # yum install -y httpd
[root@master ~] # vim /var/www/html/index.html #增加测试页面
|
rs1.test.com
RS2:
1
2
|
[root@master ~] # yum install -y httpd
[root@master ~] # vim /var/www/html/index.html #增加测试页面
|
rs2.test.com
3.配置Director
(1).开启转发
1
2
3
|
[root@master ~] # net.ipv4.ip_forward = 1
[root@master ~] # sysctl -p
[root@master ~] # cat /proc/sys/net/ipv4/ip_forward
|
(2).配置lvs-nat模型
1
2
3
|
ipvsadm -A -t 172.16.100.1:80 -s rr
ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.10 -m
ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.11 -m
|
4.服务测试
1
2
3
4
5
6
7
|
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.1:80 rr
-> 192.168.10.10:80 Masq 1 0 516
-> 192.168.10.11:80 Masq 1 0 499
|
5.保存lvs规则
1
2
3
4
5
6
|
[root@master ~] # service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm : [确定]
[root@master ~] # cat /etc/sysconfig/ipvsadm
-A -t 172.16.100.1:80 -s rr
-a -t 172.16.100.1:80 -r 192.168.10.10:80 -m -w 1
-a -t 172.16.100.1:80 -r 192.168.10.11:80 -m -w 1
|
手动保存
1
2
3
4
5
|
[root@master ~] # ipvsadm -S > /etc/sysconfig/ipvsadm.web
[root@master ~] # cat /etc/sysconfig/ipvsadm.web
-A -t 172.16.100.1:http -s rr
-a -t 172.16.100.1:http -r 192.168.10.10:http -m -w 1
-a -t 172.16.100.1:http -r 192.168.10.11:http -m -w 1
|
6.删除规则并还原规则
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@master ~] # ipvsadm -C
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@master ~] # ipvsadm -R < /etc/sysconfig/ipvsadm.web
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.1:80 rr
-> 192.168.10.10:80 Masq 1 0 0
-> 192.168.10.11:80 Masq 1 0 0
|
7.修改lvs调度算法
rr -> wrr
1
2
3
|
[root@master ~] # ipvsadm -E -t 172.16.100.1:80 -s wrr
[root@master ~] # ipvsadm -e -t 172.16.100.1:80 -r 192.168.10.10 -m -w 3
[root@master ~] # ipvsadm -e -t 172.16.100.1:80 -r 192.168.10.11 -m -w 1
|
效果
1
2
3
4
5
6
7
|
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.1:80 wrr
-> 192.168.10.10:80 Masq 3 0 765
-> 192.168.10.11:80 Masq 1 0 255
|
五、LVS-DR 模式演示
实验图:
1.ip 规则
Director:
eth0 172.16.100.2 DIP
eth0:0 172.16.100.1 VIP
RS1:
eth0: 172.16.100.10 RIP
lo0:0 172.16.100.1 VIP
RS2:
eth0: 172.16.100.11 RIP
lo0:0 172.16.100.1 VIP
2.关闭arp响应
RS1与RS2:
1
2
3
4
|
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
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
Director:
1
|
[root@master ~] # ifconfig eth0:0 172.16.100.1 netmask 255.255.255.0
|
RS1:
1
|
[root@rs1 ~] # ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
|
RS2:
1
|
[root@rs2 ~] # ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
|
4.增加路由
RS1:
1
|
[root@rs1~] # route add -host 172.16.100.1 dev lo:0
|
RS2:
1
|
[root@rs2~] # route add -host 172.16.100.1 dev lo:0
|
Director:
1
|
[root@master ~] # route add -host 172.16.100.1 dev eth0:0
|
5.配置lvs-dr
1
2
3
|
[root@master ~] # ipvsadm -A -t 172.16.100.1:80 -s wlc
[root@master ~] # ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 3
[root@master ~] # ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 1
|
6.测试效果
1
2
3
4
5
6
7
|
[root@master ~] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.1:80 rr
-> 172.16.100.10:80 Route 3 0 0
-> 172.16.100.11:80 Route 1 0 0
|
六、LVS 持久连接
说明:尽管我们选择了LVS的分发方法,但是大多时候我们要保证返回给客户端的所有响应请求必须来自于同一台Real Server,这里我们就要用到LVS Persistence(持久性)。
1.LVS 持久连接和类型
PCC 来自同一客户端所有服务的请求都被重定向到同一台Real Server上,以IP地址为准。
PPC 来自同一服务的请求都被重定向到同一台Real Server上,以端口号为准。
PNMP 基于防火墙标记的持久连接,根据iptables 的规则,将对于某类服务几个不同端口的访问定义为一类。
2.持久连接命令
1
2
|
ipvsadm -A|E … -p timeout
-p timeout 持久连接时长,默认为300秒,单位是秒!
|
3.PCC 演示
PCC是一个虚拟服务没有端口号(或者端口号为0),以"-p" 来标识服务。
缺陷:定向所有服务,期望访问不同的Real Server无法实现。
1
2
3
|
ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600
ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2
ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2
|
4.PPC 演示
例如:client---->LVS(80,22)------>RS1 client----->LVS(23)----->RS2
缺陷:期望访问不同的端口到同一台RS上,无法实现。
1
2
3
|
ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600
ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2
ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
|
5.PNMP 演示
先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的Real Server上去,后台的Real Server 并不识别这些标记。将持久和防火墙标记结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台Real Server上去。假设这样一种场景:一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,我们需要将其定义到同一台Real Server上,而其他的服务不受限制。
1
2
3
4
5
|
iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK -- set -mark 8
iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK -- set -mark 8
ipvsadm -A -f 8 -s rr -p 600
ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2
ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1
|
注:关于LVS持久连接的具体案例(80与443),见 http://www.linuxidc.com/Linux/2013-08/88524.htm