一、负载均衡的概念
负载均衡可以灵活的添加和删除服务节点,有效的提高服务的性能,特别是面对大并发时,可以有效的降低单个节点的过载。按照软硬件可分为,软件负载均衡比如工作在四层模型上的LVS和工作在七层模型上的Nginx、Haproxy,硬件负载均衡有F5的BigIP、A10还有就是citrix的netscalerz。
二、LVS的概念
LVS全称为linux virtual server,它是通过工作在内核空间的ipvs实现负载均衡的,具体的说来,是工作在用户空间的ipvsadm编写好规则后,交给工作在netfilter框架上INPUT链上的IPVS来负责处理
客户端的请求,如果请求的是集群服务,IPVS会应用调度算法,然后通过FORWARD再经过POSTROUTING转交给后端的realserver从而完成负载均衡。
三、LVS的三种工作模型
1、LVS/NAT
NAT模型中的director共有2个网卡一个负责与外网通信,一个负责与内部的realserver通信。
内部的realserver必须将他们的Default Gatway指向director的DIP(director与realserver的IP)。当客户端的请求到达(客户端请求的是VIP),director负载对报文进行拆封重组,根据调度算法,更改报文的源IP和目的IP,当然源IP一定是dierector的VIP,目的IP是通过调度算法缺点的后端realserver的IP。还有它们之间的MAC根据通信主机之间的不同也会相应的改变。realserver收到报文处理完成后,就会转发给director,director在次对报文进行拆封,重新封装发回给客户端,当然源IP肯定会被改为VIP,要不客户端下次就无法完成通信
2、LVS/DR
DR模型中,director和realserver可以在同一个网络中,director只有一个网卡。当客户端的请求到达以后,它负载转发给realserver。realserver处理完请求以后直接转交给客户端。这样就降低了director的负载。当然要完成这样的请求必须通过一些机制,要不下一次客户端的请求就有可能直接和realserver通信了。完成这种机制可以有多种方式,我学的是通过更改内核参数来完成这种机制。
3、LVS/TUN
TUN模型和DR模型很相似,
nat 目标地址转换
集群节点必须和realserver在同一个ip网络中
realserver网关必须指向集群节点DIP
rip通常是私有地址,仅用于各集群节点间的通信
director 位于client和real server之间通信,负责处理进出的所有通信
director 支持端口映射
realserver可以使用任意操作系统
较大规模应用场景中,director易称为系统瓶颈
dr 直接路由
各集群节点必须和director在同一个物理网络中,因为需要通过mac通信
rip可以使用公网地址,实现远程管理
director仅负责处理入站请求,响应报文则由realserver处理
realserver 不能将网关指向DIP,而直接使用前端网关
不支持端口映射
realserver的操作系统必须能够隐藏vip
tun 隧道
集群节点可以跨越internet
rip必须是公网地址
director仅仅处理入站请求,响应报文由realserver直接发往客户
realserver网关不能指向director
只有支持隧道功能的os才能用于realserver
不支持端口映射
四、调度算法
固定调度
rr:轮叫,轮询
wrr:加权
sh:source hash 源地址hash,进行session绑定session affinity
也可以通过seesion共享集群,把内存中的seeion在集群中同步共享,可以通过rsync+inotify ,这样就不需要sh了
dh:destion hash 目标地址hash ,缓存服务器的场景当中
动态调度(考虑活动连接数和非活动连接数)活动连接占用资源多
lc:最少连接(计算后端realserver的活动连接和非活动连接数
active*256+inactive 谁的小分给谁
wlc:加权最少连接 (考虑每台服务器的性能不同)
active*256+inactive/weight 谁的小分给谁
sed:short exprile delay 最短期望延迟
(active+1)*256/weight
nq:never queue 永不排队
lblc:locality based least connetction 基于本地的最少连接
相当于dh,用于缓存服务器的场景中,且考虑到每个缓存服务器的负载
有可能破坏命中率,
lblcr:缓存共享,能保证同一个请求到同一个服务器上,只有新的请求才会给空闲的服务器
grep -i ‘ipvs‘ /boot/config-2.6.28-308.el5
yum -y install ipvsadm
五、IPVSADM的应用
ipvsadm
管理集群服务
ipvsadm -L 查看
-n :数字格式显示主机地址和端口号
--stats:显示统计信息
--rate:显示速率
--timeout:超时时间
-c:显示连接情况
-Z:清空计数器
清空所有规则
-C:清空所有集群服务
-s ;保存规则
ipvsadm -s >/tmp
-R: 从某个地方读入规则
ipvsadm -A 添加 -t|u|f service-address [-s scheduler]
-t tcp -u utp
server-address ip:port
-f firwallmark (防火墙标记 FWM)
server-address mark number
-s 调度方法 wlc
ipvsadm -E 编辑
ipvsadm -D 删除
-t|u|f server-address
ipvsadm -A -t 172.16.100.1:80 -s rr
管理集群服务中的rs real-server
添加 -a
-t|u|f server-address -r server-address -[g|i|m] [-w weight]
-t|u|f server-address :事先定义好的某集群服务
-r server-address:某rs的地址,在nat模型中,可以使用ip:port实现端口映射
-[g|i|m]:lvs类型
-g :dr -i :tun -m :nat 默认是dr
-w:定义服务器权重
修改 -e
删除 -d -t|u|f server-address -r server-address
ipvsadm -a -t 172.16.100.1:80 -r 192.168.216.33 -m
六、NAT和DR的配置解释
1、配置ntp服务
确保时间的同步
ntpdate serveraddress
2、NAT的配置
cat /proc/sys/net/ipvs/ip_forward =1
ipvsadm -A -t 172.16.0.0.1:80 -s rr
ipvsadm -a -t 172.16.0.0.1:80 -r 192.168.216.33:80 -m
ipvsadm -a -t 172.16.0.0.1:80 -r 192.168.216.34:80 -m
ab -你1000 -c 100 http://172.16.0.0.1/index.html
realserver要配置默认网关,DIP
3、DR的配置
1、在路由器端绑定MAC地址
2、ARPtables:基于MAC地址做访问控制,在每个realserver上配置ARP访问策略、
3、通过arp_anounce arp_ignore内核参数
vip:在路由接口进行mac绑定
arptables:在每个realserver加入arp的策略
kenerl:内核参数
arp_announce 定义将自己地址向外通告时的通告级别的
0 将本机任何接口上的任何地址尽可能向外通告
1 试图仅向目标网络通告与其网络匹配的地址
2 仅向与本地接口上地址匹配的网络进行通告
arp_ignore 接受到arp请求时的响应级别
0 只要本机配置的有相应的地址就响应
1 仅仅在请求的目标地址配置请求到达的接口上的时候才给予响应
driector:
vip:eth0:0 172.16.100.1
dip:eth0172.16.100.2
route add -host 172.16.100.1 dev eth0:0
ipvsadm -A -t 172.16.100.1:80 -s wlc
ipvsadm -a -t 172.16.100.1:80 -t 172.16.100.7 -g -w 2
ipvsadm -a -t 172.16.100.1:80 -t 172.16.100.8 -g -w 2
realserver1:
rip:172.16.100.7
lo0:0 172.16.100.1
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_ignore=1
ifconfig lo:0 172.16.100.1 netmask 255.255.255.255 brodcast 172.16.100.1 up
route add -host 172.16.100.1 dev lo:0
realserver2:
rip:172.16.100.8
lo0:0 172.16.100.1
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_ignore=1
ifconfig lo:0 172.16.100.1/16
ifconfig lo:0 172.16.100.1 netmask 255.255.255.255 brodcast 172.16.100.1 up
route add -host 172.16.100.1 dev lo:0
原文:http://learnlinux.blog.51cto.com/9320044/1612784