ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

    • Linux基础

    • Linux服务

      • Rsync文件传输
      • Sersync实时同步
      • NFS文件服务
      • SSH远程连接
      • Keepalived高可用
        • Keepalived介绍
        • Keepalived部署
        • 脑裂问题
        • 自定义健康检查脚本
        • 双主配置
      • Supervospr进程管理
      • APT包管理工具
      • Samba文件共享
      • JumpServer堡垒机
      • Linux搭建DNS服务
      • Tmux终端管理
      • Iptables
      • Firewalld防火墙管理
      • OpenVPN代理
      • 本地yum仓库搭建
    • Windows Server笔记

    • Shell笔记

    • Ansible笔记

  • 虚拟化服务

  • 数据库服务

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 操作系统
  • Linux服务
Hoshinozora
2024-03-26
目录

Keepalived高可用

# Keepalived介绍

# Keepalived简介

Keepalived是一个开源的网络高可用性软件,主要用于在Linux系统上实现IP负载均衡和故障转移,可以避免WEB服务、应用服务等关键服务出现单点故障、服务不可用等问题,能够有效地提升系统的稳定性和可用性。

Keepalived的高可用架构是主备架构,使用VRRP协议进行实现,该协议允许多个服务器共享一个虚拟IP地址。在主服务器正常工作时,由主服务器绑定该虚拟IP地址提供服务。而备用服务器会一直监视主服务器的服务状态,一但主服务器无法正常提供服务,备用服务器就会立马抢占该虚拟IP地址以接手工作。

# VRRP协议简介

VRRP是一种网络协议,用于提高路由器的可用性和可靠性。它允许多个路由器共享一个虚拟IP地址,其中一个路由器被选为主(Master)路由器,其余的路由器作为备份(Backup)路由器。主路由器负责处理数据包的转发,而备份路由器处于待命状态,当主路由器不可用时,备份路由器会接管虚拟IP地址并继续处理数据包,从而实现无缝的故障转移。

Keepalived利用了VRRP协议的这一特性,通过在多个服务器上运行Keepalived实例来共享同一个虚拟IP地址,从而提供了高可用性的服务。Keepalived中的每个实例都可以通过VRRP协议来通信,选举出一个主服务器并在主服务器不可用时自动切换到备份服务器,保证了服务的连续性和稳定性。

# Keepalived工作过程

配置Keepalived

管理员在每台服务器上配置Keepalived,定义虚拟IP地址、监控服务、健康检查参数以及其他相关设置。这些配置信息通常包含在Keepalived的配置文件中。

VRRP选举

  1. 当Keepalived实例启动时,各个实例会根据配置参与VRRP协议的通信。并且各个实例会周期性发送VRRP组播包,其中包含了自己的虚拟路由器ID和优先级等信息。

    主备之间的通讯可以进行加密传输,但为了通讯效率,建议不要使用加密传输。

  2. 接收到其他实例发送的VRRP广播包后,各个实例会比较自己的优先级与其他实例的优先级,以决定自己是否应该成为主服务器。优先级高的实例将被选为主服务器(Master),其余服务器作为备份服务器(Backup)。

  3. 主服务器将会接管虚拟IP,客户端可以通过该地址访问主服务器的服务。

周期性更新

主服务器会一直以组播方式发送VRRP协议心跳包给其他所有备服务器,如果备服务器在一定时间内没有收到心跳包,就代表主服务器不可用,备服务器之间会再次进行选举,选出新的主服务器来接管虚拟IP地址,继续提供服务。

同时Keepalived还支持用户自定义健康检查脚本,通过脚本来检测特定服务或者资源的状态。例如,可以编写一个脚本来ping某个IP地址、检查TCP端口是否打开等。一旦脚本返回非零状态,Keepalived可以根据配置减小该节点在VRRP组中的优先级,以让其他备服务器来接管虚拟IP。

当最初的主服务器恢复上线后,如果他的优先级更高,就它会抢占回虚拟IP地址继续提供服务。但如果优先级值都一样,则会保持不变。

# Keepalived部署

# 1.规划高可用架构

虚拟IP:192.168.10.30

主机 IP 优先级
lb_01 192.168.10.31 100
lb_02 192.168.10.32 90

# 2.安装部署服务

# 高可用集群内主机都要安装
yum install -y keepalived
1
2

# 3.编写配置文件

# 查看配置文件路径
rpm -ql keepalived | grep "conf$"
# 编写配置文件
vim /etc/keepalived/keepalived.conf
1
2
3
4

配置文件说明:

# 全局配置,其中的配置也可以配置到局部
global_defs {
   ## 邮箱告警配置,一般不使用
   # notification_email {
   #   helloworld@email.com
   # }
   # notification_email_from robot@email.com
   # smtp_server 192.168.200.1
   
   # 路由器ID,用于VRRP通信中标识不同的路由器
   # 在同一VRRP集群中不能重复,一般可以使用主机名
   router_id LB_01
}

