haproxy的简单配置

一、Haproxy相关知识

nginx : 四层转发、七层代理

lvs :四层转发,内核态,用户态

Haproxy :四层转发,七层转发

Haproxy的作用和使用场景

  1. 场景:

    用于高并发的web场景,可以支持一万个以上的并发请求,是高性能的TCP和HTTP的负载均衡器

    工作原理:

    提供一个代理地址,访问集群

  2. 作用:

    • 进行四层和七层转发
    • 支持https
    • Haproxy本身不自带缓存功能,请求当中添加cookie,使用缓存
    • 支持主备切换(keepalive)
  3. 特点:

    • 可靠性高,稳定性好
    • 可以同时维护40000-50000个并发,单位时间内可以处理的最大请求数20000个
    • 支持负载均衡算法,虽然不带缓存,但是可以支持会话保持
      • 负载均衡算法:
      • rr :轮询
      • wrr :加权轮询
      • leastconn :最小连接数

二、Haproxy安装和配置

#haproxy安装包存放在/opt
cd /opt
tar -xf haproxy-1.5.19.tar.gz
mv haproxy-1.5.19 haproxy
cd haproxy/
uname -r
#查看本机的内核版本
make TARGET=linux2628 ARCH=x86_64
#TARGET内核版本要低于本机的内核版本,架构是x86_64
make install
mkdir /etc/haproxy
cd examples
cp haproxy.cfg /etc/haproxy

对haproxy配置文件进行设置(使用七层转发)

vim /etc/haproxy/haproxy.cfgglobal
#4-5行log /dev/log local0 infolog /dev/log local1 noticemaxconn 4096#最大连接数,推荐使用10240,需要系统内核参数修改最大打开文件数#注释下一行#chroot /usr/share/haproxynbproc 4#Haproxy的并发线程数,设置的数量最好是CPU的2倍或者和CPU保持一致defaults
#默认参数配置,包括连接配置、监听配置以及代理配置option httplog#类型 http日志retries 3#检查节点服务器3次,连续3次失败,就认为节点服务器不可用redispatch#服务器负载很高时,自动结束当前队列中处理比较久的连接maxconn 2000#最大连接数,不能超过global设置的maxconn#下面三行注释掉,已经不用了#contimeout#clitimeout#srvtimeouttimeout http-request 10s#http请求的默认超时时间timeout queue 1m#在队列当中请求的超时时间timeout connect 10s#连接超时时间timeout client 1m#客户端超时时间timeout server 1m#服务端超时时间timeout http-keep-alive 10s#默认长连接的超时时间(不是会话保持)timeout check 10s#检查后端服务器的超时时间#转发请求的设置,既可以是四层,也可以是七层
#四层和七层择其一,不要都写#七层转发的配置
listen yang1 0.0.0.0:80option httpchk GET /index.html#设置转发请求的内容,方式GET, 获取内容 index.htmlbalance static-rr#轮询算法server rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 2#server 指定真实服务器,rs01 自定义后端服务器名称#check inter 2000 :启动对后端服务器进行健康检查,检查的间隔时间2000ms#fall 3 连续三次检查不到,任务失败#四层转发的配置
frontend test
#定义服务的名称为test,前端名为testbind *:80#监听所有网络接口,端口为80mode tcp#设置负载均衡的模式为TCPdefault_backend test#指定默认后端服务名为testbackend test
#定义后端名为test,负责处理前端传递来的请求mode tcp#前后端模式匹配,都设置为TCPbalance roundrobin#设置负载均衡算法为轮询,即rrserver rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 3#保存配置

让haproxy命令可以被系统识别到

cd /haproxy/example
cp haproxy.init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin

启动haproxy服务

systemctl start haproxy

三、练习

实现keepalive + haproxy的高可用

VIP 20.0.0.100 虚拟地址

test2 :haproxy1 20.0.0.20 主

test3 :haproxy2 20.0.0.30 备

nginx1 :RS01 20.0.0.21 真实服务器1

