代码改变世界

Keepalived+HAproxy实现高可用负载均衡

2016-05-02 00:52 猎手家园 阅读(...) 评论(...) 编辑 收藏

总概:

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

      HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

这里我利用HAproxy对多台redis服务器进行负载,然后用Keepalived对HAproxy进行监控:

     (主)服务器A:10.10.51.231

     (从)服务器B:10.10.51.232

      VIP:10.10.51.230

      Keepalived监控A、B上的HAproxy,利用Keepalived的VIP漂移技术,若A、B上的HAprox都工作正常,则VIP与优先级别高的服务器(主服务器)绑定,当主服务器当掉时,则与从服务器绑定,而VIP则是暴露给外部访问的ip;HAproxy利用Keepalived生产的VIP对多台redis(从)进行读负载,当某台redis当掉,则将其移除,回复后加入集群。

 

一、安装keepalived

1、下载后解压 tar zxvf keepalived-1.2.7.tar.gz 到任意目录

[root@Centos-Server ~]# tar zxvf keepalived-1.2.7.tar.gz -C /usr/local/keepalived

解压后,进入keepalived目录

[root@Centos-Server ~]# cd /usr/local/keepalived
[root@Centos-Server ~]# ./configure
[root@Centos-Server ~]# make && make install

注:若这里报错提示没有装openssl,则执行[root@Centos-Server ~]# yum –y install openssl-devel安装,若还有其他的包没装,则执行yum命令进行安装。

2、配置keepalived

