美文网首页
Keepalive 之 高可用实现

Keepalive 之 高可用实现

作者: ghbsunny | 来源:发表于2017-11-01 23:17 被阅读0次

    1  概述

    本文将介绍三个Keepalive高可用的实现案例,分别是keepalive实现LVS高可用,keepalive通过fwmark实现LVS高可用,keepalive实现Nginx高可用。

    2实验准备

    .(1)各节点时间必须同步,这个操作很关键。工具有ntp和chrony(CentOS7上开始启用)

    .(2)确保iptables及selinux不会成为阻碍。7上要停止firewalld服务和iptables

    .(3)各节点之间可通过主机名互相通信(对KA并非必须),建议使用/etc/hosts文件实现

    172.18.50.63和73上配置

    echo"172.18.50.63  node1 ">>/etc/hosts

    echo"172.18.50.73 node2">>/etc/hosts

    .(4)各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并非必须,但是建议配置)

    两台都要设置

    172.18.50.63上配置

    ssh-keygen

    ssh-copy-id -i /root/.ssh/id_rsa.pub 172.18.50.73

    172.18.50.73上配置

    ssh-keygen

    ssh-copy-id -i /root/.ssh/id_rsa.pub 172.18.50.63

    (5)多播地址

    建议更改默认的多播地址,防止冲突,可以在配置文件里的全局加入选项vrrp_mcast_group4224.100.50.100。将组播地址调整为224.100.50.100。

    网卡需要支持多播模式,默认网卡都开启多播功能,可以使用如下的命令关闭多播地址(不能关闭该功能,仅当学习):

    ip link set dev eth1 multicast off.

    (6)测试

    通过抓包查看

    tcpdump -i eth1 -nn host组播ip,如下

    tcpdump -i eth1 -nn host 224.50.50.50

    注意,如果对应的主服务器的keepalived服务被停了,就会发一条优先级为0的状态。查看vip地址用ip a命令查看对应主机是否将VIP加入到网卡里

    3 配置介绍

    .虚拟服务器:

    .配置参数:

    有两个配置的方法

    virtual_server  IP port定义vip和端口,实现对该vip的统一调度

    virtual_server  fwmark int:指在keepalive的机器上的防火墙mangle表打标签。同一标签的主机实现同一的调度。如对外同一服务有两个ip,vip1和vip2,后端有4台RS,vip1和vip2在mangle表上打同一标签,后台的4台RS都配置这两个vip,那么keepalive服务器就可以实现访问这两个vip时,实现对这四台RS的统一调度

    virtual_server  IP port | virtual_server  fwmark int

    {

    ...

    real_server{

    ...

    }

    ...

    }

    常用参数

    .delay_loop  :服务轮询的时间间隔

    .lb_algo  rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法

    .lb_kind  NAT|DR|TUN:集群的类型

    .persistence_timeout  :持久连接时长

    .protocol TCP:服务协议,仅支持TCP

    .sorry_server     :所有RS故障时,备用服务器地址

    #以下配置,有几台RS就要重复配置几遍

    .real_server

    {

    weight    RS权重

    notify_up  | RS上线通知脚本

    notify_down  | RS下线通知脚本

    HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK   { ...}:定义当前主机的健康状态检测方法

    }

    KeepAlived配置检测

    .HTTP_GET|SSL_GET:应用层检测

    HTTP_GET|SSL_GET {

    url{

    path  :定义要监控的URL

    status_code  :判断上述检测机制为健康状态的响应码

    digest  :判断为健康状态的响应的内容的校验码

    }

    connect_timeout  :连接请求的超时时长

    nb_get_retry  :重试次数

    delay_before_retry  :重试之前的延迟时长

    connect_ip   :向当前RS哪个IP地址发起健康状态检测请求,分流,定义用来监控的网卡和提供服务的网卡不一样

    connect_port  :向当前RS的哪个PORT发起健康状态检测请求

    bindto   :发出健康状态检测请求时使用的源地址

    bind_port  :发出健康状态检测请求时使用的源端口

    }

    .TCP_CHECK {

    connect_ip :向当前RS的哪个IP地址发起健康状态检测请求

    connect_port :向当前RS的哪个PORT发起健康状态检测请求

    bindto  :发出健康状态检测请求时使用的源地址

    bind_port :发出健康状态检测请求时使用的源端口

    connect_timeout :连接请求的超时时长

    }

    4  案例实现

    所有实验会用到通知脚本和RS配置脚本,所以,将这两个脚本单独放置

    4.1示例通知脚本

    这里例子是发邮件的脚本,实际情况当角色发生变化的时候,需要服务器执行什么操作可以直接写入脚本里,而不仅仅是发邮件通知,从而实现其他应用的高可用。

    注意,以下的HA1和HA2表示高可用主机1和高可用主机2,和haproxy无关。HA为highavailability

    #!/bin/bash

    #

    contact='root@localhost'

    notify() {

    mailsubject="$(hostname) to be $1, vip

    floating"

    mailbody="$(date +'%F %T'): vrrp transition,

    $(hostname) changed to be $1"

    echo "$mailbody" | mail -s

    "$mailsubject" $contact

    }

    case  $1  in

    master)

    notify master

    ;;

    backup)

    notify backup

    ;;

    fault)

    notify fault

    ;;

    *)

    echo "Usage: $(basename $0)

    {master|backup|fault}"

    exit 1

    ;;

    esac

    .脚本的调用方法:

    直接写入配置文件VRRPD配置段里

    notify_master  "/etc/keepalived/notify.sh master"

    notify_backup  "/etc/keepalived/notify.sh backup"

    notify_fault   "/etc/keepalived/notify.sh fault"

    重启服务,用mail查看

    4.2 RS配置

    #!/bin/bash

    #

    #******************************************************************************

    #Author:                 Sunny

    #Date:                 2017-10-24

    #FileName:                 lvs_dr_rs.sh

    #version:                1.0

    #Your change info:

    #Description:                  For auto set RS_dr

    #DOC URL:               http://ghbsunny.blog.51cto.com/7759574/1975813

    #Copyright(C):               2017  All rights reserved

    #*****************************************************************************

    vip=172.18.50.80

    mask='255.255.255.255'

    dev=lo:1

    rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null

    service httpd start &> /dev/null && echo "The httpd Server is Ready!"

    echo "

    `hostname`

    " > /var/www/html/index.html

    case $1 in

    start)

    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig $dev $vip netmask $mask broadcast $vip up

    echo "The RS Server is Ready!"

    ;;

    stop)

    ifconfig $dev down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

    echo "The RS Server is Canceled!"

    ;;

    *)

    echo "Usage: $(basename $0) start|stop"

    exit 1

    ;;

    esac

    4.3  keepalive实现LVS高可用

    实现效果是当有请求过来时,根据轮询规则调度到后端RS,同时实现了对RS的健康性检查,同时实现VS的高可用

    拓扑图如下

    4.3.1 HA1 配置如下

    ! Configuration File for keepalived

    global_defs {

    notification_email {

    root@localhost

    }

    notification_email_from node1@localhost

    smtp_server 127.0.0.1

    smtp_connect_timeout 30

    router_id node1

    vrrp_mcast_group4 224.50.50.50

    }

    vrrp_instance VI_1 {

    state MASTER

    interface eth1

    virtual_router_id 50

    priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass sunny

    }

    virtual_ipaddress {

    172.18.50.80

    }

    notify_master "/etc/keepalived/vip1_notify.sh master"

    notify_backup "/etc/keepalived/vip1_notify.sh backup"

    notify_fault  "/etc/keepalived/vip1_notify.sh fault"

    virtual_server 172.18.50.80 80 {

    delay_loop 3

    lb_algo wrr

    lb_kind DR

    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 172.18.50.65 80 {

    weight 2

    HTTP_GET {

    url {

    path /

    status_code 200

    }

    connect_timeout 1

    nb_get_retry 2

    delay_before_retry 1

    }

    }

    real_server 172.18.50.75 80 {

    weight 1

    HTTP_GET {

    url {

    path /

    status_code 200

    }

    connet_timeout 1

    nb_get_retry 2

    delay_before_retry 1

    }

    }

    }

    }

    HA2只需调整优先级,stats 为BACKUP,网卡等相关信息,其他不变,RS配置参考3.2,注意VIP使用32位,防止路由问题,导致调度不通,然后测试

    4.4  keepalive通过fwmark实现LVS高可用

    基于fwmark双主模式的lvs集群,基于fwmark,实现双主高可用的前提下,根据防火墙prerouting链上的mark会将所有的请求均匀调度。

    4.4.1 打标签

    在两台63和73上keepalive机器上防火墙的mangle表打标签,命令如下

    iptables -t mangle -A PREROUTING -d172.18.50.80,172.18.50.90 -p tcp --dport 80 -j MARK --set-mark 6

    4.4.2 HA1 上配置

    ! Configuration File for keepalived

    global_defs {

    notification_email {

    root@localhost

    }

    notification_email_from node1@localhost

    smtp_server 127.0.0.1

    smtp_connect_timeout 30

    router_id node1

    vrrp_mcast_group4 224.50.50.50

    }

    vrrp_instance VI_1 {

    state MASTER

    interface eth1

    virtual_router_id 50

    priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass sunny

    }

    virtual_ipaddress {

    172.18.50.80

    }

    notify_master "/etc/keepalived/vip1_notify.sh master"

    notify_backup "/etc/keepalived/vip1_notify.sh backup"

    notify_fault  "/etc/keepalived/vip1_notify.sh fault"

    }

    virtual_server fwmark 6 {

    delay_loop 3

    lb_algo wrr

    lb_kind DR

    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 172.18.50.65 80 {

    weight 1

    HTTP_GET {

    url {

    path /

    status_code 200

    }

    connect_timeout 1

    nb_get_retry 2

    delay_before_retry 1

    }

    }

    real_server 172.18.50.75 80 {

    weight 1

    HTTP_GET {

    url {

    path /

    status_code 200

    }

    connet_timeout 1

    nb_get_retry 2

    delay_before_retry 1

    }

    }

    }

    4.4.3 配置RS1和RS2,参考3.2,然后进行测试

    4.5keepalive实现Nginx高可用

    .keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

    .vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外

    .track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script

    .分两步:(1)先定义一个脚本;(2)调用此脚本。

    vrrp_script   {

    script " " #这里写脚本的真实路径,也可以是bash命令

    interval INT  #多久执行一次脚本

    weight  -INT #当主服务异常,把之前定义的vrrp权重减掉多少,减少得比backup的值还低,这样就可以实现对别得应用的高可用性的支持

    }

    track_script {

    #以下是调用脚本,这里相当于是虚拟路由器的代码段

    SCRIPT_NAME_1

    SCRIPT_NAME_2

    }

    示例:高可用nginx服务

    两台nginx服务器上分别安装keepalive,通过脚本检查keepalive和nginx是否存在,实现高可用。

    一般只有一台keepalive的级别高,所以该机器的nginx起作用,负责调度,当nginx异常,权重减去20后,备用的keepalive起作用,备用机器删的nginx接管工作。后端的RS是定义在nginx的http配置段里

    chk_down的函数作用是检查/etc/keepalived/down文件存在时,就返回1,就将keepalive权重减去20。vip将配置到另一台主机,使得备用主机生效。当/etc/keepalived/down删掉后,该主机的优先级就会自动加上20.重新抢占vip。

    chk_nginx的函数作用是检查nginx是否正常运行,当nginx异常时,就将keepalive优先级减去20。vip将配置到另一台主机,使得另一台的keepalive生效当nginx重新工作后,该主机的优先级就会自动加上20.重新抢占vip。

    4.5.1 HA1配置如下

    ! Configuration File for keepalived

    global_defs {

    notification_email {

    root@localhost

    }

    notification_email_from node1@localhost

    smtp_server 127.0.0.1

    smtp_connect_timeout 30

    router_id node1

    vrrp_mcast_group4 224.50.50.50

    }

    vrrp_script  chk_down {

    script "[[ -f  /etc/keepalived/down ]] && exit 1 || exit 0"

    interval  1

    weight  -20

    }

    vrrp_script  chk_nginx {

    script "killall -0 nginx && exit 0 || exit 1"

    interval 1

    weight  -20

    fall 2

    rise 1

    }

    vrrp_instance VI_1 {

    state MASTER

    interface eth1

    virtual_router_id 50

    priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass sunny

    }

    virtual_ipaddress {

    172.18.50.80

    }

    notify_master "/etc/keepalived/vip1_notify.sh master"

    notify_backup "/etc/keepalived/vip1_notify.sh backup"

    notify_fault  "/etc/keepalived/vip1_notify.sh fault"

    track_script {

    chk_down

    chk_nginx

    }

    }

    4.5.2 nginx 配置如下

    http{

    ......

    upstream websrvs {

    server 172.18.50.75:80 weight=1;

    server 172.18.50.65:80 weight=2;

    server 127.0.0.1:8000 backup;

    }

    ......

    }

    server {

    .....

    location / {

    proxy_pass http://websrvs;

    }

    ......

    }

    4.5.3 测试

    创建/etc/keeplived/down文件以及关闭keepalive查看实验

    相关文章

      网友评论

          本文标题:Keepalive 之 高可用实现

          本文链接:https://www.haomeiwen.com/subject/zssnpxtx.html