提升服务器响应能力的方式:
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
七层:反向代理
Nginx
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
ipvsadm -a -t $vip:$vport -r $rs1_server -g -w $rs1_weight
ipvsadm -d -t $vip:$vport -r 127.0.0.1
fi
fi
# check real server-2
if ! curl --connect-timeout 1 http://$rs2_server &> /dev/null;then
if ipvsadm -L -n | grep $rs2_server &> /dev/null; then
ipvsadm -d -t $vip:$vport -r $rs2_server &> /dev/null
fi
fi
if curl --connect-timeout 1 http://$rs2_server &> /dev/null;then
if ! ipvsadm -L -n | grep $rs2_server:$vport &> /dev/null; then
ipvsadm -a -t $vip:$vport -r $rs2_server -g -w $rs2_weight
fi
fi
# add self
if ! curl --connect-timeout 1 http://$rs1_server &> /dev/null;then
if ! curl --connect-timeout 1 http://$rs2_server &> /dev/null; then
ipvsadm -d -t $vip:$vport -r $rs1_server &> /dev/null
ipvsadm -d -t $vip:$vport -r $rs2_server &> /dev/null
ipvsadm -a -t $vip:$vport -r 127.0.0.1 &> /dev/null
fi
fi
sleep 3
done
LVS持久连接
无论使用什么算法,lvs持久连接都可以在一定时间内,将来自同一个客户端的连接请求转发到此前选定的RS
持久连接模板(内存缓冲区)
记录了每一个客户端第一次访问时及分配给它的Real Server 的映射关系
查看持久连接模板
# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
TCP 00:05 CLOSE 10.1.1.100:52955 10.1.1.254:http 10.1.1.2:http
TCP 14:57 ESTABLISHED 10.1.1.100:52957 10.1.1.254:http 10.1.1.2:http
TCP 00:05 CLOSE 10.1.1.100:52954 10.1.1.254:http 10.1.1.3:http
TCP 00:03 CLOSE 10.1.1.100:52953 10.1.1.254:http 10.1.1.3:http
TCP 00:06 CLOSE 10.1.1.100:52956 10.1.1.254:http 10.1.1.3:http
TCP 00:05 CLOSE 10.1.1.100:52952 10.1.1.254:http 10.1.1.2:http
使lvs集群支持持久连接,只需要在定义集群服务时,使用-p选项指定持久连接的超时时间即可
# ipvsadm -A | E ….. -p timeout
timeout:定义持久连接的超时时间 默认为300秒; 单位为秒
在基于ssl的应用中,需要使用到持久连接
持久连接:
PPC(持久端口连接):将来自于同一个客户端对同一个服务的请求始终定向到同一个此前选定的Real Server
PCC(持久客户端连接):将来自于同一个客户端对所有服务的请求始终定向到同一个此前选定的Real Server
PNMPP(持久防火墙标记连接):
PPC:持久端口连接, 将来自同一个客户端对同一个集群服务的请求,始终定向到此前选定的RS
示例:
在10.1.1.1调度器对web集群服务进行持久连接
1)为方便观察效果,将集群服务修改使用rr算法
# ipvsadm -E -t 10.1.1.254:80 -s rr
2)开启web集群的持久连接,并指定其超时时间为600秒
# ipvsadm -E -t 10.1.1.254:80 -s rr -p 600
# 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 rr persistent 600
-> 10.1.1.2:80 Route 2 0 0
-> 10.1.1.3:80 Route 1 0 1
再次刷新客户端浏览器页面,发现响应的页面都来自同一个RS
3)在服务器端查看持久连接的响应服务器
# ipvsadm -L -n --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 10.1.1.254:80 rr persistent 600
-> 10.1.1.2:80 2 1 0 2
-> 10.1.1.3:80 1 0 0 1
在两台RS上安装telnet服务,并为其建立集群服务,进行持久连接测试
1) 两台RS上安装并启动telnet服务
# yum install -y telnet*
# chkconfig telnet on
# service xinetd restart
# useradd tom >>>telnet只允许普通用户连接,因此建立普通用户
# passwd tom
2)在10.1.1.1调度器上建立telnet集群服务,并指定持久连接超时为3600秒
# ipvsadm -A -t 10.1.1.254:23 -s rr -p 3600
# ipvsadm -a -t 10.1.1.254:23 -r 10.1.1.2 -g -w 2
# ipvsadm -a -t 10.1.1.254:23 -r 10.1.1.3 -g -w 2
3)在客户端测试telnet连接,连接完成后通过查看ip地址,发现连接的均是同一台RS
PCC:持久客户端连接, 将来自同一个客户端对所有服务的请求,始终定向到此前选定的RS
将所有的服务全部定义为集群服务,一律向RS转发
示例:
1)在10.1.1.1将所有服务定义为集群服务
# ipvsadm -A -t 10.1.1.254:0 -s rr -p 600
# ipvsadm -a -t 10.1.1.254:0 -r 10.1.1.2 -g -w 2
# ipvsadm -a -t 10.1.1.254:0 -r 10.1.1.3 -g -w 2
2)在客户端上分别使用telnet /ssh /http对集群服务进行测试,发现连接的全是同一台RS
# ipvsadm -L -n -c
IPVS connection entries
pro expire state source virtual destination
TCP 08:43 NONE 10.1.1.100:0 10.1.1.254:0 10.1.1.3:0
TCP 00:57 NONE 10.1.1.100:0 10.1.1.254:80 10.1.1.3:80
TCP 46:30 NONE 10.1.1.100:0 10.1.1.254:23 10.1.1.3:23
TCP 01:15 FIN_WAIT 10.1.1.100:53264 10.1.1.254:22 10.1.1.3:22
TCP 00:26 FIN_WAIT 10.1.1.100:53258 10.1.1.254:80 10.1.1.3:80
TCP 00:37 FIN_WAIT 10.1.1.100:53263 10.1.1.254:23 10.1.1.3:23
PNMPP:持久防火墙标记连接
PCC模型在实现持久连接时,需要将所有服务定义为集群服务;而PNMPP持久防火墙标记连接可以实现将几个特定的服务定义为持久连接,而不需要定义所有服务;
实现思路:
在iptables的mangle表中的PREROUTING链中,将需要定义为持久连接的服务打上相同的标记,然后将标记定义为集群服务即可
标记:0----99
示例:
将10.1.1.2和10.1.1.3上的web服务和telnet服务定义为持久连接,为两个服务打上相同的标记为10
1)在调度器10.1.1.1上为web服务和telnet服务打相同的标记
# iptables -F
# iptables -F -t mangle
# iptables -t mangle -A PREROUTING -i eth0 -d 10.1.1.254 -p tcp --dport 80 -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -i eth0 -d 10.1.1.254 -p tcp --dport 23 -j MARK --set-mark 10
2)将标记为10的服务定义为集群服务
# ipvsadm -A -f 10 -s rr
# ipvsadm -a -f 10 -r 10.1.1.2 -g -w 2
# ipvsadm -a -f 10 -r 10.1.1.3 -g -w 1
3)测试ssh 10.1.1.254连接的是调度器本身,证明其不是集群服务
分别测试http://10.1.1.254和telnet 10.1.1.254,这两个服务目前处于负载均衡状态
4)将集群服务调整为持久连接
# ipvsadm -E -f 10 -p 600
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc persistent 600
-> 10.1.1.2:0 Route 2 0 1
-> 10.1.1.3:0 Route 1 0 1
5)再次使用客户端对telnet和web服务进行测试,两个服务的请求全部被转发到了同一台RS
本文出自 “江湖笑笑生” 博客,请务必保留此出处http://hashlinux.blog.51cto.com/9647696/1760513
原文地址:http://hashlinux.blog.51cto.com/9647696/1760513