通过keepalived实现应用高可用
本教程通过keepalived高可用集群软件模拟实现应用高可用
环境:
主服务器10.88.5.31(centos7),软件:httpd,keepalived
备服务器10.88.5.144(rhel6.9),软件:httpd,keepalived
演示:
主服务器httpd关闭后,页面随之切换到备用服务器,当主服务器httpd启动后,页面切换回来
原理:
主服务器的httpd异常关闭后,keepalived配置文件中的脚本检测到httpd进程停止,根据设置的优先级,主keepalived的优先级降低,低于备服务器的优先级,备用服务器上的keepalived随之接替,虚拟IP自动漂移到备用服务器上,此时备用服务器继续提供服务。
安装部署:
安装部署步骤请参考:keepalived部署,keepalived以及httpd都安装完毕后,此时编辑配置文件vim /etc/keepalived/keepalived.conf,添加如下内容,如图:

注意:vrrp_script 不要加在global_defs里面去,要单独加在外面
脚本文件gong.sh的内容如下:

上图中脚本的意思是首先通过pgrep httpd判断httpd进程是否存在,如果不存在退出状态码为1,keepalived配置文件中检测脚本的返回状态吗,如果返回1表示httpd进程不存在,此时执行weight -20将主服务器的优先级降低20,低于备用服务器的优先级,从而备机开始提供服务,当httpd重新启动后,脚本返回状态码为0,不执行weight降级操作,因此主服务器优先级高于备机,从而切换回来继续由主服务器提供服务(可以在脚本中指定退出状态码)
注意:只在主服务器的keepalived配置文件中添加检测脚本即可,备用服务器无需配置
测试:
当前主服务器的httpd以及keepalived都是运行状态,访问界面如下:

现在将主服务器的httpd服务停止,此时再次访问页面,如图:

查询主服务器进程可以发现,httpd进程都已经停止,当重新启动主服务器的httpd进程时,可以看到界面再次切换回来,根据优先级规则,继续由主服务器提供服务(只有httpd会停止,keepalived并不停止,从而可以保证随时切换回来)
keepalived实现其他应用的高可用都可以通过检测脚本的方法来实现
模式:
keepalived的工作模式分为两种:
- 抢占模式:节点1的state状态为MASTER,节点2的状态为BACKUP,当节点1机器或者应用宕机后,节点2接管vip,但是当节点1恢复后,将再次将vip抢占回来,重新接管vip,上面的例子就是抢占模式
- 非抢占模式:节点1和节点2的state都为BACKUP,并且都配置 nopreempt(禁止抢占模式),当节点1机器或者应用宕机后,节点2接管vip,但是当节点1恢复后,不在抢占VIP,变成备机
非抢占模式配置方式有两种写法:
- 第一种:节点1和节点2都配置为BACKUP,并且都配置nopreempt,并设置相同优先级,谁先启动谁持有vip
- 第二种:节点1和节点2都配置为BACKUP,节点1配置nopreempt,节点2不配置nopreempt,节点1优先级高于节点2
第一种方式:
下面例子表示通过第一种方式来实现非抢占模式,节点1和2都有安装nginx并配置检测脚本,如下:


从上图可以看出,节点1和节点2的配置一模一样,现在将节点1的nginx关闭后,vip将会漂移到节点2上,当节点1的nginx重新启动后,vip不会被重新抢占回来,而当节点2的nginx关闭后,vip会再次漂移回来节点1
第二种方式:
下面例子表示通过第二种方式来实现非抢占模式,节点1和2都安装nginx,并配置检测脚本,如图:


上图中,节点1和2都配置了BACKUP,但是节点2没有配置nopreempt,并且节点2的优先级低于节点1,此时,将节点1的nginx关闭后,vip将漂移到节点2上,如果重新启动,节点1不会重新抢占回vip,如果将节点2的nginx关闭后,此时vip又会重新漂移到节点1,从而实现高可用
注意:如果是三台keepalived做高可用,可将三台都配置为BACKUP,并且其中两台配置nopreempt,并且三台的优先级不同,两台nopreempt的优先级高于第三台
也可以这样设置:
| 节点 | 优先级(priority) | state | nopreempt | 说明 |
|---|---|---|---|---|
| master01 | 100 | MASTER | yes | 最稳定的主节点,优先拥有 VIP |
| master02 | 90 | BACKUP | yes | VIP 备用节点,只有 master01 不可用才接管 |
| master03 | 80 | BACKUP | no | 最后备用,preempt 可选,让它在 master01/02 离线后接管 |


