理论部分:
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 { [email protected] } notification_email_from [email protected] 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 { [email protected] } notification_email_from [email protected] 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 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 } 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命令查看邮件是否收到。这里只是发给本机。
根据节点状态切换可以触发某一个操作,就可以定义自己的脚本来完成很多任务,想向空间无限大!!!