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 { [email protected] [email protected] [email protected] } notification_email_from [email protected] 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 { [email protected] [email protected] [email protected] } notification_email_from [email protected] 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就完成了,基本没有感知。
发表评论