keepalived

keepalivedlinux 下的高可用解决方案. 通过共享 ip, 心跳检测的功能实现网络的高可用.

要点:

  • 虚拟 ip 自动在节点间流转
  • 配置比较简单
  • 比较轻量

shell

apt install keepalived -y

# 配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
   router_id ha1 # ha集群内唯一
   enable_script_security # 允许执行脚本
   script_user root # 指定执行脚本的用户
}

vrrp_script check_health {
    script "/usr/bin/systemctl is-active nginx" # 检测nginx状态
    interval 2 # 间隔时间
    weight -100 # 失败后降低权重,成功的话会恢复
}

vrrp_instance VI_1 {
    state MASTER   # 主节点
    interface enp0s3 #你的网卡名字
    virtual_router_id 51 # ha集群内必须一致
    priority 100   # 权重,可以为90
    advert_int 1   # 主备通讯时间间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # 没被使用的ip dev 网卡名字 标签 标签名字
        192.168.31.244 dev enp0s3 label enp0s3:1
    }

    track_script {
        check_health
    }
}

# 启动
systemctl enable keepalived --now

shell

vim /etc/keepalived/keepalived.conf
global_defs {
   router_id ha2 # ha集群内唯一
   enable_script_security # 允许执行脚本
   script_user root # 指定执行脚本的用户
}

vrrp_script check_health {
    script "/usr/bin/systemctl is-active nginx" # 检测nginx状态
    interval 2 # 间隔时间
    weight -100 # 失败后降低权重,成功的话会恢复
}

vrrp_instance VI_1 {
    state BACKUP   # 当前节点为高可用从角色,BACKUP为从节点
    interface enp0s3 #你的网卡名字
    virtual_router_id 51 # ha集群内必须一致
    priority 90   # 权重,可以为90
    advert_int 1   # 主备通讯时间间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # 没被使用的ip dev 网卡名字 标签 标签名字
        192.168.31.244 dev enp0s3 label enp0s3:1
    }
    
    track_script {
        check_health
    }
}

node1 查询会发现 192.168.31.244/32 scope global enp0s3:1

shell

root@node1:/etc/keepalived# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:7d:18:8a brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.210/24 metric 100 brd 192.168.31.255 scope global dynamic enp0s3
       valid_lft 42367sec preferred_lft 42367sec
    inet 192.168.31.244/32 scope global enp0s3:1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe7d:188a/64 scope link 
       valid_lft forever preferred_lft forever

关闭 node1keepalived 服务 systemctl stop keepalived. node2 同样会出现 192.168.31.244/32 scope global enp0s3:1.

在第三方机器上先 ping 一下 3 个主机拿到 mac 地址, 然后使用 arp -a 命令查询.

powershell

# 一旦我们关闭node1的keepalived服务,192.168.31.244将会指向node2的mac地址
arp -a
node1  192.168.31.210        08-00-27-4d-3b-7e     动态
node2  192.168.31.211        08-00-27-7d-18-8a     动态
vip    192.168.31.244        08-00-27-4d-3b-7e     动态

参考 阿里云支持HaVip如何使用HaVip和keepalived搭建主备双机实现业务高可用

  • 不支持广播和组播. 需要配置单播通信.

配置如下:

shell

global_defs {
   router_id node1 # ha集群内唯一
   enable_script_security # 允许执行脚本
   script_user root # 指定执行脚本的用户
}

vrrp_script check_health {
    script "/usr/bin/systemctl is-active nginx" # 检测nginx状态
    interval 2 # 间隔时间
    weight -100 # 失败后降低权重,成功的话会恢复
}

vrrp_instance VI_1 {
    state MASTER   # 主节点
    interface eth0 # 你的网卡名字
    virtual_router_id 51 # 必须一致
    priority 100   # 权重,可以为90
    advert_int 1   # 主备通讯时间间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # 没被使用的ip dev 网卡名字 标签 标签名字
        192.168.31.244 dev eth0 label eth0:1
    }

    unicast_src_ip 192.168.31.210   # 设置本机ECS实例的私网IP地址
    unicast_peer {
        192.168.31.211  # 对端ECS实例的私网IP地址
    }
    track_interface {
        eth0  # 设置ECS实例网卡名
    }
    track_script {
        check_health
    }
}