码迷,mamicode.com
首页 > 其他好文 > 详细

KeepAlived

时间:2015-02-15 10:41:11      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

1 介绍

KeepAlived是一个路由软件,可以工作在IP/TCP协议栈的IP层,TCP层,及应用层,来检查机器的可用性,端口的可用性,以及服务的可用性。

Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

2 安装

yum install ipvsadm
tar -zxvf keepalived-1.2.9.tar.gz
./configure --prefix=/usr/local/keepalived 
make
make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
chmod +x /etc/init.d/keepalived
# 修改/etc/init.d/keepalived, 寻找大约15行左右的. /etc/sysconfig/keepalived, 
# 修改为: . /usr/local/keepalived/etc/sysconfig/keepalived, 即指向正确的文件位置
PATH="$PATH:/usr/local/keepalived/sbin"
# 修改/usr/local/keepalived/etc/sysconfig/keepalived文件,设置正确的服务启动参数 
KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf"
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
echo "1" > /proc/sys/net/ipv4/ip_forward
service keepalived restart
#开机自动运行
chkconfig keepalived on
3 软件设计

技术分享

为了确保鲁棒性和稳定性,守护进程被分成3个不同的进程。父进程来监控两个子进程,一个子进程负责VRRP另一个负责健康检查。另外拆分的设计亦可以降低软件的故障率。父进程被称作看门狗,父进程通过套接字周期性(5s)的发送hello消息给子进程,来判断子进程是否正常。如果失败就重启子进程。

Netlink是套接字家族中的一员,主要用内核与用户空间的进程间、用户进程间的通讯。

IPVS IP虚拟主机,配置LVS使用。

http://www.keepalived.org/documentation.html

4 配置文件说明

4.1 配置详解

一个功能比较完整的 keepalived 的配置文件,其配置文件 keepalived.conf 可以包含三个文本块:全局定义块、VRRP 实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须 VRRP 实例定义块。

#全局定义块 

global_defs { 

    notification_email { 

    email 

    email 

} 

notification_email_from email 

    smtp_server host 

    smtp_connect_timeout num 

    lvs_id string 

}

1) email 通知。作用:有故障,发邮件报警。这是可选项目,建议不用,用 nagios 全面监控代替之。

2) Lvs 负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。

3) 花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived 运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

#VRRP 实例定义块 

vrrp_sync_group string { 

    group { 

        string 

        string 

    } 

}

vrrp_instance string { 

    state MASTER|BACKUP 

    interface string 

    mcast_src_ip @IP 

    lvs_sync_daemon_interface string 

    virtual_router_id num 

    priority num 

    advert_int num 

    smtp_alert 

    authentication { 

        auth_type PASS|AH 

        auth_pass string 

    } 

    virtual_ipaddress { 
        # Block limited to 20 IP addresses

        @IP 

        @IP 

        @IP 

    } 

    virtual_ipaddress_excluded { 
        # Unlimited IP addresses number 

        @IP 

        @IP 

        @IP 

    }

}

1) 同步 vrrp 组 vrrp_sync_group。作用:确定失败切换(FailOver)包含的路由实例个数。即在有 2 个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些示例,用于配置多个VRRP实例,从而能实现双主模式等。

2) 实例组 group.至少包含一个 vrrp 实例

3) Vrrp 实例 vrrp_instance.实例名出自实例组 group 所包含的那些名字。

a) 实例状态 state.只有 MASTER 和 BACKUP 两种状态,并且需要大写这些单词。其中MASTER 为工作状态,BACKUP 为备用状态。当 MASTER 所在的服务器失效时,BACKUP 所在的系统会自动把它的状态有 BACKUP 变换成 MASTER;当失效的MASTER 所在的系统恢复时,BACKUP 从 MASTER 恢复到 BACKUP 状态

b) 通信接口 interface。对外提供服务的网络接口,如 eth0,eth1.当前主流的服务器都有2 个或 2 个以上的接口,在选择服务接口时,一定要核实清楚

c) lvs_sync_daemon_inteface。负载均衡器之间的监控接口,类似于 HA HeartBeat的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface 与服务接口 interface 使用同一个网络接口

d) 虚拟路由标识 virtual_router_id.这个标识是一个数字,并且同一个 vrrp 实例使用唯一的标识。即同一个 vrrp_stance,MASTER 和 BACKUP 的 virtual_router_id 是一致的,同时在整个 vrrp 内是唯一的

e) 优先级 priority.这是一个数字,数值愈大,优先级越高。在同一个 vrrp_instance里,MASTER 的优先级高于 BACKUP。若 MASTER 的 priority 值为 150,那么 BACKUP的 priority 只能是 140 或更小的数值

