高可用Keepalived
文章目录
- 高可用Keepalived
- [把 KEEPALIVED_OPTIONS="-D"](#把 KEEPALIVED_OPTIONS="-D")
- [修改为:KEEPALIVED_OPTIONS="-D -d -S 0"](#修改为:KEEPALIVED_OPTIONS="-D -d -S 0")
- [重启 keepalived,查看日志](#重启 keepalived,查看日志)
- 重启日志服务
- 监控日志
Keepalived 介绍
- Keepalived 是一个用 C 语言编写的路由软件。主要是为 Linux 系统和基于 Linux 的基础设施的负载平衡和高可用性提供简单设施。
- Keepalived 起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,根据TCP/IP参考模型的第三、第四层、第五层机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除。
- Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行。
VRRP 协议
- VRRP协议是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。
- VRRP可以将两台或者多台物理路由器 设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为"BACKUP角色",当主路由器失败时,BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务。
- 每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。
Keepalived工作原理
- Keepalived通过VRRP实现高可用性,它还能实现对集群中服务器运行状态的监控以及故障隔离。
- Keepalived工作在TCP/IP 参考模型的 三层、四层、七层,也就是分别为:网络层,传输层和应用层。
- 具体网络层 :提供四个重要的协议,互联网络IP 协议、互联网络可控制报文协议ICMP 、地址转换协议ARP 、反向地址转换协议RARP。
- 具体传输层:提供两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接。
- 具体应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议。
脑裂
-
定义:在keepalived高可用集群中主从节点因通信中断而导致对方故障从而争抢资源如ip引发混乱的现象。
-
原因:
- 网络故障,断网,网络延迟高。
- 防火墙屏蔽vrrp协议默认的112端口。
- 资源耗尽,cpu,内存负载过高无法响应。
- 配置错误,vrrp_instance中state,priority,authentication等相关参数不一致。
-
危害:
- 争抢同一个ip导致客户端混乱。
- 若集群管理数据库可能引发数据不一致。
- 失去高可用性,争抢资源导致服务崩溃。
-
解决方式:
-
多重检测机制和资源隔离策略预防脑裂。
-
具体可增加心跳检测线路,备用通信线路。
bash#在keepalived.conf中指定多网卡检测 vrrp_instance VI_1 { state MASTER interface eth0 # 主网卡 virtual_router_id 51 priority 100 advert_int 1 # 同时检测备用网卡(如eth1) track_interface { eth0 eth1 } } -
vrrp认证
bashvrrp_instance VI_1 { # ... authentication { auth_type PASS # 认证类型 auth_pass 123456 # 密码一致 } } -
配置防火墙规则
bashfirewall-cmd --add-protocol=vrrp --permanent firewall-cmd --reload -
监控告警,通过zabbit,prometheus等工具监控keepalived状态,发现双主节点同时存在时告警。
-
-
总结:脑裂本质是节点之间通信时效而产生的混乱,预防核心在于检测和隔离。
实验
实验准备
- 两个网段,10.1.1.0/24和10.1.8.0/24
- 两个客户端10.1.1.21和10.1.8.21,两个web服务器10.1.8.11和10.1.8.12,一个路由器10.1.1.20和10.1.8.20
相关配置
```bash
# 10.1.1.0/24 网段网关为10.1.1.20
nmcli connection modify ens33 ipv4.gateway 10.1.8.20
nmcli connection up ens33
# 10.1.8.0/24 网段网关为10.1.8.20
nmcli connection modify ens33 ipv4.gateway 10.1.1.20
nmcli connection up ens33
```
```bash
#配置路由
# 开启路由
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 或者
# sed -i "s/ip_forward=0/ip_forward=1/g" /etc/sysctl.conf
sysctl -p
# 此时10.1.8.0/24 网段虚拟机可以访问公网了。
# 设置防火墙:开启SNAT功能,实现不同网段也可以通过路由器访问公网
systemctl enable firewalld.service --now
firewall-cmd --add-masquerade --permanent
firewall-cmd --add-masquerade
```
```bash
#配置web
[root@web1-2 ~]#
# 部署 web
yum install -y nginx
echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
systemctl enable nginx.service --now
# 访问后端 nginx
[root@client1 ~]# curl 10.1.8.11
```
重要过程
-
配置keepalived
```bash
#web2作为备用节点
[root@web2 ~]#
yum install -y keepalived
cp /etc/keepalived/keepalived.conf{,.ori}
vim /etc/keepalived/keepalived.conf
```
```bash
! Configuration File for keepalived
global_defs {
router_id web2
}
vrrp_instance nginx {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.1.8.100
}
}
```
```bash
# 启动 keepalived 服务
[root@web2 ~]# systemctl enable keepalived.service --now
# 查看 IP
[root@web2 ~]# ip -br a show ens33
ens33 UP 10.1.8.12/24 10.1.8.100/24 fe80::20c:29ff:fe83:619c/64
```
```bash
#配置web1主节点
[root@web1 ~]#
yum install -y keepalived
cp /etc/keepalived/keepalived.conf{,.ori}
vim /etc/keepalived/keepalived.conf
```
```bash
! Configuration File for keepalived
global_defs {
router_id web1
}
vrrp_instance nginx {
state MASTER
interface ens33
virtual_router_id 51
# master节点优先级要高于BACKUP节点
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.1.8.100
}
}
```
```bash
# 启动服务
systemctl enable keepalived.service --now
# 查看 IP,VIP 切换到 web1
[root@web1 ~]# ip -br a show ens33
ens33 UP 10.1.8.11/24 10.1.8.100/24 fe80::20c:29ff:fe16:ad99/64
[root@web2 ~]# ip -br a show ens33
ens33 UP 10.1.8.12/24 fe80::20c:29ff:fe83:619c/64
```
实验验证
```bash
# 访问 web
[root@client1 ~]# curl 10.1.8.100
[root@client2 ~]# curl 10.1.8.100
# 关闭 web1 的 keepalive服务,再次访问
[root@web1 ~]# systemctl stop keepalived.service
[root@client1 ~]# curl 10.1.8.100
# 再次启动 web1 的keepalive服务,再次访问
[root@web1 ~]# systemctl start keepalived.service
[root@client1 ~]# curl 10.1.8.100
```
配置文件
-
配置文件位置:/etc/keepalived/keepalived.conf
-
包含三部分:
-
GLOBAL,全局配置部分
-
VRRPD ,VRRP协议配置部分
-
LVS ,LVS服务管理配置部分
-
详细配置解释:
bash! 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 # 检查一个VRRP通告中的所有地址是很耗时的。设置这个标志意味着,如果这个通告和之前接收到的通告来自同一个主路由器,则不会执行检查。 vrrp_skip_check_adv_addr # 严格遵守VRRP协议。 vrrp_strict # 接口发送免费ARP消息的延迟毫秒数 vrrp_garp_interval 0 # 接口发送未经请求的NA消息的延迟毫秒数 vrrp_gna_interval 0 } # VRRP协议配置 # VI_1是虚拟实例名称,可自定义 vrrp_instance VI_1 { # 指定当前节点角色,可以值MASTER和BACKUP,角色由priority决定,这里的值不重要。 state MASTER # VIP使用的接口 interface eth0 #从0到255的任意唯一数字,用于区分VRRPD的多个实例,同一个高可用集群使用相同的id virtual_router_id 51 # 用于选举为MASTER,高于其他节点50,将成为MASTER priority 100 # VRRP通告之间间隔,1s advert_int 1 # VRRP通告认证凭据 authentication { auth_type PASS auth_pass 1111 } # 提供的VIP列表,还可以通过<IPADDR>/<MASK>指定多个地址 virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } # LVS服务管理配置 # 虚拟服务器是 192.168.200.100 443 virtual_server 192.168.200.100 443 { # delay timer for service polling delay_loop 6 # LVS scheduler,支持lb_algo rr|wrr|lc|wlc|lblc|sh|dh lb_algo rr # LVS forwarding method,支持NAT|DR|TUN lb_kind NAT # LVS persistence timeout in seconds, default 6 minutes persistence_timeout 50 # L4 protocol,支持TCP|UDP|SCTP protocol TCP # one entry for each realserver real_server 192.168.201.100 443 { # relative weight to use, default: 1 weight 1 } }
日志
bash
# 以下步骤在 web1 和 web2 节点完成
vim /etc/sysconfig/keepalived
# 把 KEEPALIVED_OPTIONS="-D"
# 修改为:KEEPALIVED_OPTIONS="-D -d -S 0"
# 重启 keepalived,查看日志
systemctl restart keepalived.service
vim /etc/rsyslog.d/keepalived.conf
local0.* /var/log/keepalived.log
# 重启日志服务
systemctl restart rsyslog
# 监控日志
tail -f /var/log/keepalived.log
总结
- keepalived基于vrrp协议实现高可用,通过虚拟ip对外提供统一访问入口,支持主从和双主两种部署模式,。
eepalived
把 KEEPALIVED_OPTIONS="-D"
修改为:KEEPALIVED_OPTIONS="-D -d -S 0"
重启 keepalived,查看日志
systemctl restart keepalived.service
vim /etc/rsyslog.d/keepalived.conf
local0.* /var/log/keepalived.log
重启日志服务
systemctl restart rsyslog
监控日志
tail -f /var/log/keepalived.log
## 总结
- keepalived基于vrrp协议实现高可用,通过虚拟ip对外提供统一访问入口,支持主从和双主两种部署模式,。
- 通过优先级确定主从节点,故障时有备份节点接管虚拟ip和服务,常与lvs,nginx等负载均衡工具联动为web,数据库构建稳定可靠的高可用架构。