高并发系统设计之负载均衡

news/2024/5/2 23:04:00/文章来源:https://blog.csdn.net/bookssea/article/details/129127392

本文已收录至Github,推荐阅读 👉 Java随想录

文章目录

  • DNS负载均衡
  • Nginx负载均衡
    • 负载均衡算法
    • 负载均衡配置
    • 超时配置
    • 被动健康检查与主动健康检查
    • LVS/F5+Nginx

当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台、几十台、几百台。此时我们就需要负载均衡,进行流量的转发。下面介绍几种负载均衡的方案。

DNS负载均衡

一种是使用DNS负载均衡,将域名映射多个IP

用户访问时是通过如 https://www.baidu.com 的方式访问,在请求时,浏览器首先会查询DNS服务器获取对应的IP,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。

DNS还可以设置权重,我们可以将配置比较好的机器设置为高权重。

具体配置可以参考阿里云官方文档:阿里云DNS负载均衡权重配置

  • 优点:配置简单,将负载均衡的工作交给了DNS服务器,省去了管理的麻烦。
  • 缺点:DNS会有一定的缓存时间,故障后切换时间长。

DNS存在一个问题,假设某台服务器重启或者出现故障,DNS会有一定的缓存时间,故障后切换时间长,而且没有对后端服务进行心跳检查和失败重试的机制。

例如:DNS缓存了A记录,假设我有一台服务器坏了需要下线,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS仍然会将域名解析到已下线的服务器上,最终导致用户访问失败。

关于DNS缓存多久时间生效,可以参考阿里云的帮助文档:解析生效时间FAQ

Nginx负载均衡

负载均衡算法

一般用Nginx来做负载均衡比较多。

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。

  • 轮循(默认)

    Nginx根据请求次数,将每个请求均匀分配到每台服务器。

  • 最少连接

    将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。

  • IP Hash

    每个请求按访问IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题。

  • fair(第三方模块)

    根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。

    需要安装nginx-upstream-fair模块

  • url_hash(第三方模块)

    按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,如果需要这种调度算法,则需要安装nginx_upstream_hash模块。

  • 一致性哈希(第三方模块)

    ip_hash算法,在增加和服务器宕机时会导致会话和缓存丢失。如果需要使用一致性哈希,则需要安装ngx_http_consistent_hash模块。

负载均衡配置

示例配置如下:

