lvs的核心就是调度器,所有客户端请求的数据都需要经过调度器进行转发,如果单一的调度器出现故障,整个集群系统将全部崩溃。所以需要使用keepalived来实现集群的高可用、高负载。

keepalived实现高可用集群的核心是VRRP协议。

VRRP协议:虚拟路由冗余协议。在keepalived正常工作时,主master会不断的通过多播方式向备节点Backup发送心跳信息,用以告诉备节点自己还活着,仍然在提供服务。当主节点故障时,无法发送信息,备节点收不到来自主节点的心跳信息,认为主节点故障,将根据优先级调用自身的接管程序接管主Master的IP资源及服务,当主节点恢复时,备节点又会释放自己接管的IP资源及服务,恢复到原来的备用角色。

VRRP选举机制:优先级越大,选举几率越高。/etc/keepalived/keepalived.conf配置priority参数。

测试环境如下:

keepalived主机: 192.168.6.142
keepalived备机: 192.168.6.152
http服务器1:     192.168.6.147
http服务器2:     192.168.6.151
VIP :         192.168.6.148

两台http服务器的安装

 1、 两台机均安装httpd

 # yum install -y httpd

 2、 添加首页

 Realserver1设置

 # echo “RS1” >/var/www/html/index.html

 Realserver2设置

 # echo “RS2” >/var/www/html/index.html

 3、 启动并设置开机启动httpd

 # service httpd start

两台keepalived主机的设置

 1、 两台机均安装keepalived

 安装依赖文件与keepalive

 # yum install -y openssl openssl-devel keepalived

 2、 keepalived主机配置

 # vim /etc/keepalived/keepalived.conf

  vrrp_instance VI_1 {

    state MASTER    #指定该节点为主节点,备用节点设置为BACKUP(必须)

    interface eth1      #绑定虚拟IP的网络接口 (必须)

    virtual_router_id 51    #VRRP组名,两个节点设置一样,以指明同属一VRRP组

    priority 101  #主节点的优先级,数值在1~254,注意从节点必须比主节点的优先级别低(必须)

   advert_int 1  #组播信息发送间隔,两个节点需一致

   authentication{

     auth_type PASS

     auth_pass 1111

    }       #设置验证信息,两个节点需一致

    virtual_ipaddress{

      192.168.6.148/24 dev eth1 label eth1:0

    }   #指定虚拟IP,两个节点需设置一样(必须),别名可设可不设,不设置别名不会显示

  }

     #虚拟IP服务

 virtual_server 192.168.6.148 80 {

    delay_loop 6        #设定检查间隔

    lb_algo rr    #指定LVS算法(必须)

    lb_kind DR    #指定LVS模式(必须)

    nat_mask 255.255.255.0 (必须)

    persistence_timeout 50    #持久连接设置,会话保持时间

    protocol TCP   #转发协议为TCP

        #后端实际TCP服务配置

      real_server 192.168.6.147 80 {

      weight 1

             # HTTP监测,RS上下线

      HTTP_GET {

                                               url {

                                                        path /

                                                         status_code 200

                                                     }

                                                connet_timeout 2

                                                nb_get_retry 3

                                               delay_before_retry 1

                                            }

                                                             }

 real_server 192.168.6.151 80 {

  weight 1

                    HTTP_GET {

                                          url {

                                                   path /

                                                   status_code 200

                                                }

                                         connet_timeout 2

                                        nb_get_retry 3

                                       delay_before_retry 1

                                         }

                                                            }

 }

  3、 keepalived备机的keepalived.conf的配置,不同之处如下:

  state BACKUP

  priority 100

  #其它配置跟keepalived主机相同

/etc/keepalived/keepalived.conf为keepalived的主配置文件。以上配置state
表示主节点为192.168.6.142,副节点为192.168.6.152。虚拟为
IP192.168.6.148。后端的真实服务器为192.168.6.147和192.168.6.151,当通过192.168.6.148访问web服务器时,自动转到后端真实服务器,后端节点的权重相同,类似轮询的模式。

keepalived的启动与测试

  1、 启动keepalived

       # service  keepalived start

  2、 查看keepalived主机的IP

            # ipconfig

测试结果

1、 测试前查看keepalived主机和备机的IP,eth1:0无任何配置信息

2、 主备机均启动keepalived后,eth1:0配置在主机Master上。当主机上的Keepalived服务down后,eth1:0漂移到备机Backup上。

3、查看节点信息,手动down掉RS1的httpd服务,再看节点信息

        # ipvsadm -L -n

  以上测试结果说明,当keepalived备机在keepalived主机宕机的情况会自动接管了资源。但待keepalived主机恢复正常的时候,主机会重新接管资源。

问题思考

1、外部浏览器无法访问192.168.6.148内容

          此故障原因可能是lvs模式选择的DR模式,但是并未配置RS的lo:0口及未添加route

2、所有RS服务器均Down后,如何处理

    配置文件keepalived.conf中的real_server 项配置后面添加一配置项 sorry_server 127.0.0.1 80 同时启动主备机的httpd服务,添加index提示页面。如“Under test....”等等

3、自写监测脚本,完成维护模式切换。

keepalived实现双机热备_第1张图片

该脚本主要是编辑配置文件keepalived.conf通过权重weight来控制主备的切换。

4、前端vip地址192.168.6.148发生漂移时,怎样通知管理员。

keepalived实现双机热备_第2张图片

# vim new_notify.sh

    #!/bin/bash

contact='root@localhost'

Usage() {

echo "Usage:`basename $0` {master|backup|fault} VIP"

 }

notify() {

subject="`hostname`'s state changed to $1"

mailbody="`date`:`hostname`'s state change to $1,$VIP floating."

echo $mailbody | mail -s "$subject" $contact

}

[ $# -lt 2 ] && Usage && exit

   VIP=$2

   case $1 in

    master)

   notify master

 ;;

backup)

   notify backp

 ;;

fault)
           notify fault

;;

*)

   Usage

   exit1

;;

esac

切换主备机查看邮件

# mail

5.脑裂

高可用系统架构中,当连接主备节点的心跳线故障时,本来正常提供服务的两个节点就成为相互的个体。由于相互失去联系,均以为对方出现故障。两个节点像脑裂人一样争夺资源,最终导致共享资源被瓜分,或者两边服务都起不来或者同时读写共享存储,导致数据被损坏。

防止脑裂的方式:

1.两个节点间添加冗余的心跳线,即双心跳线。

2.当相互收不到信息时,强行关闭其中一个节点。比如,备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。此功能需要特殊设备的支持,比如Stonith

3.设置仲裁机制。当两个节点相互不通时,可以参考ping一下网关,ping不通网关的一方主动放弃竞争。

4.节点数最好为奇数。