高可用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等各种不同类型的高层协议。

脑裂

  1. 定义:在keepalived高可用集群中主从节点因通信中断而导致对方故障从而争抢资源如ip引发混乱的现象。

  2. 原因:

    • 网络故障,断网,网络延迟高。
    • 防火墙屏蔽vrrp协议默认的112端口。
    • 资源耗尽,cpu,内存负载过高无法响应。
    • 配置错误,vrrp_instance中state,priority,authentication等相关参数不一致。
  3. 危害:

    • 争抢同一个ip导致客户端混乱。
    • 若集群管理数据库可能引发数据不一致。
    • 失去高可用性,争抢资源导致服务崩溃。
  4. 解决方式:

    • 多重检测机制和资源隔离策略预防脑裂。

    • 具体可增加心跳检测线路,备用通信线路。

      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认证

      bash 复制代码
      vrrp_instance VI_1 {
          # ... 
          authentication {
              auth_type PASS  # 认证类型
              auth_pass 123456  # 密码一致
          }
      }
    • 配置防火墙规则

      bash 复制代码
      firewall-cmd --add-protocol=vrrp --permanent
      
      firewall-cmd --reload
    • 监控告警,通过zabbit,prometheus等工具监控keepalived状态,发现双主节点同时存在时告警。

  5. 总结:脑裂本质是节点之间通信时效而产生的混乱,预防核心在于检测和隔离。

实验

实验准备

  • 两个网段,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,数据库构建稳定可靠的高可用架构。
相关推荐
郝学胜-神的一滴1 天前
Linux线程使用注意事项:骈文技术指南
linux·服务器·开发语言·数据结构·c++·程序人生
迷茫运维路1 天前
【K8S集群漏洞扫描】kube-proxy进程所监听的443端口证书过期问题分析与解决
linux·容器·kubernetes·漏洞处理
笑笑�1 天前
OpenResty + nginx_upstream_check_module 构建主动健康检查模块
运维·nginx·负载均衡·openresty
葵花楹1 天前
【计网期末复习】
网络
moonsims1 天前
地下空间机器狗无线通信解决方案-通感算一体AIBrainBox-UGV:构建多层次、高韧性的生存性网络,适合工业及救援场景
网络·无人机
China_Yanhy1 天前
AWS EC2 挂载新网卡不通?从网卡启动到策略路由的完整排查指南
网络·云计算·aws
林疏safe1 天前
信息系统安全突发事件应急预案
运维·服务器·网络
风乍起吹皱一池春水1 天前
vi/vim 中查看文件时删除全部内容
linux
UCH1HA1 天前
mysqlbinlog基本用法
linux·运维·mysql