http {upstream myserve {# ip_hash; 表示使用ip hash负载均衡策略server 192.168.0.100:8080 weight=1 max_fails=2 fail_timeout=10;;server 192.168.0.101:8080 weight=2;server 192.168.0.102:8080 weight=3;# server 192.168.0.102:8080 backup; # server 192.168.0.102:8080 down;# server 192.168.0.102:8080 max_conns=100;}server {listen 80;location / {proxy_pass http://myserve;}}
}
  • weight:weight是权重的意思,上例配置,表示6次请求中,分配1次,2次和3次。
  • max_fails:允许请求失败的次数,默认为1。超过max_fails后,在fail_timeout时间内,新的请求将不会分配给这台机器。
  • fail_timeout:默认为10秒,上诉代码配置表示失败2次之后,10秒内 192.168.0.100:8080不会处理新的请求。
  • backup:备份机,所有服务器挂了之后才会生效,如配置文件注释部分,只有192.168.0.100和192.168.0.101都挂了,才会启用192.168.0.102。
  • down:表示某一台服务器不可用,不会将请求分配到这台服务器上,该状态的使用场景是某台服务器需要停机维护时设置为down,或者发布新功能时。
  • max_conns:限制分配给某台服务器处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认是0,表示不限制最大连接。它所起到的作用是防止服务器因连接过多而导致宕机,比如我给192.168.0.102分配100个连接请求,如果这台服务器正在处理100个请求,nginx将不会分配新的请求给它。也就是同时处理的最大连接数量。

超时配置

  • proxy_connect_timeout:后端服务器连接的超时时间,默认是60秒。
  • proxy_read_timeout:连接成功后等候后端服务器响应时间,也可以说是后端服务器处理请求的时间,默认是60秒。
  • proxy_send_timeout:发送超时时间,默认是60S

被动健康检查与主动健康检查

Nginx负载均衡有个缺点,就是说Nginx的服务检查是惰性的,Nginx只有当有访问时后,才发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发,而且自带模块无法做到预警

也就是说Nginx自带的健康检查是被动的

如果我们想主动的去进行健康检查,需要使用淘宝开源的第三方模块:nginx_upstream_check_module

Nginx会定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。

示例配置如下:

upstream myserver {    server 192.168.0.100:8080;server 192.168.0.101:8080;check interval=5000 rise=2 fall=5 timeout=1000 type=http;    check_http_send"HEAD / HTTP/1.0\r\n\r\n";   check_http_expect_alive http_2xx http_3xx;}

interval间隔5s,连续失败5次,连续成功2次,超时时间1s,使用http协议,发送一个请求头,如果是2xx或者3xx状态(比如200,302等)表示服务正常运行。

LVS/F5+Nginx

对于一般应用来说,有Nginx就可以了。但Nginx一般用于七层负载均衡,其吞吐量是有一定限制的。为了提升整体吞吐量,会在 DNS 和 Nginx之间引入接入层,如使用LVS(软件负载均衡器)、F5(硬负载均衡器)可以做四层负载均衡,即首先 DNS解析到LVS/F5,然后LVS/F5转发给Nginx,再由Nginx转发给后端真实服务器。

比较理想的架构是这样的:

对于一般业务开发人员来说,我们只需要关心到Nginx层面就够了,LVS/F5一般由系统/运维工程师来维护。Nginx目前提供了HTTP (ngx_http_upstream_module)七层负载均衡,而1.9.0版本也开始支持TCP(ngx_stream_upstream_module)四层负载均衡。

一般用到F5的公司不多,大部分LVS+Nginx就可以搞定

另外我抱着好奇心去谷歌了下F5设备的价格

╮(╯▽╰)╭ 这玩意要几十万一台,看来不是一般人玩的起的。


本篇文章就到这里,感谢阅读,如果本篇博客有任何错误和建议,欢迎给我留言指正。

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

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

相关文章

Navicat Premium 安装 注册

Navicat Premium 一.Navicat Premium的安装 1.暂时关闭windows的病毒与威胁防护弄完再开,之后安装打开过程中弹窗所有警告全部允许,不然会被拦住 2.下载安装包,解压 链接:https://pan.baidu.com/s/1X24VPC4xq586YdsnasE5JA?pwdu4vi 提取码…

论文阅读 | Real-Time Intermediate Flow Estimation for Video Frame Interpolation

前言:ECCV2022 快速插帧方法 Real-Time Intermediate Flow Estimation for Video Frame Interpolation 引言 进行视频插帧目前比较常见的方法是基于光流法,分为两个步骤:1.通过光流对齐输入帧,融合对齐的帧 光流并不能直接同于…

epoll 笔记

maxevents 参数大小一般不超过64必须够了 maxevents 个事件,才会传到用户空间吗?可见,只要有事件就可以传到用户空间。一台服务器可以支撑多少个链接https://blog.csdn.net/mijichui2153/article/details/81331345 0、两台虚拟机的初始状态如…

亮个相吧小宝贝儿,五款压箱底的软件

今天要给大家推荐5款压箱底的宝贝软件了,百度搜索一下就能找到下载链接了。 1.开源浏览器——Firefox Firefox是一个自由的,开放源码的浏览器,适用于 Windows, Linux 和 MacOS X平台,Mozilla Firefox官方版体积小速度快&#xf…

rocketmq延时消息自定义配置

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分: nameserver:保存路由信息broker:保存消息生产者:生产消息消费者:消费消息 延时消息的处理是在其中的broker中。 但是…

堆球问题,开普勒猜想(格密码相关)

目录 一. 介绍 二. 历史进展分析 三.2维下的堆球问题 四. 3维下的堆球问题 五. 8维与24维下的堆球问题 总结 一. 介绍 堆球问题又叫堆球理论、最密堆积、球填充,英文为The Theory Of Sphere Packings。 堆球问题的本质就是填充一堆大小相同的球。要求这些球…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后,Yield Guild Games 现在推出了第三季的公会发展计划(GAP)。GAP 在第二季有了显著的增长,有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议,下一次迭代将…

pmp考试是什么?适合哪些人学?含金量?(含pmp资料)

先说一下我这个人的理解,PMP就是提高项目管理理论基础和实践能力的考试。 再说说PMP官方一点的说明: PMP证书全称为Project Management Professional,也叫项目管理专业人士资格认证。PMP证书由美国项目管理协会(PMI)发起,是严格…

美国原装二手keysight E4980A(安捷伦)2MHZ LCR表

Agilent E4980A、Keysight E4980A、LCR 表,20 Hz - 2 MHz E4980A 是 Agilent 的 2 MHz LCR 表。LCR表是一种电子测试设备,用于测量电子元件的电感(L)、电容(C)和电阻(R)。LCR 表可…

关于在VM上的windows server 2022系统安装

目录 1、windows serer 2022安装的准备工作 1)下载系统 2)寻找对应系统密钥 3)配置server系统开机配置项(可能会出现sconfig配置界面) 2、开始安装server系统 1、windows serer 2022安装的准备工作 1)…

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学:研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑:研究推理的科学 数学方法:引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学,即使用符号化…

