keepalived
HA的解决方案的两大流派分为heartbeat、corosync和keepalived
keepalived在诞生时被赋予的使命仅仅是为lvs的director的HA、生成ipvs规则和监控后端主机的健康状况
keepalived是可以模拟并以进程的方式实现vrrp协议,并以此协议进行工作的HA解决方案
vrrp:虚拟冗余路由协议
vrrp的工作方式:将两个或两个以上的物理路由设备定义成一个虚拟的路由器,这种方式称作为一个路由组,这组路由设备共同构建成为一个虚拟的路由,在此路由上配置一个VIP和与此VIP相对应的VMAC,在此路由组中,每个路由器都有自己的优先级,当路由器开启时都会自我初始化,然后发送广播通告路由组中的所有路由器自己的优先级,以此推选出主节点MASTER和备用节点BACKUP级别的路由器,只有当主节点故障或优先级降低时才会通告其他节点,然后其他节点再次通过比较优先级推选出另外一个主节点,另外一个主节点会去夺取之前主节点的IP地址等信息
在keepalived中有三种节点类型:
MASTER:主节点类型
BACKUP:备用节点类型
Initialized:表初始化
下面是keepalived的常用案例:
案例环境:
主节点:172.16.25.1
从节点:172.16.25.2
先在两台节点上安装keepalived程序包
这里使用yum的方式安装
#yum install keepalived
两台主机都安装完以后,开始我们的案例
1、先做简单的主从节点
主节点配置:
编辑keepalived的配置文件,在编辑之前先将此文件备份,以免以后使用 [root@localhost keepalived]# vim keepalived.conf 在此文件中暂时没用的信息都删除,然后开始定义所需的配置,这里我们开始直接进行定义 vrrp_instance VI_1 { state MASTER //表示设置此主机的节点信息为主节点 interface eth0 //表示使用eth0网卡 virtual_router_id 51 //默认的id号 priority 100 //优先级为100 advert_int 1 //表示发送自己在线信息,两节点的时间必须一样 authentication { //表示设置认证方式 auth_type PASS auth_pass 1111 } virtual_ipaddress { //表示设置一个虚拟的IP地址 172.16.25.30 } }
从节点配置:
编辑keepalived的配置文件 [root@localhost keepalived]# vim keepalived.conf 在此文件中暂时没用的信息都删除,然后开始定义所需的配置,这里我们开始直接进行定义 vrrp_instance VI_1 { state BACKUP //表示设置此主机的节点信息为备节点 interface eth0 //表示使用eth0网卡 virtual_router_id 51 //默认的id号 priority 99 //优先级为99 advert_int 1 //表示发送自己在线信息,两节点的时间必须一样 authentication { //表示设置认证方式 auth_type PASS auth_pass 1111 } virtual_ipaddress { //表示设置一个虚拟的IP地址 172.16.25.30 } }
这样两节点的主备配置就已完成,然后启动服务,就可以测试了 [root@localhost keepalived]# service keepalived restart 启动完以后,将主节点的服务停掉,然后查看备节点的情况 [root@localhost keepalived]# service keepalived stop 然后在备节点使用ip addr show查看刚才设定的IP是否已经从主节点上获取到备节点上;从中可以看出备节点上已经得到了IP [root@localhost keepalived]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:62:4d:37 brd ff:ff:ff:ff:ff:ff inet 172.16.25.2/16 brd 172.16.255.255 scope global eth0 inet 172.16.25.30/32 scope global eth0 如果再把主节点启动起来的话,因为主节点的优先级大于从节点,主节点就会把IP夺回自己的主机
2、双主模型
只需要在两台主机的刚才的配置文件中再添加配置定义信息即可
在主节点配置:
[root@localhost keepalived]# vim keepalived.conf vrrp_instance VI_2 { //改下次名称 state BACKUP interface eth0 virtual_router_id 61 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { //设置第二个虚拟IP为60 172.16.25.60 } }
在从节点配置:
vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 61 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.60 } }
配置完以后将两主机的服务都重新启动,然后都使用ip addr show命令查看配置结果
会发现在主节点上会得出172.16.25.30的IP地址;而在从节点上会看出有172.16.25.60的IP地址
2、使用自定义脚本监控设定当主节点所设定的服务出现问题时自动切换到备用节点
在/usr/share/doc/keepalived-1.2.7/目录下有一个名叫keepalived.conf.vrrp.localcheck的文件,里面存放有运行实例
定义检测脚本:
使用单独的配置段定义检测机制
vrrp_script CHK_NAME { script "/path/to/somefile.sh" //检测的方式 interval # //表示检测的间隔时间,单位为秒钟 weight -5 //表示当检测失败时,此主机的优先级减去5 fall 3 //表示当检测失败时,再检测3次 rise 1 // 从正常到失败要检测几次,一般来说1次即可 定义完成以后,要在实例调用定义的检测机制,才能生效 vrrp_instance NAME { track_script { CHK_NAME } }
使用示例:
主节点配置:
在两节点上都安装nginx程序,保证nginx运行无误后,配置keepalived
编辑配置文件,在global_defs下面定义内容 vrrp_script chk_nginx { script "killall -0 nginx" //表示检测此进程是否运行,killall -0 nginx表示此进程的是否运行,使用此命令不会打印到屏幕信息,使用echo $?查看状态返回值 interval 1 //检测间隔时间为1秒 weight -5 //检测失败时优先级减5 fall 2 //检测失败时再检测2次 rise 1 //从正常到失败要检测1次 } 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 { 172.16.25.30 } track_script { //调用定义机制 chk_nginx } notify_master "/etc/rc.d/init.d/nginx start" //调用信息 notify_backup "/etc/rc.d/init.d/nginx stop" notify_fault "/etc/rc.d/init.d/nginx stop" }
备用节点配置:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.30 } track_script { chk_nginx } notify_master "/etc/rc.d/init.d/nginx start" notify_backup "/etc/rc.d/init.d/nginx stop" notify_fault "/etc/rc.d/init.d/nginx stop" } 两节点都配置完后,便可进行测试。为了让测试结果更加信息,可以把主从节点的nginx的主页设置不同,以便区分,然后关闭两个节点的其中一个,再使用浏览器访问虚拟IP,查看得到的结果,这里测试步骤不在做演示。 vrrp_script chk_sched_down { //表示当需要自己手动调试keepalived,可使用此方法 script "[ -e /etc/keepalived/down ] && exit 1 || exit 0 " //表示当此文件存在时便显示失败,不存在则显示成功 interval 2 //失败后检查2秒 weight -50 //优先级减50 fall 2 //检测失败时再检测2次 rise 1 //从正常到失败要检测1次 }
然后在使用track_script调用定义便可,然后再从节点配置相同内容;配置完成后查看配置结果,然后再/etc/keepalived/下创建一个down文件,便发现在此节点上的keepalived下线了。
3、使用DR模型构建一个real_server
172.16.25.1:主节点
172.16.25.2:备节点
172.16.25.3:real_server
172.16.25.3配置
创建一个目录 [root@www ~]# mkdir -pv /web/htdocs/a 并添加一个页面文件 [root@www ~]# vim /web/htdocs/a/index.html 配置httpd的主配置文件 [root@www ~]# vim /etc/httpd/conf/httpd.conf <VirtualHost *:80> DocumentRoot /web/htdocs/a ServerName www1.how.com </VirtualHost> 更改内核信息 [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 设置路由[root@www ~]# ifconfig lo:0 172.16.25.30 netmask 255.255.255.255 broadcast 172.16.25.30 up [root@www ~]# route add -host 172.16.25.30 dev lo:0
172.16.25.1配置
将之前配置的文件删除,并复制最开始的配置文件 [root@localhost keepalived]# cp keepalived.bak keepalived.conf 配置此文件[root@localhost keepalived]# vim keepalived.conf 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 { 172.16.25.30 } } virtual_server 172.16.25.30 80 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.0.0 protocol TCP real_server 172.16.25.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } } } 安装ipvsadm [root@localhost keepalived]# yum install ipvsadm [root@localhost keepalived]# ipvsadm -L -n
172.16.25.2配置
[root@localhost keepalived]# cp keepalived.bak keepalived.conf [root@localhost keepalived]# vim keepalived.conf vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.25.30 } } virtual_server 172.16.25.30 80 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.0.0 protocol TCP real_server 172.16.25.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } } } 配置完后主备节点都重启keepalived服务 [root@localhost keepalived]# service keepalived restart
配置完使用浏览器查访问虚拟IP地址,可看到已经得到了172.16.25.3的http页面