版权声明:
本文遵循“署名非商业性使用相同方式共享 2.5 中国大陆”协议
您可以自由复制、发行、展览、表演、放映、广播或通过信息网络传播本作品
您可以根据本作品演义自己的作品
您必须按照作者或者许可人指定的方式对作品进行署名。
您不得将本作品用于商业目的。
如果您改变、转换本作品或者以本作品为基础进行创作,您只能采用与本协议相同的许
可协议发布基于本作品的演绎作品。
对任何再使用或者发行,您都必须向他人清楚地展示本作品使用的许可协议条款。
如果得到著作权人的许可,您可以不受任何这些条件的限制。
                                                                                                                  asram

一、部署keepalived

使用:

#wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz

下载keepalived软件,解压,安装

#tar -zxvf keepalived-1.1.20.tar.gz

# cd keepalived-1.1.20

# ./configure

clip_p_w_picpath002

不加参数可以编制只包含VRRP框架,用来搭建HA,加上--with-kernel-dir=可以编制IPVS框架,用于配合LVS,组建高可用的load balancing.

前提要安装好ipvsadm

# ./configure --with-kernel-dir=/usr/src/kernels/2.6.18-194.8.1.el5-i686/

clip_p_w_picpath004

#make &&make install

二、配置 1. 全局配置

这里的配置对整个keepalived都有用。 

  1. global_defs  
  2. {  
  3. notification_email  
  4. {  
  5. admin@example.com  
  6. }  
  7. notification_email_from admin@example.com  
  8. smtp_server 127.0.0.1  
  9. stmp_connect_timeout 30  
  10. lvs_id my_hostname  
  11. }  
####解释####
  • notification_email指定keepalived在发生事情的时候,发送邮件告知,可以有多个地址,每行一个。
  • smtp_*指定发生email的smtp服务器地址和超时
  • lvs_id运行keepalived的机器的一个标识

2. VRRPD配置

这里是keepalived的核心,LVS配置只在要使用keepalived来配置和管理LVS时需要使用,如果仅仅使用keepalived做HA的话就可以完全不用配置LVS。

VRRPD配置分2部分:VRRP Sync Groups和VRRP Instance

2.1 VRRP Sync Groups

将需要监控的多个实例放入sync group,这样可以保证在任意实例出错的时候都能切换,继续提供服务。 

  1. vrrp_sync_group VG_1 {  
  2. group {  
  3. inside_network    
  4. outside_network  
  5.     }  
  6. notify_master /path/to/to_master.sh  
  7. notify_backup /path_to/to_backup.sh  
  8. notify_fault "/path/fault.sh VG_1"  
  9. notify /path/to/notify.sh  
  10. smtp_alert  
  11. }  


####解释####

  • group里面就是vrrp的实例
  • notify_master指定当切换到master时,执行的脚本,可以向脚本传递参数,其他2个类推。
  • Nofity指令有3个参数,$1(GROUP—INSTANCE),$2(group或instance的名字),$3(MASTER—BACKUP—FAULT)
  • smtp_alter使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知

2.2 VRRP Instance

VRRP instance主要是对实例的一些特性的描述。可以为每个网卡开启一个实例。 

  1. vrrp_instance inside_network {  
  2. state MASTER  
  3. interface eth0  
  4. dont_track_primary  
  5. track_interface {  
  6. eth0  
  7. eth1  
  8. }  
  9. mcast_src_ip <IPADDR> 
  10. garp_master_delay 10  
  11. virtual_router_id 51  
  12. priority 100  
  13. advert_int 1  
  14. authentication {  
  15. auth_type PASS  
  16. autp_pass 1234  
  17. }  
  18. virtual_ipaddress {  
  19. #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> 
  20. 192.168.200.17/24 dev eth1  
  21. 192.168.200.18/24 dev eth2 label eth2:1  
  22. }  
  23. nopreempt  
  24. preemtp_delay 300  
  25. debug  
  26. }  
 ####解释####
  • state指定实例初始化的状态,如果都是backup,那么就按照priority的值来确定谁是master。Priority最好相差50
  • interface 就是实例绑定的网卡,对外提供服务的网口
  • track_interface设置额外的监控,里面的任意一个网卡出错,都会进入FAULT状态。
  • mcast_src_ip发送多播包的地址,如果不设置,默认使用绑定的网卡的primary IP。
  • virtual_router_id VRID标记(0-255)
  • priority 高优先级的为master,最好相差大于50
  • advert_int 检查间隔时间,默认1s
  • virtual_ipaddress 里面指定VIP,也就是切换到master时,这些IP会被添加,切换到backup时,就删除这些VIP。通过ip addr show 可以看到这些VIP。
  • lvs_sync_daemon_interface lvs syncd绑定的网卡,类似发送心跳
  • authentication 这一段设置认证
  • auth_type 认证方式,支持PASS和HA(据说HA有问题)
  • auth_pass 认证密码
  • nopreempt 设置不抢占,注意这个设置只能设置在backup状态主机上,而且这个主机的priority必须比另外的主机高
  • preempt_delay 抢占延迟,默认5分钟

2.3 LVS配置

LVS的配置也包括2个部分:virtual server group和virtual server。

2.3.1 virtual server group

这一配置段是可选的,目的是为了让一台Real Server上的某个service可以属于多个Virtual Server,并且只做一次健康检查。

virtual_server_group <STRING> {

# VIP port

          <IPADDR> <PORT>

          <IPADDR> <PORT>

          fwmark <INT>

}

2.3.2 virtual server

