基于KeepAlived双主模型的高可用LVS的实现


简介

KeepAlived是网络协议VRRP(Virtual Route Redundancy Protocol 虚拟路由冗余协议)协议的实现。
KeepAlivedLinux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。具体来说,其作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,KeepAlived将会检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后KeepAlived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
KeepAlived的工作原理
通过了解VRRP协议来了解KeepAlived的工作原理。
VRRP协议:Virtual Route Redundancy Protocol 虚拟路由冗余协议。是一种容错协议,保证当主机的下一跳路由出现故障时,由另一台备用路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。这些路由器组成了一个虚拟路由器,其中包含一个Master 路由器和多个 Backup 路由器。主机将虚拟路由器当作默认网关。一个虚拟路由器可以拥有一个或多个IP 地址。


实验实现基于KeepAlived双主模型的高可用LVS

需求分析

如下图所示

基于KeepAlived双主模型的高可用LVS的实现.jpg
FQDN IP
images.king.com VIP1
192.168.1.100
app.king.com VIP2
192.168.1.200

当客户端访问images.king.com的时候,是通过VIP1访问,最终后端提供服务的是WEBSRV1和WEBSRV2;当客户端访问app.king.com的时候,是通过VIP2访问,后端提供服务的是WEBSRV3和WEBSRV4。当用户访问其中一个站点的时候,单个LVS服务器可以提供负载均衡,将前端的请求调度到后端的两台WEBSRV上,但是一台LVS无法避免单点失败的问题,所以考虑用两台LVS服务器配合KeepAlived来实现高可用性。同时,企业提供两个站点的服务,如果每个站点都采用两台LVS来实现高可用性,那么需要四台LVS,成本比较高,而且正常情况下,有两台LVS服务器处于空闲中。可以考虑采用KeepAlived + LVS 双主模型的方式来实现这种需求。
双主模型。即针对VIP1,LVS1是MASTER,LVS2是BACKUP,此时,VIP1漂在LVS1上面,LVS1负责调度后端的WEBSRV1和WEBSRV2。针对VIP2,LVS2是MASTER,LVS1是BACKUP,此时,VIP2漂在LVS2上面,LVS2负责调度后端的WEBSRV3和WEBSRV4。当LVS1或者LVS2服务器出现故障的时候,那么此时出故障的LVS上面的VIP将漂移到另一台LVS上面,并且原来负责的两台后端WEBSRV将由正常的LVS接管。这就是大致的实现过程。

实验环境准备

确保所有虚拟机(centos7.3)上面的防火墙和selinux处于关闭状态。
各节点时间必须同步
找一台机器A与国内一台常用的NTP服务器同步时间,企业里面其他的机器与A机器同步时间。
各节点之间通过主机名互相通信,建议使用/etc/hosts文件实现
各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信

实验过程

一、配置客户端CLIENT

vim /etc/hosts
# 添加下面两行
192.168.1.100     images.king.com
192.168.1.200     app.king.com

二、在WEBSRV1和WEBSRV2上面
WEBSRV2的配置和WEBSRV1的配置大致相同,下面以WEBSRV1为例介绍一下。

# 如果没有安装httpd就安装
yum install httpd
# 启动服务
systemctl start httpd
# 准备页面,如果是WEBSRV2,就把WEBSRV1 改为WEBSRV2
echo "WEBSRV1 images" > /var/www/html/index.html
# 准备RS脚本
vim lvs_dr_rs.sh
#!/bin/bash
vip=192.168.1.100
mask='255.255.255.255'
dev=lo:1
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
    route add -host $vip dev $dev
    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
# 执行RS脚本
bash lvs_dr_rs.sh start
# 查看回环网卡上面是否绑定了vip  192.168.1.100
ip a

三、在WEBSRV3和WEBSRV4上面
WEBSRV4的配置和WEBSRV3的配置大致相同,下面以WEBSRV3为例介绍一下。

# 如果没有安装httpd就安装
yum install httpd
# 启动服务
systemctl start httpd
# 准备页面,如果是WEBSRV4,就把WEBSRV3 改为WEBSRV4
echo "WEBSRV3 app" > /var/www/html/index.html
# 准备RS脚本
vim lvs_dr_rs.sh
#!/bin/bash
vip=192.168.1.200
mask='255.255.255.255'
dev=lo:1
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
    route add -host $vip dev $dev
    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
# 执行RS脚本
bash lvs_dr_rs.sh start
# 查看回环网卡上面是否绑定了vip 192.168.1.200
ip a

四、配置LVS1的KeepAlived

# 安装ipvsadm,用于查看ipvs规则
yum install ipvsadm 
# 查看一下,目前来说是空的
ipvsadm -Ln
# 安装KeepAlived
yum install keepalived
# 配置keepalived
cat /etc/keepalived/keepalived.conf
! 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.100.100.100
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 411fa9f6
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.100 80 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.14 80 {
        weight 2
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.15 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 66
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.200 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.16 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.66 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}
# MASTER和BACKUP切换的邮件通知脚本
cat /etc/keepalived/notify.sh
#!/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
# keepalived记录日志 ,修改/etc/sysconfig/keepalived对应的行
KEEPALIVED_OPTIONS="-D -S 2" 
# 在/etc/rsyslog.conf添加一行
local2.*                /var/log/keepalived.log
# 重启日志服务
systemctl restart rsyslog
# 准备sorry server
yum install httpd
systemctl start httpd
echo sorry,server > /var/www/html/index.html
# 启动keepalived服务
systemctl start keepalived

五、配置LVS2的KeepAlived
LVS2的配置大致和LVS1相同,主要是KeepAlived的配置不同,现将KeepAlived的配置说明如下。

cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from node2@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2 
   vrrp_mcast_group4 224.100.100.100
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 411fa9f6
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.100 80 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.14 80 {
        weight 2
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.15 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.200 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.16 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.66 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

六、在CLIENT上进行测试
测试一:
for i in {1..15};do curl images.king.com; done
for i in {1..15};do curl app.king.com; done
按照调度算法正常进行服务调度。
测试二:
for i in {1..50};do sleep 0.5; curl images.king.com;done
for i in {1..50};do sleep 0.5; curl app.king.com;done
断开LVS1或者LVS2的网络,两个站点依然正常访问。
此时,VIP1和VIP2集中在一台正常工作的LVS上面。
测试三:
for i in {1..50};do sleep 0.5; curl images.king.com;done
停掉WEBSRV1或者WEBSRV2,images.king.com站点依然可以正常访问。
for i in {1..50};do sleep 0.5; curl app.king.com;done
停掉WEBSRV3或者WEBSRV4,app.king.com站点依然可以正常访问。
测试四:
for i in {1..50};do sleep 0.5; curl images.king.com;done
把WEBSRV1和WEBSRV2的httpd服务都停掉,发现显示的是sorry,server,前端调度器充当了WEBSRV。
for i in {1..50};do sleep 0.5; curl app.king.com;done
把WEBSRV3和WEBSRV4的httpd服务都停掉,发现显示的是sorry,server,前端调度器充当了WEBSRV。


至此,实验介绍结束,不足之处,请多指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,961评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,444评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,009评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,082评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,101评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,271评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,738评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,395评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,539评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,434评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,481评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,160评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,749评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,816评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,038评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,548评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,140评论 2 341

推荐阅读更多精彩内容