「可信计算」与软件行为学

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

实验室设计|实验室设计要点SICOLAB

一、实验室设计规划要素1、实验室布局:实验室的布局要符合实验室工作流程,可以将实验室划分为干净区和污染区,以确保实验室的卫生和实验的准确性。2、设备选购:根据实验需要选择适当的设备,并确保设备的质量和性能符合…

Melis4.0[D1s]:1.启动流程(与adc按键初始化相关部分)跟踪笔记

文章目录1.启动流程1.1 最先进入的文件:head_s.S1.2 start_kernel()函数所在的文件:init.c1.3 input_init()函数所在文件:sys_input.c1.4 INPUT_LKeyDevInit()所在文件:keyboarddev.c1.5 esINPUT_RegLdev()所在文件:in…

【LeetCode】剑指 Offer 09. 用两个栈实现队列 p68 -- Java Version

题目链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/ 1. 题目介绍(09. 用两个栈实现队列) 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别…

如何运行YOLOv6的代码实现目标识别?

YOLOv6是由美团视觉团队开发的1.环境配置我们先把YOLOv6的代码clone下来git clone https://github.com/meituan/YOLOv6.git安装一些必要的包pip install pycocotools2.0作者要求pytorch的版本是1.8.0,我的环境是1.7.0,也是可以正常运行的pip install -r requirement…

【机器学习】决策树-C4.5算法

1.C4.5算法 C4.5算法与ID3相似,在ID3的基础上进行了改进,采用信息增益比来选择属性。ID3选择属性用的是子树的信息增益,ID3使用的是熵(entropy, 熵是一种不纯度度量准则),也就是熵的变化值&…

Kaldi语音识别技术(六) ----- DTW和HMM-GMM

Kaldi语音识别技术(六) ----- DTW和HMM-GMM 文章目录Kaldi语音识别技术(六) ----- DTW和HMM-GMM前言一、语音识别概况二、语音识别基本原理三、DTW(动态时间弯折)算法四、GMM-HMM前言 前面的内容中我们完成了特征的提取,那么本章节我们主要进行理论部分…

2023爱分析· 云管理服务(MSP)市场厂商评估报告:华创方舟

目录 1. 研究范围定义 2. 云管理服务(MSP)市场定义 3. 厂商评估:华创方舟 4. 入选证书 1. 研究范围定义 数字化时代,应用成为企业开展各项业务的落脚点。随着业务的快速发展,应用的功能迭代变得越来越…

VSCode Remote-SSH配置免密登录踩坑

VSCode Remote-SSH配置免密登录踩坑1. 参考2. 基本流程2.1 机器A(Windows客户端)2.2 机器B(Linux服务器)2.3 机器A(Windows客户端)的VSCode设置3. 踩坑总结相关教程很多,但要么冗余,…