Keepalived配置

2017-11-06  本文已影响0人  RocWay

1. 编译

编译keepalived比较简单,只要到官网下载源码, configure/make/make install即可。
有时候比较麻烦,比如会提示“Openssl is not properly installed”。这主要是缺少openssl-devel包。可以通过平台的软件管理程序安装即可。例如

# centos
yum install openssl-devel

# suse
zypper install openssl-devel

# ubuntu
apt-get install openssl-devel
``3
如果无法安装,例如suse11,缺少这样的软件包,可以搜索下载libopenssl-devel。安装即可。

wget http://www.convirture.com/repos/deps/SLES/11.x/x86_64/libopenssl-devel-0.9.8h-30.11.x86_64.rpm

## 2. 应用
用flask开发一个简单的web应用, app.py。
``` python
#!/usr/bin/python

from flask import Flask
app = Flask("webapp")
@app.route('/')
def hello_world():
      return 'Hello World'

if __name__ == '__main__':
      app.run(host='0.0.0.0')

3. 配置

3.1 状态检测

如果不指定vrrp_script,keepalived只检测:

如果要检测到目标服务的状态,那就只能通过vrrp_script脚本。例如为了监控app.py进程,可以编写一个failover.sh脚本:
要点是状态正常返回0;状态不正常返回1。

#!/bin/bash

SERVICE='app.py'

STATUS=$(ps aux | grep $SERVICE  | grep -v grep)
# 状态正常返回0,不正常就返回1。
if [ "$STATUS"x != ""x ]; then
    exit 0
else
    exit 1
fi

3.2 主节点配置

NodeA的配置:nodeA.conf

global_defs {
    router_id NodeA      # 节点标识
}

vrrp_script chk_webapp {
    script "/home/ha/conf/failover.sh"    # 只要遵从“正常返回0,失败返回1”的规则即可
    interval 1     # 检测间隔
    weight -20      # 失败时权重降低数
}

vrrp_instance VI_1 {
    state       MASTER      # MASTER 或BACKUP
    interface   eth5            # 绑定的网络接口。具体主机具体配置
    virtual_router_id   51   # 各节点一致
    priority    100                # 节点权重
    advert_int  1                # 广播间隔
    authentication {
        auth_type PASS      # 节点间验证模式
        auth_pass 1234      # 主备口令相同
    }

    virtual_ipaddress {
        182.180.115.216/24   # 可不必给出掩码位数
    }
    track_script {
        chk_webapp            # 检查服务状态的vrrp_script
    }
}

NodeB配置:nodeB.conf

global_defs {
    router_id NodeB      # 节点标识
}

vrrp_script chk_webapp {
    script "/home/ha/conf/failover.sh"    # 只要遵从“正常返回0,失败返回1”的规则即可
    interval 1     # 检测间隔
    weight -20      # 失败时权重降低数,低于其他节点的权重才会切换。
}

vrrp_instance VI_1 {
    state       BACKUP # MASTER 或BACKUP
    interface   eth6            # 绑定的网络接口。具体主机具体配置
    virtual_router_id   51   # 各节点一致
    priority    100                # 节点权重
    advert_int  1                # 广播间隔
    authentication {
        auth_type PASS      # 节点间验证模式
        auth_pass 1234      # 主备口令相同
    }

    virtual_ipaddress {          # 绑定的VIP
        182.180.115.216/24   # 可不必给出掩码位数
    }
    track_script {
        chk_webapp            # 检查服务状态的vrrp_script
    }
}

4. 实验

  1. 在nodeA上启动keepalived
keepalived -D -f /path/to/nodeA.conf
  1. 在nodeB上启动keepalived
keepalived -D -f /path/to/nodeB.conf
  1. 观测vip,以及访问服务
    分别在两个节点上运行
ip addr show
# or
ip a

curl -XGET http://182.180.169.216:5000

观测对应网络接口。

此时由于nodeA的权重较高,所以vip绑定在nodeA的网卡上。

  1. 关闭nodeA的服务
killall app.py

观测VIP,已经访问服务:

# 此时vip应当转移到nodeB上。如果vrrp_script中配置的weight不够,
# 即nodeA的priority+weight之后,仍然高于nodeB,则不会发生转移
ip -a
# 访问服务,应当仍然可以获取结果。
curl -XGET http://182.180.169.216:5000
上一篇下一篇

猜你喜欢

热点阅读