1. 什么是Keepalived?

    keepalived是一个类似与layer3,4,5交换机制的软件,也就是我们平时说的第3,4,5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.

2. Keepalived作用

    负载均衡方案

    高可用性HA

    实现对是小机器/服务的故障隔离

负载均衡器间的失败切换failover,是通过VRRPv2(Virtual Router Redundancy Protocol) stack实现

3. Keepalived体系结构

    Keepalived大致分为两层结构: 用户空间(User space)和内核空间(kernel space)

spacer.gif

WatchDog    负责监控checkers和VRRP进程的状况

Checkers        负责真实服务器的健康检查healthchecking,是Keepalived最主要的功能.换句话说--可以没有VRRP Stack,但健康检查healthchecking是一定要有的.

CRRP Stack        负责负载均衡器之间失败切换FailOver. 如果只用一个负载均衡器,则VRRP不是必须的.

IPVS wrapper        用来发送设定的规则到内核ipvs代码

Netlink Reflector        用来设定vrrp 的vip地址等

3. Keepalived的安装

[root@clust1 keepalived-1.2.1]# ln -s /usr/src/kernels/2.6.18-238.el5-i686/ /usr/src/linux  

## 否则 Use IPVS Framework : No

[root@clust1 keepalived-1.2.1]# ./configure --prefix=/opt/keepalived121/

[root@clust1 keepalived-1.2.1]# make

[root@clust1 keepalived-1.2.1]# make install

[root@clust1 keepalived-1.2.1]# cd /opt/keepalived121/

# 设置 service 方式启动服务

[root@clust1 keepalived121]# mkdir /etc/keepalived

[root@clust1 keepalived121]# cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

[root@clust1 keepalived121]# cp etc/sysconfig/keepalived /etc/sysconfig/

[root@clust1 keepalived121]# cp etc/keepalived/keepalived.conf /etc/keepalived/

[root@clust1 keepalived121]# cp sbin/keepalived /usr/sbin/

#启动进程

[root@clust1 keepalived121]# service keepalived start

Starting keepalived: [ OK ]

[root@clust1 keepalived121]# ps aux | grep keep

root 15417 0.0 0.2 5032 576 ? Ss 19:58 0:00 keepalived -D

root 15418 0.0 0.5 5104 1452 ? S 19:58 0:00 keepalived -D

root 15419 0.0 0.3 5104 972 ? S 19:58 0:00 keepalived -D

Keepalived正常运行时,共启动3个进程,其中一个进程是父进程,负责监控其子进程,一个是vrrp子进程,另外一个是checkers子进程.

4. Keepalived的配置文件

位置: 

[root@clust1 keepalived121]# cat /etc/keepalived/keepalived.conf 

    Keepalived的所有配置都在一个配置文件里设置,支持的配置项也比较多,可以分为三类:

a. 全局配置(Global configuration)  

    就是对整个Keepalived起作用的配置,不管是否使用LVS

b. VRRPD配置

    是Keepalived的核心

c. LVS配置

    只在使用Keepalived来配置和管理LVS时需要使用,如果仅使用Keepalived来做HA,LVS的配置完全是不需要的

    

4.1 全局配置

    全局配置包括两个子配置: 全局定义(global definition), 静态地址路由(static ipaddress routes)

A: 全局定义主要设置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

}

notification_email : 指定Keepalived在发生事件时,需要发送Email到的对象,可以有多个,每行一个

smtp_* : 指定发送email的smtp服务器

route_id : 运行Keepalived的机器的一个标识

B: 静态地址和路由

    所谓静态,就是说不会随vrrpd instance的开/关的变化的,VIP就不是static的,会随着vrrp而添加/删除,这个配置可以用来给服务器配置静态的IP地址/路由

静态地址和路由的配置结构:

static_ipaddress {

    192.168.1.1/24 brd + dev eth0 scope global

}


static_routes {

    src $SRC_IP to $DST_IP dev $SRC_DEVICE

    .....

    src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE

}

4.2 VRRPD配置

    VRRPD的配置也包括两个部分: VRRP同步组(synchronization group), VRRP实例(VRRP instance)

A: VRRP同步组

    如果机器或路由有两个网段,一个内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么外网出现问题时,VRRPD认为自己仍然健康,那么不会发送Master和Backup的切换,sync group就是为了解决这个问题,可以把两个实例都放进一个sync group. 这样group里任何一个实例出现问题都会发生切换.

    VRRP同步组的配置结构:

vrrp_sync_group VG_1 {

 group {

  inside_network

  outside_network

 }

 notify_master /path/to/to_master.sh

 notify_backup /path/to/to_backup.sh

 notify_fault "/path/fault.sh VG_1"

 notify /path/to/notify.sh

 smtp_alert

}

# notify_master : 指定当切换到master时,执行的脚本,这个脚本可以传入参数

# smtp_alert : 使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知


