一、HAPROXY介绍
提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的负载均衡软件。
它是免费、快速并且可靠的一种解决方案
特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理
二、衡量负责均衡器性能的因素
Session rate 会话率
– 每秒钟产生的会话数
Session concurrency 并发会话数
– 服务器处理会话的时间越长,并发会话数越多
Data rate 数据速率
– 以MB/s或Mbps衡量
– 大的对象导致并发会话数增加
– 高会话数、高数据速率要求更多的内存
三、HAProxy工作模式
mode http
– 客户端请求被深度分析后再发往服务器
mode tcp
– 在客户端与服务器这间建立全双工会话,不检查第七层信息
mode health
– 仅做健康状态检查,已经不建议使用
四、HTTP事务模型
HTTP协议是事务驱动的
每个请求(Request)仅能对应一个响应(Response)
常见模型:
– HTTP close
– Keep-alive
– Pipelining
1、HTTP close
客户端向服务器建立一个TCP连接
客户端发送请求给服务器
服务器响应客户端请求后即断开连接
如果客户端到服务器的请求不只一个,那么就要不断的去建立连接
TCP三次握手过程消耗相对较大的系统资源,同时延迟较大
2、Keep-alive
一次连接可以传输多个请求
客户端需要知道传输内容的长度,以避免无限期的等待传输结束
降低两个HTTP事务间的延迟
需要相对较少的服务器资源
3、Pipelining
仍然使用Keep-alive
在发送后续请求前,不用等前面的请求已经得到回应
适用于有大量图片的页面
降低了多次请求之间的网络延迟
五、实验部分
1.实验环境
系统:Centos6.5 软件版本 haproxy-1.4.24.tar.gz
VIP1=192.168.2.100
VIP2=192.168.2.101
haproxy01=192.168.2.10
haproxy02=192.168.2.11
web1=192.168.2.200
web2=192.168.2.201
img1=192.168.2.202
img2=192.168.2.203
2.实验拓扑
3.网站服务器的设置
web1和web2
# yum -y install httpd
# cd /var/www/html/
# echo WEB1 > index.html
# echo WEB2 > index.html
ing1和img2
# echo img1 > index.html
# echo img2 > index.html
# service httpd restart
4.安装配置
(1)、安装HAProxy
1>、两台HAProxy的安装配置步骤一样
haproxy下载地址:http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz
# cd haproxy-1.4.24
[[email protected] haproxy-1.4.24]# vim README
[[email protected] haproxy-1.4.24] # uname -r
2.6.32-431.el6.x86_64 # 根据以上要求找到对应自己系统的内核版本,此处选择linux26
[[email protected] haproxy-1.4.24]# make TARGET=linux26 PREFIX=/usr/local/haproxy install
#将HAProxy安装到/usr/local/haproxy下
[[email protected] haproxy-1.4.24]# ls
doc sbin #安装完成后会在安装目录下生成doc ,sbin ,share三个文件夹
此时,HAProxy安装完成
2>、创建配置文件和启动文件
[[email protected] haproxy-1.4.24]# mkdir /etc/haproxy
[[email protected] haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy
[[email protected] haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
[[email protected] haproxy-1.4.24]# chmod +x /etc/init.d/haproxy
[[email protected] haproxy-1.4.24]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
[[email protected] haproxy-1.4.24]# mkdir /usr/share/haproxy
3>、编辑配置文件(两台Haproxy配置文件相同)
# vim /etc/haproxy/haproxy.cfg
#this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local0 #日志输出配置,所有日志都记录在本机,通过local0输出
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096 #最大连接数
chroot /usr/share/haproxy #改变当前工作目录。
uid 99 #所属用户的uid
gid 99 #所属运行的gid
daemon #以后台形式运行haproxy
#debug
#quiet
defaults
log global
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog
option dontlognull
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
retries 3 #两次连接失败就认为是服务器不可用
maxconn 2000 #默认的最大连接数
contimeout 5000 #连接超时
clitimeout 50000 #客户端超时
srvtimeout 50000 #服务器超时
timeout check 5s #心跳检测超时
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm baison-test-Haproxy #统计页面密码框上提示文本
stats auth admin:admin123 #统计页面用户名和密码设置
stats hide-version #隐藏统计页面上HAProxy的版本信息
frontend www
bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不>能访问了。
acl web hdr(host) –i www.hyzc.com #acl后面是规则名称,-i是要访问的域名,如果访问www.hyzccom这个域名就分发到下面的webserver 的作用域。
acl img hdr(host) -i img.hyzc.com #如果访问img.hyzc.com.cn就分发到imgserver这个作用域。
use_backend webserver if web
use_backend imgserver if img
backend webserver #webserver作用域
mode http
balance roundrobin #banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
option httpchk /index.html #检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1 192.168.2.200:80 check inter 2000 fall 3 weight 10
server web2 192.168.2.201:80 check inter 2000 fall 3 weight 20
backend imgserver
mode http
option httpchk /index.php
balance roundrobin
server img1 192.168.2.202:80 check inter 2000 fall 3
server img2 192.168.2.203:80 check inter 2000 fall 3
在192.168.2.11上面执行,复制当前配置文件
[[email protected] conf]# scp /etc/haproxy/haproxy.cfg [email protected]:/etc/haproxy/
4>、启动Haproxy服务,查看状态。
# service haproxy start
状态检查没有问题,程序正常
(2)、安装keepalived
1>、安装配置keepalived(两台keepalived安装步骤一样)
参考博客
http://9265463.blog.51cto.com/9255463/1831850 keepalived 安装
2>、第一台keepalived配置文件。第一台:192.168.2.100vip的master,192.168.2.101vip的backup。
# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/opt/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER ############ 辅机为 BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 192.168.2.10
priority 100 ########### 权值要比 back 高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port ### 执行监控的服务
}
virtual_ipaddress {
192.168.2.100
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.101
}
}
3>、第二台keepalived的配置文件。
#vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/opt/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 192.168.2.11
priority 99 ##########权值 要比master低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.2.100
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.101
}
}
4>、检测脚本,为了防止haproxy服务关闭导致keepalived不自动切换(两台keepalived都需部署)。
# vim /opt/check_haproxy.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/haproxy start
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi
# chmod -R +x /opt/check_haproxy.sh
5>、启动两台keepalived和Haproxy服务。
# service haproxy start
# service keepalived start
6>、测试
1>、查看两台服务器的VIP 查看
查看192.168.2.10:
查看192.168.2.11:
2>、测试,关闭任意一台keepalived,img和www域名访问正常。
由于测试环境,则每台机器分别添加主机解析(生产环境申请域名即可)
# vim /etc/hosts
192.168.2.200 web1.hyzc.com web1
192.168.2.201 web2.hyzc.com web2
192.168.2.202 img1.hyzc.com img1
192.168.2.203 img2.hyzc.com img2
192.168.2.100 www.hyzc.com www
192.168.2.101 img.hyzc.com img
测试关闭2.10机器,在2.11测试结果
结论:
高可用实现
3>、测试2.10
www和img的页面轮询,结论负载实现
遇到的问题:
1.
解决办法:
找到对应的行,是注释行的原因