[root@Centos-Server ~]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@Centos-Server ~]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@Centos-Server ~]# mkdir /etc/keepalived
[root@Centos-Server ~]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Centos-Server ~]# ln -s /usr/local/sbin/keepalived /usr/sbin/
[root@Centos-Server ~]# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {                        #Haproxy服务启动
   script "/etc/keepalived/check_haproxy.sh"     #监控haproxy进程的脚本, 根据自己的实际路径放置
   interval 2
   weight -4
}
vrrp_instance VI_1 { state MASTER
#主机为MASTER,备机为BACKUP interface eth0 #监测网络端口,用ipconfig查看 virtual_router_id 51 #主备机必须相同 priority 150 #主备机取不同的优先级,主机要大。从服务器上改为120 advert_int 1 #VRRP Multicast广播周期秒数 authentication { auth_type PASS #VRRP认证方式 auth_pass 1111 #VRRP口令 主备机密码必须相同 }
track_script {
#调用haproxy进程检测脚本 chk_haproxy } virtual_ipaddress { 10.10.51.230 #VIP 漂移地址 即集群IP地址 } }
[root@Centos-Server ~]# vim /etc/keepalived/check_haproxy.sh

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
   /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
   sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then /etc/init.d/keepalived stop fi fi

此文件root组读写权限,并且允许程序执行此文件。

[root@Centos-Server ~]# chmod 777 /etc/keepalived/check_haproxy.sh

 

三、安装HAproxy

1、下载后解压 tar zxvf haproxy-1.4.24.tar.gz 到任意目录

解压后,进入Haproxy目录

[root@Centos-Server ~]# cd /usr/local/haproxy-1.4.24
[root@Centos-Server ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy                               
[root@Centos-Server ~]# make install PREFIX=/usr/local/haproxy        #将Haproxy安装到/usr/local/haproxy

2、配置HAproxy

[root@Centos-Server ~]# cd /usr/local/haproxy
[root@Centos-Server ~]# vim haproxy.cfg

注:这里是没有haproxy.cfg文件的,可以回到安装文件目录下将examples下的haproxy.cfg拷贝到usr/local/haproxy下。

[root@Centos-Server haproxy-1.5.11]# cp /usr/local/mypackages/haproxy-1.5.11/examples/haproxy.cfg /usr/local/haproxy
####################HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
#global  :参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
#defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
#frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
#backend :后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
#listen  :Frontend和Backend的组合体。

global
    log 127.0.0.1 local0    #日志输出配置,所有日志都记录在本机,通过local0输出
    maxconn 4096            #限制单个进程的最大连接数
    chroot /usr/local/haproxy                 #Haproxy安装目录
    uid 99            #所属运行用户,默认99为nobody
    gid 99            #所属运行用户组,默认99为nobody
    daemon            #让进程作为守护进程在后台运行
    nbproc 1          #指定作为守护进程运行时的进程数
    pidfile /usr/local/haproxy/haproxy.pid    #将所有进程写入pid文件

defaults
    log global
    mode tcp                  #所处理的类别,默认采用http模式,可配置成tcp作4层消息转发
    maxconn 4096              #限制单个进程的最大连接数
    option httplog            #http 日志格式 
    option dontlognull        #不记录空连接
    option forwardfor         #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
    option httpclose          #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
    option abortonclose       #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 
    option redispatch         #在连接失败或断开的情况下,允许当前会话被重新分发
    retries 3                 #设置在一个服务器上链接失败后的重连次数
    balance source            #表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法。
    timeout client 30s        #设置客户端的最大超时时间(毫秒)
    timeout connect 5s        #设置等待连接到服务器成功的最大时间
    timeout server 30s        #设置服务器端的最大超时时间
    timeout check 5s          #心跳检测时间

#前端代理 Redis
frontend Redis
    bind *:6379
    default_backend RedisServer

#后端分发 Redis
backend RedisServer
    mode tcp
    balance source
    server redis-233 10.10.51.233:6379 check inter 2000 fall 5
    server redis-234 10.10.51.234:6379 check inter 2000 fall 5
    server redis-235 10.10.51.235:6379 check inter 2000 fall 5


#前端代理 Web
frontend WebSite
    bind 10.10.51.230:80                            #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
    acl WwwSite hdr(host) -i www.ccav.com           #acl后面是规则名称,-i是要访问的域名,如果访问www.zhirs.com这个域名就分发到下面的webserver 的作用域。
    acl ImgSite hdr(host) -i res.ccav.com           #如果访问img.baison.com.cn就分发到imgserver这个作用域。
    use_backend WwwSiteServer if WwwSite
    use_backend ImgSiteServer if ImgSite

#后台分发 Web
backend WwwSiteServer
    mode http
    balance source                    #banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等
    option httpchk /index.html        #检测文件,如果分发到后台index.html 访问不到就不再分发给它
    server web01 10.10.51.241:80  check inter 2000 fall 3 weight 30
    server web02 10.10.51.242:80  check inter 2000 fall 3 weight 20
 
backend ImgSiteServer
    mode http
    option httpchk /index.html
    balance roundrobin
    server web03 10.10.51.243:80  check inter 2000 fall 3 weight 10


    # weight - 调节服务器的负重
    # check - 允许对该服务器进行健康检查
    # inter - 设置连续的两次健康检查之间的时间,单位为毫秒(ms),默认值 2000(ms)
    # rise - 指定多少次连续成功的健康检查后,可认定该服务器处于可操作状态,默认值 2
    # fall - 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3
    # maxconn - 指定可被发送到该服务器的最大并发连接数

#状态检测
listen status 10.10.51.231:8080        #监控页面的端口
    mode http
    stats enable
    stats refresh 10s                  #统计页面自动刷新时间
    stats uri /haproxy-admin           #监控页面的访问地址
    stats realm Haproxy\ Statistics    #统计页面密码框上提示文本
    stats auth ccav:123456             #统计页面用户名和密码设置
    stats hide-version                 #隐藏统计页面上HAProxy的版本信息

3、加上日志支持

[root@Centos-Server ~]# vim /etc/rsyslog.conf

#在最下边增加
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
[root@Centos-Server ~]# vim /etc/sysconfig/rsyslog
修改: SYSLOGD_OPTIONS="-r -m 0" 

[root@Centos-Server ~]# service rsyslog restart        #重启日志服务

 

三、测试

1、启动Keepalived:

[root@Centos-Server ~]# /usr/local/keepalived/bin/keepalived -D -f /etc/keepalived/keepalived.conf  #指定启动配置文件

正在启动 keepalived: [确定]
#说明:Keepalived启动后会去检查HAproxy,若HAproxy未启动,则启动HAproxy,若启动HAproxy失败,则关闭Keepalived

2、启动Haproxy

[root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg  #启动
[root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`  #重启
[root@Centos-Server ~]# killall haproxy  #停止

PS:haproxy启动故障:Starting proxy cluster: cannot bind socket

[root@Centos-Server ~]# /etc/sysctl.conf        #修改内核参数
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind=1                     #没有就新增此条记录

[root@Centos-Server ~]# sysctl -p               #保存结果,使结果生效。

3、查看keepalived状况:

[root@alex]# service keepalived status

keepalived (pid  5420) 正在运行...

4、查看HAproxy状况:

[root@alex]# ps -aux|grep haproxy

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
nobody   5430  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy –f /usr/local/haproxy/haproxy.conf
nobody   5431  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
root      5618  0.0  0.0 103252   844 pts/2    S+   16:38   0:00 grep haproxy

Keepalived启动后自动将HAproxy启动了。

5、查看Keepalived生成的VIP是否与主服务器绑定

[root@alex]# ip addr

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 UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet 10.10.51.230/32 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

VIP绑定OK!

6、打开HAproxy的图形管理界面:

浏览器输入http://localhost:8080/haproxy-admin

用户名:ccav   密码:123456

这时候我们Kill掉HAproxy,Keepalived检查到后会重新将HAproxy启动。

[root@alex sysconfig]# killall haproxy

刷新页面,可以看到HAproxy的pid改变了。

7、这时我们将主服务器上的keepalived当掉,看VIP是否漂移到了从服务器上,从服务器接管服务。

A、主服务器上:

[root@Centos-Server ~]# killall keepalived
[root@Centos-Server ~]# ip addr

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 UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

B、从服务器上:

[root@Centos-Server ~]# ip addr

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 UNKNOWN qlen 1000
    link/ether 08:00:27:be:47:90 brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.232/24 brd 192.168.4.255 scope global eth6
    inet 10.10.51.230/32 scope global eth6
    inet6 fe80::a00:27ff:febe:4790/64 scope link
    valid_lft forever preferred_lft forever

VIP漂移OK!

8、这时候重启主服务器的Keepalived,查看VIP是否漂移回来。

[root@Centos-Server ~]# service keepalived start
正在启动 keepalived:                                      [确定]

[root@Centos-Server ~]# ip addr

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 UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet 10.10.51.230/32 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

VIP漂移到主服务器!