nginx2 :RS02 20.0.0.22 真实服务器2

test1 :客户机

工作原理:

haproxy就像LVS的调度器,高可用即实现两台haproxy服务器一主一备。

在test2和test3上分别安装haproxy和keepalived

使用keepalive配置test2为 主haproxy服务器,test3为 备haproxy服务器,两台服务器都能对两台nginx服务器(即真实服务器)实现轮询

通过检测服务器上的haproxy服务状态实现主备切换,即VIP的漂移,注意:VIP是两台主备haproxy服务器的虚拟地址

3.1 test2和test3上安装haproxy

源码安装haproxy:

Haproxy安装

#haproxy安装包存放在/opt
cd /opt
tar -xf haproxy-1.5.19.tar.gz
mv haproxy-1.5.19 haproxy
cd haproxy/
uname -r
#查看本机的内核版本
make TARGET=linux2628 ARCH=x86_64
#TARGET内核版本要低于本机的内核版本,架构是x86_64
make install
mkdir /etc/haproxy
cd examples
cp haproxy.cfg /etc/haproxy

对haproxy配置文件进行设置

vim /etc/haproxy/haproxy.cfgglobal
#4-5行log /dev/log local0 infolog /dev/log local1 noticemaxconn 4096#最大连接数,推荐使用10240,需要系统内核参数修改最大打开文件数#注释下一行#chroot /usr/share/haproxy#添加下一行nbproc 4#Haproxy的并发线程数,设置的数量最好是CPU的2倍或者和CPU保持一致defaults
#默认参数配置,包括连接配置、监听配置以及代理配置option httplog#类型 http日志retries 3#检查节点服务器3次,连续3次失败,就认为节点服务器不可用redispatch#服务器负载很高时,自动结束当前队列中处理比较久的连接maxconn 2000#最大连接数,不能超过global设置的maxconn#下面三行注释掉,已经不用了#contimeout#clitimeout#srvtimeouttimeout http-request 10s#http请求的默认超时时间timeout queue 1m#在队列当中请求的超时时间timeout connect 10s#连接超时时间timeout client 1m#客户端超时时间timeout server 1m#服务端超时时间timeout http-keep-alive 10s#默认长连接的超时时间(不是会话保持)timeout check 10s#检查后端服务器的超时时间#转发请求的设置,既可以是四层,也可以是七层
#四层和七层择其一,不要都写#七层转发的配置
listen yang1 0.0.0.0:80option httpchk GET /index.html#设置转发请求的内容,方式GET, 获取内容 index.htmlbalance static-rr#轮询算法server rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 2#server 指定真实服务器,rs01 自定义后端服务器名称#check inter 2000 :启动对后端服务器进行健康检查,检查的间隔时间2000ms#fall 3 连续三次检查不到,任务失败

想做四层转发的话以用下面的配置

#四层转发的配置
frontend test
#定义服务的名称为test,前端名为testbind *:80#监听所有网络接口,端口为80mode tcp#设置负载均衡的模式为TCPdefault_backend test#指定默认后端服务名为testbackend test
#定义后端名为test,负责处理前端传递来的请求mode tcp#前后端模式匹配,都设置为TCPbalance roundrobin#设置负载均衡算法为轮询,即rrserver rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 3#保存配置

让haproxy命令可以被系统识别到

cd /haproxy/example
cp haproxy.init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin

启动haproxy服务

systemctl start haproxy

3.2 在test2和test3上安装keepalived

安装keepalived

yum -y install keeplived

对test2的keepalive进行配置

编辑检查haproxy状态的脚本

vim /opt/check_haproxy.sh
#内容如下
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
#指定curl命令的路径调用curl命令
#curl -I 仅查看http响应头部信息,而不用下载页面内容,常用于状态检查
if [ $? -ne 0 ]
thensystemctl stop keepalived
fi
vim /etc/keepalived/keepalived.conf
#在global_defs模块中
#修改下两行
smtp_server 127.0.0.1
router_id LVS_02
#route_id 后面的名称不能相同!
#添加以下行
vrrp_iptables#添加vrrp脚本模块
vrrp_script check_haproxy {script "/opt/check_haproxy.sh"interval 5
}#修改vrrp_instance VI_1 模块的内容
state MASTER
interface ens33
priority 120
virtual_ipaddress {20.0.0.100
}
#在该模块中添加脚本追踪组,执行check_haproxy里的脚本
track_script {check_haproxy
}#删除下面的所有模块,保存

