目录
注:
关于负载均衡如何使用命令或者脚本配置,可参考我这篇博文
LVS详解
本篇博文讲述如何使用keepalived实现配置ipvs并保证后端服务器的高可用性。
高可用(High Availability )
HA(High Available), 高可用性群集是通过系统的可靠性(reliability)和可
维护性(maintainability)来度量的。工程上,通常用平均无故障时间(MTTF)
来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于
是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%
具体HA(可用性)衡量标准:
99% 一年宕机时间不超过4天
99.9% 一年宕机时间不超过10小时
99.99% 一年宕机时间不超过1小时
99.999% 一年宕机时间不超过6分钟
高可用(High Availability )
高可用工作方式:主从方式 (非对称方式)、双机双工方式(互备互
援)、集群工作方式(多服务器互备方式)
高可用的资源分类:网络高可用、服务器高可用、存储高可用、服务
高可用等
开源高可用解决方案:keepalived:通过实现vrrp协议来实现地址
漂移;heartbeat(开源社区项目),cman+rgmanager (RHCS:
redhat cluster suite),corosync+pacemaker(大型解决方案,
一个用于心跳检测,一个用于资源转移。两个结合起来使用,可以实
现对高可用架构的自动管理。)
实现高可用,有两个关键的点,其一是状态检测,以什么标准作为服务器不可用的判断,其二是资源转移,将不可用的服务器的资源转移到可用的服务器上,以达到服务不停顿的目的
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
如上图,keepalived主要是模块是VRRP Stack和Cheackers,实现HA集群
中失败切换(Failover)功能。Keepalived通过VRRP功能能再结合LVS负载均
衡软件即可部署一个高性能的负载均衡集群系统。,Cheackers主要实现可
实现对服务器运行状态检测和故障隔离。,其中ipvs和realserver健康状态检
查通过配置文件配置就可以实现,而其他服务高可用则需要通过自己编写脚
本,然后配置keepalived调用来实现。
Keepalived运行有3个守护进程。父进程主要负责读取配置文件初始化
、监控2个子进程等;然后两个子进程,一个负责VRRP,另一个负责
Cheackers健康检查。其中父进程监控模块为WacthDog,工作实现:每个
子进程打开一个接受unix域套接字,父进程连接到那些unix域套接字并向子
进程发送周期性(5s)hello包。
上图是Keepalived的功能体系结构,大致分两层:用户空间(user space)
和内核空间(kernel space)。
内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)
和NETLINK(提供高级路由及其他相关的网络功能)两个部份。
VRRP (Virtual Router Redundancy Protocol ,虚拟路由冗余协议)
可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以
由另一个备份路由器继续提供相同的服务。
VRRP 根据优先级来确定虚拟路由器中每台路由器的角色(Master 路由
器或Backup 路由器)。VRRP 优先级的取值范围为0 到255 ( 数值越大表明
优先级越高 ),可配置的范围是1 到254 ,优先级0 为系统保留给路由器放弃
Master 位置时候使用,255 则是系统保留给IP 地址拥有者使用。优先级越高
,则越有可能成为Master 路由器。当两台优先级相同的路由器同时竞争
Master 时,比较接口IP 地址大小。接口地址大者当选为Master
在网络层、数据链路层,运行着4个重要的协议:互联网协议IP、互联网控制报文协议
ICMP、地址转换协议ARP以及反向地址转换协议RARP。Keepalived在网络层采用的最
常见的工作方式是通过ICMP协议向服务器集群中的那个节点发送一个ICMP数据包(类
似于ping实现的功能),如果某个节点没有返回响应数据包,那么认为此节点发生了故
障,Keepalived将报告次节点失效,并从服务器集群中剔除故障节点。
在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制
协议TCP可以提供可靠的数据传输服务、Ip地址和端口代表TCP的一个连接端。要获得
TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接,而Keepalived
在传输层就是利用TCP协议的端口连接和扫描技术来判断集群点是否正常的。比如,对
于常见的WEB服务默认的80端口、SSH服务默认的22端口等,Keepalived一旦在传输
层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对
应得节点从服务器集群组中移除。
在应用层,可运行FTP、TELNET、HTTP、DNS等各种不同类型的高层协议,
Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作
方式;例如:用户可以通过编写程序来运行keepalived。而keepalived将根据用户的设
定检测各种程序或服务是否运行正常,如果Keepalived的检测结果与用户设定不一致时
,Keepalived将把对应的服务从服务器中移除。
也就是说,keepalived所实现的功能是,其一当调度器有一台出现故障之后,能够切换到另一台备用的调度器,保证服务不受影响;其二,实时监测后端的realserver的状态,如果出现问题那么就将这台机器自动踢出,当该服务器状态
机器名称 | IP配置 | 服务角色 |
---|---|---|
lvs1 | DIP:172.25.0.11 VIP:172.25.0.100 | 主调度器 |
lvs2 | DIP:172.25.0.12 VIP:172.25.0.100 | 从调度器 |
web1 | RIP:172.25.0.31 | web服务器 |
web2 | RIP:172.25.0.32 | web服务器 |
web3 | RIP:172.25.0.33 | web服务器 |
lvs1的配置
[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {#全局配置
notification_email {#realserver故障时通知邮件的收件人地址
root@localhost
}
notification_email_from root@xiaomi.com #发件人信息
smtp_server 127.0.0.1 #发邮件服务器
smtp_connect_timeout 30 #连接超时时间
router_id KEEPALIVED_LVS #路由器的标识
}
vrrp_instance VI_1 { #虚拟路由实例一
state MASTER #承担角色,MASTER|BACKUP
interface ens34 #通告所使用的网络端口
virtual_router_id 51 #虚拟路由的组ID,同一组主备要保持同一个ID
priority 100 #优先级信息 ,备结点需要更低
advert_int 1 #VRRP通告间隔
authentication {
auth_type PASS #认证机制
auth_pass centos #密码
}
virtual_ipaddress {
172.25.0.100 #VIP的地址
}
}
virtual_server 172.25.0.100 80 { #设置一个virtualServer
delay_loop 2 #服务轮询的时间间隔
lb_algo wrr #LVS的调度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS的模式选择 NAT|DR|TUN
protocol TCP #指明健康检查使用的是TCP还是UDP
! persistence_timeout 120 #会话保持时间,注意,若开启此功能,用户会在一定时间内,分配到同一个后端realServer
real_server 172.25.0.31 80 {
weight 1 #每台服务器的权重
HTTP_GET {
url { ##请求的路径
path /
}
}
TCP_CHECK { #TCP健康检测
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
}
}
real_server 172.25.0.32 80 {
weight 1
HTTP_GET {
url {
path /
}
}
TCP_CHECK { #TCP健康检测
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
}
}
real_server 172.25.0.33 80 {
weight 1
HTTP_GET {
url {
path /
}
}
TCP_CHECK { #TCP健康检测
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
}
}
}
配置完毕之后,将程序设定为开机自启动,启动服务
[root@lvs1 ~]# systemctl enable keepalived.service
[root@lvs1 ~]# systemctl start keepalived.service
lvs2的配置
lvs2的配置与lvs1基本相同,主要需要改以下几个点
state BACKUP #承担角色,MASTER|BACKUP
优先级调低
priority 98 #优先级信息 ,备结点需要更低
降配置的步骤,写入脚本中,并设定为开机自启动。
WEB端脚本
#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=172.25.0.100
host=`/bin/hostname`
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#响应ip地址是在lo接口上的arp请求,其余的忽略。
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#配置所有网卡只响应自己接口上的ip的arp请求,其余的忽略。
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#必须避免将接口信息向非本网络进行通告
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0 down
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
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start||stop}"
exit 1
;;
esac
保存至/etc/init.d/lvs-rs,并赋予执行权限,然后添加为开机启动:
[root@web1~]# chmod +x /etc/init.d/lvs-rs
[root@web1 ~]# chkconfig --add lvs-rs
[root@web1 ~]# chkconfig lvs-rs on
[root@web1 ~]# /etc/init.d/lvs-rs start
web2和web3使用相同的配置即可
在后端的三台web服务器中设置不同的站点内容,在浏览器中访问,看是否能够得到不同的结果。注意清除浏览器的缓存以及keepalived中的会话保持选项。