系统扩展方式:
Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
Linux Cluster(集群)类型:
参考
https://www.ibm.com/developerworks/cn/linux/cluster/lw-clustering.html
https://www.top500.org
在群集的这三种基本类型之间,经常会发生混合与交杂。于是,可以发现高可用性群集也可以在其节点之间均衡用户负载,同时仍试图维持高可用性程度。同样,可以从要编入应用程序的群集中找到一个并行群集,它可以在节点之间执行负载均衡。尽管集群系统本身独立于它在使用的软件或硬件,但要有效运行系统时,硬件连接将起关键作用
LB Cluster的实现
HA集群实现方案
Cluster基于工作的协议层次划分
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一
官方网站
http://www.linuxvirtualserver.org/
lvs集群类型中的术语:
VS
:Virtual Server,Director Server(DS) ,Dispatcher(调度器),Load BalancerRS
:Real Server(lvs), upstream server(nginx),backend server(haproxy)CIP
:Client IPVIP
: Virtual serve IPDIP
: Director IP VSRIP
: Real server IP工作原理
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS;如何调度到RS上由下面介绍的lvs工作模型(4种)决定;调度算法有10种
lvs数据调度
lvs需要借助iptables/netfilter,通过修改内核参数,在INPUT链前增加一个LVS功能模块,转发数据包
lvs集群的工作模型
lvs-nat模式
LVS-DR模式
find /proc -name "*arp_ignore"
,修改lo和all目录下的项 find /proc -name "*arp_announce"
,修改lo和all目录下的项交换机
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
lvs-tun模式
lvs-fullnat模式(此类型kernel默认不支持)
LVS工作模式总结
参数 | VS/NAT | VS/TUN | VS/DR |
---|---|---|---|
server | any | Tunneling | Non-arp device |
server network | private | LAN/WAN | LAN |
server number | low(10~20) | High(100) | High(100) |
server gateway | load balancer | own router | own router |
调度算法(ipvs scheduler)
根据其调度时是否考虑各RS当前的负载状态,分为静态和动态两大类
LC
:least connections 适用于长连接应用
WLC
:Weighted LC,默认调度方法SED
:Shortest Expection Delay,初始连接高权重优先ipvsadm用于设置、维护和检查虚拟服务器,支持TCP和UDP协议
支持三种工作模型
NAT,tunneling,direct routing
支持八种负载均衡算法
round robin, weighted round robin, least-connection, weighted least-connection, locality-based least-connection, locality-based least-connection with replication, destination-hashing, and source-hashing
程序安装
核心功能
管理集群服务:增、改、删
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
ipvsadm -D -t|u|f service-address
service-address
:vip服务的地址及端口号-t
:TCP协议的端口,VIP:TCP_PORT-u
:UDP协议的端口,VIP:UDP_PORT-f
:firewall MARK,标记,一个数字[-s scheduler]
:指定集群的调度算法,默认为wlc[-p [timeout]]
:超时时长管理集群上的RS:增、改、删
-r server-address[:port]
:RS的ip地址,如省略port,不作端口映射server-address
:vip的地址及端口其他ipvsadm命令
ipvsadm -C
ipvsadm -Z [-t|u|f service-address]
ipvsadm -L|l [options]
--numeric, -n
:以数字形式输出地址和端口号必须L在前,不然语法错误
[root@hai7-2 ~]$ ipvsadm -Ln
--exact
:扩展信息,精确值--connection,-c
:当前IPVS连接输出[root@hai7-2 ~]$ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
|协议|连接过期时间|连接状态| 客户端地址 | vip地址 | 响应的RS
TCP 01:58 TIME_WAIT 172.20.124.254:41326 172.20.125.0:80 192.168.50.105:80
–stats:统计信息[root@hai7-2 ~]$ipvsadm -Ln --stats
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
|连接| 收到包 | 发送包 |收到大小|发送大小|
–rate :输出速率信息[root@hai7-2 ~]$ipvsadm -Ln --rate
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
|每秒连接数|收到报文|发出报文|收到字节|发出字节
ipvsadm -Ln
相似,只是将ip地址以16进制显示保存及重载规则
[root@hai7-2 ~]$ipvsadm-save -n
/etc/sysconfig/ipvsadm
中,与ipvsadm.service服务相同,可以自动加载[root@hai7-2 ~]$cat /usr/lib/systemd/system/ipvsadm.service
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
保存策略ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
[root@hai7-2 ~]$ipvsadm-save -n > /etc/sysconfig/ipvsadm
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service
设计要点
主机准备
路由器设置
[root@hai7-2 ~]$vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@hai7-2 ~]$sysctl -p
[root@hai7-2 ~]$ip route add 172.20.0.0/16 via 192.168.47.129
配置lvs
[root@hai7-2 ~]$route add -net 192.168.50.0/24 gw 192.168.47.128
[root@hai7-2 ~]$yum install ipvsadm -y
[root@hai7-2 ~]$ipvsadm -A -t 172.20.125.0:80 -s rr
[root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:80 -r 192.168.50.104 -m
[root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:80 -r 192.168.50.105 -m
[root@hai7-2 ~]$ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.20.125.0:80 rr
-> 192.168.50.104:80 Masq 1 0 1
-> 192.168.50.105:80 Masq 1 0 0
客户端测试
使用客户机测试,采用的轮询策略,RS1和RS2轮流出现
[root@hai7-1 ~]$curl 172.20.125.0
RS1 Server
[root@hai7-1 ~]$curl 172.20.125.0
RS2 Server
如果RS服务器使用非常规端口8080,如何修改策略
[root@hai7-2 ~]$vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@hai7-2 ~]$ipvsadm -e -t 172.20.125.0:80 -r 192.168.50.105:8080 -m
lvs的缺点
停掉其中一个RS服务器,会造成,部分访问失败,因为没有设置健康性检测,这是lvs服务器的弊端
1. '停掉RS2服务器'
[root@hai7-2 ~]$systemctl stop httpd
2. '在客户机测试,轮询算法,调度到RS2时会报错'
[root@hai7-1 ~]$curl 172.20.125.0
curl: (7) Failed connect to 172.20.125.0:80; Connection refused <==访问失败
[root@hai7-1 ~]$curl 172.20.125.0
RS1 Server <==访问成功
为RS服务器加权重,定义调度额度
[root@hai7-2 ~]$ipvsadm -E -t 172.20.125.0:80 -s wrr
[root@hai7-2 ~]$ipvsadm -e -t 172.20.125.0:80 -r 192.168.50.105:8080 -m -w 3
[root@hai7-2 ~]$ipvsadm -Ln
TCP 172.20.125.0:80 wrr
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
-> 1192.168.50.105:8080 Masq 3 0 0
搭建httpds集群服务
[root@hai7-2 ~]$yum install -y mod_ssl
[root@hai7-2 ~]$ipvsadm -A -t 172.20.125.0:443 -s rr
[root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:443 -r 192.168.50.104 -m
[root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:443 -r 192.168.50.105 -m
[root@hai7-1 ~]$curl -k https://172.20.125.0
RS2 Serve
[root@hai7-1 ~]$route add -net 10.0.0.0/8 gw 172.20.125.180
[root@hai7-2 ~]$cat lvs_dr_rs.sh
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=10.0.0.100 <==设置变量vip地址
mask='255.255.255.255' <==设置变量vip子网掩码,vip作用是接收数据报文,只要有出去的路由就可以,子网掩码没要求
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null <==检测httpd服务是否安装,
service httpd start &> /dev/null && echo "The httpd Server is Ready!" <==启动httpd
echo "`hostname`
" > /var/www/html/index.html <==设置web页面
case $1 in <==$1表示命令后跟的第一个参数
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore <==修改为忽略arp相应
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce <==修改为不使用免费arp
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down <==停止服务时,还原arp设置
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
[root@hai7-2 ~]$bash lvs_dr_rs.sh start
[root@hai7-2 ~]$route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.50.106 0.0.0.0 UG 100 0 0 ens37
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip='10.0.0.100' <==vip地址
iface='lo:1' <==绑定的回环网卡
mask='255.255.255.255'
port='80' <==端口为80
rs1='192.168.50.104' <==设置增加集群RS服务器策略
rs2='192.168.50.105'
scheduler='wrr' <==设置集群规则-s选项
type='-g' <==设置lvs工作模型
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null <==确认ipvsadm安装
case $1 in
start)
ifconfig $iface $vip netmask $mask #broadcast $vip up <==绑定vip地址到回环网卡
iptables -F <==清空iptables规则
ipvsadm -A -t ${vip}:${port} -s $scheduler <==添加lvs集群规则
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 <==添加集群RS服务器规则
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
echo "The VS Server is Ready!"
;;
stop)
ipvsadm -C <==停止集群时清空规则
ifconfig $iface down
echo "The VS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度
mangle表
的PREROUTING链
上
iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
ipvsadm -A -f NUMBER [options]
[root@hai7-2 ~]$iptables -t mangle -A PREROUTING -d 10.0.0.100/32 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
[root@hai7-2 ~]$iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 41 packets, 3253 bytes)
pkts bytes target prot opt in out source destination
0 0 MARK tcp -- * * 0.0.0.0/0 10.0.0.100 multiport dports 80,443 MARK set 0xa(16进制的10)
[root@hai7-2 ~]$ipvsadm -A -f 10 -s rr
[root@hai7-2 ~]$ipvsadm -a -f 10 -r 192.168.50.104 -g
[root@hai7-2 ~]$ipvsadm -a -f 10 -r 192.168.50.105 -g
[root@hai7-2 ~]$ipvsadm -Ln
FWM 10 rr
-> 192.168.50.104:0 Route 1 0 0
-> 192.168.50.105:0 Route 1 0 0
[root@hai7-1 ~]$while true;do curl -k https://10.0.0.100;curl http://10.0.0.100;sleep 0.5; done
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
[root@hai7-1 ~]$curl http://192.168.50.104 &> /dev/null ||ipvsadm -d -f 10 -r 192.168.50.104
[root@hai7-2 ~]$yum install ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
1.'拷贝模板文件到主配置目录下'
[root@hai7-2 ~]$cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
2. '编辑配置文件'
[root@hai7-2 ~]$vim /etc/ha.d/ldirectord.cf
checktimeout=3 <==检查时间超时时长,RS服务器响应时间,超过即删除
checkinterval=1 <==检测间隔
autoreload=yes <==自动加载,第一次修改需要重启服务器,以后修改会自动加载
logfile=“/var/log/ldirectord.log“ <==日志文件
quiescent=no <==down时yes权重为0,no为删除
virtual=5 <==指定集群服务器的地址(如virtual=10.0.0.100:80),如果未数字表示防火墙标签
real=172.16.0.7:80 gate 2 <==DR服务器地址,gate表示DR模型,2表示权重
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate <==sorry server
service=http <==集群服务
scheduler=wrr <==算法名称
protocol=tcp <==如果使用的是防火墙标签,此项不可使用,因为标签中已经定义,会冲突
checktype=negotiate <==检测类型,协商
checkport=80 <==检测端口
request="index.html" <==检测时访问的页面
receive=“Test Ldirectord" <==指定访问页面返回结果,认定为健康,抓取关键字
[root@hai7-2 ~]$echo Sorry > /var/www/html/index.html