热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

haproxy部署web群集

一、常见的Web集群调度器我们知道tomcatnginx负载均衡群集,lvs负载均衡群集和haproxy搭建群集,这三种群集相比较来说,

一、常见的Web集群调度器

我们知道tomcat+nginx负载均衡群集,lvs负载均衡群集 和 haproxy搭建群集,这三种群集相比较来说,lvs性能最好,但是搭建复杂,nginx的upstream模块支持群集,但是对群集的节点的故障检查功能不多,性能也没有haproxy好,所以应该说harpoxy也是非常不错的。所以接下来我们开始使用haproxy搭建群集

1.1、目前常见的Web就集群调度器分为软件和硬件

1.2、软件通常使用开源的LVS、Haproxy、Nginx

1.3、硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等
在这里插入图片描述

二、Haproxy应用分析

2.1、LVS在企业应用中抗负载能力很强,但存在不足

  • LVS不支持正则处理,不能实现动静分离
  • 对于大型网站,LVS的实施配置复杂,维护成本相对较高

2.2、Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件

  • 适用于负载大的Web站点
  • 运行在硬件上可支持数以万计的并发连接的连接请求

三、Haproxy调度算法原理

Haproxy支持多种调度算法,最常用的有三种

3.1、RR(Round Robin)

RR算法是最简单最常用的一种算法,即轮询调度

理解举例

  1. 有三个节点A、B、C
  2. 第一个用户访问会被指派到节点A
  3. 第二个用户访问会被指派到节点B
  4. 第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

3.2、LC(Least Connections)

最小连接数算法,根据后端的节点数连接数大小动态分配前端请求

理解举例

  1. 有三个节点A、B、C,各节点的连接数分别为A:4、B:5、C:6
  2. 第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、C:6
  3. 第二个用户请求会继续分配到A上,连接数变为A:6、B:5、C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端
  4. 由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况
  5. 此算法相比较rr算法有很大改进,是目前用到比较多的一种算法

3.3、SH(Source Hashing)

基于来源访问调度算法,用于一些有Session会话记录再服务器端的场景,可以基于来源的IP、COOKIE等做集群调度

理解举例

  1. 有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被只指派到了B
  2. 当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问会被指派到A,第二个用户访问都会被指派到B,实现集群的调度
  3. 此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

3.4、Haproxy配置文件详解

Haproxy配置文件通常分为三个部分

  1. global:为全局配置
  2. defaults:为默认配置
  3. listen:为应用组件配置

global配置参数

参数说明
log 127.0.0.1 local0配置日志记录,local0为日志设备,默认存放到系统日志
log 127.0.0.1 local1 noticeNotice为日志级别,通常有24个级别
maxconn 4096最大连接数
uid 99用户uid
gid 99用户gid

defaults配置项默认参数,一般会被应用组件继承

Haproxy参数优化,随着企业网站负载增加,Haproxy参数优化相当重要

参数参数说明优化建议
maxconn最大连接数根据应用的实际使用情况进行调整,推荐使用10240,同事“defaults”中的最大连接数不能超过“global”段中的定义
daemon守护进程模式Haproxy可以使用费守护进程模式启动,生产环境建议使用守护进程模式启动
nbproc负载均衡的并发进程数建议与当前服务器CPU核数相等或为其2倍
retries重试次数主要用于对群集节点的检查,如果节点多,且并发量大,设置为2次或3次;在服务器节点不多的情况下,可以设置5次或6次
option http-server-close主动关闭http请求选项建议在生产环境中使用此项,避免由于timeout时间设置过长导致http连接堆积
timeout http-keep-alive长连接超时时间设置长连接时间,具体参考应用自身特点设置,可以设置为10s
timeout http-requesthttp请求超时时间建议将此时间设置为5~10s,增加http连接释放速度
timeout client客户端超时时间如果访问过大,节点响应慢,可以将此事件设置短一些,建议设置为1min左右就可以了

3.5、日志管理

默认是输出到系统的syslog中,生成环境中一般单独定义

定义的方法步骤

  1. 修改Haproxy配置文件中关于日志配置的选项,加入配置

log /dev/log local0 info
log /dev/log local0 notice

  1. 修改rsyslog配置,将Haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下
  2. 保存配置文件并重启rsyslog服务,完成rsyslog配置

访问Haproxy集群测试网页并查看日志信息

四、案例:使用Haproxy搭建Web群集


4.1、案例拓扑图

在这里插入图片描述

4.2、环境

用一台客户端,三台虚拟服务器模拟搭建一套Web集群

Haproxy服务器20.0.0.10/24
Nginx服务器120.0.0.20/24
Nginx服务器220.0.0.30/24
客户机一台用于测试验证

4.3、配置Nginx1服务器

