KeepAlived
keepalived可以用来对Java应用进行故障切换,保障通讯的连续性。我这里单独使用,来做服务的双主备份(即一台服务挂掉了,另一台服务主动接管)。还可以搭配负载均衡。
主要原理是使用VRRP虚拟路由协议,将同一个网段的地址虚拟出一个ip,对外直接连这个ip,内部通过优先级竞选方式确定具体哪个ip上对应的服务提供服务。
vrrp协议:http://blog.51cto.com/billy98/2064252
安装:
ubuntu直接 $sudo apt-get install keepalived
其他可以编译源码安装
$cd /usr/local/
// 安装依赖
$yum install -y libnl*
$yum install -y libnfnetlink-devel zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh
// 可以选择版本下载
$wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
$tar -zxvf keepalived-1.3.5.tar.gz
$sudo rm -rf keepalived-1.3.5.tar.gz
$cd keepalived-1.3.5
$./configure --prefix=/usr/local/keepalived
$make && make install
配置
本机环境为Ubuntu,配置文件目录在/etc/keepalived/ 下,编辑修改配置文件。
假设我想用 192.168.10.20 192.268.10.30做两台真实的项目备份的ip,20是主 30是备。虚拟出的漂移ip定位192.168.10.40(要保证没有被占用).
先配置20服务器
$sudo vim /etc/keepalived/keepalived.conf
// 将配置文件修改为下面这样,默认文件还有其他项,已注释掉。
! Configuration File for keepalived
global_defs {
#不同服务器起这里配置不同,不必写ip但是要区分开。比如30上的配置可以改为30。
router_id 192.168.10.20
}
#定义监控脚本
vrrp_script check_bash {
script "/etc/keepalived/keepalive_check.sh" # 脚本位置
interval 5 # 脚本执行间隔
weight -20 # 若脚本执行结果返回非0,则减去自身权重
}
#配置虚拟ip的实例
vrrp_instance VI_1 {
state MASTER # 20为主服务,30为备份,可以填BACKUP
interface wlp2s0 # ifconfig查看到的网卡
# notify_master /root/notify_master.sh #每次主被切换会执行的脚本
# notify_backup /root/notify_backup.sh
virtual_router_id 10 #虚拟路由ip 取值分为1-255 不同服务器要取值相同,建议为当前网段 10
# nopreempt # 不竞争
priority 100 # 权重 master权重为100 取值1-255
advert_int 1 # master backup检测间隔
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.10.40/24 # 飘移ip
}
track_script { #自定义的执行脚本,主要看脚本的返回结果 大括号前这里有空格 否则脚本不执行
check_bash
}
}
自定义脚本内容: $sudo cat /etc/keepalived/keepalive_check.sh
#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
# echo "nginx not found!!!";
exit 1;
fi
if [ `netstat -lnt|grep 3306|wc -l` -eq 0 ];then
# echo "mysql not found!!!";
exit 1;
fi
if [ `netstat -lnt|grep 8088|wc -l` -eq 0 ] || [ `netstat -lnt |grep 8089 |wc -l` -eq 0 ];then
# echo "syncSignServer 8088||8089 not found!!!";
exit 1;
fi
#echo "nginx mysql java all running~~";
exit 0;
java 项目依赖于nginx和mysql,项目端口是8088和8089.这里如果任何一个应用检测不到,说明这台服务器上的java服务不可用,ip需要切换到其他服务器。脚本执行非0后,自身权重减少20,备份服务器权重初始值是90,此时备份权重高于20服务器,备份升级为主。虚拟ip40漂移到30上。
可以通过 ip addr查看虚拟ip漂移到哪个服务上了。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.10.20/24 brd 192.168.10.255 scope global dynamic noprefixroute wlp2s0
valid_lft 5536sec preferred_lft 5536sec
inet 192.168.10.40/24 scope global secondary wlp2s0 // 这里说明漂移ip在20服务器上。客户端只要链接40,会默认转发到真实的20服务器上。
valid_lft forever preferred_lft forever
inet6 fe80::7c02:b0a1:4b79:5277/64 scope link noprefixroute
valid_lft forever preferred_lft forever
其他参考文档:http://blog.51cto.com/6638225/1867848