lvs+keepalived 构建高可用集群
负载均衡LVS基本介绍
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
LVS 特点
LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具
- 首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
- 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率;
- 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
- LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP
LVS组成部分
ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
ipvsadm:另外一段是工作在用户空间,叫ipvsadm,命令行工具, 用于管理集群服务及集群服务上的RS,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
LVS相关术语
- DS:Director Server。指的是前端负载均衡器节点。
- RS:Real Server。后端真实的工作服务器。
- VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
- DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
- RIP:Real Server IP,后端服务器的IP地址。
- CIP:Client IP,访问客户端的IP地址
三种工作模式:
1)NAT模式:
NAT(Network Address Translation)网络地址转换,通过修改数据报头,使得内网中的IP可以和外部网络进行通信。LVS负载调度器使用两块不同的网卡配置不同的IP地址,网卡一设置为公网IP负责与外部通信,网卡二设置内网IP负责与内网服务通信。
外部用户通过访问LVS调度器的公网IP发送服务请求,LVS调度器接受请求后,将请求数据进行转换,通过内网IP的网卡设备,根据调度策略将数据转发给内部服务,内部服务处理完成将响应数据再返回给LVS调度器,LVS调度器再将数据转换通过公网IP的网卡设备将响应结果返回给请求用户。
以上描述的就是一个基于NAT工作模式的LVS调度,这种模式的瓶颈在于LVS调度器,因为所有的请求数据和响应数据都需要经过LVS来进行转换处理,当大流量到来时,LVS调度器就成了一个短板,限制整个集群服务性能的上限。
2)TUN模式:
TUN模式与NAT的不同在于,TUN模式下LVS调度器只负责接受请求,而真实服务器进行响应请给用户。LVS调度器与真实服务器建立IP隧道,IP隧道它可以将原始数据包封装并将新的源地址及端口、目标地址及端口添加新的包头中,将封装后的数据通过隧道转发给后端的真实服务器,真实服务器在收到请求数据包后直接给外部用户响应数据,这种模式下要求真实服务器具有直接外部用户通信的能力。
外部用户访问LVS调度器发送服务请求,LVS调度器接收请求后,将请求数据转换,根据调度策略将数据转发给服务集群真实服务器,真实服务器在处理完成后,就直接与外部请求用户通信,直接将响应结果返回给请求用户。
以上描述就是一个基于TUN工作模式的LVS调度,这种模式下LVS调度器就只负责请求的负载均衡转发,而处理数据的响应则全部由真实服务器来直接和用户通信了。在实际环境中,请求的数据量往往是小于响应的数据量,所以仅仅将请求数据让LVS来转发,好处就是LVS调度器的压力减少很多,可以承载更大的流量,同时真实服务器的性能也能得到充分利用,缺点就是真实服务器需要与外部网络用户直接通信,在安全上会存在一定风险。
3)DR模式:
DR模式是在TUN模式的基础上又进行了改造,在DR模式下LVS调度器与真实服务器共享一个虚拟IP,且调度器的虚拟IP对外暴露,而真实服务器的虚拟IP地址将配置在Non-ARP的网络设备上,这种网络设备不会向外广播自己的MAC及对应的IP地址,这样即保证了真实服务器可以接受虚拟IP的网络请求也让真实服务器所绑定的虚拟IP对外部网络部是不可见的。
外部用户通过访问虚拟IP将请求数据包发送到调度器,调度器根据调度策略确定转发的真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器,之后真实服务器在处理完后进行数据响应时,会将虚拟IP封装在数据包中,再经过路由将数据返回给外部用户,在这整个过程中,真实服务器对外部用户不可见,外部用户只能看到虚拟IP的地址
在DR模式下因为真实服务器给外部用户回应的数据包设置的源IP是虚拟IP地址,又因为真实服务器的虚拟IP不对外暴露,这样外部用户在通过虚拟IP访问时,就访问到了调度器的虚拟IP地址,就实现了整个集群对外部用户透明。
LVS的八种调度算法
1.轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源
lvs构建负载均衡集群
ip | |
---|---|
调度器 | 192.168.126.101 |
vip | 192.168.126.100 |
rs1 | 192.168.126.121 |
rs2 | 192.168.126.122 |
# eth0:1表示这个VIP绑定的目标网卡设备,192.168.209.22就是VIP的值,广播地址为192.168.209.255,子网掩码为:255.255.255.0,up表示立即启用这个VIP
# ifconfig eth0:1 192.168.209.22 broadcast 192.168.209.255 netmask 255.255.255.0 up
# 路由表上添加对这个VIP的路由信息
# route add -host 192.168.209.22 dev eth0:1
# LVS101调度器
systemctl stop NetworkManager # 关闭网卡守护进程
cp /etc/sysconfig/network-scripts/ifcfg-ens32 ifcfg-ens32:0
# 拷贝 ens32 网卡子接口充当集群入口接口
vim ifcfg-ens32:0
DEVICE=ens32:0
IPADDR=192.168.126.100
NETMASK=255.255.255.0
ifup ens32:0 #启动网卡
yum -y install ipvsadm #安装LVS
modprobe ip_vs #重载 ipvs 模块
ipvsadm -v #查看当前ipvs版本
ipvsadm -A -t 192.168.126.100:80 -s rr #添加一个集群并采用轮询算法
ipvsadm -a -t 192.168.126.100:80 -r 192.168.126.121:80 -g
ipvsadm -a -t 192.168.126.100:80 -r 192.168.126.122:80 -g
#添加ipvsadm集群节点
ipvsadm -Ln #查看当前集群
chkconfig ipvsadm on #设置为开机自启
# web121
systemctl stop NetworkManager
cp /etc/sysconfig/network-scripts/ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.126.100
NETMASK=255.255.255.255
vim /etc/sysctl.conf #关闭对应ARP响应及公告功能
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p
ifup lo:0 #重启lo:0网卡
route add -host 192.168.126.100 dev lo:0 #添加路由
systemctl start httpd #启动httpd服务
# 查看集群负载状态
ipvsadm -Ln --stats
lvs+keepalived构建高可用集群
Keepalived是什么?
Keepalived是Linux下一个轻量级别的高可用解决方案。可以实现服务的高可用或热备,用来防止单点故障的问题,Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉。而Keepalived的核心是VRRP协议,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议) 主要实现了在路由器或三层交换机处的冗余,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。
VRRP协议与工作原理
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP) VRRP是一种路由容错协议,也可以叫做备份路由协议。VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部有多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被设置成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,这种选举角色切换非常之快,因而保证了服务的持续可用性。
Keepalvied的工作原理
Keepalived是通过VRRP协议实现高可用性的,Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离。
Keepalived工作在TCP/IP 参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:
在网络层: Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包,如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
在传输层: Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
在应用层:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除
相关术语:
- LB (Load Balancer 负载均衡)
- HA (High Available 高可用)
- Failover (失败切换)
- Cluster (集群)
- LVS (Linux Virtual Server Linux 虚拟服务器)
- DS (Director Server),指的是前端负载均衡器节点
- RS (Real Server),后端真实的工作服务器
- VIP (Virtual IP),虚拟的 IP 地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
- DIP (Director IP),主要用于和内部主机通讯的 IP 地址
- RIP (Real Server IP),后端服务器的 IP 地址
- CIP (Client IP),访问客户端的 IP 地址
名称 | IP地址 |
---|---|
LVS-Master | 10.239.103.51 |
LVS-Backup | 10.239.103.52 |
Web-A | 10.239.103.53 |
Web-B | 10.239.103.54 |
Web-C | 10.239.103.55 |
VIP | 10.239.103.250 |
LVS-Master/LVS-Backup 安装ipvs
# 安装lvs
yum -y install ipvsadm
# ipvsadm:命令行工具, 用于管理集群服务及集群服务上的RS等
# ipvs: 工作于内核上的程序, 可根据用户定义的集群实现请求转发
modprobe ip_vs #重载 ipvs 模块
lsmod | grep ip_vs
yum -y install gcc
yum -y install openssl-devel
LVS-Master/LVS-Backup 安装keepalived
cd /usr/local/src
tar -zxvf keepalived-1.4.0.tar.gz
cd keepalived-1.4.0
./configure --prefix=/usr/local/keepalived
make && make install
keepalived.conf 配置示例
# /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs { #全局配置部分
notification_email {
acassen@firewall.loc #设置报警邮件地址,可以设置多个,每行一个。
failover@firewall.loc #需开启本机的sendmail服务
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server地址
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LVS_DEVEL #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { #vrrp实例定义部分
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface eth0 #指定HA监测网络的接口
virtual_router_id 60 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup
advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
unicast_src_ip 10.239.103.51
unicast_peer {
10.239.103.52
}
authentication { #设置验证类型和密码
auth_type PASS #主要有PASS和AH两种
auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
}
virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个
10.239.103.250
}
}
virtual_server 10.239.103.250 80 { #设置虚拟服务器,需要指定虚拟ip和服务端口
delay_loop 3 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
net_mask 255.255.255.0
persistence_timeout 50 #设置会话保持时间,对动态网页非常有用
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 10.239.103.53 31080 { #配置服务器节点1,需要指定real server的真实IP地址和端口
weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
TCP_CHECK { #realserver的状态监测设置部分单位秒 TCP_CHECK { :注意TCK_CHECK和 {之间有一个空格,忘记打这个空格的话,可能会出现后面用ipvsadm查看时,某个RS查看不到
connect_timeout 3 #超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port 31080 #监测端口
}
}
real_server 10.239.103.54 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
real_server 10.239.103.55 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
}
LVS-Master配置keepalived.conf
global_defs {
router_id keep_101
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 60
priority 90
advert_int 1
unicast_src_ip 10.239.103.51
unicast_peer {
10.239.103.52
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.239.103.250
}
}
virtual_server 10.239.103.250 80 {
delay_loop 3
lb_algo rr
lb_kind DR
net_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.239.103.53 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
real_server 10.239.103.54 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
real_server 10.239.103.55 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
}
LVS-Backup配置keepalived.conf
global_defs {
router_id keep_102
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 60
priority 100
advert_int 1
unicast_src_ip 10.239.103.51
unicast_peer {
10.239.103.52
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.239.103.250
}
}
virtual_server 10.239.103.250 80 {
delay_loop 3
lb_algo rr
lb_kind DR
net_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.239.103.53 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
real_server 10.239.103.54 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
real_server 10.239.103.55 31080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 31080
}
}
}
LVS-Master/LVS-Backup keepalived注册系统服务
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# 复制 keepalived 服务脚本到默认的地址
cp /usr/local/src/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
systemctl start keepalived
# 查看VIP映射关系
ipvsadm -L
realserver.sh
#!/bin/bash
#description: Config realserver
VIP=10.239.103.250
/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
Web-A/Web-B/Web-C执行realserver.sh
vim /usr/local/server/realserver.sh
chmod 755 /usr/local/server/realserver.sh
realserver.sh start
realserver.sh stop