f) 同步通知间隔 advert_int .MASTER 与 BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒

g) 验证 authentication。包含验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用的类型为 PASS,据说 AH 使用时有问题。验证密码为明文,同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信

4) 虚拟 ip 地址 virtual_ipaddress . 可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个 ip 必须与我们在 lvs 客户端设定的 vip 相一致

#虚拟服务器定义块

virtual_server (@IP PORT)|(fwmark num) {

delay_loop num

lb_algo rr|wrr|lc|wlc|sh|dh|lblc

lb_kind NAT|DR|TUN

(nat_mask @IP)

persistence_timeout num

persistence_granularity @IP

virtualhost string

protocol TCP|UDP

sorry_server @IP PORT

real_server @IP PORT {

weight num

TCP_CHECK {

connect_port num

connect_timeout num

}

}

real_server @IP PORT {

weight num

MISC_CHECK {

misc_path /path_to_script/script.sh

(or misc_path “/path_to_script/script.sh <arg_list>”)

}

}

real_server @IP PORT {

weight num

HTTP_GET|SSL_GET {

url { # You can add multiple url block

path alphanum

digest alphanum

}

connect_port num

connect_timeout num

nb_get_retry num

delay_before_retry num

}

}

}

1) 虚拟服务器 virtual_server. 这个 ip 来自于 vrrp 定义块的第“4”步,后面一个空格,然后加上端口号。定义一个vip,可以实现多个 tcp 端口的负载均衡功能。

a) delay_loop。健康检查时间间隔,单位是秒。

b) lb_algo. 负载均衡调度算法,互联网应用常使用 wlc或 rr。常用调度算法参考http://www.linuxany.com/archives/1270.html

c) lb_kind. 负载均衡转发规则。一般包括 DR,NAT,TUN3 种,在我的方案中,都使用DR 的方式。

d) persistence_timeout.会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个 lvs 环境,使用 DR 转发模式,真实服务器有 3 个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第 2次的请求转发到其他的服务器。

e) 转发协议 protocol.一般有 tcp 和 udp两种。实话说,我还没尝试过 udp协议类的转发。

2) 真实服务器 real_server.也即服务器池。Real_server的值包括 ip地址和端口号。多个连续的真实 ip,转发的端口相同,是不是可以以范围表示?需要进一步实验。如写成real_server 61.135.20.1-10 80 .

a) 权重 weight.权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。

b) Tcp检查 tcp_check

4.2 健康检查方式

健康检查方式有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK。

HTTP_GET|SSL_GET {

url { #HTTP|SSL检查的URL ,这里可以指定多个URL

path / #URL后的路径

digest <STRING> #SSL检查后的摘要信息(通过genhash算出)

}

connect_port 444 #检查的端口

connect_timeout 3 #连接超时3秒

nb_get_retry 3 #重连次数3次

delay_before_retry 3 #重新连接间隔时间3秒

}

SMTP_CHECK { #使用SMTP_CHECK方式检查

connect_timeout 10 #连接超时3秒

retry 2 #重连次数3次

delay_before_retry 5 #重新连接间隔时间3秒

helo_name "foo.bar.com" #“smtp HELO”请求命令的参数,可选。

host {

connect_ip 172.16.1.12 #需要检查的IP

connect_port 25 #需要检查的端口

bindto 172.16.1.2 #以此地址发送请求对服务器进行健康检查

}

}

MISC_CHECK { #使用MISC_CHECK方式检查

misc_path “/usr/local/bin/script.sh arg1 arg2” #外部程序或者脚本的路径和参数

misc_timeout 5 #脚本或程序超时时间

misc_dynamic #这个参数的设置,将利用healthchecker程序的退出状态码来动态调整服务器的权重。返回0:健康检查OK,权重保持。返回1:健康检查失败,权重设为0。返回2-255:健康检查OK,权重设置为:退出状态码-2。如返回255,那么权重为255-2=253

}

5 场景模拟

5.1 KeepAlived用于单点备份

技术分享

在该场景中,在台主机一台作为master,一台作为backup,正常情况下由master主机提供服务,当master主机发生故障时,backup接管master主机来提供服务,当master主机恢复时,继续由master主机来提供服务。

MASTER配置如下:real_server为10.10.104.16上部署的一台http服务器

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from root@localhost

smtp_server localhost

smtp_connect_timeout 30

router_id LVS_DEVEL_OSSP

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.10.104.231/24

}

}

BACKUP仅修改state 为BACKUP、priority 为90

