您的位置:首页 > 运维架构 > 网站架构

keepalived实现lvs双主架构及状态切换的通知

2014-09-20 12:17 706 查看
理论部分:keepalived:为lvs开发的(director: HA ipvs rules, health check),能够为LVS生成规则,并检测后部real server的健康状态。主要是在两个或多个节点上实现vrrp协议选举机制。主节点称为Master,从节点称为Backup。它也可以为其它服务做高可用。vrrp 虚拟冗余路由协议 (virtual redundent routing protocol),在两台或多台设备上配置同一个虚拟IP地址和虚拟MAC地址,在实际工作时,这些设备根据某种法则选举出一个主设备,当主设备故障时,其它设备会再根据某种法则选举出另一个主设备。这样在一台节点挂掉后,会有从节点设备顶上,就实现了路由设备的高可用。客户端需要把网关配置成虚拟IP就可以。Keepalived在配置好所的节点同时启动时,所有节点都工作在从节点模式,这时都无法响应请求,所有节点会根据事先定义的优先级来计算出那个节点是主节点。优先级从1到255间的数值,数据越大优先级越高。当选举了主节点后,主节点才可以响应用户的请求。不过只有主节点才可以响应用户的请求。在选举主节点的过程中,如果大家的优先级一样,就会根据各自的IP来比较,IP大的优先级高。选举出主节点后,主节点会每隔一定的时间向其它备节点通告心跳信息,通告时会带有优先级。从节点在收到通告后,会拿到通告中的优先级和自己的优先级做比较,一但发现自己的优先级比心跳信息中的优先级高,就会取而代之成为主节点。当挂掉的主节点重新上线,这时是否会把主节点抢过来,就需要事先定义Keepalived是否为抢占模式preempt 抢占模式和nopreempt 非抢占模式。在虚拟IP切换时会有切换时间,切换过程中会造成无法响应客户端的请求。因为一个虚拟IP同时只能让一台设备工作,从设备只能做备份,为了让从也备也分摊一部分流量可以做多组虚拟IP。每个设备都是主节点,所有节点间相互做备份。每组虚拟路由间用虚拟路由器标示(VRID)。VRID用数据标识,1到255之间的数字。Keepalived软件的组件IPVS:用来和ipvs接口交互的工具,为ipvs应用生成的规则。NETLINK:通过NETLINK组件来配置网络接口,和监控网络接口。IPVS wrapper:为ipvs生成规则,并借助Checkers监视后端的real server。Nnetlink Reflector:向其它节点发送通告信息VRRP Stack:Keepalived的VRRP实现Checkers:用来为ipvs生成的规则中的各real server健康状态检测的。可以基于tcp检测,可以根据应用层协议检测。WatchDog:用来检测Keepalive各个工作组件的健康状态。各个组件会每隔一定的时间向WatchDog通告下自己,如果长时间没有收到通告,WatchDog会重启这个没有发送通告的组件。它存在的主要是用来实现不会因为Keepalived内部问题导致集群不正常。Keepalived 是一个轻量级调度器,适用场景:lvs , nginx代理,haproxy代理。节点的状态:master 主节点状态backup 从状态Initialized 初始化状态,keepalived服务刚启动时的状态。-------------------------------------------------------------------------------------------操作部分-------------------------------------------------------------------------------------------实验拓扑图实验环境: 1,4台服务器操作系统为centos6.5。 2,两台webserver为httpd,使用yum安装。并且测试可以正常访问web服务。 3,两台lvs节点keepalived使用yum安装。 4,lvs使用dr模式工作。 5,客户机是一台win8。 6,每个lvs节点定义sorry server为本机。实验目标: 1,使用keepalived实现lvs的高可用,并且监测后端real server的健康状态。 2,了解keepalived的工作原理和适用场景。-------------------------------------------------------------------------------------------配置大体过程: 1,为两台web服务器安装启动httpd服务,并配置vip。 2,为两台lvs服务器安装并配置keepalived。 3,测试各个配置是否正常工作 4,为两台keepalived配置状态切换后的报警机制-------------------------------------------------------------------------------------------首先保证两台服务器web访问正常,sorry server也可以正常作。为两台web服务器分别配置vip,先定义linux内核对于arp协议的响应方式。
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
配置虚拟ip,并且指定请求是那个Ip,响应时就使用那个ip响应。
# ifconfig lo:0 192.168.1.16 netmask 255.255.255.255 broadcast 192.168.1.16
# ifconfig lo:1 192.168.1.18 netmask 255.255.255.255 broadcast 192.168.1.18
# route add -host 192.168.1.16 dev lo:0 # route add -host 192.168.1.18 dev lo:1
注意: 为了重启后配置生效,需要把这些写到配置文件中。或都写一个脚本,开机自动设定配置信息也可。为两台lvs服务器分别安装keepalived,并且编辑配置文件。
# yum -y install keepalived
第一个lvs的主配置文件内容如下。
! Configuration File for keepalived

