1. keepalived
简介
- Keepalived是一个轻量级别的高可用解决方案,Keepalived起初是为LVS设计的,专门用 来监控集群系统中各个服务节点的状态,如果某个服务器节点出现故障,Keepalived将检测到后自动将节点从集群系统中剔除。
- Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。
核心功能
健康检查(针对RS)
- 采用tcp三次握手, icmp请求,http请求等方式对负载均衡器后面的实际的服务器(通常是提供真实服务的服务器)进行检查并保活
失败切换(针对负载均衡器)
- 当主负载均衡器出现问题时, 由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性
工作原理
- 网络层:通过ICMP协议向后端服务器集群中发送数据报文
- 传输层:利用TCP协议的端口连接和扫描技术检测后端服务器集群是否正常
- 应用层:自定义keepalived工作方式(脚本)
VRRP协议
虚拟路由冗余协议
- VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生, MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。
- 当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址(拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址)发送数据而不是自身网卡的 MAC 地址,
- VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。 | 虚拟路由器 | VRRP组中所有的路由器,拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址 | | —- | —- | | 主路由器(MASTER) | 虚拟路由器内部通常只有一台物理路由器对外提供服务,主路由器是由选举算法产生, 对外提供各种网络功能 | | 备份路由器(BACKUP) | VRRP组中除主路由器之外的所有路由器,不对外提供任何服务,只接受主路由的通 告,当主路由器挂 掉之后,重新进行选举算法接替master路由器。 |
选举机制
- 优先级高的优先选举
- 抢占模式,即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来
- 非抢占模式,即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
三种状态
- Initialize状态:系统启动后进入initialize状态
- Master状态
- Backup状态
架构
SchedulerI/OMultiplexer
- 是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求
Memory Mngt
- 是一个内存管理机制,这个框架提供了访问内存的一些通用方法;
Control Plane
- 是keepalived的控制面板,可以实现对配置文件编译和解析;
Core componets
- Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和 VRRP进程的。
- Checkers:这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
- VRRP Stack:这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换
- FailOver IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送到内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
- Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换
keepalived运行时会启动三个进程
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查
- vrrp:用来实现vrrp协议,负责失败切换
配置文件
- 主节点master配置文件
# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs{# keepalived 自带的邮件提醒需要开启sendmail服务。 建议用独立的监控或第三方SMTProuter_id node1 #标识本节点的字符串,通常为hostname}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。vrrp_script_chk_nginx{script "/etc/keepalived/nginx_check.sh" #检测nginx状态的脚本路径interval 2 #检测时间间隔weight -20 #如果条件成立,权重减20}##定义虚拟路由,VI_1为虚拟路由标识符,可以自定义vrrp_instance_VI_1{state MASTER #主节点,备份节点为BACKUPinterface ens33 #绑定虚拟IP的网络接口(网卡)与本机IP地址所在的网络接口同#虚拟路由的ID号,两个节点设置必须一样,可选 IP 最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址virtual_router_id 33mcast_src_ip xxx.xxx.xxx.xxx #本机ip地址priority 100 #节点优先级,范围0-254,MASTER比BACKUP高nopreempt #优先级高的设置,用在非抢占模式下,设置了之后不会去抢占advert_int 1 # 组播信息发送间隔,两个节点设置必须一样, 默认1s## 设置验证信息,两个节点必须一致authentication {auth_type PASSauth_pass 1111 ## 真实生产,按需求对应该过来}#将 track_script 块加入 instance 配置块track_script {chk_nginx #执行 Nginx 监控的服务}# 虚拟 IP 池, 两个节点设置必须一样virtual_ipaddress {xxx.xxx.xxx.xxx ## 虚拟 ip,可以定义多个,一行一个}}
keepalived+nginx
实现高可用 Web 负载均衡搭建
网络拓扑
- RS部署web服务
#下载apache[root@rs1 ~]# yum install -y httpd[root@rs2 ~]# yum install -y httpd#关闭防火墙[root@rs1 ~]# systemctl stop firewalld[root@rs1 ~]# setenforce 0[root@rs2 ~]# systemctl stop firewalld[root@rs2 ~]# setenforce 0#配置站点并开启服务[root@rs1 ~]# echo "<h1>This is RS1</h1>" > /var/www/html/index.html[root@rs1 ~]# systemctl start httpd[root@rs2 ~]# echo "<h1>This is RS2</h1>" > /var/www/html/index.html[root@rs2 ~]# systemctl start httpd
- nginx服务器部署
#下载nginx[root@nginx1 ~]# yum install -y nginx[root@nginx2 ~]# yum install -y nginx#关闭防火墙[root@nginx1 ~]# systemctl stop firewalld[root@nginx1 ~]# setenforce 0[root@nginx2 ~]# systemctl stop firewalld[root@nginx2 ~]# setenforce 0#负载均衡配置[root@nginx1 ~]# vim /etc/nginx/conf.d/proxy.confupstream webserver{server 192.168.244.135;server 192.168.244.139;}server{listen 80;server_name 192.168.244.128;location / {proxy_pass http://webserver;}}[root@nginx2 ~]# vim /etc/nginx/conf.d/proxy.confupstream webserver{server 192.168.244.135;server 192.168.244.139;}server{listen 80;server_name 192.168.244.129;location / {proxy_pass http://webserver;}}
- keepalived部署
#下载keepalived[root@nginx1 ~]# yum install -y keepalived[root@nginx2 ~]# yum install -y keepalived#配置文件[root@nginx1 ~]# mv /etc/keepalived/keepalived.conf{,.bak}[root@nginx1 ~]# vim /etc/keepalived/keepalived.confglobal_defs {router_id nginx1}vrrp_script chk_http_port {script "/etc/keepalived/check_nginx.sh"interval 1weight -2}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 10priority 100mcast_src_ip 192.168.244.128advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_http_port}virtual_ipaddress {192.168.244.100}}[root@nginx1 ~]# systemctl restart keepalived[root@nginx2 ~]# vim /etc/keepalived/keepalived.confglobal_defs {router_id nginx2}vrrp_script chk_http_port {script "/etc/keepalived/check_nginx.sh"interval 1weight -2}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 10priority 90mcast_src_ip 192.168.244.128advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_http_port}virtual_ipaddress {192.168.244.100}}[root@nginx2 ~]# systemctl restart keepalived#编写脚本[root@nginx1 ~]# vim /etc/keepalived/check_nginx.sh#! /bin/bashnginx_process_number=`ps -C nginx --no-header | wc -l`if [ $nginx_process_number -eq 0 ];then# systemctl restart nginxnginx_process_number=`ps -C nginx --no-header | wc -l`if [ $nginx_process_number -eq 0 ];thenexit 1elseexit 0fielseexit 0fi[root@nginx1 ~]# chmod +x /etc/keepalived/check_nginx.sh[root@nginx2 ~]# vim /etc/keepalived/check_nginx.sh#! /bin/bashnginx_process_number=`ps -C nginx --no-header | wc -l`if [ $nginx_process_number -eq 0 ];then# systemctl restart nginxnginx_process_number=`ps -C nginx --no-header | wc -l`if [ $nginx_process_number -eq 0 ];thenexit 1elseexit 0fielseexit 0fi[root@nginx1 ~]# chmod +x /etc/keepalived/check_nginx.sh
- 测试:将nginx1上的服务关闭
[root@nginx1 ~]# systemctl stop keepalived[root@nginx1 ~]# nginx -s stop
- 此时,VIP已经漂移到nginx2上去了
