pacemaker + corosync 实现 haproxy 的高可用负载均衡

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
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Buster_ZR/article/details/81457594