理论部分:

    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服务刚启动时的状态。

-------------------------------------------------------------------------------------------

操作部分

-------------------------------------------------------------------------------------------

实验拓扑图

spacer.gifwKiom1Qc_mii0qPQAAHEO_5QUxY750.jpg

实验环境:

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