--------------------sunkaikees@gmail.com-------------------

Java-keepalived

KeepAlived

keepalived可以用来对Java应用进行故障切换,保障通讯的连续性。我这里单独使用,来做服务的双主备份(即一台服务挂掉了,另一台服务主动接管)。还可以搭配负载均衡。

主要原理是使用VRRP虚拟路由协议,将同一个网段的地址虚拟出一个ip,对外直接连这个ip,内部通过优先级竞选方式确定具体哪个ip上对应的服务提供服务。

vrrp协议:http://blog.51cto.com/billy98/2064252

安装:

ubuntu直接 $sudo apt-get install keepalived 可以安装。

其他可以编译源码安装

https://blog.csdn.net/liupeifeng3514/article/details/79018116

$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

posted @ 2019-01-16 14:59  雪天微风吹  阅读(869)  评论(0编辑  收藏  举报