安装Nginx环境
[root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel设置用户不可登录的用户
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx解压缩,编译安装
[root@nginx1 ~]# tar zxf nginx-1.12.2.tar.gz
[root@nginx1 ~]# cd nginx-1.12.2/
[root@nginx1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@nginx1 nginx-1.12.2]# make && make install优化路径
[root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@nginx1 nginx-1.12.2]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful开启Nginx,查看端口号
[root@nginx1 nginx-1.12.2]# nginx
[root@nginx1 nginx-1.12.2]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16640/nginx: master 设置网页内容并测试
[root@nginx1 nginx-1.12.2]# echo "web1" >/usr/local/nginx/html/index.html
[root@nginx1 nginx-1.12.2]# curl http://localhost
web1

4.4、配置Nginx2服务器

安装Nginx环境
[root@nginx2 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel设置用户不可登录的用户
[root@nginx2 ~]# useradd -M -s /sbin/nologin nginx解压缩,编译安装
[root@nginx2 ~]# tar zxf nginx-1.12.2.tar.gz
[root@nginx2 ~]# cd nginx-1.12.2/
[root@nginx2 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@nginx2 nginx-1.12.2]# make && make install优化路径
[root@nginx2 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@nginx2 nginx-1.12.2]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful开启Nginx,查看端口号
[root@nginx2 nginx-1.12.2]# nginx
[root@nginx2 nginx-1.12.2]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16640/nginx: master 设置网页内容并测试
[root@nginx2 nginx-1.12.2]# echo "web2" >/usr/local/nginx/html/index.html
[root@nginx2 nginx-1.12.2]# curl http://localhost
web2

4.5、配置Haproxy服务器

安装Haproxy环境
[root@haproxy ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel解压缩,编译安装
[root@haproxy ~]# tar zxf haproxy-1.4.24.tar.gz
[root@haproxy ~]# cd haproxy-1.4.24/
[root@haproxy haproxy-1.4.24]# uname -r
3.10.0-693.el7.x86_64
[root@haproxy haproxy-1.4.24]# make TARGET=linux26
[root@haproxy haproxy-1.4.24]# make install创建目录
[root@haproxy haproxy-1.4.24]# mkdir /etc/haproxy
[root@haproxy haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/修改配置文件
[root@haproxy haproxy-1.4.24]# vi /etc/haproxy/haproxy.cfg
####将文件里下面两行注释####
#chroot /usr/share/haproxy
#redispatch
####将所有listen删除,增加下面的内容####
......省略部分内容
listen webcluster 0.0.0.0:80option httpchk GET /index.htmlbalance roundrobinserver web1 20.0.0.20:80 check inter 2000 fall 3server web2 20.0.0.30:80 check inter 2000 fall 3优化路径并开启服务
[root@haproxy haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy
[root@haproxy haproxy-1.4.24]# vi /etc/init.d/haproxy
[root@haproxy haproxy-1.4.24]# chmod 755 /etc/init.d/haproxy
[root@haproxy haproxy-1.4.24]# chkconfig --add /etc/init.d/haproxy
[root@haproxy haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@haproxy haproxy-1.4.24]# systemctl start haproxy
[root@haproxy haproxy-1.4.24]# systemctl status haproxy.service

4.6、测试

img

img

4.7、配置日志功能

4.7.1、再Haproxy服务器上配置

修改配置文件
[root@haproxy haproxy]# vi /etc/haproxy/haproxy.cfg
#修改global下面两项log /dev/log local0 infolog /dev/log local0 notice再rsyslog.d下面创建一个目录
[root@haproxy haproxy-1.4.24]# touch /etc/rsyslog.d/haproxy.conf
[root@haproxy haproxy-1.4.24]# vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~重启服务
[root@haproxy log]# systemctl restart haproxy.service
[root@haproxy log]# systemctl restart rsyslog.service 查看日志目录
[root@haproxy rsyslog.d]# cd /var/log
[root@haproxy log]# ll
drwx------. 2 root root 56 11月 5 16:26 haproxy

4.7.2、访问网页

img

img

4.7.3、查看日志内容

[root@haproxy haproxy]# cat haproxy-info.log
Nov 5 16:25:24 haproxy haproxy[15653]: 20.0.0.1:53977 [05/Nov/2020:16:25:15.723] webcluster webcluster/web1 0/0/0/1/9089 304 356 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
Nov 5 16:25:47 haproxy haproxy[15653]: 20.0.0.1:53978 [05/Nov/2020:16:25:32.515] webcluster webcluster/web2 0/0/0/0/14663 200 239 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
[root@haproxy haproxy]# cat haproxy-notice.log
Nov 5 16:24:22 haproxy haproxy[15652]: Proxy webcluster started.
Nov 5 16:24:22 haproxy haproxy[15652]: Proxy webcluster started.


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文总结了淘淘商城项目的功能和架构,并介绍了传统架构中遇到的session共享问题及解决方法。淘淘商城是一个综合性的B2C平台,类似京东商城、天猫商城,会员可以在商城浏览商品、下订单,管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。商城的架构包括后台管理系统、前台系统、会员系统、订单系统、搜索系统和单点登录系统。在传统架构中,可以采用tomcat集群解决并发量高的问题,但由于session共享的限制,集群数量有限。本文探讨了如何解决session共享的问题。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
詹姵慧3482
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有