对test3的keepalive进行配置

基本和test2的配置一样,区别在于

  • 不用添加vrrp_script check_haproxy脚本模块和track_script脚本追踪组

  • 全局模块global_defs中设置

    router_id LVS_01
    
  • vrrp_instance VI_1 模块中,设置

    state BACKUP
    priority 100(不用修改,默认就100)
    

重启keepalived服务

systemctl restart keepalived

3.3 测试和验证

可以先查看test2和test3的haproxy服务是否正常

curl test2和test3,观察是否能实现对两台真实服务器(Nginx1和2)的轮询,如果能轮询,则haproxy服务正常

再检查主备工作是否正常

可以查看test2和test3的IP地址

ip addr

观察到VIP现在在主服务器test2上

然后 curl 20.0.0.100 ,即访问VIP地址,能否正常获取服务,如果正常轮询,说明keepalive正常,此时是主服务器test2在通过haproxy提供服务

然后停止test2主服务器的haproxy服务

systemctl stop haproxy

过5s,再查看test2和test3的IP地址 ip addr

观察到VIP现在在备服务器test3上,VIP漂移

再 curl 20.0.0.100 ,查看能否正常获取页面服务,如果正常轮询,说明keepalive正常,此时是备服务器test3在通过haproxy提供服务

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

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

相关文章

学习Python的IDE功能--(一)入门导览

项目视图是主要工具窗口之一。它包含项目目录、SDK 特定的外部库和临时文件。点击带条纹的按钮可以预览演示项目。您也可以按Alt1打开。点击以打开项目视图,展开项目目录以查看项目文件。双击以打开welcome.py。 切换到"学习"工具窗口继续学习本课次。…

Django F()函数

F()函数的作用 F()函数在Django中是一个非常强大的工具,主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作,而无需将数据加载到Python内存中。这不仅提高了性能,还允许你利用数据库的优化功能。 字段引用 在查询表达…

SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 前言 …

力扣每日一题:2956. 找到两个数组中的公共元素

文章目录 ***今日份每日一题:***题目要求:示例如下:示例1示例2示例3 解释剖析示例示例1示例2示例3 将逻辑思路转换为代码 力扣官网:前往作答!!!! 今日份每日一题: 题目…

XBOX360-玩体感游戏时提示:您必须进行系统更新,才能使用Kinect

XBOX360-玩体感游戏时提示:您必须进行系统更新,才能使用Kinect 背景更换硬盘准备的软件XBOX换盘和拷贝游戏设置XBOX启动就进入Aurora如何何止Aurora的游戏目录扫描路径解决您必须进行系统更新,才能使用Kinect问题参考链接背景 实际上我的XBOX需要解决两个问题: 自制系统升…

HTTP缓存/强缓存/协商缓存

HTTP缓存是HTTP性能优化中一种简单高效的优化方式,通过保存资源副本并在下次请求时直接使用该副本,以减少对服务器的请求次数和数据传输量,从而提高网页加载速度和用户体验。以下是HTTP缓存的详细解释: 一、定义与工作原理 HTTP…

VMware安装CentOS 7

在虚拟机中安装无论是Windows还是Linux其实都差不多,主要还是需要熟悉VMware的使用,多新增几次就熟悉了,可以反复删除再新增去练习… 如下是安装CentOS 7 安装过程: VMare Workstation 16 PRO 中安装CentOS 7 CentOS 7 下载推荐…

Meta Llama - Model Cards Prompt formats

