openwrt使用keepalived实现高可用

缘起

之前在j3455的ubuntu服务器上的虚拟机上安装了openwrt作为路由器(单臂),用于dns解析等目的。

ubuntu的这个服务器运行算是非常稳定,但是从实践情况来看,总会一两个月后服务器卡死或者其他异常情况, 导致openwrt路由器间接挂掉,整个局域网都没法联网了。

因此最近在折腾这块的可用性,一个最简单也最直接的方法,就是搞个2个作为双备份,在一个挂了的时候自动切换到备份,主机恢复后再自动切回来,这样就不会断网了。

折腾过程

通过google得出,目前linux服务器领域在使用的比较好的方案是keepalived,原理和我想的差不多,只不过这个协议是运行在网络的更低层,可以通过arp声明等,实现多个服务器自动切换,且使用统一的虚拟ip,这样的话对外部就非常好用啦,ip一直没有变过。

安装keepalived

openwrt上天然的自带了这个包,直接命令行或者网页上安装即可。

opkg update
opkg install keepalived

配置keepalived

keepalived的配置分为主机、备机,即master和backup。

master主机配置

1、使用/etc/keepalived/keepalived.conf

vi /etc/config/keepalived
# 反注释掉

option alt_config_file		"/etc/keepalived/keepalived.conf"

2、编辑/etc/keepalived/keepalived.conf

修改成类似这样:

! 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_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   }

vrrp_instance VI_1 {
    state MASTER    
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {        
    192.168.200.44
    }
}

其中 state MASTER代表这个是keepalived的主机,virtual_router_id表示keepalived实例的id,备机需要一样,priority表示优先级,主机设置要更高,比如这里是100。

virtual_ipaddress中的地址,代表这组keepalived实例的虚拟ip,即所有的机器使用这个虚拟ip对外提供服务。

backup备机配置

1、使用/etc/keepalived/keepalived.conf

vi /etc/config/keepalived

# 反注释掉

option alt_config_file		"/etc/keepalived/keepalived.conf"

2、编辑/etc/keepalived/keepalived.conf

修改成类似这样:

! 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_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   }

vrrp_instance VI_1 {
    state BACKUP    
    interface eth0
    virtual_router_id 51
    priority 10
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {        
    192.168.200.44
    }
}

注意这里设置成了BACKUP,priority设置成了10,优先级更低,这里的id也是51,虚拟ip和主机一致。

测试

通过如上配置,基本就可以关闭一个看下另一个能否立马顶上了,可以在openwrt的系统日志内看到主机、备机的切换过程。

类似下面的日志:

 2021 local1.info Keepalived_vrrp[3772]: (VI_1) Entering MASTER STATE

中间的坑

地址配置错误

如果虚拟地址配置错误等地址错误,会报下面的错误。

Sat Dec 11 11:21:30 2021 local1.info Keepalived_vrrp[4226]: (VI_1) ip address associated with VRID 51 not present in MASTER advert : 192.168.200.22

无法连接虚拟ip问题

重启后发现无法连接虚拟ip,此时service keepalived restart重启后可以了,原因未知


更新于22年5月13日夜

最近网上搜索信息,参考这里https://serverfault.com/questions/642706/keepalived-router-on-virtual-ip-is-not-reachable发现这个问题是由于虚拟ip没有设置子网掩码,默认是255.255.255.255,导致在重启之类的情况下,局域网没办法连接了。

可以通过如下配置修改虚拟ip的子网(比如这里的子网24代表普通的局域网),经过验证已经可以了:

virtual_ipaddress {
  192.168.200.3/24
  }

虚拟ip使用的注意点

使用虚拟ip可以登录操作openwrt,但是一定要注意:和网络相关的,比如设置ip地址,设置防火墙等操作,一定要用真实ip,而不能使用虚拟ip,否则操作会异常卡住等

原因大概是,操作网络后一些包发到备份服务器了,导致整个过程异常。

有时候防火墙操作后,导致ping操作不能在虚拟ip正常处理,但实际路由器工作正常,这时候重启两个真实ip的服务器可以恢复。

总结

linux上这个keepalived还是非常方便的,用在openwrt上,天然支持了高可用性,防止网络偶发异常导致的上网问题,经过实测,主备机切换非常快,在2-3s就完成了,基本没有感知。


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。