使用Keepalived+shell脚本线上系统热备一例
因为线上业务比较特殊,因为针对系统进行扩展时,需要从全局的角度来进行规划与部署高可用。以最小的改动,让线上系统使用上高可用。
具体环境介绍:
服务器A : 线上系统JAVA应用。
服务器B : 线上系统服务器A的冷备. 因为业务逻辑相对复杂,有些东西在代码层面写死了,因此成了现在这个情况。在服务器A出现故障时,运维人员需要手工进行启动服务器B,有些参数有可能需要调整,原计划是使用负载均衡,奈何两台服务器不能同时使用。
要让服务器A、B实现自动热备。在服务器A故障时,服务器B自动接管VIP,实现自动切换。我认为这个过程非常的简单.
软件:keepalved + shell
原理:keepalived 实现系统层面VIP的飘移,shell用于实现在VIP飘移后的操作。
面临问题:
1、因为两台服务器,连接两个网络,一个是用于接入,一个是用于连接数据库;再者它本机需要开放端口让其他应相库。所以,在一台服务器的java进程在跑的时候,另外一台java进程最好关掉。
> 这就是使用脚本的原因
2、关于keepalived的心跳,使用用于接入的网卡进行心跳检查。因为如果前面不能接入,后端能连数据库,意义不大了。
> 现实就是这样的
3、java应用层面的监控,如果页面无法打开的话,立即停止keepalived,触发业务切换. 独立脚本实现>
> 通过脚本判断不是问题。
4、在服务器A出现故障时,B接管了业务系统;当A恢复时,不需要重新接管业务系统.
> 已经实现了.
系统维护 A -----shell------ B
系统检查 A -----keepalived----- B
shell:<以Python启动一个web服务器为例>
- # cat /opt/tomcat.sh
- #!/bin/bash
- A=`ps -C python --no-header |wc -l`
- ip addr | grep "10.254.41.200" > /dev/null
- if [ "$?" != "0" ];then
- if [ "$A" = "1" ];then
- pkill python //直接kill好像不行,最后使用pkil强行关
- fi
- else
- if [ "$A" = "0" ];then
- python -m SimpleHTTPServer 80
- fi
- fi
具看我如何实现?
看keepalived配置:
A服务器配置:
- ! 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_script chk_port {
- script "/opt/tomcat.sh"
- interval 2
- weight 2
- }
- vrrp_instance VI_1 {
- state BACKUP //使用BACKUP状态
- interface eth0
- virtual_router_id 51
- priority 100
- mcast_src_ip 10.254.41.173
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1234
- }
- track_script {
- chk_port
- }
- virtual_ipaddress {
- 10.254.41.200
- }
- }
B服务器配置:
- ! 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_script chk_port { //自己定义的脚本
- script "/opt/tomcat.sh"
- interval 2
- weight 2
- }
- vrrp_instance VI_1 {
- state BACKUP //使用BACKUP状态
- interface eth0
- virtual_router_id 51
- priority 100
- mcast_src_ip 10.254.41.110 //使用eth0作为广播源地址
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1234
- }
- track_script {
- chk_port
- }
- virtual_ipaddress {
- 10.254.41.200
- }
- }