virtual server可以以3种方式中的任意一种配置:

1. virtual server IP port

2. virtual server fwmark int

3. virtual server group string

例如:

virtual_server 192.168.1.199 80 { #设置一个virtual server VIP VPORT

    delay_loop 6 #服务投票的延迟

    lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS调度算法

    lb_kind NAT|DR|TUN #LVS集群方式

    nat_mask 255.255.255.0 #nat子网掩码

    persistence_timeout 10 #会话保持时间(秒)

   protocol TCP #使用的协议TCP

   sorry_server <IP> <PORT> #备用机,所有的realserver失效后启用

   real_server 192.168.1.13 80 { #真实服务器的地址和端口

          weight 1 #权重,默认为1,0为失效

          inhibit_on_failure #在服务器健康检查失败时,将其权重设置为0,而不是直接从IPVS表里删除。

          TCP_CHECK { #健康检查方式,这里使用tcp方式

                      connect_timeout 3 #连接超时3秒

                      nb_get_retry 3 #重连次数3次

                      delay_before_retry 3 #重新连接间隔时间3秒

                      connect_port 80 #连接端口80

          }

    }

}

2.3.3 健康检查方式

健康检查方式有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK

可以参考安装keepalived后的sample目录下的模板

  • HTTP_GET|SSL_GET {

                        url { #HTTP|SSL检查的URL ,这里可以指定多个URL

                             path / #URL后的路径

                             digest <STRING> #SSL检查后的摘要信息(通过genhash算出)

                        }

                       connect_port 444 #检查的端口

                       connect_timeout 3 #连接超时3秒

                       nb_get_retry 3 #重连次数3次

                       delay_before_retry 3 #重新连接间隔时间3秒

         }

  • SMTP_CHECK { #使用SMTP_CHECK方式检查

                       connect_timeout 10 #连接超时3秒

                       retry 2 #重连次数3次

                       delay_before_retry 5 #重新连接间隔时间3秒

                       helo_name "foo.bar.com" #“smtp HELO”请求命令的参数,可选。

                       host {

                               connect_ip 172.16.1.12 #需要检查的IP

                               connect_port 25 #需要检查的端口

                               bindto 172.16.1.2 #以此地址发送请求对服务器进行健康检查

                       }

         }

  • MISC_CHECK { #使用MISC_CHECK方式检查

                    misc_path “/usr/local/bin/script.sh arg1 arg2” #外部程序或者脚本的路径和参数

                    misc_timeout 5 #脚本或程序超时时间

                    misc_dynamic #这个参数的设置,将利用healthchecker程序的退出状态码来动态调整服务器的权重。返回0:健康检查OK,权重保持。返回1:健康检查失败,权重设为0。返回2-255:健康检查OK,权重设置为:退出状态码-2。如返回255,那么权重为255-2=253

            }

三、配置基于keepalived的LVS

本来拓扑图应该如下:

p_w_picpath

但是由于使用虚拟机来做试验,所以将LD和realserver合并了。2台服务器:www和web,web主用,www备用,分发器上需要先安装ipvsadm。

[root@web ~]# more /etc/keepalived/keepalived.conf 

  1. global_defs {  
  2.    lvs_id LVS_www  
  3. }  
  4.  
  5. vrrp_sync_groups VG1 {  
  6.     group {  
  7.            VI_1  
  8.     }  
  9. }  
  10.  
  11. vrrp_instance VI_1 {  
  12.     state BACKUP  
  13.     interface eth0  
  14.     virtual_router_id 51  
  15.     priority 100  
  16.     nopreempt  
  17.     advert_int 1  
  18.     authentication {  
  19.         auth_type PASS  
  20.         auth_pass 123456  
  21.     }  
  22.     virtual_ipaddress {  
  23.         192.168.1.199/24  
  24.     }  
  25. }  
  26.  
  27. virtual_server 192.168.1.199 80 {  
  28.     delay_loop 6  
  29.     lb_algo rr  
  30.     lb_kind NAT  
  31.     nat_mask 255.255.255.0  
  32.     persistence_timeout 10  
  33.     protocol TCP  
  34.  
  35.     real_server 192.168.1.13 80 {  
  36.         weight 1  
  37.         TCP_CHECK {  
  38.             connect_timeout 3  
  39.             nb_get_retry 3  
  40.             delay_before_retry 3  
  41.             connect_port 80  
  42.         }  
  43.     }  
  44.  
  45.     real_server 192.168.1.14 80 {  
  46.         weight 1  
  47.         TCP_CHECK {  
  48.             connect_timeout 3  
  49.             nb_get_retry 3  
  50.             delay_before_retry 3  
  51.             connect_port 80  
  52.         }  
  53.     }  
  54. }  

www服务器上仅仅修改如下:

Global_defs字段的:

lvs_id LVS_www

vrrp_instance字段的:

priority 100 #修改为50

nopreempt #删除此行

realserver上先启动httpd服务,然后再启动负载均衡器上的keepalived服务,还有请务必在负载均衡服务器上开启数据包的转发

#echo "1" > /proc/sys/net/ipv4/ip_forward

#service keepalived start

通过ipvsadm –ln查看lvs架构是否正确

clip_p_w_picpath002[4]

通过ip add show查看VIP是否正确添加

clip_p_w_picpath004[4]

可以看出VIP已经在web服务器上正确添加,现在可以访问服务了。 

 p_w_picpath

参考:

http://www.keepalived.org/pdf/UserGuide.pdf

关于更加灵活使用的方法请参考田逸老师的blog:

http://blog.formyz.org/?p=46