B: VRRP实例

    VRRP实例表示在上面开启了VRRP协议,这个实例说明了VRRP的一些特性.

    VRRP实例的配置结构:

vrrp_instance VI_1 {

    state MASTER # 实例的初始状态

    interface eth0 # 实例绑定的网卡

    dont_track_primary # 忽略VRRP的interface错误

    lvs_sync_daemon_interface eth0 # 绑定eth0作为lvs同步的

    track_interface { # 设置额外的监控,里面的任意一个出现问题,都会进入fault状态

        eth0

        eth1

    }

    mcast_src_ip <IPADDR> # 发送多播包地址,默认使用绑定的网卡

    garp_master_delay 10 # 在切换到master状态后,延迟进行gratuitous ARP请求

    virtual_router_id 51 # VRID标记

    priority 100 # 高优先级竞选为master,至少高backup 50

    advert_int 1 # 检查间隔

    authentication { # 设置验证

        auth_type PASS # 认证方式,支持PASS和AH

        auth_pass 1111 # 认证的密码

    }

    virtual_ipaddress {   # 虚拟IP

        # <IPADDR>/<MASK>brd<IPADDR>dev<STRING>scope<SCOPT>label<LABEL>

        192.168.200.16

        192.168.200.17

        192.168.200.18

    }

}

C: 检查服务是否正常配置:

vrrp_script chk_http_port {

    script "killall -0 httpd"  #检查httpd服务是否正常

    # script "/tcp/127.0.0.1/80"

    interval 1  #检查时间间隔

}

使用:

在vrrp_instance里面

track_script {

    chk_http_port

}

4.3 LVS配置

    LVS的配置有两个部分: 虚拟主机组(virtual server group), 虚拟主机(virtual server)

A: 虚拟主机组

    可选的,目的是为了让一台RealServer上的某个service可以属于多个virtual server并且只做一次健康检查

virtual_server_group <STRING> {

 # VIP port

 <IPADDR> <PORT>

 <IPADDR> <PORT>

 .....

 fwmark <INT>

}

B: 虚拟主机   --虚拟服务器定义部分

    

virtual_server 10.10.10.3 1358 { # 设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

    delay_loop 3 # 设置健康检查时间,单位是秒

    lb_algo rr # 设置负载调度算法

    lb_kind NAT # 设置LVS实现负载均衡的机制,可以有NAT,TUN和DR三个模式

    nat_mask 255.255.255.0

    persistence_timeout 50 # 会话保持时间,单位的秒

    protocol TCP # 指定转发协议类型,有tcp和udp两种

    sorry_server <IPADDR> <PORT> # 备机IP端口,所有的real server失效后启用

    # 节点服务器配置部分

    real_server 192.168.200.4 1358 { # 配置服务节点,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开

        weight 1 # 配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,

                       # 设置权值的大小可以为不同性能的服务器分配不同的负载,

                       # 可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值

                       # 这样就合理的利用和分配了系统资源

        inhibit_on_failure # 健康检查失败后,将weight设置为0,不从IPVS里面删除

        TCP_CHECK { # realserver的状态检查设置部分,单位是秒

             connect_timeout 10 # 10秒无响应超时

             nb_get_retry 3 # 重试次数

             delay_before_retry 3 # 重试间隔

        }

        HTTP_GET {

            url {

              path /testurl/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            url {

              path /testurl2/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            url {

              path /testurl3/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

5. 测试

spacer.gif

clust3 -> keepalived.conf

[root@clust3 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id Haweb_1

}

vrrp_sync_group VGM {

    group {

        VI_HA

    }

}

vrrp_instance VI_HA {

    state MASTER

    interface eth1

    lvs_sync_daemon_interface eth1

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.98.155/24 dev eth1

    }

}

clust4 -> keepalived.conf

[root@clust4 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id Haweb_1

}

vrrp_sync_group VGM {

    group {

        VI_HA

    }

}

vrrp_instance VI_HA {

    state BACKUP

    interface eth1

    lvs_sync_daemon_interface eth1

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.98.155/24 dev eth1

    }

}

# 查看日志输出

[root@clust4 keepalived-1.2.1]# tail -f /var/log/messages  

# stop master/backup查看IP地址变化

[root@clust4 keepalived-1.2.1]# ip a

# cluster3 -> service keepalived stop

# 浏览器输入 192.168.98.155 看现实的哪台服务器的页面内容

# cluster3 -> service keepalived start

# 浏览器输入 192.168.98.155 看现实的哪台服务器的页面内容

问题:

1. Keepalived抢占问题如何优化?

    两台服务器组成高可用集群,分别处于Master和Backup状态,当Master出现故障时由Backup来接管所有任务,那么当Master恢复时,Master会抢回所有权.虽然是高可用,但是对客户来说,来回的切换是比较烦恼的事.

    解决: 可将两服务器均设置成backup状态是因为 nopreempt(不抢占)只支持backup模式,而让那一台成为master,这个由优先级priority来决定