Haproxy简介:
Haproxy是一个使用c语言编写的自由开发源代码软件,它提供高可用性、负载均衡、以及基于http和tcp的应用程序代理。Haproxy特别使用于那些负载特别大的web站点。Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接,并且他的运行模式使得它可以很简单安全的整合进当前的架构中,同时也可以保护我们的web服务器不被暴露再网络上。
haproxy采用的八种算法
roundrobin 简单的轮询
static-rr 根据权重
leastconn 最少连接者先处理
source 根据请求源IP
uri 根据请求的URI
url_param 根据请求的URl参数
hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
rdp-cookie(name) 根据cookie(name)来锁定并哈希每一次TCP请求
haproxy的安装配置及负载均衡
环境: rhel6.5
主机:foundations: 172.25.1.250 //用于客户端进行测试
test1: 172.25.1.11 //安装haproxy,用来实现负载均衡,但有瓶颈
test2: 172.25.1.12 //开启http服务 ,实现负载均衡的真实服务器
test3: 172.25.1.13 //开启http服务 ,实现负载均衡的真实服务器
test1端:
首先在test1中下载haproxy的源码包,解压
yum install rpm-build -y # 安装rpmbuild命令
rpmbuild -tb haproxy-1.6.13.tar.gz # 建立haproxy的二进制软件包, 有依赖性,需下载
yum install -y pcre-devel
rpmbuild -tb haproxy-1.6.13.tar.gz //再次执行
cd rpmbuild/RPMS/x86_64
rpm -ivh haproxy-1.6.13-1.x86_64.rpm # 安装haproxy软件包
rpm -ql haproxy # 查看软件相关文件的路径,生成haproxy的配置文件
cd /root/
tar zxf haproxy-1.6.13.tar.gz # 解压压缩包。
cd haproxy-1.6.13/examples
touch /etc/haproxy/haproxy.cfg # 若目录haproxy不存在,则须新建
cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
useradd haproxy //创建haproxy用户,并修改配置文件
id haproxy
vim /etc/haproxy/haproxy.cfg
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.global
maxconn 10000 //最大连接数stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 //日志设备uid 500 //用户的gid和uid
gid 500
chroot /var/empty //安全设置,根目录切换,锁在/var/empty下
daemon //设置为后台进程# The public 'www' address in the DMZ
frontend public
bind 172.25.1.11:1080 name clear
bind *:1080 //端口随意设置,但不可与其他服务冲突,默认1080
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
mode http //haproxy工作模式,四层工作模式为TCP,七层为HTTP
log global
option httplog //启用http日志
option dontlognull
monitor-uri /monitoruri
maxconn 8000 //每个进程的最大连接数,会覆盖global中的maxconn
timeout client 30s //客户端超时时长stats uri /admin/stats //监控页面的URL设置
# use_backend static if { hdr_beg(host) -i img }
# use_backend static if { path_beg /img /css }
default_backend static# The static backend backend for 'Host: img', /img and /css.
backend static
mode http
balance roundrobin //实现轮询
option prefer-last-server
retries 2 //服务器连接失败后的重试次数
option redispatch
timeout connect 5s //连接最大超时时间
timeout server 5s //服务器最大超时时间
server statsrv1 172.25.1.12:80 check inter 1000
server statsrv2 172.25.1.13:80 check inter 1000
修改内核最大文件数
vim /etc/security/limits.conf
haproxy - nofile 10000 //写在最后一行
启动服务,测试haproxy是否安装成功
/etc/init.d/haproxy start
netstat -antlp| grep 1080 # 查看1080端口是否开启
test2端和test3端:
yum install -y httpd //下载http服务
/etc/init.d/httpd start //开启服务
vim /var/www/html/index.html //写发布页面
test2 //为了方便观察哪个主机出现故障及是否轮询,故 如果是主机test3,发布页面就写test3
此时,在真机中进行负载均衡测试,轮询的方式
[root@foundation1 ~]# curl test1:1080
网页验证:
http://172.25.1.11:1080/admin/stats //对后端服务器管理和页面数据的监控
http://172.25.1.11:1080/monitoruri //网站健康检测URL,检测haproxy管理的网站是否可用,若正常则返回200 OK
基于tcp和http的应用程序代理
动态页面和静态页面的分离
在test2中的httpd默认发布目录中编写文件index.html(test2);在test3中http默认发布目录编写文件index.php
test2: 页面不用变,即:
[root@test2 ~]# cat /var/www/html/index.html
test3:
yum install -y php php-mysql # 在test3中安装php动态页面
vim /var/www/html/index.php
/etc/init.d/httpd restart
test1:
vim /etc/haproxy/haproxy.cfg //在haproxy的配置文件中修改访问动态页面和静态页面
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#global
maxconn 10000
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 500
gid 500
chroot /var/empty
daemon
defaultsmode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
stats uri /admin/stats
option prefer-last-server
retries 2
option redispatch
timeout connect 5s
timeout server 5s
# The public 'www' address in the DMZ
frontend public
bind 172.25.1.11:1080 name clear
#bind *:80
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem #use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }use_backend static2 if { path_end -i .php } //如果以.php结尾,则显示static2,即172.25.1.13:80的内容
default_backend static1 //默认显示static1的内容,即172.25.1.12:80的内容#acl blacklist src 172.25.1.250
#http-request deny if blacklist
#errorloc 403 http://172.25.1.11:8080# The static backend backend for 'Host: img', /img and /css.
backend static1
balance roundrobin
server statsrv1 172.25.1.12:80 check inter 1000
backend static2
balance roundrobin
server statsrv2 172.25.1.13:80 check inter 1000
[root@test1 ~]# /etc/init.d/haproxy restart
[root@test1 ~]# netstat -antlp |grep haproxy
在浏览器中进行测试:
默认静态访问test2的index.html页面
动态访问test3的index.php界面
修改haproxy的日志文件
test1: 修改日志服务配置文件从而修改日志存储位置
vim /etc/rsyslog.conf
/etc/init.d/rsyslog restart //重启日志服务
> /var/log/haproxy.log //将日志清空
/etc/init.d/haproxy restart //重启haproxy服务,
cat /var/log/haproxy.log # 查看是否生成日志
访问控制
test1: 修改配置文件,添加访问控制的主机
vim /etc/haproxy/haproxy.conf //设置访问黑名单,在blacklist中的主机均不可访问,可写ip或网段
//这里设置不允许主机foundation1访问
/etc/init.d/haproxy restart
在浏览器测试:
重定向(当主机foundation1进行访问时,自动重定向到test1中)
vim /etc/haproxy/haproxy.conf # 打开httpd服务
acl blacklist src 172.25.1.250 //黑名单
http-request deny if blacklist //若是黑名单则服务拒绝
errorloc 403 http://172.25.1.11:80
//如访问到403则直接重定向到172.25.1.11 的http服务,即test1的本机http服务,端口为http的端口,这里http端口是80
/etc/init.d/haproxy restart
vim /var/www/html/index.html //内容如下
<h1>服务正在维修,请等待......</h1>
/etc/init.d/httpd start
netstat -antlp | grep httpd
测试结果:
172.25.1.11:1080
//已经重定位到了test1的http页面
读写分离
在test1中编辑配置文件
vim /etc/haproxy.haproxy.conf //当进行上传操作时,转到test3
acl write method POST //写的方式有 POST和PUT
acl write method PUT
use_backend static2 if write //当写的时候用static2
default_backend static1 //默认使用static1
/etc/init.d/haproxy restart
在test2和test3中安装php,把上传脚本放在http默认发布目录
yum install -y php
test3:
cd /root //注意:这里需要自己下载上传脚本,提前将上传脚本放到/root下
mv update /var/www/html
cd /var/www/html/
chmod 777 update
cd update
ls
mv * ..
此时,在浏览器进行访问:
在网页进行上传照片,然后在test3中的update目录下查看是否已经上传到update目录,已上传则表示测试成功。
corosync+pacemaker心跳组件实现haproxy的高可用
pacemaker是一个集群管理资源器。利用集群基础构件(corosync或heartbeat)提供消息和成员管理能力来探测并从节点或资源级别的故障恢复,以实现集群服务的最大可能性
为了实现test1与test4的集群管理,test4上与test1作相同的配置。当一个节点故障时,另一个节点会替代进行工作。
故在test4中安装haproxy服务。操作步骤与test1相同:
结果为:
在test1和test4中,开启corosync服务,执行下列操作:
yum install pacemaker corosync -y
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
///安装crm管理工具,下面这两个软件须自行下载
yum install -y crmsh-1.2.6-0.rc2.2.1.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm
下载时需要依赖包,python-pssh,须自行下载
Requires: python-pssh = 2.3.1-4.1 //报错
yum install -y crmsh-1.2.6-0.rc2.2.1.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm python-pssh-2.3.1-4.1.x86_64.rpm
vim /etc/corosync/corosync.conf
compatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 172.25.1.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
service{
name:pacemaker
ver:0
}
aisexce {
user: root
group: root
}
quorum {
provider: corosync_votequorum
expected_votes: 2
two_node: 1
}
进行测试:
[root@test1 ~]# crm status
[root@test1 ~]# crm node standby