1. Keepalived
Keepalived ,看名字为 保持存活,在网络 里面就是保持在线,也就是所谓的高可用或者热备,用于防止单点故障(单点故障时指一旦某一个节点发生故障就会导致整个系统不可用)的发送。
Keepalived 是用于保持集群的高可用:
高并发: 能够同时提供能多台客户端访问
高可用: 防止集群中因为某个几点坏掉,从而导致整个集群不能正常的提供服务
Keepalived 起初是为了和 LVS 进行搭配使用,主要是配合LVS 对后端的集群,因为 LVS 没有健康检查,所以要是使用Keepalived 配合使用,当后端的集群中有一个服务器宕机,他将会把这个服务从后端节点中剔除,从而实现集群的高可用,当后端的服务器能正常的提供服务的时候,再将该服务器加入到后端的集群中,后来 keepalived 实现了 vrrp 协议。
2. VRRP 协议
VRRP 协议: 虚拟路由冗余协议
虚拟路由冗余协议 是由IETF 提出的解决局域网中配置静态网关出现的单点失效现象的路由协议。
VRRP 协议用于保证当主机的吓一跳路由器出现故障时,由另一台路由器来代替 出现故障的路由器工作,从而保证网络的连续性和可靠性。
- VRRP 优点:
- 简化网络管理,在具有多播或广播能力的局域网中,借助VRRP 能在某台设备出现故障时提供高可用的缺省链路,有效避免单一链路发生故障后网络中断的问题。
- 适应性强,VRRP 保温封装IP报文中,支持各种上层协议
- 网络开销小,VRRP 至定义了一种报文—VRRP 通告报文,并且只有处在 Master 状态的路由器可以发送VRRP 报文
3. Keepalived 相关术语:
- 虚拟路由器: 由一个Master 路由器和多个 Backup的路由器组成,主机将 路由器作为默认网关
- VRID: 虚拟路由器的标识,相同VRID 为一组
- Master: 主要工作的主机
- Backup: 用于备份
- 虚拟IP地址(漂移地址): 虚拟路由的IP地址,一个虚拟路由器可以有一个或者多个IP地址
- 优先级: VRRP 根据优先级来确定主机的地位
4. Keepalived 工作原理
负载均衡集群,分为 (master、backup) ,如果 Master 发生故障,从节点将会在集群中选出一个主,来代替的位置,主和从之间会发送特定的消息(这个时间一般为 1S ),当从服务器接收不到Master 发送来的消息,就以为这主服务器宕机了,然后 Backup 将接替 Master 来进行工作,从而保证集群的高可用,当主服务器修改以后,就会继续 Master的位置。
5. Keepalived 配置文件
! Configuration File for keepalived
global_defs { # 全局配置
notification_email { # 发送的邮箱地址
acassen@firewall.loc # 接收邮件的地址1
}
notification_email_from Alexandre.Cassen@firewall.loc #发件箱地址
smtp_server 192.168.200.1 # 指定邮件服务的地址 例如: smtp.163.com
smtp_connect_timeout 30 # 连接 smtp 超时时间
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 # 当前主机状态, Master 主, Backup 辅
interface ens33 # 当前监听网络接口,网卡名字,用于配置集群IP地址
virtual_router_id 51 # 虚拟路由ID号,,同一组要一致
priority 100 # 优先级
advert_int 1 # 通知周期,单位 秒
authentication { # 认证方式
auth_type PASS # 认证类型: 密码或者证书
auth_pass 1111 # 认证密码: 所有节点相同
}
virtual_ipaddress { # 虚拟地址集群,漂移地址
192.168.200.16 # 漂移地址1
192.168.200.17 # 漂移地址2
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { # VIP 地址,要与漂移IP地址一致
delay_loop 6 # 健康检查间隔时间
lb_algo rr # LVS 调度算法 rr | wrr | lc | wlc | lblc | sh | dh
lb_kind NAT # 负载均衡转发规则 NAT | DR | RUN
persistence_timeout 50 # 会话保持时间
protocol TCP # 使用的协议
real_server 192.168.201.100 443 { # 后端真实节点信息
weight 1 # 权重
connect_port 80 # 连接端口
connect_timeout 3 # 超时时间
nb_get_retry 3 # 与节点连接次数
delay_before_retry 3 # 每个连接次数的间隔时间
}
}
}
6. Keepalived 配置
- 最简单的配置,实现 Nginx 双击热备
实验环境:
主机 | IP | 备注 |
---|---|---|
192.168.116.110 | 漂移地址 | |
Web1-Master | 192.168.116.103 | Nginx |
Web2-Backup | 192.168.116.104 | Nginx |
实验目的:
部署两台Nginx ,并配置 Keepalived 实现高可用,当 Web1-Master 宕机之后,Backup 立马顶上称为 Master,保持服务的稳定,当 Master 恢复至集群内再次兼职 Master。
实验步骤:
1) 安装 Nginx
参考 nginx安装
- Web1-Master 编写验证网页文件
- 启动服务
[root@localhost ~]#echo 'This is a Web1-Master ' > /usr/local/nginx/html/index.html
[root@localhost ~]#nginx
[root@localhost ~]#curl 192.168.116.103
This is a Web1-Master
- Web2-Backup 编写验证网页文件
- 启动服务
[root@localhost ~]# echo 'This is a Web2-Backup ' > /usr/local/nginx/html/index.html
[root@localhost ~]# nginx
[root@localhost ~]# curl 192.168.116.104
This is a Web2-Backup
-
部署 Keepalived
- 安装 Keepalived
# 解决依赖关系
[root@localhost ~]# yum -y install popt-devel kernel-devel openssl-devel
# 解包,并源码安装 keepalived
[root@localhost ~]# tar -zxf keepalived-1.2.13.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/keepalived-1.2.13/
[root@localhost keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
- Master
[root@localhost ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL-R1 # 指定路由标识
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33 # 绑定 网卡
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.110 # 漂移地址
}
}
- Backup
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL-R2 # 路由标识,唯一
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { # 协议簇
state BACKUP # 指定备份主机状态
interface ens33 # 绑定网卡
virtual_router_id 51 # 路由ID,要一致
priority 90 # 调整优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.116.110 # 漂移地址
}
}
4) 启动服务
- Master
[root@localhost ~]#service keepalived start
Reloading systemd: [ 确定 ]
Starting keepalived (via systemctl): [ 确定 ]
# 查看漂移地址
[root@localhost ~]#ip ad | grep inet
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet 192.168.116.103/24 brd 192.168.116.255 scope global noprefixroute ens33
inet 192.168.116.110/32 scope global ens33
inet6 fe80::5585:3c11:dae0:cfd6/64 scope link noprefixroute
- Backup
[root@localhost ~]# service keepalived start
Starting keepalived (via systemctl): Warning: keepalived.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[ 确定 ]
5) 测试:
- 访问 VIP
- 得到的是 Web 1 界面
[root@localhost ~]#curl 192.168.116.110
This is a Web1-Master
[root@localhost ~]#curl 192.168.116.110
This is a Web1-Master
- 此时关闭 Master Keepalived 服务
[root@localhost ~]#service keepalived stop
Stopping keepalived (via systemctl): [ 确定 ]
[root@localhost ~]#ip ad | grep inet
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet 192.168.116.103/24 brd 192.168.116.255 scope global noprefixroute ens33
inet6 fe80::5585:3c11:dae0:cfd6/64 scope link noprefixroute
- 再次访问 VIP,并查看 Backup的IP地址
[root@localhost ~]#curl 192.168.116.110
This is a Web2-Backup
[root@localhost ~]#curl 192.168.116.110
This is a Web2-Backup
[root@localhost ~]# ip add | grep 'inet 192.168.116'
inet 192.168.116.104/24 brd 192.168.116.255 scope global noprefixroute ens33
inet 192.168.116.110/32 scope global ens33
- Master Keepalived 再次上线
[root@localhost ~]#service keepalived start
Starting keepalived (via systemctl): [ 确定 ]
[root@localhost ~]#curl 192.168.116.110
This is a Web1-Master
7. 添加 Nginx 监控脚本
-
在生产环境中,我们不可能做到试试监视 服务,所需要由Nginx的状态触发 Keepalived的启动关闭
-
编写 脚本内容
[root@localhost ~]#vim /root/nginx.sh
#! /bin/sh
nginxPid=`ps -C nginx --no-header | wc -l`
if [ $nginxPid -eq 0 ];then
/usr/local/nginx/sbin/nginx
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
# 如果Nginx服务掉了,将再次启动,如果还没启动成功,则停止 Keepalived
- 赋予执行权限
[root@localhost ~]#chmod +x /root/nginx.sh
- 修改配置文件
vrrp_script chk_http_port { # 添加
script "/root/nginx.sh" # 指定监控执行的脚本
interval 2 # 间隔时间
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script { # 以脚本为监控
chk_http_port
}
virtual_ipaddress {
192.168.116.110
}
}
- Backup 配置一样
8. Keepalived 脑裂
Keepalived 可能出现两个主的情况
-
state 都是Master
-
防火墙没有关闭
-
priority 100 优先级 不一样
-
vrrp_instance 组名不一样
-
vitual_route_id 51 不一样
-
当主恢复后,漂移地址转移需要时间,在生产环境中Master 恢复不会转移
-
配置不抢占,使Master 恢复后不会转移
- 在 Backup 中设置
vrrp_instance VI_1 {
state BACKUP --这里状态指定为backup
…………
nopreempt --设置 nopreempt 防止抢占资源
}