本文翻译整理自: https://llama.meta.com/docs/model-cards-and-prompt-formats/meta-llama-3/ 文章目录 一、Meta Llama 3与Meta Llama 3一起使用的特殊tokenMeta Llama 3Meta Llama 3 Instruct 二、Meta Llama Guard 2提示格式 三、Meta Code LlamaMeta Code Llam…

Java 中的NIO、BIO和AIO详细总结

Java IO 与 BIO、NIO IO,常写作 I/O,是 Input/Output 的简称,即输入/输出。通常指数据在内部存储器(内存)和外部存储器(硬盘、优盘等)或其他周边设备之间的输入和输出。 输入/输出是信息处理系统…

数据结构之栈的实现与排序详解与示例(C, C#, C++)

文章目录 栈的基本操作栈的排序总结 栈是一种后进先出(Last In First Out, LIFO)的数据结构。在栈中,元素的插入和删除操作都发生在同一端,即栈顶。本文将详细介绍如何实现栈的排序,并提供C, C#, C三种语言的示例。 栈…

【46 Pandas+Pyecharts | 当当网畅销图书榜单数据分析可视化】

文章目录 🏳️‍🌈 1. 导入模块🏳️‍🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 书名处理2.5 提取年份 🏳️‍🌈 3. Pyecharts数据可视化3.1 作者图书数量分布3.2 图书出版年份…

JVM--垃圾收集算法

1.分代收集理论 垃圾收集算法可以划分为“引用计数式垃圾收集”(ReferenceCounting GC)和“追踪式垃圾收集”(Tracing GC)两大类,本次仅仅讨论踪式垃圾收集 谈到垃圾收集 ,首先先了解分代的收集理论&#x…

Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

title: Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验 date: 2024/7/16 updated: 2024/7/16 author: cmdragon excerpt: 摘要:“Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验”介绍如何使用useHead函数…

智能合约中授权与转账的分离可行性分析

概览 本文档旨在探讨智能合约中授权与转账操作为何通常被设计为分离的步骤,以及在授权与转账之后,是否能够立即进行连续的代币转移。我们将从安全性、效率、灵活性和操作流程的角度分析这些问题。 授权与转账操作的分离 目标与原因 安全性增强&#…

mybatis的xml中,where标签不自动删除多余的and之类的问题

遇到了这个莫名其妙的问题,起初是很疑惑的,where标签好像失灵了一般不会自动删除掉 多余的and 看了眼sql语句,发现还是有and没被删除。 后来重新写了遍后发现又没事了。真的是神人。 然后就研究了好一会,发现!&#…

什么是Go中的泛型与接口,它们都有哪些优缺点?

Golang 中的泛型与空接口 泛型简介 泛型允许在编写能够处理任意类型的代码,而无需在每次使用不同类型时都重新编写代码。泛型的核心是类型参数,这些参数在函数、结构体或接口中定义,并在使用时进行具体化。 泛型函数 使用泛型函数时&…

Uniapp中image的@load不触发问题

load 事件不触发的常见情况有以下几种: 图片缓存命中 当图片从浏览器缓存中加载时,load 事件通常不会被触发。这是因为浏览器认为这个图片已经成功加载过了,所以不会再次触发 load 事件。 图片地址未发生变化 如果 image 组件的 src 属性值没有发生变化,即使图片是从网络上加载…

C++——关于new和delete

在C语言中我们想要动态管理内存空间,需要使用到malloc/calloc/realloc/free这些函数,在 C中有新的管理方式,那就是new和delete。new和delete是C新定义的操作符,专门用于管理堆上的内存空间。 new和delete在编译时,编译…

Linux C++ 055-设计模式之状态模式

Linux C 055-设计模式之状态模式 本节关键字:Linux、C、设计模式、状态模式 相关库函数: 概念 状态模式(State Pattern)是设计模式的一种,属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似…

Rust RefCell<T> 和内部可变性模式

内部可变性(Interior mutability)是 Rust 中的一个设计模式,它允许你即使在有不可变引用时也可以改变数据,这通常是借用规则所不允许的。为了改变数据,该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借…