问题提出
说起高可用配置,首先就要提到服务器宕机的问题,硬件或者软件都是可能会出毛病的,一旦出毛病,机器提供的服务就会挂掉,所以,一般情况下,是使用负载均衡来解决服务器宕机问题。负载均衡就是:配多台服务器,提供同一种服务,一台挂掉,其他的可以暂时顶上。nginx负载均衡可以参考我的另一篇文章:nginx负载均衡
nginx高可用配置
nginx通过反向代理和负载均衡可以解决服务器的宕机问题,可是,nginx本身也是个服务器呀,nginx本身也可能宕机,此时,怎么解决?多配置几台nginx服务器,再有一台服务器专门处理这几台nginx的负载均衡?那,这台处理nginx负载均衡的服务器宕机怎么办????这问题似乎无解了,套娃了开始。
解决方案
我们知道,服务器ip是唯一的,那么,假如我设置两个nginx服务器,ip不同,然后,一台作为备用,如果一台挂掉了,就改变另一台的ip,顶替上,这方案可以吗?
其实是可以的,但是,有点小毛病,如果挂掉的那台服务器,自己又恢复了呢?此时你已经改掉了备用服务器的ip,此时,出现两个相同ip的服务器,这不就冲突了吗?那怎么解决ip冲突的问题?
虚拟ip
可以用虚拟ip解决,虚拟出来一个ip,这个ip,既不是nginx服务器1的真实ip,也不是服务器2的真实ip,但是,用虚拟ip来代替这两个服务器的ip,虚拟IP就需要借用一个插件:keepalived
我们服务器一般都是Linux系统,在Linux系统中,安装keepalived插件后,通过配置,就可以为多台服务器虚拟出一个虚拟ip,外界访问的是虚拟ip,具体映射到哪台服务器上,可以自己配置权重。
keepalived原理
keepalived其实就是在每台服务器上创建一个进程,然后绑定的几台服务器互相通信,一旦某台挂掉了,就把虚拟ip映射给其他服务器。
第三方脚本
但是,keepalived进程其实有个问题,就是,有时候宕机的可能是程序或者软件,而不是整个机器,如果仅仅是nginx程序宕机了,但是keepalived进程还能好好运行的话,那么,可能并不能检测出来。
因此,通常做法是:写个脚本去不停检测nginx(或者任意你想监测的进程),然后,一旦脚本发现这个进程挂掉了,就去kill掉本机上keepalived的进程,一旦本机上keepalived被kill了,那虚拟IP不就调走了嘛