SRE之前端服务器的负载均衡

写在前面


  • 今天和小伙伴们分享一些前端服务器负载均衡技术
  • 内容为结合《 SRE Google运维解密》 整理:
    • 涉及DNS 负载均衡
    • VIP 负载均衡
    • 反向代理负载均衡
  • 理解不足小伙伴帮忙指正

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波


运维大型系统时,将所有鸡蛋放在一个篮子里是引来灾难的最好办法。所以从容灾,负载均衡角度考虑,一般的大型系统,受众较多的,比如电信运营商的系统,都会有多个数据中心,根据流量分布,地域划分,同时考虑地理位置,电费,房价,人力等相关的经济因素,负载均衡的同时,解决了容灾问题。

在这里插入图片描述

负载的模式有很多种,主备,轮询,随机,哈希一致性负载等,比如主备区域负载,正常业务可以走省级别的数据中心,然后数据增量同步给集团数据中心,当省数据中心故障时,可以切到集团的地址,反之亦然。

有时候硬件并不能解决问题

用户流量负载均衡(traffic load balancing)系统是用来决定数据中心中的这些机器中哪一个用来处理某个请求的。

理想情况下,用户流量应该最优地分布于多条网络链路上、多个数据中心中,以及多台服务器上。但是这里的 “最优”是如何定义的呢?

并没有一个独立的答案,最优严重依赖于下列几个因素:

  • 逻辑层级(是在全局还是在局部)
  • 技术层面(硬件层面与软件层面)
  • 用户流量的天然属性

讨论以下两个常见的用户流量场景:一个搜索请求和一个视频上传请求

用户想要很快地获取搜索结果,所以对 搜索请求来说最重要的变量是延迟(latency)。对于视频上传请求来说,用户已经预期该请求将要花费一定的时间,但是同时希望该请求能够一次成功,所以这里最重要的变量是吞吐量(throughput)

两种请求用户的需求不同,是我们在 全局层面 决完“最优”分配方然的重要条件

  • 最小化请求的延迟 :搜索请求将会被发往最近的、可用的数据中心:评价条件是数据包往返时间(RTT)
  • 最大化吞吐量: 视频上传流将会采取另外一条路径——也许是一条目前带宽没有占满的链路—来最大化吞吐量,同时也许会牺牲一定程度的延迟。

局部层面: 在一个数据中心内部,我们经常假设同一个物理建筑物内的所有物理服务器都在同一个网络中,对用户来说都是等距的。因此在这个层面上的“最优”分配往往关注于优化资源的利用率,避免某个服务器负载过高

在现实中,很多其他因素也都在“最优”方案的考虑范围之内:有些请求可能会被指派到某个稍远一点的数据中心,以保障该数据中心的缓存处于有效状态。或者某些非交互式请求会被发往另外一个地理区域,以避免网络拥塞

负载均衡,尤其是大型系统的负载均衡,是非常复杂和非常动态化的。

Google在多个层面上使用负载均衡策略来解决这些问题:

DNS进行负载均衡

在某个客户端发送HTTP请求之前,会通过域名获取IP,需要先通过系统底层Socket库的解析器来向DNS服务器发起请求查询IP地址。DNS系统会通过域名和地址的映射表中查找相关的记录,然后返回ip,这就为我们第一层的负载均衡机制提供了一个良好基础:

DNS负载均衡,最简单的方案是在DNS回复中提供多个A记录或者AAAA记录(ipv4&ipv6),由客户端任意选择一个IP地址使用。这种方案虽然看起来简单并且容易实现,但是存在很多问题。

PS C:\Users\liruilong> nslookup www.baidu.com
DNS request timed out.
    timeout was 2 seconds.
服务器:  UnKnown
Address:  10.96.0.1

非权威应答:
名称:    www.a.shifen.com
Addresses:  220.181.38.150
          220.181.38.149
Aliases:  www.baidu.com

PS C:\Users\liruilong>

www.baidu.com 被解析为两个IP地址,即220.181.38.149和220.181.38.150。这意味着当你尝试连接到www.baidu.com时,你的计算机可以选择其中一个IP地址来建立连接。这样可以分散流量、提高性能和可用性,以应对高负载或服务器故障的情况。

在DNS服务器上创建多个A记录,每个记录对应一个服务器的IP地址。例如,假设有3个服务器的IP地址分别为192.168.1.1、192.168.1.2和192.168.1.3,则需要在DNS服务器上创建3个A记录,分别对应这些IP地址。