验证:

1 查看MASTER的ip 地址信息

技术分享

2 查看BACKUP的ip地址信息

技术分享

3 通过客户端访问页面查看10.10.104.231对应的MAC地址

技术分享

可以观察到虚拟ip 10.10.104.231对应的mac地址为master主机的mac地址

4 关闭MASTER上的keepalived后MASTER的ip 地址信息

技术分享

可以观察到主节点不在绑定虚拟ip

5 关闭MASTER上的keepalived后BACKUP的ip 地址信息

技术分享

可以观察到备份节点绑定了虚拟ip

6 通过客户端访问页面查看10.10.104.231对应的MAC地址

技术分享

可以观察到虚拟IP对应的MAC地址为BUCKUP节点的MAC地址。

5.2 KeepAlived+LVS实现高可用

5.2.1 LVS简介

LVS虚拟服务器的体系结构如图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检 测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。

技术分享

LVS有三种工作模式

Virtual Server via Network Address Translation(VS/NAT)通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

Virtual Server via IP Tunneling(VS/TUN)采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

Virtual Server via Direct Routing(VS/DR)VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。

5.2.2 情景模拟

技术分享

5.2.2.1 配置

这里我们采用了LVS的DR模型,keepalived可以直接操作LVS。

l 4台机器均要安装ipvadm(yum install ipvadm)

l 4台主机均要关闭SELinux(setenforce 0)

l 两台WEB服务器需要安装apache或nginx等来提供HTTP服务(127.0.0.1:28899)

l MASTER机器的keepalived配置如下:

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from root@localhost

smtp_server localhost

smtp_connect_timeout 30

router_id LVS_DEVEL_OSSP

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.10.104.231/24

}

}

virtual_server 10.10.104.231 28899 {#端口号必须与真实服务的端口号相同

delay_loop 6

lb_algo rr

lb_kind DR

nat_mask 255.255.255.0

persistence_timeout 50

protocol TCP

real_server 10.10.104.6 28899 {

weight 10

TCP_CHECK {

connect_port 28899

connect_timeout 30

}

}

real_server 10.10.104.7 28899 {

weight 10

TCP_CHECK {

connect_port 28899

connect_timeout 30

}

}

}

l BACKUP仅修改state 为BACKUP、priority 为90

l 在两台WEB服务器上同时要执行LVS配置脚本:real_server.sh start

#real_server.sh

#!/bin/bash

SNS_VIP=10.10.104.231

. /etc/rc.d/init.d/functions

case "$1" in

start)

/sbin/ifconfig lo down

/sbin/ifconfig lo up

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

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

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

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

ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up

/sbin/route add -host $SNS_VIP dev lo:0

sysctl -p >/dev/null 2>&1

echo "RealServer Start OK"

;;

stop)

ifconfig lo:0 down

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

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

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

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

echo "RealServer Stoped"

;;

*)

echo "Usage: $0 {start|stop}"

exit 1

esac

exit 0

5.2.2.2 验证

l 在10.10.104.11上访问10.10.104.231:28899

技术分享

可以看到WEB2返回了服务

l 关闭WEB2服务器再次访问页面

技术分享

可以看到变成由WEB1提供服务

l 查看10.10.104.231的mac地址

技术分享

技术分享

可以看到10.10.104.231对应的mac地址为MASTER节点的MAC地址

l 开启WEB2服务器同时关闭MASTER上的Keepalived请求页面

技术分享

可通,访问的为WEB2,

l 关闭WEB2后访问页面

技术分享

可以看到变成由WEB1提供服务

l 此时查看10.10.104.231的mac地址

技术分享

技术分享

可以看到10.10.104.231对应的mac地址为BACKUP节点的MAC地址

通过上面的结果可以得到结论,这种结构下只要能保证有任意一个Keepalived节点和任意一个WEB服务器节点正常,页面10.10.104.231:28899就能提供正常的服务。

参考资料:

http://www.linuxany.com/archives/1270.html

http://www.keepalived.org/documentation.html

http://www.linuxidc.com/Linux/2012-08/69383.htm

http://www.cnblogs.com/dkblog/archive/2011/07/06/2098949.html

http://asram.blog.51cto.com/1442164/359093/

http://jilili.blog.51cto.com/6617089/1202069

http://zh.linuxvirtualserver.org/

http://www.baike.com/wiki/LVS%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1

http://michaelkang.blog.51cto.com/1553154/816292

http://www.linuxvirtualserver.org/zh/lvs1.html

KeepAlived

标签:

原文地址:http://www.cnblogs.com/scguo/p/4292531.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!