Keepalive 之 高可用实现

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查看实验

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

推荐阅读更多精彩内容