案例:使用Haproxy搭建Web集群

news2024/11/18 19:45:46

目录

Haproxy

Haproxy和LVS的区别

LVS

Haproxy

代理和调度的区别

Haproxy调度算法原理

案例

拓扑图

Web服务器配置

Haproxy配置

安装Haproxy

Haproxy初步设置

Haproxy配置

配置文件各行说明

监听项配置

启动Haproxy

测试

配置Haproxy日志


Haproxy

Haproxy是一种集群调度工具,可以提供高可用性、负载均衡、基于TCP和HTTP应用的代理软件

Haproxy和LVS的区别

  • LVS

    • LVS在企业应用中抗负载能力强,但存在缺陷
    • LVS不支持健康状态检查和动静分离
    • 对于大型网站,LVS的实施配置复杂,维护成本相对较高
    • 支持4层代理
  • Haproxy

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

代理和调度的区别

Haproxy是代理,而LVS是调度

  • 代理:代替后端服务器接收客户端的请求,并不解析,而是转交给后端服务器
  • 调度:调度器收到客户端的请求调度给后端服务器,后端服务器把结果直接返回给客户端

Haproxy调度算法原理

  • RR(Round Robin)
    • 轮询调度,轮流分配请求给每个后端服务器
    • 适用于每个后端服务器性能差别不大的情况
  • LC(Least Connections)
    • 最小连接数,根据后端服务器建立连接的数量动态分配前端请求
    • 适用于每个后端服务器性能差别大的情况
  • SH(Source Hashing)
    • 基于源IP、Cookie等的进行调度
    • 适用于一些有Session会话记录在服务器端的场景,可以基于源IP和Cookie等属性做集群调度
    • 每次调度器收到请求后,检测源地址生成哈希值,根据哈希值辨别该地址上次请求连接的服务器,分配该请求给上次连接的服务器(会话保持)

会话:会话是客户端登录服务器后,服务器向客户端发送的cookie,短时间内再访问该服务器就无需进行身份验证


案例

拓扑图

操作系统

IP 地址

角色

CentOS

192.168.10.101

Haproxy服务器

CentOS

192.168.10.102

Web服务器

CentOS

192.168.10.102

Web服务器

CentOS或Windows

192.168.10.104

访问网站测试


Web服务器配置

打开所有主机并连接上XShell

两个Web服务器的配置基本一致,因此先开启全部会话同步,然后单独关闭101(Haproxy)的会话同步

在102(Web服务器①)操作

关闭防火墙和内核安全机制,安装Apache网站服务

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd

关闭会话同步

在102(Web服务器①)操作

先关闭会话同步,然后为两个Web服务器添加不同的网页内容

[root@localhost ~]# echo "Test Web 01" > /var/www/html/index.html

在102(Web服务器①)操作

[root@localhost ~]# echo "Test Web 02" > /var/www/html/index.html

Haproxy配置

安装Haproxy

在101(Haproxy服务器)操作

这里我们使用源码包安装Haproxy,导入Haproxy源码包

在安装Haproxy之前需要先提供开发环境

为了方便实验关闭防火墙和内核安全机制,安装Haproxy所需的开发环境

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc*

解压源码包,进入解压目录

Haproxy的源码包在安装时,编译的时候需要指定当前系统的内核版本,可以先使用uname -r查看当前内核版本,然后make编译,make install安装

[root@localhost ~]# tar zxvf haproxy-1.5.19.tar.gz
[root@localhost ~]# cd haproxy-1.5.19
[root@localhost haproxy-1.5.19]# uname -r
6.9.1-1.el7.elrepo.x86_64
[root@localhost haproxy-1.5.19]# make TARGET=linux26
[root@localhost haproxy-1.5.19]# make install
# Haproxy的命令放到了/usr/local/sbin/
  • linux26:内核的版本为2.6或更高

Haproxy初步设置

然后进入解压目录下的example子目录,在/etc下新建一个目录,用来存放Haproxy的配置文件。拷贝配置文件

[root@localhost haproxy-1.5.19]# cd examples/
[root@localhost examples]# mkdir /etc/haproxy
[root@localhost examples]# cp haproxy.cfg /etc/haproxy/

为了方便在系统中使用Haproxy,拷贝服务脚本到管理服务的目录下,并且重命名把后缀去掉,然后为该脚本添加执行权

使用chkconfig命令将Haproxy添加为系统服务,注意--add选项指定的服务名称对应的是/etc/init.d/目录下服务脚本的名称