# VRRP集群实例配置,可以给不同服务配置集群,在同一集群中实例名需要一致
vrrp_instance WEB_LB {
    # 标识该服务器的角色(MASTER/BACKUP),仅做标识使用
    state MASTER
    # 指定虚拟IP地址使用的网卡
    interface eth0
    # 设置虚拟路由器ID,用于区分不同的VRRP集群实例,同一集群中该值需要一致
    virtual_router_id 51
    # 设置优先级,用于选举主服务器,值越高越有可能成为主
    priority 100
    # 定义VRRP组播包发送的间隔时间(秒),同一集群中该值需要一致
    advert_int 1
    # 设置通讯时安全认证配置
    authentication {
        # 指定认证类型,PASS为密码认证
        auth_type PASS
        # 认证密码
        auth_pass 1111
    }
    # 虚拟IP地址配置,用于配置主备服务器共享的虚拟IP地址,同一集群中该值需要一致
    virtual_ipaddress {
        192.168.10.30
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 4.防火墙放行

# 允许VRRP协议
firewall-cmd --add-protocol=VRRP --permanent

# 重新加载firewalld规则使之生效
firewall-cmd --reload
1
2
3
4
5

# 5.启动keepalived服务

systemctl start keepalived && systemctl enable keepalived
1

# 6.检查主服务器虚拟网卡信息

# 检查网卡信息中是否存在虚拟IP
ip a s
1
2

# 脑裂问题

# 介绍

备服务器由于意外,接收不到主服务器发送的组播包,于是备服务器会抢占虚拟IP。

物理层面上,可能是高可用集群之间的通讯线路出现问题。逻辑层面上,可能是安全策略阻止组播包的发送或接受,如:防火墙没有正常配置等。

# 监控方法

使用脚本对其进行监控,一旦出现脑裂问题,就发送邮件通知运维人员。脚本中判断如果网卡上出现虚拟IP地址,就发送邮件告警,因为无论是否脑裂,切换了说明某个节点出问题,则需要进行告警。

运维人员收到后,先关掉其中一个节点,然后分析问题进行解决。

ip a s ens33 | grep "192.168.10.30" > /dev/null
if [ $? -eq 0 ]
then
    echo "告警信息" > mail -s [标题] [邮箱]
if
1
2
3
4
5

# 自定义健康检查脚本

Keepalived支持使用自定义脚本(track_script)来进行健康检查,如果脚本返回非0则表示检查失败,权重值会变为priority值加上weight值(可为负数)。

# 例子

实现nginx停止运行,keepalived进行主备切换。

  1. 编写脚本
mkdir -p /data/scripts/lb
cat>/data/scripts/lb/lb_nginx_check.sh<<EOF
#!/bin/bash

# 判断nginx worker进程数是否少于1
worker_num=\`ps -ef | grep -c "nginx: worke[r]"\`
if [ \$worker_num -lt 1 ]
then
    exit 1
fi
EOF
1
2
3
4
5
6
7
8
9
10
11
  1. 在keepalived配置中定义与引用脚本
# 脚本定义在顶级配置中,也就是与vrrp_instance同级
vrrp_script lb_nginx_check {
    # 指定脚本的绝对路径
    script "/data/scripts/lb/lb_nginx_check.sh"
    # 执行脚本的间隔时间(秒)
    interval 2
    # 权重值参数,介绍见下方
    weight -10
    # 检测连续多少次失败,确定是真失败
    fall 2
    # 检测连续多少次成功,确定是真成功
    # rise 1
}

# 调用脚本
vrrp_instance WEB_LB {
    ...
    # 调用脚本,指定上面定义的脚本标识名即可
    track_script {
        lb_nginx_check
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# weight参数

权重值参数,主要用于与priority优先级值进行运算,得出最终权重值。

它用于根据监控脚本执行情况,来调整优先级,以达到释放虚拟IP资源的目录。

当权重值为正数,一般用于提升当前服务器为主服务器。

  • 脚本运行后返回结果为0时,最终优先级进行求和运算,real_priority = priority + weight
  • 脚本运行后返回结果为非0时,表示无需升级,使用默认优先级。

当权重值为负数,一般用于降级当前服务器为备服务器。

  • 脚本运行后返回结果为0时,表示无需降级,使用默认优先级。
  • 脚本运行后返回结果为非0时,最终优先级进行求差运算,real_priority = priority - weight

# 双主配置

# 介绍

实际就是在两台服务器上,配置两个不同的VRRP集群实例,然后集群A由服务器A作为主服务器,服务器B作为备服务器。集群B由服务器B作为主服务器,服务器A作为备服务器。

这样将访问资源分开,可以减轻单主的压力,也可以防止单点问题。

# 配置方法

两个服务器state互设为主备。

两个服务器priority设置为互为主备的数值。

两个集群实例名不能相同。

两个集群virtual_router_id不能相同。

两个集群的virtual_ipaddress不能相同。

lb01配置

vrrp_instance www {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150 
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }   
    virtual_ipaddress {
      10.0.0.3/24
    }
}

vrrp_instance bbs {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.4/24
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

lb02配置

vrrp_instance www {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.3/24
    }
}

vrrp_instance bbs {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.4/24
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#Linux#Keepalived#高可用#HA
SSH远程连接
Supervospr进程管理

← SSH远程连接 Supervospr进程管理→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式