1.首先对haproxy的源码包进行编译,获得haproxy的方式有多种:直接下在rpm,官网的源码包
在本次的实验中使用的是haproxy-1.6.11.tar.gz
haproxy被内置到红帽中 在本次的源中查看haproxy的版本
使用rpmbuild -tb 源码包 用来构建haproxy的rpm包 便于安装就不用编译,创建连接了
[root@server1 ~]# rpmbuild -tb haproxy-1.6.11.tar.gz
[root@server1 ~]# cd rpmbuild/
[root@server1 rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
[root@server1 rpmbuild]# cd RPMS/
[root@server1 RPMS]# ls
x86_64
[root@server1 RPMS]# cd x86_64/
[root@server1 x86_64]# ls
haproxy-1.6.11-1.x86_64.rpm
[root@server1 x86_64]#
得到了haproxy-1.6.11-1.x86_64.rpm 直接进行安装,环境不用进行重新的连接
[root@server1 x86_64]# rpm -ivh haproxy-1.6.11-1.x86_64.rpm
Preparing... ########################################### [100%]
1:haproxy ########################################### [100%]
rpm安装完成后的环境中并没有脚本,启动的脚,配置文件等
[root@server1 ~]# cd /etc/haproxy/
[root@server1 haproxy]# ls
[root@server1 haproxy]# ls
[root@server1 haproxy]#
需要将源码的包解压进行配置
[root@server1 ~]# tar zxf haproxy-1.6.11.tar.gz
[root@server1 examples]# pwd
/root/haproxy-1.6.11/examples
[root@server1 examples]# cp content-sw-sample.cfg /etc/haproxy/
这个content-sw-sample.cfg就是haproxy的主配置文件 为了方便可以将文件名更名
[root@server1 haproxy]# mv content-sw-sample.cfg haproxy.cfg
下来我们对配置文件进行详细的了解
配置文件中全局的变量中 使用haproxy用户对haproxy服务进行调动,
但在启动服务的时候系统并没有直接的创建这样的一个用户为使用
在进行下一步的配置首先为进程创建一个用户,在配置中默认的uid=200 如下图所示
[root@server1 haproxy]# groupadd -g 200 haproxy
[root@server1 haproxy]# useradd -g 200 -u 200 haproxy
等同于nginx 我们改变haproxy所接收处理的最大的连接数
1.查看内核是否支持指定的数 2.修改配置参数的最大数目 3.系统识别最大的文件连接数
[root@server1 haproxy]# vim /etc/security/limits.conf
haproxy - nofile 10000
修改配置文件中的参数
更改配置文件 了解配置文件中的参数的意义[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
用于设置全局配置参数global
log 127.0.0.1 local2 全局的日志的配置,指定使用 127.0.0.1 上的syslog 服务中的local2 日志设备,记录等级为info 的日志
chroot /var/lib/haproxy chroot 运行路径pidfile /var/run/haproxy.pid 进行 pid 用于
存放 pid
maxconn 4000 默认最大连接数user haproxy 启动程序所用用户group haproxy 启动程序所用组Daemon 以后台的形式运行 haproxy
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
默认全局配置,这些参数会被利用 frontend ,backend ,listen 组件中
defaults
mode http 所处理的类别(7 层http, 4 层代理tcp)
log global 应用全局的日志配
置
option httplog 启用日志记录
HTTP 请求,默认 haproxy 日志记录是不记录 HTTP 请求日志option dontlognull 启用该项,日
志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
option http-server-close 每次请求完毕后主动关闭http 通道
option forwardfor except 127.0.0.0/8
如果服务器上的应用程序想记录发起请求的客户端的 IP 地址,需要在 HAProxy 上 配置此选项, 这样 HAProxy 会把客户端的IP 信息发送给服务器,在HTTP 请求中添加
"X-Forwarded-For"字段。 启用 X-Forwarded-For,在requests 头部插入客户端 IP 发送给后端的server,使后端server 获取到客户端的真实IP。
option redispatch serverID 对应的服务挂掉以后,强制定向到其他的健康的服务
retries 3 3 次连接失败就认为服务不可用
timeout http-request 10s
timeout queue 1m 一个请求在队列里的超时时间
timeout connect 10s 设置默认的连接超时的
时间
timeout client 1m 设置客户端连接超时的
时间
timeout server 1m 设置服务器连接超时的
时间
timeout http-keep-alive 10s 设置 http-keep-alive
的超时时间
timeout check 10s 检测超时
maxconn 3000
backend static
balance roundrobin 使用的算法为轮询
server static 127.0.0.1:4331 check 健康检查backend app
balance roundrobin 轮询的算法server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check
<3>基于负载均衡的 haproxy 中配置文件的改写[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 以上的设置默认不改变 将舰艇端口修改为 80 frontend main *:80
default_backend my_webserver
backend static 静态文件部署在本机(也可以部署在其他机器或者squid 缓存服务器)
balance roundrobin
server static 127.0.0.1:80 check
backend my_webserver 定义一个名为my_webserver 后端部分。PS:此处 my_webserver 只是一个自定义名字而已,但是需要与 frontend 里面配置项 default_backend 值相一致
balance roundrobin 算法
server web1 172.25.254.2:80 check inter 2000 fall 3
weight 30
server web2 172.25.254.3:80 check inter 2000 fall 3
weight 30
配置完成后启动服务
[root@server1 ~]# /etc/init.d/haproxy start
Starting haproxy: [ OK ]
在物理机上进行测试负载均衡的页面 页面如下图所示
以下的情况表示后台的服务器不可用
开启RS的http服务重新进行测试
在以上的设置中 haproxy只是最基本的负载均衡 将客户的请求的分发给真正的服务器,
服务器处理请求完成以后将数据返回给客户,
cookie的参数决定了,在测试时不会出现轮询,在cookie中会保持长连接,除非当前的RS挂掉以后
会寻找存活的RS进行下次的数据处理
server dynsrv1 172.25.254.2:80 minconn 50 maxconn 500 cookie s1 check inter 1000
minconn 50 最小连接 maxconn 500 最大连接 cookie s1 保持长链接
check inter 1000 健康检查 自动的对后端的服务进行检查,在调度时不会对挂掉的服务进行受理
在参数中去掉 cookie就可以正常的看到轮询的页面
server dynsrv1 172.25.254.2:80 check inter 1000
server dynsrv2 172.25.254.3:80 check inter 1000
对haproxy进行重启 [root@server1 haproxy]# /etc/init.d/haproxy restart
在物理机上对轮询的页面测试如下图
页面不能轮询 : 1.参数中有没有关闭 cookie 设置轮询的算法 2.后台的RS是否在线
http://172.25.254.1/admin/stats 查看负载的web界面 在配置的参数中这个位置是可以改变的
down 掉RS后 在web界面上 server2 会变颜色
具有健康检查 在server2在线以后 会自动加入负载中
查看返回的状态码 参数设置 monitor-uri /monitoruri
haproxy 的8种负载均衡算法 :
1.balance roundrobin #轮询 软负载均衡基本都具备这种算法
2.balance static-rr #根据权重,建议使用
3.balance leastconn #最少连接者先处理,建议使用
4.balance sourc #根据请求源IP,建议使用
5.balance uri #根据请求的URI
6.balance url_param #根据请求的URI参数
7.balance hdr(name) #根据请求的HTTP请求头来锁定每次的HTTP请求
8.balance rdp-cookie(name) #根据cookie(name)来锁定并哈希每一次TCP请求
根据请求的源IP 来进行测试 balance source'
[root@server1 haproxy]# /etc/init.d/haproxy reload
测试结果如下 根据请求的源IP进行锁定 持续一个连接不变
将负载均衡的日志添加到系统中
[root@server1 haproxy]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local0.* /var/log/haproxy.log
*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
[root@server1 haproxy]# /etc/init.d/rsyslog restart
修改haproxy中的轮询的算法 对haproxy进行重读 查看haproxy的日志记录的文件
在haproxy中设置允许拒绝的客户请求
frontend public
bind 172.25.254.1:80 name clear
acl blacklist src 172.25.254.151
http-request deny if blacklist
[root@server1 haproxy]# /etc/init.d/haproxy reload
在物理机上进行测试 会收到拒绝的页面如下
在Haproxy收到拒绝的请求以后 可以将拒绝的请求定向到一个正在维护的页面上去
haproxy 的端口是 80 因此在负载上进行定向的时候 可以将http的端口修改为8080
[root@server1 haproxy]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@server1 haproxy]# cat /var/www/html/index.html
<h1>网站正在维护中...</h1>
[root@server1 haproxy]# /etc/init.d/httpd restart
[root@server1 haproxy]# vim haproxy.cfg
frontend public
bind 172.25.254.1:80 name clear
acl blacklist src 172.25.254.151
http-request deny if blacklist
errorloc 403 http://172.25.254.1:8080
[root@server1 haproxy]# /etc/init.d/haproxy reload
在物理机上进行测试 重定向的页面 如下图 使用命令进行测试发现永久重定向
[root@loaclhost ~]# curl -I 172.25.254.1
HTTP/1.1 302 Found
Cache-Control: no-cache
Content-length: 0
Location: http://172.25.254.1:8080
采用另一种策率进行重定向
frontend public
bind 172.25.254.1:80 name clear
acl blacklist src 172.25.254.151
redirect location http://172.25.254.1:8080
[root@server1 haproxy]# /etc/init.d/haproxy reload
在页面上进行测试 如下图
访问的是 blacklist 使用直接连接的方式重定向到 某一固定的页面
frontend public
bind 172.25.254.1:80 name clear
acl blacklist src 172.25.254.151
redirect location http://172.25.254.1:8080 if blacklist
[root@server1 haproxy]# /etc/init.d/haproxy reload
在物理机上进行命令的询问 依旧会出现重定向的方式
[root@loaclhost ~]# curl -I 172.25.254.1
HTTP/1.1 302 Found
Cache-Control: no-cache
Content-length: 0
Location: http://172.25.254.1:8080
Connection: close
动静分离的访问 修改haproxy的参数
按照客户的需求,将不同的RS具有的页面调度给客户,
default_backend static
backend dynamic
balance roundrobin
#balance source
#cookie DYNSRV insert indirect nocache
#fullconn 4000 # the servers will be used at full load above this number of connections
#172.25.254.2上面是动态页面的访问
server dynsrv1 172.25.254.2:80 check inter 1000
backend static
balance roundrobin
#172.25.254.3上面是静态页面的访问
server dynsrv2 172.25.254.3:80 check inter 1000
因此在server2上进行动态页面的搭建
[root@server2 ~]# yum install -y php
[root@server2 html]# vim index.php
<?php
phpinfo();
?>
[root@server2 html]# /etc/init.d/httpd restart
[root@server1 haproxy]# vim haproxy.cfg
use_backend dynamic if { path_end -i .php }
[root@server1 haproxy]# /etc/init.d/haproxy reload
在物理机的web上进行访问 是否可以动静分离的请求到想要请求的页面
将上一步做访问的重定向 注释掉 让物理机可以访问到做动静分离的页面
以.php 结尾的动态页面的访问 会直接调度到动态状态下的动态RS server2进行受理
当没有结尾时 默认的处理规则以静态页面为首下的server3 以静态页面进行处理 访问普通的html页面
对haproxy的参数进行修改 对后台的服务器可写
frontend public
bind 172.25.254.1:80 name clear
# acl blacklist src 172.25.254.151
acl write method POST
acl write method PUT
use_backend dynamic if write
[root@server1 haproxy]# /etc/init.d/haproxy reload
[root@server2 html]# ls
index.html index.php
[root@server2 html]# rm -rf *
[root@server2 html]# ls
upload
[root@server2 html]# cd upload/
[root@server2 upload]# ls
index.php upload_file.php
[root@server2 upload]# mv * ..
[root@server2 html]# chmod 777 upload
[root@server2 html]# ls
index.php upload upload_file.php
[root@server2 html]# vim upload_file.php
[root@server2 html]# scp -r * server3:/var/www/html/
[root@server3 ~]# yum install -y php
[root@server3 html]# /etc/init.d/httpd restart
在物理机上进行测试访问 172.25.254.1/upload_file.php
Haproxy的高可用套件的搭建 pacemaker+ corosync + haproxy
[root@server1 haproxy]# yum install -y pacemaker corosync
[root@server4 ~]# yum install -y pacemaker corosync
[root@server1 haproxy]# cd /etc/corosync/
[root@server1 corosync]# cp corosync.conf.example corosync.conf
[root@server1 corosync]# vim corosync.conf
此处我只列出修改的参数,没有特别的说明,参数不必修改
bindnetaddr: 172.25.254.0
service {
name: pacemaker
ver:0
}
[root@server1 corosync]# scp corosync.conf server4:/etc/corosync/
[root@server1 corosync]# /etc/init.d/corosync start
[root@server4 ~]# /etc/init.d/corosync start
pacemaker的交互并没有向ricci的套件那样的web界面,在进行交互的时候要安装交互式的软件crmsh 才能对集群进行控制
[root@server1 corosync]# yum provides */crmsh
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
No Matches found
crmsh的交互软件并没有被内置到红帽中 因此要在官网上下载
crmsh-1.2.6-0.rc2.2.1.x86_64.rpm 这个包具有依赖性 找到pssh的相同版本的包进行安装
pssh-2.3.1-2.1.x86_64.rpm
先安装pssh 再安装crmsh 否则会有依赖性
[root@server1 ~]# rpm -q crmsh
crmsh-1.2.6-0.rc2.2.1.x86_64
直接使用crm 命令进入到交互式的页面 无须启动服务
[root@server1 ~]# crm
crm(live)#
出现了一个小问题 再我进入crm 查看的时候不听的出现以下的错误
再网上寻求无果
[root@server1 ~]# crm
crm(live)# configure
ERROR: running cibadmin -Ql: Could not establish cib_rw connection: Connection refused (111)
Signon to CIB failed: Transport endpoint is not connected
Init failed, could not perform requested operations
解决: 打开了pacemaker 的服务接口就可以进行正常使用了
正常的进入到交互的界面
[root@server1 ~]# crm
crm(live)# configure
crm(live)configure# show
node server1
node server4
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="cman"
crm(live)configure#
在 crmsh的界面中可以使用tab键进行补齐 不用完全的记住其中命令的全称
crm(live)configure# property stonith-enabled=false 关闭fence的接口
crmsh在进行交互的时候记得要提交
crm(live)configure# commit
#########################
测试的时候发现没有问题
[root@server1 ~]# crm_verify -LV
[root@server1 ~]#
########################
使用show查看的时候规则就添加进去了
crm(live)configure# show
node server1
node server4
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="cman" \
stonith-enabled="false"
#########################
在规则中添加VIP集群的统一调度接口
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip=172.25.254.100 cidr_netmask=32 op monitor interval=1min
crm(live)configure# commit
在server4中使用crm_mon进行对集群的监控 如图
对集群的节点进行测试 将server1上的资源转移到server4上去
有意的使server1集群的节点进行毁坏,将资源转移到server4上,集群的搭建就成功了
[root@server1 ~]# crm node standby
在后端的监测 就会发现server1上的资源转移到server4上面去了 如下图所示
在server1上可以使得另一个节点在线
[root@server1 corosync]# crm node online
注意:当另一个节点在线的时候,节点间不要回切,避免 因资源的接管而导致资源的丢失
测试:当其中的一个节点 /etc/init.d/corosync stop
由于corosync 默认器用stonith功能但是没有stonith的设备 如果直接配资源的化 没有这个功能 资源的切换 并不会完成
所以要禁止stonith功能 设置no-quorum-policy 为ignore 就可以解决 当其中的一个节点down 掉以后
集群还可以正常的工作 对集群含有健康检查 节点数小与2 就认为无法组成集群 集群也就无法工作
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# commit
haproxy的高可用 将原来的haproxy的配置文件 还原到原来的静态页面的轮询的界面
把server1上的haproxy的rpm包利用scp传到server4上
[root@server1 x86_64]# pwd
/root/rpmbuild/RPMS/x86_64
[root@server1 x86_64]# scp * server4:/root/
[root@server1 haproxy]# scp haproxy.cfg server4:/etc/haproxy/
启动haproxy的服务,相应的也可以将日志配置到本地系统中,便于查看和管理
回到含有crmshell的节点上对haproxy的资源进行配置 我们首先查看应有的配置如图
添加haproxy的资源到pacemaker中去
crm(live)configure# primitive haproxy lsb:haproxy op monitor interval=30s
crm(live)configure# commit
添加资源组
crm(live)configure# group hagroup vip haproxy
crm(live)configure# commit
尝试让其中的一台节点down 集群的高可用就会将该节点上的业务转移到正常节点上去
在crm中的resource中可以查看到当前的资源的资源组的状态
crm(live)resource# show
Resource Group: hagroup
vip (ocf::heartbeat:IPaddr2): Started
haproxy (lsb:haproxy): Started
集群中的fence的搭建
首先我们在server4上查询相关的fence-virt的配置
[root@server4 haproxy]# rpm -q fence-virt
fence-virt-0.2.3-15.el6.x86_64
[root@server1 haproxy]# rpm -q fence-virt
fence-virt-0.2.3-15.el6.x86_64
查看相关的配置
[root@server4 haproxy]# stonith_admin -M -a fence_xvm
在物理机上打开支配fence的服务
[root@loaclhost kiosk]# systemctl start fence_virtd
在/etc/fence_virt.conf查看fence的主配置文件
使用桥接,确保虚拟机桥接到物理机真实的网卡上 使用命令 btctl show
其次要注意在节点上的fence的密钥,如果没有密钥无法支配虚拟机进行重启
下来进入到节点的crmshell模式,对集群的资源进行fence的配置
[root@server1 ~]# crm
crm(live)#
crm(live)configure#
crm(live)configure# primitive vmfence stonith:fence_xvm params pcmk_host_map="server1:server1;server4:server4" op monitor interval=1min
server1:server1 虚拟主机名称(在创建的时候虚拟机的名称:主机名)
开启fence的功能
crm(live)configure# property stonith-enabled=true
crm(live)configure# commit
开启之后可以在另外的节点上进行crm_mon的监控 如图
也就是说在进行fence的调用的时候,corosync调用fence对在线的节点进行监控,
当节点不堪重负,或者人为宕机,启动fence功能,将节点重启,节点上的资源转移到在线的节点上
为什么要创建资源组对节点进行管理?
在创建的资源组中,会由很多的资源
Resource Group: hagroup
vip (ocf::heartbeat:IPaddr2): Started server4
haproxy (lsb:haproxy): Started server4
vmfence (stonith:fence_xvm): Started server4
随着节点的转移而集体的迁移,当然可以创建很多的资源组对不同的vip进行管控,
在一个组中的vip,haproxy,vmfece相当于配套的组件,成对的使用,在不同的组中可以分别相应客户的不同请求
haproxy的高可用就到此结束了,但是其中的原理和一个参数的常用的理解需要下来慢慢的融汇贯通,
总结:
这篇博客主要就是haproxy 以及corosync+ pacemaker + haproxy的高可用
haproxy:实现了利用源码包创建rpm ->安装,寻找haproxy的主配置文件->配置文件中的参数的功能:
1.创建haproxy的用户去调动这个进程
2.haproxy 自带cookie chek健康检查 要实现轮询的算法,对cookie进行注释
3.实现对访问控制的重定向,以及重定向页面的处理
4.将haproxy的日志加入到系统的日志中去,在配置文件中查看日志的位置,及日志的类型
在/etc/rsyslog.conf中加入local0的类型,并将其加入到/var/log/messages中全局日志,haproxy.none
5.实现页面访问的动静分离,在以path_end -i .php 区别动态页面和静态页面 在底下分别对不同的页面调度到不同的RS上
6.实现读写分离,在默认的写和读可以在两台机器上实现
corosync + pacemaker + haproxy 高可用:
pacemaker是资源管理器,对集群进行管理和监测的,但其本身并不具备心跳的功能,
现在corosync集成了心跳和集群的组件,对集群间的心跳有测试,具备平滑的切换,利用组资源,将套件快速整合切换,
但是corosync的组件,本身并不具备web的页面,在进行交互的时候,要使用crmshell的插件对集群进行配置,具体的crm具有依赖性,pssh的安装,注意版本
1.在crm中crm(live)#并不能进行配置 首先进入configure界面 进行show 就可以看见其中的参数
2.创建统一的接口VIP的搭建,
3.因为pacemaker的集群中少于2个节点,就认为集群是坏的,因此必须要让集群忽视这个功能
4.haproxy的集群高可用,将haproxy加入集群中带入
5.将VIP和haproxy绑定在同一个资源组,当节点转移的时候,所有的资源都会转移,
6.fence的加入,使得集群中的单点可调节,根据状态变化,进行重启