[root@localhost examples]# cp haproxy.init /etc/init.d/haproxy
[root@localhost examples]# chmod +x /etc/init.d/haproxy
[root@localhost ~]# chkconfig --add haproxy
[root@localhost ~]# chkconfig haproxy on  # 开机自启

拷贝命令文件,使其他程序也能找到Haproxy的命令

[root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/

Haproxy配置

打开Haproxy配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
配置文件各行说明

先删除26行以下的内容,然后这里讲解一下配置文件中的参数

global  # 全局配置项,如果与default的冲突了,应用default的参数
        log 127.0.0.1   local0  # 配置日志记录,local0为日志设备,默认是系统日志
        log 127.0.0.1   local1 notice # 日志级别为notice
        #log loghost    local0 info    
        maxconn 4096  # 最大连接数
        chroot /usr/share/haproxy  # 禁锢目录,存放Haproxy运行时的数据目录,需要创建出来或把该行注释掉才能启动Haproxy
        uid 99        # 用户uid
        gid 99        # 用户gid
        daemon        # 以守护进程的方式运行
        #debug        # 调试模式,输出启动信息到标准输出
        #quiet        # 安静模式,启动时无输出

defaults  # 默认配置项
        log     global       # 使用globle中定义的日志
        mode    http         # 模式为http
        option  httplog      # 采用http的格式记录日志
        option  dontlognull  # 保证Haproxy不记录上级负载均衡发送过来的用于检测状态数据的心跳包
        retries 3            # 检查节点连接失败的次数,超过3次认为节点不可用
        #redispatch          # 当负载很高时,自动结束当前队列处理比较久的连接
        maxconn 2000         # 最大连接数
        contimeout      5000    # 连接超时时间ms
        clitimeout      50000   # 客户端超时时间ms
        srvtimeout      50000   # 服务器超时时间ms

listen  webcluster 0.0.0.0:80   # 定义群集和监听的端口号
        option  httpchk GET /index.html  # 检查服务器的index.html文件,心跳检测URL设置
        balance roundrobin   # 调度算法为轮询
        server  inst1 192.168.1.61:80 check inter 2000 fall 3   # 定义在线节点
        server  inst2 192.168.1.62:80 check inter 2000 fall 3   
       
# check inter 2000是检测心跳频率(每2000ms检测一次),fall 3是3次失败认为服务器不可用

在新版本中,超时的设置做了调整,具体如下

contimeout 被 timeout connect取代:定义haproxy将客户端请求转发至后端服务器所等待的超时时长

clitimeout 被 timeout client取代:客户端非活动状态的超时时长,是 app 连接 haproxy的时间  

srvtimeout 被 timeout server取代:客户端与服务器端建立连接后,等待服务器端的超时时长,是haproxy 连接后端web服务器的时间

监听项配置

在Haproxy配置文件中,分为全局配置选项,默认配置选项,还有监听项

因为刚才我们删除了Haproxy提供的监听项模板,这里我们添加自己的监听项参数

在第26行之后添加以下内容,保存退出

listen myweb 0.0.0.0:80
    option httpchk GET /index.html
    balance roundrobin
    server inst1 192.168.10.102:80 check inter 2000 fall 3 weight 1
    server inst2 192.168.10.103:80 check inter 2000 fall 3 weight 2

Haproxy的特点包含了能够给后端服务器做健康状态检查

如果检测的类型是网站(httpchk),就是给该网站发送请求,这里指定为GET请求,然后指定想要访问的网页文件

roundrobin:指定的调度算法,轮询

inst1:实例名,可以自由定义

check inter 2000:心跳频率检查,单位是毫秒 (ms)

weight:指定权重值,请求分发的次数

fall:检测次数

启动Haproxy

注意配置文件中的参数:chroot /usr/share/haproxy:存放Haproxy运行时的数据目录,需要创建出来或把该行注释掉

启动服务

[root@localhost ~]# systemctl start haproxy
测试

在104(客户端)操作

使用curl命令测试,这里使用Haproxy服务器的IP来访问(代理)

[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 01
配置Haproxy日志

在102(Web服务器①)操作

此时如果去查看某个Web服务器的访问日志就可以发现访问的IP都是代理服务器的IP

[root@localhost httpd]# tail /var/log/httpd/access_log
192.168.10.101 - - [07/Aug/2024:10:22:07 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
192.168.10.101 - - [07/Aug/2024:10:22:09 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
192.168.10.101 - - [07/Aug/2024:10:22:11 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"

在101(Haproxy服务器)操作

Haproxy的日志需要手动配置才能生成

修改配置文件,在全局配置选项添加下方内容

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global
    log 127.0.0.1   local0
    log 127.0.0.1   local1 notice
    log 127.0.0.1   local3  # 添加该行

新建Haproxy配置日志的文件,添加下方内容

使用rsyslog服务的udp-514端口接收local3的日志,存放在/var/log/haproxy.log文件中

[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log

imudp:用于接收日志

因为修改了配置文件,重启rsyslog和Haproxy服务

[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy

在104(客户端)操作

来到客户端访问几次,让日志生成信息

[root@localhost ~]# curl 192.168.10.101
Test Web 01
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 01

在101(Haproxy服务器)操作

最后来到在rsyslog配置文件中指定local3的位置就可以看到生成的文件,文件内也生成了日志信息了

[root@localhost ~]# cd /var/log/
[root@localhost log]# ls
haproxy.log
[root@localhost log]# cat haproxy.log 
Aug  7 16:27:00 localhost haproxy[12499]: Proxy myweb started.
Aug  7 16:27:13 localhost haproxy[12500]: 192.168.10.104:49790 [07/Aug/2024:16:27:13.957] myweb myweb/inst1 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Aug  7 16:27:14 localhost haproxy[12500]: 192.168.10.104:49796 [07/Aug/2024:16:27:14.644] myweb myweb/inst2 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Aug  7 16:27:14 localhost haproxy[12500]: 192.168.10.104:49808 [07/Aug/2024:16:27:14.904] myweb myweb/inst1 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定点数的实现

定点数实现的是float转PEint /// 浮点数有很多问题 多个平台一些运算结果不一致 /// 定点数 运算 (把浮点数转为定点数进行运算,保证所有平台结果的一致性) //因为要把float转化为整形来操作 //float是一个结构体 所以我们这里也是…

[图解]阿西莫夫·台球杀人事件-《分析模式》漫谈

1 00:00:00,470 --> 00:00:02,510 今天的《分析模式》漫谈 2 00:00:02,760 --> 00:00:06,700 我们来说一个有趣的台球杀人事件 3 00:00:08,640 --> 00:00:09,630 还是第一章 4 00:00:09,920 --> 00:00:12,020 这里有一句,you would 5 00:00:12,030 …

【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库

1、思路 docker部署项目是将项目的不同程序放入不同容器中运行,这样可以方便管理不同程序。我的项目有Springboot、Vue、mysql三部分,Vue用nginx代理,因为nodejs太占空间了。一开始我是用Dockerfile创建镜像再运行容器的,但发现它…

uniapp点击图片预览,关闭预览图片后自动触发onshow生命周期,怎么解决?

第一,页面的数据会实时更新,所以接口请求需要在onshow中,变量figh初始为true,数据列表信息可直接调用获取 当点击查看图片时改变,变量figh为false,此时onshow里面的this.postlist()不触发。 此时&#xff0…

Linux/C 高级——Linux命令

从这里开始,我们展开对Linux/c 高级的学习,首先介绍的是在Linux/c高级中,Linux的部分 目录 1.Linux简介 1.1Linux起源 1.2查看系统版本命令 1.3分层结构 1.4系统关机重启命令 2.Linux安装工具 2.1软件包安装 2.1.1软件包的管理机制 …

FastAdmin默认表单中显示列表

FastAdmin表单中又列表&#xff0c;例如订单下有好几个商品需要进行显示&#xff0c;其他字段用系统默认表单样式。 <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(商品详情)}:</label><div class&qu…

升级 chatGPT plus 成功丨出海笔记

有图有真相(升级了速度真的爽)&#xff0c;这个过程说简单不简单&#xff0c;说难不难&#xff0c;废话不说&#xff0c;直接上干货&#xff1a; 支付的时候老说你的卡decline或者被拒绝&#xff0c;就是环境原因。 关键点 换什么IP都没用&#xff0c;本地环境怎么切换都不行&…

java——泛型和JUnit

1、泛型的理解和好处 1.1、使用传统方法的问题分析 1、不能对加入到集合 ArrayList中的数据类型进行约束(不安全) 2、遍历的时候&#xff0c;需要进行类型转换,如果集合中的数据量较大&#xff0c;对效率有影响 1.2、泛型的好处 1、编译时&#xff0c;检查添加元素的类型&…

FreeRTOS学习 -- 事件标志组

一、事件标志组简介 1、事件位&#xff08;事件标志&#xff09; 事件位用来表明某个事件是否发生&#xff0c;事件位通常用作事件标志&#xff0c;比如下面的几个例子&#xff1a; 当收到一条消息并且把这条消息处理掉以后就可以将某个位&#xff08;标志&#xff09;置1&a…

阅读台灯什么品牌好?一文带你了解热门阅读台灯推荐

阅读台灯最终都绕不开护眼这个话题。护眼灯作为保护视力的辅助工具&#xff0c;以有效护眼的价值深受大众青睐。学生长时间用眼&#xff0c;普通台灯的伤害大&#xff0c;而阅读台灯的出现&#xff0c;通过其先进的技术和设计&#xff0c;能为学生提供了一个既舒适又健康的照明…

十三、代理模式

文章目录 1 基本介绍2 案例2.1 Sortable 接口2.2 BubbleSort 类2.3 SortTimer 类2.4 Client 类2.5 Client 类的运行结果2.6 总结 3 各角色之间的关系3.1 角色3.1.1 Subject ( 主体 )3.1.2 RealObject ( 目标对象 )3.1.3 Proxy ( 代理 )3.1.4 Client ( 客户端 ) 3.2 类图 4 动态…

vue3学习day04-provide和inject、defineOptions、defineModel、Pinia、pinia持久化

15、provide和inject &#xff08;1&#xff09;作用&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 &#xff08;2&#xff09;语法&#xff1a; 1&#xff09;顶层组件通过provide函数提供数据 2&#xff09;底层函数提供inject获取数据…

封装el-table 基于element封装可配置JSON表格组件

基于element封装可配置JSON表格组件 话不多说直接贴代码&#xff0c;复制运行即可查看效果 子组件全部代码 <template><div class"custom-table"><el-table:data"tableData"borderstyle"width: 100%"size"mini"max-h…

[AI绘画] 简明原生 ComfyUI 三重超细节放大教程(附工作流)

本教程将从0构建 ComfyUI 三重细节填充放大工作流&#xff0c;人有多大胆&#xff0c;图有多大产 **&#xff08;建议横屏&#xff09;**鬼灭之刃 堕姬 & 甘露寺蜜璃 三重细节填充放大 16K(154888832) 「四种放大」 ”潜空间“和”像素空间”&#xff0c;图像放大可…

精通C++ STL(三):vector的介绍及使用

目录 vector的介绍 vector的使用 vector的定义方式 vector的空间增长问题 size和capacity reserve和resize empty vector的迭代器使用 begin和end rbegin和rend vector的增删查改 push_back和pop_back insert和erase swap 元素访问 vector迭代器失效问题 迭代器失效问题举例 …

vue3+Vite实现滑动拼图验证

参考文档&#xff1a;https://github.com/javaLuo/vue-puzzle-vcode/blob/master/README3.md 最近想学习一下这个前端滑动拼图的实现&#xff0c;就找了一个第三方库&#xff0c;该库支持vue2和vue3两个版本&#xff0c;直接看文档就能上手&#xff0c;我自己跑了一边倒&#…

武汉流星汇聚:青少年为何钟情亚马逊?一站式购物与信任铸就魅力

在当今这个数字化时代&#xff0c;青少年的消费习惯正以前所未有的速度演变&#xff0c;他们不仅是未来的消费主力军&#xff0c;更是推动市场变革的重要力量。令人瞩目的是&#xff0c;Piper Sandler最新发布的青少年消费研究报告揭示了一个引人注目的现象&#xff1a;超过半数…

快速下载大模型的方法

现在&#xff0c;每天都有各种大模型不断涌现&#xff0c;这些模型文件通常都很大。如何快速又靠谱地下载这些开源大模型&#xff0c;放到我们的环境中&#xff0c;进行后续的微调、量化和部署工作呢&#xff1f;以下是我的一些经验分享。 准备 Docker 基础环境 首先&#xf…

个人知识库与RAG的技术

构建个人知识库时&#xff0c;采用RAG结合LangChain的方法极为有效。RAG&#xff0c;即检索增强生成技术&#xff0c;是一种前沿的自然语言处理手段&#xff0c;它融合了信息检索的精确匹配与语言模型的高效文本生成&#xff0c;为处理自然语言相关任务提供了一种既灵活又准确的…

java~泛型

目录 泛型 泛型的声明 泛型的实例化 泛型的使用细节 自定义泛型类 自定义泛型接口 自定义泛型方法 泛型的继承和通配符 Junit 单元测试类 泛型 检查添加元素的类型 减少了类型转换的次数&#xff0c;直接对这个类型进行遍历&#xff0c;例如arraylist<>() publ…