Keepalived+HAproxy实现高可用负载均衡
2016-05-02 00:52 猎手家园 阅读(8595) 评论(2) 编辑 收藏 举报总概:
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漂移到主服务器!