LVS负载均衡集群(干货来袭)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS负载均衡集群(干货来袭)相关的知识,希望对你有一定的参考价值。
提升服务器响应能力的方式:
Scale On:向上扩展
升级服务器硬件
Scale Out:向外扩展
增加服务器个数
集群类型:
LB: Load Balance负载均衡集群
并发处理能力
HA: High Availability高可用集群
在线时间/(在线时间+故障处理时间)
99%,99.9%,99.99%,99.999%
HPC:High Performance Computer 高性能集群
并行处理集群
分布式存储:分布式文件系统
将大任务切割成小任务,分别进行处理计算的机制
脑裂 split-brain
两个集群节点不对称,节点2认为节点1已经挂掉了,但节点1因为繁忙等原因没有挂掉,此时会产生集群脑裂
有可能导致两个节点同时读写同一个文件系统,导致数据错乱
STONITH:Shoot The Other Node In The Head
为避免产生集群脑裂,可以借助STONITH设备彻底使某个节点失效
FENCE
拒绝某个节点访问集群资源
节点级别隔离:STONITH
资源级别隔离
为避免集群分裂,高可用集群至少要有奇数个节点
负载均衡集群
实现调度器的方式:
Hardware
F5
Citrix,Netscaler
A10
Software
四层
LVS
七层:反向代理
http,smtp,pop3,imap
haproxy
http,tcp(mysql,smtp)
LVS-----Linux Virtual Server
LVS:
ipvsadm:管理集群的命令行工具
ipvs:工作在内核上
LVS角色:
前端:Director
vip:Director上对外提供服务的IP
DIP:Director上与Real Server通信的IP
CIP:客户端的IP地址
后端:Real Server
RIP:Real Server上网卡IP
LVS类型:
LVS-NAT
1、集群节点与Director必须在同一个IP网络中
2、real server的网关要指向Director的DIP
3、RIP通过是私有地址,仅用于各集群节点间的通信
4、Director负责所有通信,进、出的数据都要经过Director
5、Director支持端口映射,对外提供服务的端口与real server的服务端口可以不一致
6、Real server可以使用任意操作系统
7、较大规模应用场景中,Director易成为系统瓶颈
LVS-DR
1、集群节点与Director必须在同一个物理网络中
2、RIP地址可以是公网IP或者私有地址
3、Director只负责处理入站请求,响应报文由Real server直接发往客户端
4、Real Server不能将网关指向DIP,直接指向前端路由网关地址
5、Director不支持端口映射
LVS-TUNNEL
1、集群节点可以跨越互联网,可以不在一个物理网络中
2、RIP必须是公网IP地址
3、Director只负责处理入站请求,响应报文由Real Server直接发往客户端
4、只有支持隧道功能的OS才能用于Real Server
5、不支持端口映射
LVS调度算法:
静态调度方法
rr:Round Robin轮询
wrr:Weight Round Robin 加权轮询
sh:Source hash 源地址Hash,只要来自同一个客户端的用户请求全都转发至同一个Real Server
dh:Destination hash 将同样的请求发送到同一个real server
动态调度方法
lc: least connection 最少连接
active*256+inactive
wlc:weight least connection 加权最少连接,默认调度方法
(active*256+inactive)/weight
sed:shorest expire delay 最少期望延迟
(active+1)*256/weight
nq: never queue 永不排队
LBLC:Local Base Least Connection 基本本地的最少连接
将同一个客户端的请求发送到同一个Real Server,并考虑当前服务器的连接数
LBLCR:Local Base Least Connection Replication 基于本地的带复制功能的最少连接
ipvsadm工具的使用:
管理集群服务
添加 -A -t|u|f service-address [-s scheduler]
-t:tcp协议的集群
-u:udp协议的集群
service-address: IP:port
-f:firewallmark fwm防火墙标记
service-address: Mark Number
修改 -E
删除 -D -t|u|f service-address
示例1:定义172.16.100.1的80端口为集群服务
# ipvsadm -A -t 172.16.100.1:80 -s rr
管理集群服务中的real server
添加 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
service-address 之前定义好的集群服务
-r server-address 某real server的IP地址;在NAT模型中,可以使用IP:PORT格式做端口映射
[-g|i|m] 表示LVS类型
-g DR模型 默认模型
-i TUNNEL模型
-m NAT模型
[-w weight] 定义real server的权重
修改 -E
删除 ipvsadm -d -t|u|f service-address -r server-address
查看
ipvsadm -L|l [options]
options:
-n:以数字形式显示地址及端口
--stats 显示统计信息
--rate 数据传输速率
--timeout 显示tcp/tcp-fin/udp会话超时时间
# ipvsadm -L -n --timeout
Timeout (tcp tcpfin udp): 900 120 300
-c 显示客户端的连接数
删除所有集群服务
-C:清空ipvs规则
保存ipvs规则
-S
# ipvsadm -S > /path/to/somefile
载入此前的规则
-R
# ipvsadm -R < /path/to/somefile
各节点之间的时间偏差不应该超过1秒钟
NTP:Network Time Protocol
NAT模型LVS集群案例
环境如下:rhel 6.3服务器3台,IP地址规则如下
rhel-1: 作为调度器Director vmnet1 10.1.1.1 vmnet8 192.168.1.1
rhel-2: web服务器1 vmnet 8 192.168.1.2 网关 192.168.1.1
rhel-3:web服务器2 vmnet8 192.168.1.3 网关 192.168.1.1
按照如上要求,分别配置3台服务IP地址及网关
1、两台web服务器分别安装httpd,并建立测试测试网页,保证本机可以正常访问
2、在10.1.1.1上验证内核是否支持ipvs模块
# grep -i "vs" /boot/config-2.6.32-279.el6.i686
# CONFIG_GENERIC_TIME_VSYSCALL is not set
CONFIG_HIBERNATION_NVS=y
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
3、在10.1.1.1上安装ipvsadm管理工具
# rpm -ivh /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm
warning: /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing... ########################################### [100%]
1:ipvsadm ########################################### [100%]
4、定义10.1.1.1的80端口为集群服务,并将两台real server添加到该集群服务中
# ipvsadm -A -t 10.1.1.1:80 -s rr
# ipvsadm -a -t 10.1.1.1:80 -r 192.168.1.2 -m
# ipvsadm -a -t 10.1.1.1:80 -r 192.168.1.3 -m
5、查看集群状态
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.1:80 rr
-> 192.168.1.2:80 Masq 1 0 0
-> 192.168.1.3:80 Masq 1 0 0
6、打开10.1.1.1服务器上的ipv4.forward转发功能,并在客户端测试访问;
# sysctl -p
net.ipv4.ip_forward = 1
在客户端浏览器输入http://10.1.1.1可查看到real server网页,点击刷新,网页内容在两台服务器间相互切换
查看集群数据统计信息
# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.1.1.1:80 23 120 102 14795 11135
-> 192.168.1.2:80 11 59 51 7595 5554
-> 192.168.1.3:80 12 61 51 7200 5581
保存ipvsadm规则
# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
7、调整集群调度算法为wrr,并分别指定192.168.1.2的权重为3,192.168.1.3的权重为1
# ipvsadm -E -t 10.1.1.1:80 -s wrr
# ipvsadm -e -t 10.1.1.1:80 -r 192.168.1.2 -m -w 3
# ipvsadm -e -t 10.1.1.1:80 -r 192.168.1.3 -m -w 1
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.1:80 wrr
-> 192.168.1.2:80 Masq 3 0 0
-> 192.168.1.3:80 Masq 1 0 0
8、清空ipvsadm统计数据,并在客户端重新浏览网页,查看ipvsadm统计数据
# ipvsadm -Z -t 10.1.1.1:80
# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.1.1.1:80 22 111 107 15473 10494
-> 192.168.1.2:80 17 83 82 11712 7684
-> 192.168.1.3:80 5 28 25 3761 2810
观察以上数据,权重为3的192.168.1.2 web服务器,数据量大概为192.168.1.3的3倍左右
LVS-DR模型
避免Real Server向外通告VIP,可采用如下办法:
1、在前端路由做IP与MAC静态绑定
2、arptables
3、kernel parameter
arp_ignore:接收到arp请求时的响应级别
0:默认值,只要有请求进入,只要本地配置了此IP,都向外通告
1:仅仅在请求的目标IP是本地地址,并且该地址是配置在请求进入的网卡时,才给予响应
arp_announce:将自己的IP地址及MAC地址的对应关系向外通告时的通告级别
0:默认值,使用本地的任何接口上的任何地址都向外通告
1:尽可能试图仅向目标网络通告与其网络匹配的接口地址
2:仅将与本地接口匹配的网络向外通告
Linux路由转发特性,回应报文从哪个网络接口发出,则以该网络接口的地址作为报文的源IP地址使用;在配置LVS-DR模型时,Real Server上的VIP地址一般都是配置在lo网卡的别名上,例如lo:1. 为保证Real Server在给客户端进行报文响应时,仍可以使用lo:1的地址作为源地址,需要在Real SServer上配置路由,明确指定响应报文以lo:1的地址作为响应的源地址。
LVS DR模型示例
环境IP规则如下:
Director调度器:
DIP eth0 10.1.1.1
VIP eth0:0 10.1.1.254
Real Server 1
RIP eth0 10.1.1.2
VIP lo0:0 10.1.1.254
Real Server 2
RIP eth0 10.1.1.3
VIP lo:0 10.1.1.254
1、按上述要求配置各主机的IP地址及路由
Director:
# ifconfig eth0:0 10.1.1.254 broadcast 10.1.1.254 netmask 255.255.255.255
# route add -host 10.1.1.254 dev eth0:0 >>>响应目的地址为10.1.1.254的请求包时,以eth0:0作为源地址
配置Real Server的VIP时,必须先修改arp_ignore和arp_announce参数
Real Server 1:
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# ifconfig lo:0 10.1.1.254 broadcast 10.1.1.254 netmask 255.255.255.255
# route add -host 10.1.1.254 dev lo:0
Real Server 2:
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# ifconfig lo:0 10.1.1.254 broadcast 10.1.1.254 netmask 255.255.255.255
# route add -host 10.1.1.254 dev lo:0
2、分别在两台real server上搭建web服务,并使用Director测试访问两台服务器的web服务正常
# curl http://10.1.1.2
10.1.1.2 Pag:wq
# curl http://10.1.1.3
10.1.1.3 Page
3、在Director上配置ipvsadm规则 ,添加集群服务
# rpm -ivh /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm
# ipvsadm -A -t 10.1.1.254:80 -s wrr
# ipvsadm -a -t 10.1.1.254:80 -r 10.1.1.2 -g -w 2
# ipvsadm -a -t 10.1.1.254:80 -r 10.1.1.3 -g -w 1
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.254:80 wrr
-> 10.1.1.2:80 Route 2 0 0
-> 10.1.1.3:80 Route 1 0 0
4、在客户机浏览器中输入 http://10.1.1.254测试访问网页
脚本实现DR模型LVS集群:
real server脚本 :
#!/bin/bash
vip=10.1.1.254
# stop NetworkManager
service NetworkManager stop &> /dev/null
chkconfig NetworkManager off
# stop iptables and SELinux
service iptabels stop &> /dev/null
chkconfig iptables off
setenforce 0 &> /dev/null
# Define the kernel arguments arp_ignore arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255
route add -host $vip dev lo:0
Director脚本示例
#!/bin/bash
vip=10.1.1.254
vport=80
rs1_ip=10.1.1.2
rs2_ip=10.1.1.3
rs1_weight=2
rs2_weight=1
net=eth0
case $1 in
start)
# Config vip and route
ifconfig $net:0 $vip broadcast $vip netmask 255.255.255.255
route add -host $vip dev $net:0 &> /dev/null
# install ipvsadm software
mount /dev/cdrom /mnt &> /dev/null
if i rpm -q ipvsadm &> /dev/null; then
rpm -ivh /mnt/Packages/ipvsadm-1.25-10.el6.i686.rpm &> /dev/null
fi
ipvsadm -C
ipvsadm -A -t $vip:$vport -s wlc
ipvsadm -a -t $vip:$vport -r $rs1_ip -g -w $rs1_weight
ipvsadm -a -t $vip:$vport -r $rs2_ip -g -w $rs2_weight
;;
stop)
ipvsadm -C
echo "ipvs cluster have been deleted"
ipvsadm -L -n
;;
save)
ipvsadm -S > /etc/ipvs.info
echo "ipvs rules is saved in /etc/ipvs.info"
;;
status)
ipvsadm -L -n
;;
*)
echo "Usage:`basename $0` { start | stop | status | save }"
;;
esac
curl命令常用选项:
--cacert <file> CA证书文件
--capath <directory> CA目录
--compressed 要求返回是压缩的形势
--connect-timeout <seconds> 设置最大请求时间
-H/--header <line> 自定义头信息传递给服务器
-i/--include 输出时包括protocol头信息
-I/--head 只显示文档信息
--interface <interface> 使用指定网络的接口或地址
-s/--silent 静音模式,不输出任何内容
-u/--user <user[:password]> 设置服务器的用户和密码
-p/--proxytunnel 使用HTTP代理
lvs后端服务器健康状态检查脚本
#!/bin/bash
vip=10.1.1.254
vport=80
rs1_server=10.1.1.2
rs2_server=10.1.1.3
rs1_weight=2
rs2_weight=1
while true;do
# check real server-1
if ! curl --connect-timeout 1 http://$rs1_server &> /dev/null;then
if ipvsadm -L -n | grep $rs1_server &> /dev/null; then
ipvsadm -d -t $vip:$vport -r $rs1_server &> /dev/null
fi
fi
if curl --connect-timeout 1 http://$rs1_server &> /dev/null;then
if ! ipvsadm -L -n | grep $rs1_server:$vport &> /dev/null; then 以上是关于LVS负载均衡集群(干货来袭)的主要内容,如果未能解决你的问题,请参考以下文章