global_defs {
notification_email {
admin@wukui.com
}
notification_email_from lvsadmin@wukui.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DIRECTOR
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.16/24
}
}

virtual_server 192.168.1.16 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
net_mask 255.255.255.0

real_server 172.16.2.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.2.17 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
}

vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 2
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.18/24
}
}

virtual_server 192.168.1.18 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 1
protocol TCP
sorry_server 127.0.0.1 80
net_mask 255.255.255.0
real_server 172.16.2.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.2.17 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
}
第二个lvs节点配置内容如下
! Configuration File for keepalived

global_defs {
notification_email {
admin@wukui.com
}
notification_email_from lvsadmin@wukui.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DIRECTOR
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.16/24
}
}

virtual_server 192.168.1.16 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
net_mask 255.255.255.0

real_server 172.16.2.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.2.17 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
}

vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 2
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.18/24
}
}

virtual_server 192.168.1.18 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 1
protocol TCP
sorry_server 127.0.0.1 80
net_mask 255.255.255.0
real_server 172.16.2.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.2.17 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
}
}
}
LVS两台节点配置好Keepalived后分别启动。启动命令:

# service keepalived start
注:keepalived启动后的详细工作日志都记录在/var/log/messages中。可以使用tail -f /var/log/messages 监视。
keepalived启动后开启做相应的测试工作:
1,关闭其中一台keepalived服务,到另一台节点上查看是否把资源转移到了本机上。查看方法:
使用:ip addr show 命令来查看vip是否配置在本地,或查看日志的详细记录
2,在客户端浏览器分别访问 192.168.1.16 和 192.168.1.18 ,确定可以访问到。按上面的配置,lvs负载均衡有持久会话,所以大概在一分钟以内同一个客户端会一直打开一个real server的页面。
3,把后端所有real server 服务器的httpd进程关闭,然后再访问vip,测试 sorry server是否可以正常工作。
在上面的配置中还没有加入keepalived主从切换或都出现错误的报警通知。需要再两台节点的主配置文件中每个实例中加入以下配置。这个配置根据实际情况是否需要来配置。很多情况下,监控软件定义发送邮件报警级别设置不当,导致我们运维人员收到的邮件过多,看不过来还不如不报警呢!下面为示例:
vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 2priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.18/24}notify_master "/bin/echo '节点1状态切换到master' | mail -s '节点1状态切换' root@localhost"notify_backup "/bin/echo '节点1状态切换到backup' | mail -s '节点1状态切换' root@localhost"notify_fault "/bin/echo '节点1状态切换到fault' | mail -s '节点1状态切换'root@localhost"}
    测试,在命令行中使用mail命令查看邮件是否收到。这里只是发给本机。
    根据节点状态切换可以触发某一个操作,就可以定义自己的脚本来完成很多任务,想向空间无限大!!!

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息