1. 集群概念(Cluster)
-
系统扩展方式:
- Scale UP:向上扩展(硬件设备)
- Scale Out:向外扩展,增加设备,调度分配问题,采用Cluster
Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
-
Linux Cluster(集群)类型:
参考
https://www.ibm.com/developerworks/cn/linux/cluster/lw-clustering.html
https://www.top500.org
在群集的这三种基本类型之间,经常会发生混合与交杂。于是,可以发现高可用性群集也可以在其节点之间均衡用户负载,同时仍试图维持高可用性程度。同样,可以从要编入应用程序的群集中找到一个并行群集,它可以在节点之间执行负载均衡。尽管集群系统本身独立于它在使用的软件或硬件,但要有效运行系统时,硬件连接将起关键作用- LB:Load Balancing,负载均衡集群
将用户的请求按照一定的比例均匀的发布到不同的服务器上,该系统使负载可以在计算机群集中尽可能平均地分摊处理 - HA:High Availiablity,高可用性集群
解决SPOF(single Point Of failure),解决不了性能问题,其主要作用是使集群的整体服务尽可能可用,如果高可用性群集中的主节点发生了故障,那么这段时间内将由次节点代替它。次节点通常是主节点的镜像,所以当它代替主节点时,它可以完全接管其身份,并且因此使系统环境对于用户是一致的,重要参数如下- MTBF:
Mean Time Between Failure 平均无故障时间 - MTTR:
Mean Time To Restoration( repair)平均恢复前时间,故障时间 - 高可用判断系数(以年为单位)
A=MTBF/(MTBF+MTTR) (0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
- MTBF:
- HPC:High-performance computing,高性能集群
解决复杂的科学问题,内部由十至上万个独立处理器组成,通过高速链接来链接处理器,在公共消息传递层上进行通信以运行并行应用程序
- LB:Load Balancing,负载均衡集群
-
LB Cluster的实现
- 硬件解决方案:实现调度功能,通常主备2台
F5 Big-IP
Citrix Netscaler
A10 A10 - 软件解决方案
- lvs:Linux Virtual Server (官方宣传号称支持并发400万)
内核级实现,不需要装服务器软件,性能强大,功能相对少 - nginx:做代理服务器
支持七层调度,阿里七层SLB使用Tengine,比lvs性能差,但是功能丰富 - haproxy:
支持七层调度,只做调度功能 - ats:apache traffic server,
yahoo捐助 - perlbal:Perl 编写
- pound
- lvs:Linux Virtual Server (官方宣传号称支持并发400万)
- 集群调度中会话保持:负载均衡
- session sticky:同一用户调度固定服务器
Source IP:LVS sh算法(对某一特定服务而言)
Cookie - session replication:每台服务器拥有全部session
session multicast cluster - session server:专门的session服务器
Memcached,Redis
- session sticky:同一用户调度固定服务器
- 硬件解决方案:实现调度功能,通常主备2台
-
HA集群实现方案
- keepalived:vrrp协议
- ais:应用接口规范
- heartbeat
- cman+rgmanager(RHCS)
- coresync_pacemaker
-
Cluster基于工作的协议层次划分
- 四层调度传输层(通用):
- 描述
传输层往下的,识别不了应用层协议(例如http协议),不能识别Cookie,可以识别出同一个ip地址发来的请求,服务器收到的原地址为客户端地址 - 支持的服务类型
- LVS
- nginx:stream
- haproxy:mode tcp
- 描述
- 七层调度应用层(专用):针对特定协议,自定义的请求模型分类
- 描述
服务器收到的请求报文原地址为代理服务器proxy的地址,因为在代理服务器上,会将客户端请求报文解封装,在重新封装为代理服务器的报头 - 服务
- nginx:可以当http和fastcgi的代理服务器,不能代理mysql
- haproxy:
- proxy server:可以,识别应用层协议,不叫调度器,而叫代理服务器
- http:nginx, httpd, haproxy(mode http), …
- fastcgi:nginx, httpd, …
- mysql:mysql-proxy, …
- 描述
- 四层调度传输层(通用):
2. LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一
-
lvs集群类型中的术语:
VS
:Virtual Server,Director Server(DS) ,Dispatcher(调度器),Load Balancer
负载调度器,是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的RS
:Real Server(lvs), upstream server(nginx),backend server(haproxy)
是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等CIP
:Client IP
客户端ip地址VIP
: Virtual serve IP
调度服务器对外的IP地址DIP
: Director IP VS
调度服务器对于内网的IP地址RIP
: Real server IP
集群中提供服务的服务器IP地址
-
工作原理
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS;如何调度到RS上由下面介绍的lvs工作模型(4种)决定;调度算法有10种 -
lvs数据调度
lvs需要借助iptables/netfilter,通过修改内核参数,在INPUT链前增加一个LVS功能模块,转发数据包
-
lvs集群的工作模型
- lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr:直接路由,操纵封装新的MAC地址,LVS默认模式,应用最广
- lvs-tun:隧道,在原请求IP报文之外新加一个IP首部
- lvs-fullnat:修改请求报文的源和目标IP
-
lvs-nat模式
- IP包调度过程
- lvs-nat转发方式
lvs服务器与RS服务器之间使用交换机或路由器都可以,涉及到ip头的更改,需要启动ipforword转发,本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发- RIP和DIP应在同一个IP网络,且应使用私网地址(可以为公网,较浪费);RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
- IP包调度过程
-
LVS-DR模式
- DR模式IP包调度过程
- LVS-DR转发方式
- 通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;
- 源IP/PORT,以及目标IP/PORT均保持不变,传输层不动,不支持端口映射,不需要启用Ipforword转发
- 当请求到达服务器时,网络层不动,只修改数据链路层的mac地址
- 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 避免vip冲突的方法
- 不回应广播
arp_ignore=1,找到设定目录find /proc -name "*arp_ignore"
,修改lo和all目录下的项
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应 - 启动时不发免费ARP
arp_announce=2,找到设定目录find /proc -name "*arp_announce"
,修改lo和all目录下的项
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告 - 将ip地址绑定为静态,指定mac地址
- 不回应广播
- 网络配置要求
- lvs服务器与RS服务器之间为
交换机
- 确保前端路由器将目标IP为VIP的请求报文发往Director
- 在前端网关做静态绑定VIP和Director的MAC地址
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
- 在RS上修改内核参数以限制arp通告及应答级别(lo和all都要修改),保存配置需要修改配置文件/etc/sysctl.conf
- /proc/sys/net/ipv4/conf/all/arp_ignore
- /proc/sys/net/ipv4/conf/all/arp_announce
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
- RS和Director要在同一个物理网络
- Director和各RS都配置有VIP
- 不支持端口映射(端口不能修败)
- RS可使用大多数OS系统
- lvs服务器与RS服务器之间为
- DR模式IP包调度过程
-
lvs-tun模式
- TUN模式IP包调度过程
- 转发方式
不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP) - DIP, VIP, RIP都应该是公网地址
- RS的网关一般不能指向DIP
- 请求报文要经由Director,但响应不经由Director
- 不支持端口映射
- RS的OS须支持隧道功能
- TUN模式IP包调度过程
-
lvs-fullnat模式(此类型kernel默认不支持)
- lvs-fullnat转发方式
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP - 网络配置要求
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
- RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
- 请求和响应报文都经由Director
- 支持端口映射
- lvs-fullnat转发方式
-
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 - lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信 - lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
- lvs-nat与lvs-fullnat:请求和响应报文都经由Director
-
调度算法(ipvs scheduler)
根据其调度时是否考虑各RS当前的负载状态,分为静态和动态两大类- 静态方法:仅根据算法本身进行调度,不考虑后端服务器的情况
- RR:roundrobin,轮询
- WRR:Weighted RR,加权轮询
- SH:Source Hashing,实现session sticky,源IP地址hash
将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定 - DH:Destination Hashing;目标地址哈希
第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
ipvs scheduler
- 动态方法:主要根据每RS当前的负载状态及调度算法进行调度(Overhead=value 较小的RS将被调度)
LC
:least connections 适用于长连接应用- 算法:Overhead=activeconns*256+inactiveconns
- 参数说明
activeconns:建立三次握手,并且有数据在传输
inactiveconns:三次握手后,没有数据传输
WLC
:Weighted LC,默认调度方法
算法:Overhead=(activeconns*256+inactiveconns)/weightSED
:Shortest Expection Delay,初始连接高权重优先
算法:Overhead=(activeconns+1)*256/weight- NQ:Never Queue,第一轮均匀分配,后续SED
- LBLC:Locality-Based LC,动态的DH算法
使用场景:根据负载状态实现正向代理 - LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
- 静态方法:仅根据算法本身进行调度,不考虑后端服务器的情况
3 ipvsadm包构成
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
- 包文件
- 服务文件
/usr/lib/systemd/system/ipvsadm.service - 主程序:
/usr/sbin/ipvsadm - 规则保存工具:
/usr/sbin/ipvsadm-save - 规则重载工具:
/usr/sbin/ipvsadm-restore - 配置文件:
/etc/sysconfig/ipvsadm-config
- 服务文件
-
核心功能
- 集群服务管理:创建集群,涉及到vip及端口号和协议,调度算法
- 集群服务的RS管理:增、删、改
查看
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [–pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空
ipvsadm –R 重载
ipvsadm -S [-n] 保存
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
-
管理集群服务:增、改、删
- 增、改:-A表示增加,-E表示修改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
- 删除:-D表示删除
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]]
:超时时长
- 增、改:-A表示增加,-E表示修改
-
管理集群上的RS:增、改、删
- 增、改:-a表示增加,-e表示修改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] - 删:-d表示删除
ipvsadm -d -t|u|f service-address -r server-address - 其他参数说明
-r server-address[:port]
:RS的ip地址,如省略port,不作端口映射server-address
:vip的地址及端口- lvs工作模型:
- -g:gateway, dr类型,默认
- -i:ipip, tun类型
- -m:masquerade, nat类型
- -w weight:权重
- 增、改:-a表示增加,-e表示修改
-
其他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连接输出
–stats:统计信息[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
–rate :输出速率信息[root@hai7-2 ~]$ipvsadm -Ln --stats Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes |连接| 收到包 | 发送包 |收到大小|发送大小|
[root@hai7-2 ~]$ipvsadm -Ln --rate Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS |每秒连接数|收到报文|发出报文|收到字节|发出字节
- 命令格式
- ipvs规则:/proc/net/ip_vs
显示内如与ipvsadm -Ln
相似,只是将ip地址以16进制显示 - ipvs连接:/proc/net/ip_vs_conn
- 清空定义的所有内容
-
保存及重载规则
- 查看保存的规则(重启会失效),默认打印在屏幕上
[root@hai7-2 ~]$ipvsadm-save -n
- 重定向至指定目录,可以自定义,推荐保存于
/etc/sysconfig/ipvsadm
中,与ipvsadm.service服务相同,可以自动加载
查看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
- 查看保存的规则(重启会失效),默认打印在屏幕上
4. 搭建负载均衡集群
- 负载均衡集群设计时要注意的问题
- 是否需要会话保持
- 是否需要共享存储
共享存储:NAS, SAN, DS(分布式存储)
数据同步: - 搭建https时,RS都要提供同一个私钥和同一个证书
4.1 搭建net模型
-
设计要点
- RIP与DIP在同一IP网络, RIP的网关要指向DIP
- 支持端口映射
- Director要打开核心转发功能
-
拓扑图
-
主机准备
- 客户机
172.20.124.254 - LVS服务器
双网卡,外网ens33:172.20.125.0/16,内网ens37:192.168.47.129/24 - 路由器
可以直接使用交换机,这里只是说明可以使用路由器连接两个网段 - RS服务器:
RS1:192.168.50.104/24
RS2:192.168.50.105/24
- 客户机
-
路由器设置
- 当做路由器的主机,需要开启ipforword功能
[root@hai7-2 ~]$vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@hai7-2 ~]$sysctl -p
- 路由器需要知道报文回去的路径,所以需要添加172.20网段的路由,网关指向lvs服务器的192.168.47.129
[root@hai7-2 ~]$ip route add 172.20.0.0/16 via 192.168.47.129
- 当做路由器的主机,需要开启ipforword功能
-
配置lvs
- lvs服务器需要访问RS服务器网段,需要加访问路由,也需要开启ipforword功能,因为是内核功能,所以在lvs服务器看不到监听的80端口
[root@hai7-2 ~]$route add -net 192.168.50.0/24 gw 192.168.47.128
- 安装包ipvsadm
[root@hai7-2 ~]$yum install ipvsadm -y
- 增加集群服务器策略
[root@hai7-2 ~]$ipvsadm -A -t 172.20.125.0:80 -s rr
- 添加RS服务器策略
[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
- lvs服务器需要访问RS服务器网段,需要加访问路由,也需要开启ipforword功能,因为是内核功能,所以在lvs服务器看不到监听的80端口
-
客户端测试
使用客户机测试,采用的轮询策略,RS1和RS2轮流出现[root@hai7-1 ~]$curl 172.20.125.0 RS1 Server [root@hai7-1 ~]$curl 172.20.125.0 RS2 Server
-
如果RS服务器使用非常规端口8080,如何修改策略
- 修改RS2的httpd服务端口为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
- 修改RS2的httpd服务端口为8080
-
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服务器加权重,定义调度额度
- 修改lvs服务器算法,不能为轮询,不然看不出效果
[root@hai7-2 ~]$ipvsadm -E -t 172.20.125.0:80 -s wrr
- 定义RS服务器的权重-w选项,默认为1
[root@hai7-2 ~]$ipvsadm -e -t 172.20.125.0:80 -r 192.168.50.105:8080 -m -w 3
- 调整后策略效果,Weight显示为3,使用客户机测试,RS2服务器承担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
- 修改lvs服务器算法,不能为轮询,不然看不出效果
-
搭建httpds集群服务
- 实验环境,使用自签名证书,在RS服务器上添加mod_ssl,使用其自生成的证书,重启httpd服务
[root@hai7-2 ~]$yum install -y mod_ssl
- 在lvs服务器上添加https集群规则,映射端口为443
[root@hai7-2 ~]$ipvsadm -A -t 172.20.125.0:443 -s rr
- 在lvs服务器上添加RS服务器规则
[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
- 实验环境,使用自签名证书,在RS服务器上添加mod_ssl,使用其自生成的证书,重启httpd服务
4.2 搭建dr模型
- 设计要点
- RS服务器上需要绑定vip,需要解决地址冲突问题
- Director服务器虽然不参与响应,但不能没有网关
- 客户端需要有指向vip的路由
- 拓扑图
- 主机准备
- 客户机
172.20.124.254/16,需要添加找到VIP地址的路由 - 外网路由器
A口:172.20.125.180/16与客户机同网段
B口:192.168.50.106/24与内网同网段,还需要连接Director Server外网的网段地址增加一个10.0.0.51/8(Director Server的VIP地址对子网掩码没有要求,只要可以接收路由器的广播就可以) - LVS服务器
192.168.50.102/24,将VIP(外网地址)绑定在回环网卡l0上,将192.168.50.102/24的网关指向路由器(本质来说网关可以任意指定,lvs不参与通信,只是不加网关系统默认没有路,停止通信) - RS服务器
RS1:192.168.50.104/24,将VIP(外网地址)绑定在回环网卡l0上
RS2:192.168.50.105/24,将VIP(外网地址)绑定在回环网卡l0上
- 客户机
- 客户端,添加VIP地址路由
[root@hai7-1 ~]$route add -net 10.0.0.0/8 gw 172.20.125.180
- 修改RS服务器相关设置
- 修改内容如脚本所示
[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 "<h1>`hostname`</h1>" > /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
- 在两台RS服务器上分别执行以上脚本
[root@hai7-2 ~]$bash lvs_dr_rs.sh start
- 将RS服务器网关指向路由器临近接口,不经过LVS服务器,直接回应给用户
[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
- 修改内容如脚本所示
- 配置lvs服务器
- 配置内容,如脚本所示
#!/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
- 配置内容,如脚本所示
5. FWM(FireWall Mark)
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度
- 实现方法:
- 在Director主机打标记,作用在
mangle表
的PREROUTING链
上- 格式
iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
- 参数说明
MARK target :可用于给特定的报文打标记
–set-mark value:value 可为0xffff格式,表示十六进制数字
- 格式
- 在Director主机基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
- 在Director主机打标记,作用在
- 示例
- 将http和https使用同一个集群服务进行调度, -d表示vip地址
[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
- 查看贴的标签,查看iptables规则,表为mangle
[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)
- 定义ipvs规则,各服务器网络设置按dr模型搭建,-f指定标签即可,不需要写vip地址
[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
- 测试,http和https可以轮流被访问
[root@hai7-1 ~]$while true;do curl -k https://10.0.0.100;curl http://10.0.0.100;sleep 0.5; done
- 将http和https使用同一个集群服务进行调度, -d表示vip地址
6 持久连接
- session 绑定
对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现 - 持久连接( lvs persistence )模板
实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS- 语法格式
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
- 选项
在生成lvs规则时加-p选项
- 语法格式
- 持久连接实现方式
- 每端口持久(PPC)
每个端口定义为一个集群服务,每集群服务单独调度 - 每防火墙标记持久(PFWMC)
基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity - 每客户端持久(PCC)
基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式
- 每端口持久(PPC)
7 LVS高可用性
- lvs需要2个问题
- Director不可用,整个系统将不可用;
解决方案:高可用集群(keepalived heartbeat/corosync) - 某RS不可用时,Director依然会调度请求至此RS
脚本解决方案:- 执行任务计划,每多久执行一次查询命令,没有应答则删除对应RS服务
[root@hai7-1 ~]$curl http://192.168.50.104 &> /dev/null ||ipvsadm -d -f 10 -r 192.168.50.104
- 专业的监控工具ldirectord,由Director对各RS健康状态进行检查,失败时禁用,成功时启用
- 执行任务计划,每多久执行一次查询命令,没有应答则删除对应RS服务
- Director不可用,整个系统将不可用;
- 专业监控ldirectord
监控和控制LVS守护进程,可管理LVS规则- 检测方式
- 网络层检测,icmp
- 传输层检测,端口探测
- 应用层检测,请求某关键资源
- 下载地址
http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/ - 包名
ldirectord-3.9.6-0rc1.1.1.x86_64.rpm - 包文件说明
- 主配置文件,ldirectord.cf 默认没有,需要负责模板配置文件
/etc/ha.d/ldirectord.cf - 配置文件模版
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf - 服务程序
/usr/lib/systemd/system/ldirectord.service - 主程序
/usr/sbin/ldirectord - 日志文件
/var/log/ldirectord.log
- 主配置文件,ldirectord.cf 默认没有,需要负责模板配置文件
- 使用说明
- 安装
[root@hai7-2 ~]$yum install ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
- Ldirectord配置文件示例
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" <==指定访问页面返回结果,认定为健康,抓取关键字
- sorry server设置
当后端服务器全部宕机时,由lvs服务器充当sorry server,在lvs服务器上安装httpd服务,编辑页面文件,启动服务,当后端服务器宕机时,ldirectord会自动调度[root@hai7-2 ~]$echo Sorry > /var/www/html/index.html
- 安装
- 检测方式