1. HAProxy简介
- HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
- HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
- HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
2. haproxy 配置
拓扑:
haproxy 服务器 server2ip:172.25.21.2,server3:172.25.21.4
httpd 服务器 Server7,server13
1. 进行haprox 的安装
换取haproxy 源码包,并进行安装
- 将原码包编译成rpm包
原码包中需要包含 .spec 文件,其中写入了原码编译成rpm包的规则
find -name *.spec 通过此命令来查找是否存在
然后将原码包编译成 rpm 包
[root@server3 haproxy-1.6.11]# rpmbuild -tb haproxy-1.6.11.tar.gz
可看到rpm 包被建立的为位置
然后执行 rpm -ivh 加安装包 进行安装
可在其启动脚本中查看配置文件,然后在原码包中获取
进入原码包获取配置文件
启动脚本
源码包,配置文件模版
/mnt/haproxy-1.6.11/examples
2. 配置haproxy
生成haproxy配置文件
[root@server2 examples]# cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
[root@server2 ~]vim /etc/haproxy/haproxy.cfg
对配置文件进行编辑
内容如下:
global
maxconn 10000 # 最大连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200 # 用户ID 如果没有,需要手动添加用户
gid 200
chroot /var/empty
# 监牢,保护机制,让访问的用户在此目录内,无法对其他目录进行操作
daemon
defaults # 定义默认配置
mode http # 负载均衡软件,7层协议
log global
option httplog
option dontlognull
monitor-uri /monitoruri # 本机状态的健康检查
maxconn 8000 # 最大连机数,会覆盖gloab 中的设定
timeout client 30s
stats uri /admin/stats uri 状态,全局状态,包含本机与后端服务
option prefer-last-server
retries 2
option redispatch
timeout connect 5s
timeout server 5s
# The public 'www' address in the DMZ
frontend public # 前端配置
bind *:80 name clear # 监听本机所有IP
#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 }
default_backend static # 默认后端的名称
# The static backend backend for 'Host: img', /img and /css.
backend static # 后端
mode http # http 协议
balance roundrobin # 算法rr
server statsrv1 172.25.21.7:80 check inter 1000 # 后端服务器
server statsrv2 172.25.21.13:80 check inter 1000
编辑完成,重启服务:
[root@server2 ~]# /etc/init.d/haproxy restart
Shutting down haproxy: [ OK ]
Starting haproxy: [ OK ]
在浏览取中查看状态
输入 172.25.21.2/monitoruri # 本机状态的健康检查
输入 172.25.21.2/adminstats # monitoruri # 本机状态的健康检查
开启后端服务器,进行负载均衡的查看
[root@server7 ~]# /etc/init.d/httpd start
[root@server13 ~]# /etc/init.d/httpd start
浏览器中查看
3 设定日志记录
在配置文件中可看到日志记录规定
log 127.0.0.1 local0
Local0 为日志记录
编辑/etc/rsyslog.conf 进行设定
[root@server2 log]# vim /etc/rsyslog.conf
编辑如下:
允许UDP 日志接收
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
不将日志发送到/var/log/messages
local0.* /var/log/haproxy.log
# 定义日志接收点
编辑完成,重启日志服务
查看日志
4. haproxy动静分离:
定义多个后端
frontend public
bind *:80 name clear
#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
default_backend static1 # 默认访问的后端 static1
# The static backend backend for 'Host: img', /img and /css.
backend static1 # 后端1
mode http
balance roundrobin
server statsrv1 172.25.21.7:80 check inter 1000
backend static2 # 后端2
mode http
balance roundrobin
server statsrv2 172.25.21.13:80 check inter 1000
编辑如下:
在浏览器查看
默认后端
访问.php
5. haproxy访问控制:
在前端定义
编辑配置文件,进行访问控制设置
[root@server2 log]# vim /etc/haproxy/haproxy.cfg
# The public 'www' address in the DMZ
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
acl black_lsit src 172.25.21.250
# 访问控制列表 black_list 为自定义,前后一致即可
http-request deny if black_list
# http-request deny 访问控制黑名单
errorloc 403 http://172.25.1:8080
# 重定向,将错误显示类型,重新定向到指定页面
172.25.21.250 主机访问效果如下:
根据错误类型将访问重定向:
172.25.25.2:8080 为该172.25.21.2主机http 的端口
编辑默认发布文件,并重新启动服务
172.25.21.250 主机访问效果如下:
编辑配置文件,进行访问重定向(crul 命令不支持重定向)
redirect location 重定向,将访问的页面重新定向到指定页面
[root@server2 log]# vim /etc/haproxy/haproxy.cfg
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
# acl black_list src 172.25.21.250
# http-request deny if black_list
# errorloc 403 http://172.25.21.2:8080 # 重定向
acl blacklist src 172.25.21.250
redirect location http://www.nba.com
# 将上述访问的源地址重定向到 www.nba.com
编辑完成重新加载配置文件
[root@server2 log]# /etc/init.d/haproxy reload
172.25.21.250 主机访问效果如下:直接被重新定向到www.nba.com
6. haproxy读写分离:
通过haproxy 实现网页的读写分离
编辑 /etc/haproxy/haproxy.cfg
[root@server2 ~]# vim /etc/haproxy/haproxy.cfg
编辑内容如下:
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
# acl black_list src 172.25.21.250
# http-request deny if black_list
# errorloc 403 http://172.25.21.2:8080 # 重定向
# acl blacklist src 172.25.21.250
# redirect location http://www.nba.com # 重定向
acl write method POST # 控制表写,方法为PSOT
acl write method PUT # 控制表写,方法为PUT
#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 }
use_backend static2 if write # 执行写的方法时,访问static2
.........................省略...............................
backend static1
mode http
balance roundrobin
server statsrv1 172.25.21.7:80 check inter 1000
backend static2
mode http
balance roundrobin
server statsrv2 172.25.21.13:80 check inter 1000
编辑完成重启服务
给haproxy 服务端安装 php ,来进行对.php的解析
[root@server2 ~]# /etc/init.d/haproxy reload
在后端服务器进行配置
在172.25.21.7,与172.25.21.13 /var/www/html/加载下载安装目录
Upload 目录,中实现简单的upload
两个后端http服务器都进行此操作
在两个后端服务器进行php服务的安装
然后重启httpd 服务
为172.25.21.7主机的/var/www/html/images/ 添加图片
[root@server7 html]# yum install -y php
[root@server7 html]# /etc/init.d/httpd restart
[root@server13 html]# yum install -y php
[root@server13 html]# /etc/init.d/httpd restart
在服务端进行测试:
访问172.25.21.7/images/中的文件
访问haproxy主机
进行上传操作
进行上传文件的选择
选择上传
上传成功
2. Pacemaker + haproxy 实现高可用集群
- 基本配置:
给两个节点安装 haproxy ,pacemaker,corosync,crmsh,pssh
安装完成后,进行 corosync 的配置:
编辑主配置文件:
compatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
interface { # 需要根据你的环境设置以下值
ringnumber: 0
bindnetaddr: 172.25.21.0 # 集群网段
mcastaddr: 226.94.1.21 # 多播地址,保证与其他集群服务器不 同,否则会造成冲突
mcastport: 5405 # 多播端口
ttl: 1
}
}
..................省略.........................
service {
name: pacemaker # 添加服务名称
ver: 0 #
}
编辑成功,两节点同时启动corosync
可通过 crm 命令来进行对配置进行管理
Crm recurce
Crm_verify -VL
首先检测配置文件是否异常
这是因为stonith,目前,我们禁用这个特性,然后在 配置STONISH 章节来配置它。这里要指出,使用STONITH是非常有必要的。关闭这个特性就是告诉集群:假装故障的节点已经安全的关机了。一些供应商甚至不允许这个特性被关闭。
我们将 stonith-enabled设置为 false 来关闭STONITH
# crm configure property stonith-enabled=false
# crm_verify -L
设置完这个选项以后,校验配置文件就正常了。
进行Fence的安装
进行fence的安装
[root@server3 ~]# yum install -y fence-virt-0.2.3-15.el6.x86_64
在真实主机安装fence 服务,并生成密钥,传到两个节点主机的/etc/cluster下
通过crm configure 进行配置
crm(live)configure# primitive vmfence stonith:fence_xvm params pcmk_host_map="server2:Server2;server3:Server4" op monitor interval=30s
# pcmk_host_map=“节点名+节点所在主机的域名;节点名+节点所在主机域名”
crm(live)configure# property stonith-enabled=ture
# 启用 stonith
crm(live)configure# commit
# 保存配置
[root@server2 cluster]# crm configure
crm(live)configure# show
查看最终配置
在节点处查看状态
crm_mon
进行测试fence(高可用测试)
手动让server2 服务所在机器崩溃
Echo c > /proc/sysrq-trigger 手动让内核崩溃
Server2 宕机,服务全部移动至server3,fence 重新启动server2