基于Keepalived的虚拟IP漂移

基于Keepalived的虚拟IP漂移

卖萌小老头
2025-02-19 / 0 评论 / 159 阅读 / 正在检测是否收录...

前景描述

问题:我有两台DNS服务器,DNS5:10.11.27.5,DNS6:10.11.27.6。但是这两台DNS服务器在一个宿主机上(假设宿主机A:性能偏弱),前段时间把DNS5迁移到另一台主机(假设宿主机B:高性能)。但是遇到问题是宿主机B偶尔可能会停机,这个时候DNS5就不工作了。宿主机A是全年无休运行的,我就在想宿主机B不工作的时候宿主机A的DNS5能接替工作,但是当宿主机B恢复的时候自动切到宿主机B的DNS5。这样可以减少宿主机A的负载。

方案:通过Keepalived实现虚拟IP(VIP),从而达到DNS5的服务器灾备切换功能。

*提示:不一定是DNS场景,很多场景都适用。文章主要描述我的场景改造,并不是硬套。

准备工作

  1. 宿主机B的DNS5作为Master,宿主机A的DNS5作为Backup。
  2. 修改宿主机B的DNS5 IP为 10.11.27.105,修改宿主机A的DNS5 IP为 10.11.27.106。(这个很简单,不用详细描述了)
  3. 为两台DNS安装Keepalived,并启动服务。

Keepalived的安装

# CentOS
yum install keepalived -y

# Ubuntu
apt-get install keepalived

# Alpine Linux
apk add keepalived

配置Keepalived

  1. 主节点配置

编辑 /etc/keepalived/keepalived.conf 文件,示例如下:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens192 # 根据实际网卡名称修改
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass DNS5
    }
    virtual_ipaddress {
        10.11.27.5
    }
}
  1. 备份节点配置

同样编辑 /etc/keepalived/keepalived.conf 文件,示例如下:

! Configuration File for keepalived

global_defs {
    router_id LVS_BACKUP
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 根据实际网卡名称修改
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass DNS5
    }
    virtual_ipaddress {
        10.11.27.5
    }
}
  • state:指定节点的初始状态,MASTER 表示主节点,BACKUP 表示备份节点。
  • interface:指定使用的网络接口,需要根据实际情况修改。
  • priority:优先级,主节点的优先级要高于备份节点,这样在正常情况下虚拟 IP 会绑定到主节点。
  • advert_int:VRRP 通告间隔时间,单位为秒。
  • authentication:认证信息,auth_type 为认证类型,auth_pass 为认证密码,主备节点的密码需要一致。
  • virtual_ipaddress:指定虚拟 IP 地址。

启动和设置开机自启Keepalived

# CentOS
systemctl start keeplived && systemctl enable keepalived
# Ubuntu
systemctl start keeplived && systemctl enable keepalived
# Alpine Linux
rc-service keepalived start && rc-update add keepalived

验证配置

ip addr show eth0  # 根据实际网卡名称修改

# 主节点返回如下:
ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:40:50:04 brd ff:ff:ff:ff:ff:ff
    inet 10.11.27.105/24 brd 10.11.27.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 10.11.27.5/32 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 2409:8a1e:ab92:a8c1::8b2/128 scope global noprefixroute dynamic 
       valid_lft 7069sec preferred_lft 7069sec
    inet6 fe80::20c:29ff:fe40:5004/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# 备份节点返回如下:
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:18:25:92:06:56 brd ff:ff:ff:ff:ff:ff
    inet 10.11.27.106/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.11.27.5/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::218:25ff:fe92:656/64 scope link 
       valid_lft forever preferred_lft forever

模拟主节点故障,比如:Keepalived 或者 关闭 宿主机B的服务

# 主节点
systemctl stop keepalived 

# 此时再次验证网卡绑定
ip addr show eth0 # 根据实际网卡名称修改

# 主节点返回
ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:40:50:04 brd ff:ff:ff:ff:ff:ff
    inet 10.11.27.105/24 brd 10.11.27.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 2409:8a1e:ab92:a8c1::8b2/128 scope global noprefixroute dynamic 
       valid_lft 6734sec preferred_lft 6734sec
    inet6 fe80::20c:29ff:fe40:5004/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
# 备份节点返回
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:18:25:92:06:56 brd ff:ff:ff:ff:ff:ff
    inet 10.11.27.106/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.11.27.5/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::218:25ff:fe92:656/64 scope link 
       valid_lft forever preferred_lft forever

同时可以验证DNS5的工作情况,正常。

注意事项

确保 A 主机和 B 主机上的 DNS 配置(如named.conf等)保持一致,以保证在主备切换时 DNS 服务能够正常工作。同时,局域网内的客户端需要将 DNS 服务器地址配置为虚拟 IP10.11.27.5和 DNS6 的地址10.11.27.6。
通过以上步骤,你就可以实现 B 主机的 DNS5 作为主服务器,A 主机的 DNS5 作为备用服务器,当 B 主机的 DNS5 停机时,A 主机的 DNS5 能接替工作。

扩展提示

  1. 服务停止,重启和日常操作其他服务一样。
  2. 虚拟IP是否允许多个?允许。在virtual_ipaddress 下设置多个IP即可,当主节点故障时,所有的虚拟IP都会漂移到备份节点。也可以单独配置多个虚拟接口,使每个虚拟IP独立漂移。
# 示例如下:这样就定义了 多个独立的虚拟机IP配置,备份节点也可以根据实际情况分开配置多台。
! Configuration File for keepalived

global_defs {
    router_id DNS5_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 根据实际网卡名称修改
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.11.27.5
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0  # 根据实际网卡名称修改
    virtual_router_id 52
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.11.27.7
    }
}

vrrp_instance VI_3 {
    state MASTER
    interface eth0  # 根据实际网卡名称修改
    virtual_router_id 53
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.11.27.8
    }
}

# 如果服务启动正常,会看到类似如下信息
systemctl status Keepalived

# 返回
keepalived.service - Keepalive Daemon (LVS and VRRP)
     Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-02-19 14:30:00 CST; 1min ago
    Process: 1234 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 1235 (keepalived)
      Tasks: 3 (limit: 4667)
     Memory: 1.2M
        CPU: 123ms
     CGroup: /system.slice/keepalived.service
             ├─1235 /usr/sbin/keepalived -D
             ├─1236 /usr/sbin/keepalived -D
             └─1237 /usr/sbin/keepalived -D

剩下的自己研究扩展吧。

0

评论 (0)

取消