标签:
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将把服务器从服务器群中剔除。
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个不同的进程。父进程来监控两个子进程,一个子进程负责VRRP另一个负责健康检查。另外拆分的设计亦可以降低软件的故障率。父进程被称作看门狗,父进程通过套接字周期性(5s)的发送hello消息给子进程,来判断子进程是否正常。如果失败就重启子进程。
Netlink是套接字家族中的一员,主要用内核与用户空间的进程间、用户进程间的通讯。
IPVS IP虚拟主机,配置LVS使用。
http://www.keepalived.org/documentation.html
一个功能比较完整的 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
健康检查方式有: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
}
在该场景中,在台主机一台作为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地址。
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隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。
这里我们采用了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
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
标签:
原文地址:http://www.cnblogs.com/scguo/p/4292531.html