针对每个A记录,设置相同的域名和TTL值,以确保客户端每次查询时都会得到相同的结果。

在BIND DNS服务器中,可以使用round-robin关键字启用轮询功能

编辑 BIND 配置文件,并在 example.com zone 中添加以下行:

zone "example.com" {
    type master;
    file "example.com.zone";
    rrset-order { random; };
};

同时需要在 example.com.zone 文件中添加对应三个域名相同的A 记录

第一个问题 是这种机制对客户端行为的约束力很弱:记录是随机选择的,也就是每条记录都会引来有基本相同数量的请求流量。如何避免这个问题呢?

理论上我们可以使用SRV记录来指明每个IP地址的优先级和比重,但是HTTP·协议目前还没有采用SRV记录。(某些互联网协议,如 IMAP、SIP 和 XMPP`,除了与特定的服务器连接外,还需要连接到一个特定的端口。SRV 记录是在 DNS 中指定端口,优先级和权重等)

_xmpp._tcp.example.com. 86400 IN SRV 10 5 5223 server.example.com

服务 XMPP
原型协议 TCP
域名 example.com
TTL(有效期) 86400
class(网络类型) IN
在提示下键入 SRV
优先级 10
权重 5
端口 5223
目标 server.example.com

另一个问题 是客户端无法识别“最近”的地址。我们可以通过提供一个 anycast DNS服务器 地址,通过 DNS 请求一般会到达最近的地址这种方式来一定程度上缓解这个问题。内部DNS,服务器可以使用最近的数据中心地址来生成DNS回复。

更进一步的优化方式是,将所有的网络地址和它们对应的大概物理位置建立一个对照表,按照这个对照表来发送回复。但是这种解决方案使得我们需要维护一个更加复杂的DNS服务,并且需要维护一个数据更新流水线(pipeline)来保证位置信息的正确性。

当然,没有一个很简单的方案,因为这是由DNS的基本特性决定的:最终用户很少直接跟权威域名服务器(authoritive nameserver)直接联系。在用户到权威服务器中间经常有一个递归解析器(recursive nameserver)代理请求。该递归解析器代理用户请求,同时经常提供一定程度的缓存机制。

这样的DNS中间人机制在用户流量管理上有三个非常重要的影响:

  • 递归方式解析IP
  • 不确定的回复路径
  • 额外的缓存问题

负载均衡:虚拟IP

虚拟IP地址(VIP)不是绑定在某一个特定的网络接口上的,它是由很多设备共享的。所以说和代理是有本质区别的,代理往往是一个绑定到一个特定的网卡,主要用于负载均衡,这里讲的VIP是 `虚拟IP+负载均衡``的一种设计。

当然,从用户视角来看,VIP仍然是一个独立的、普通的lP地址。理论上来讲,这种实现可以让我们将底层实现细节隐藏起来(比如某一个VIP背后的机器数量),无缝进行维护工作。

比如我们可以依次升级某些机器,或者在资源池中增加更多的机器而不影响用户。

数据到达数据中心内部之后,我们可以在内部采用更大的MTU来避免碎片重组的发生,但是这种做法需要网络设备支持尽早进行负载均衡,以及分级多次进行

常见的 VIP 解决方案 一般使用 LVS+Keepalived 的方式,当然也可以考虑 NLB,HLB

LVS 是什么,即 Linux 虚拟服务器

┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.26.200:80 rr
  -> 192.168.26.153:80            Masq    2      0          0
  -> 192.168.26.154:80            Masq    2      0          0

LVS 无法对真实负载机器进行监控检测,即无法判断负载节点是否健康,能够提供能力,由此引入 Keepalived

另外使用 keepalived 可进行 HA 故障切换,也就是有一台备用的 LVS,主 LVS 宕机,LVS VIP 自动切换到从,可以基于 LVS+Keepalived 实现负载均衡及高可用功能,满足网站7x24小时稳定高效的运行。

┌──[root@vms152.liruilongs.github.io]-[~]
└─$ansible node -a 'ipvsadm -Ln'
192.168.26.153 | CHANGED | rc=0 >>
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.26.200:80 rr persistent 2
  -> 192.168.26.155:80            Route   3      0          0
  -> 192.168.26.156:80            Route   3      0          0
192.168.26.154 | CHANGED | rc=0 >>
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.26.200:80 rr persistent 2
  -> 192.168.26.155:80            Route   3      0          0
  -> 192.168.26.156:80            Route   3      0          0
┌──[root@vms152.liruilongs.github.io]-[~]
└─$

Keepalived 基于三层检测(IP层,TCP传输层,及应用层),需要注意,如果使用了 keepalived.conf 配置,就不需要再执行 ipvsadm -A 命令去添加均衡的 realserver 命令了,所有的配置都在 keepalived.conf里面设置即可。它可以自动地将真实服务器添加到 IPVS 中。当然,您需要在 keepalived.conf 文件中配置虚拟服务和真实服务器。

负载均衡:反向代理

基于反向代理的负载均衡技术, 通过使用反向代理服务器分发传入的请求后端服务器上。反向代理服务器充当了客户端和后端服务器之间的中间人,将请求转发给后端服务器,并将响应返回给客户端。

常见的反向代理负载均衡技术:Nginx,HAProxy,Apache HTTP Server` 等。负载均衡角度理解,反向代理来说更细了,ISO 参考模型角度考虑, 支持 4层和7层的代理,同时可以考虑做一些动静分离

4 层代理

┌──[root@liruilongs.github.io]-[~/load_balancing]
└─$ cat nginx.conf
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
daemon off;

events {
    worker_connections  1024;
}
# 四层代理的方式
stream{
    server {
        listen     8088;
        proxy_pass backend;
        }
    upstream backend {
        server web1:80;
        server web2:80;
    }

}

7 层代理

┌──[root@liruilongs.github.io]-[~/load_balancing]
└─$ cat nginx.conf
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
#daemon off;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$upstream_addr - $remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" ';
    access_log  /var/log/nginx/nginx_access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen          8099;
        server_name     localhost;
        root            /var/www/html/;
        index           index.html index.htm;
        access_log      /var/log/nginx/default_access.log main;
        error_log       /var/log/nginx/default_error.log;
        location / {
                proxy_pass http://backend;
        }
        location ~ .* {
                        proxy_pass http://backend;
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
    upstream backend {
        server web2:80;
        server web1:80;
    }
}

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知


《 SRE Google运维解密》


© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

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

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

相关文章

ARM--day2(cpsr、spsr、数据搬移指令、移位操作指令、位运算操作指令、算数运算指令、比较指令、跳转指令)

.text .global _gcd _gcd:mov r0,#9mov r1,#15b loop loop:cmp r0,r1beq stopsubhi r0,r1bhi loopsubcc r1,r0bcc loopstop:b stop.end用for循环实现1~100之间和5050 .text .global _gcd _gcd:mov r0,#0x0mov r1,#0x1mov r2,#0x64b loop loop:cmp r1,r2bhi stopadd r0,r0,r1ad…

0101xss入门及pikachu靶场-xss-web安全-网络安全

文章目录 0 概述1 环境准备2 反射型xss2.1 概述2.1 靶场-反射型xss(get) 3 存储型xss3.1 概述3.2 靶场-存储型xss 4 DOM型xss4.1 概述4.2 靶场-DOM型xss 5 问题总结6.1 再次启动pikachu容器报错 结语 0 概述 学习路线,如如下图所示&#xff…

前后端分离------后端创建笔记(03)前后端对接(上)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

[保研/考研机试] 杨辉三角形 西北工业大学复试上机题 C++实现

题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入n值,使用递归函数,求杨辉三角形中各个位置上的值。 输入描述: 一个大于等于2的整型数n 输出描述: 题目可能有多组不同的测试数据,对于每组输入数据, 按题目的要求输…

Java代理模式——静态代理与动态代理

代理模式 代理模式允许你为其他对象提供一个代理,以控制对这个对象的访问。代理模式在不改变实际对象的情况下,可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身,调用者可以通过这个替身去实现这个被代理对…

定长内存池设计ConcurrentMemoryPool

原理 还回来的内存用链表串联起来&#xff0c;称为自由链表 内存块自身进行链接&#xff0c;前四个字节存下一个的地址 结构 template<class T> class ObjectPool { public:T* New(){} private:char* _memory nullptr; //方便切割void* _freeList nullptr; };第一步…

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库&#xff0c;一套典型的移动端办公工具型APP Axure RP原型模板&#xff0c;可根据实际的产品需求进行扩展&#xff0c;也可以作为移动端原型设计的参考案例。为提升本作品参考价值&#xff0c;在模板设计过程中尽量追求…

uniapp 自定义手机顶部状态栏不生效问题

想要的效果想淘宝一样&#xff0c;底色覆盖到手机顶部&#xff0c;找了两天都没找到原因&#xff0c;过程很艰苦&#xff0c;直接上结果吧 项目是后来接手的&#xff0c;最终原因出在这&#xff0c; "immersed" : false>设置为 true 就可以了&#xff0c;沉浸式样…

RunnerGo的相比较JMeter优势,能不能替代?

目前在性能测试领域市场jmeter占有率是非常高的&#xff0c;主要原因是相对比其他性能测试工具使用更简单&#xff08;开源、易扩展&#xff09;&#xff0c;功能更强大&#xff08;满足多种协议的接口&#xff09;&#xff0c;但是随着研发协同的升级&#xff0c;平台化的性能…

Java智慧工地APP源码带AI识别

智慧工地为建筑全生命周期赋能&#xff0c;用创新的可视化与智能化方法&#xff0c;降低成本&#xff0c;创造价值。 一、智慧工地APP概述 智慧工地”立足于互联网&#xff0c;采用云计算&#xff0c;大数据和物联网等技术手段&#xff0c;针对当前建筑行业的特点&#xff0c;…

【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于朴素贝叶斯算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 模型原理&#xff1a; 朴素贝叶斯分类是基于贝叶斯定理的一种分类方法。它假设特征之间相互…

海康威视摄像头二次开发_云台控制_视频画面实时预览(基于Qt实现)

一、项目背景 需求:需要在公司的产品里集成海康威视摄像头的SDK,用于控制海康威视的摄像头。 拍照抓图、视频录制、云台控制、视频实时预览等等功能。 开发环境: windows-X64(系统) + Qt5.12.6(Qt版本) + MSVC2017_X64(使用的编译器) 海康威视提供了设备网络SDK,设备网…

爬虫练手项目——获取龙族小说全文

网站信息 目标网站信息如下&#xff1a;包含了龙族1-5全部内容 代码 import requests from bs4 import BeautifulSoup import os import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Sa…

NAS搭建指南一——服务器的选择与搭建

一、服务器的选择 有自己的本地的公网 IP 的请跳过此篇文章按需求选择一个云服务器&#xff0c;目的就是为了进行 frp 的搭建&#xff0c;完成内网穿透我选择的是腾讯云服务器&#xff0c;我的配置如下&#xff0c;仅供参考&#xff1a; 4. 腾讯云服务器官网地址 二、服务器…

工具推荐:Wireshark网络协议分析工具(对比tcpdump)

文章首发地址 Wireshark是一款开源的网络协议分析工具&#xff0c;可以捕获网络数据包并对其进行详细的分析和解释。下面是Wireshark的详细介绍&#xff1a; Wireshark 工作原理 Wireshark通过捕获网络接口上的数据包&#xff0c;将其转换为可读的格式&#xff0c;并在界面…

React入门 jsx学习笔记

一、JSX介绍 概念&#xff1a;JSX是 JavaScript XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在 JS 代码中书写 HTML 结构 作用&#xff1a;在React中创建HTML结构&#xff08;页面UI结构&#xff09; 优势&#xff1a; 采用类似于HTML的语法&#xff0c;降低学…

java中右移>>和无符号右移>>>的区别

public static void main(String[] args) {byte[] dest new byte[2];dest[0] 0x15; //0001 0101dest[1] (byte) 0xfb;//1111 1011System.out.println((dest[0] >> 4) & 0xff);//右移 应该是0000 0001 十进制结果显示1 结果也是1&#xff0c;正确System.out.printl…

【Linux命令详解 | chown命令】 chown命令用于修改文件或目录的所有者,常与chmod一起使用

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 更改文件的所有者2. 递归地更改目录及其内容的所有者3. 使用--from参数改变所有者4. 使用--reference参数参考其他文件或目录的所有者5. 获取帮助信息和版本信息 总结 简介 在Linux系统中&#xff0c;chown命令被…

【AI作画】使用Stable Diffusion的艺术二维码完全生成攻略

文章目录 前言Stable Diffusion 简介 什么是云端平台&#xff1f;优势灵活性和可扩展性成本效益高可用性和容错性管理简便性 选择适合的云端平台 平台优势平台操作购买算力并创建工作空间启动工作空间应用市场一键安装 使用Stable-Diffusion作图使用控制网络将文本转图像二维码…

03-基础入门-搭建安全拓展

基础入门-搭建安全拓展 1、涉及的知识点2、常见的问题3、web权限的设置4、演示案例-环境搭建&#xff08;1&#xff09;PHPinfo&#xff08;2&#xff09;wordpress&#xff08;3&#xff09;win7虚拟机上使用iis搭建网站&#xff08;4&#xff09;Windows Server 2003配置WEB站…