分布式基础概念

分布式基础概念,第1张

拒绝大型单体应用,把一个独立的应用程序开发为一套小服务,每个小服务运行在自己独立的进程中,并使用轻量级机制通信,通常>如果想要同一时间有数亿人在线,TB级别带宽,CDN加速和多节点,负载均衡等等技术缺一不可。

其实,抖音,百度,阿里云,腾讯都是自建的数据中心,都是TB级别出口带宽(总出口带宽),也就是达到1TB=1024G/s的出口带宽,服务器总署基本都在20万台以上,甚至阿里云都超过了100万台。

据研究,字节跳动(抖音)的数据中心总带宽,可能在10TB级别左右,预期突破15TB级别不远了。

抖音为什么能够供上亿人同时刷?它的带宽有多大?

服务器集群
抖音并不是全国所有刷视频用户都在同一个地方的数据中心接入我们看视频的流量,如果是这样的话,那么这个数据数据中心所需的带宽就是过于巨大。

一般来说,抖音在全国各地会建设几个比较大的数据中心,也就是服务器集群,我们刷视频的请求是就近接入的。

而且每个数据中心都会和三大运营商网络对接。这也就意味着你是如果是上海移动用户,那么刷出来抖音的视频将会从上海移动的网络接入抖音。

抖音为什么能够供上亿人同时刷?它的带宽有多大?
字节跳动有多少台服务器?
根据网络数据整理,字节跳动2017年有2-3万台服务器,这个时候主要是租用服务器为主。2018年,字节跳动自己建设了数据中心,最大的数据中心在河北怀来官厅湖新媒体产业园,一期5万台服务器。二期9万台服务器。

抖音为什么能够供上亿人同时刷?它的带宽有多大?

2018年,租用+自建的服务器数量达到17万台服务器。

2020年,根据字节跳动招聘公告的数据,显示有42万台服务器。比2018年增长了15倍。(数据来自网络)

在海外,例如在美国的TIKTOK(抖音国际版)是独立出来的运营,数据在美国当地存储和分发。2020年TIKTOK在美国也租用了近10万台服务器,占地面积可达数十万平方英尺。

抖音为什么能够供上亿人同时刷?它的带宽有多大?
CDN让视频不卡顿
上面说到服务器集群,再说说CDN等技术,属于是硬性要求,基本都是视频行业的标配了,抖音肯定也不例外。

CDN是做内容分发,用通俗的话解释CDN就是:会把一些页面,专门压缩,有的压缩为静态页面,静态页面直接分发,速度快。用户可以在2s内看到内容,体验感更好。这是静态传输。

对于动态视频,首先通过智能路由,寻找最佳路径,然后协议优化将长连接,内容进行压缩,去除冗余。这就是动态压缩。

抖音为什么能够供上亿人同时刷?它的带宽有多大?

早在2015年腾讯就有5亿日活,集合了音乐,即时通讯等等产品的CDN的级别,达到了10TB带宽。每天请求万亿次。

目前抖音日活有6亿,西瓜视频+今日头条我们粗略算是2亿,总计有8亿的日活。所以,字节跳动整体服务器有10TB只少不多。

所以,拥有这么大的带宽和技术实力,才能让上亿人同时刷视频不卡顿。

短连接

连接->传输数据->关闭连接

比如>

具体就是:浏览器client发起并建立TCP连接 -> client发送>

->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。


也可以这样说:短连接是指SOCKET连接后,发送接收完数据后马上断开连接。
因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是>

长连接

连接->传输数据->保持连接 -> 传输数据-> ->直到一方关闭连接,多是客户端关闭连接。

长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

>

>

如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个>

>


TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。

什么时候用长连接,短连接?
长连接多用于 *** 作频繁,点对点的通讯,而且连接数不能太多情况。

每个TCP连接都需要三步握手,这需要时间,如果每个 *** 作都是先连接,再 *** 作的话那么处理速度会降低很多,所以每个 *** 作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

WEB网站的>

总之,长连接和短连接的选择要视情况而定。

长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。

长连接,是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。
聊天室或即时消息推送系统等,因为很多消息需要到产生时才推送给客户端,所以当没有消息产生时,就需要hold住客户端的连接,这样,当有大量的客户端时,要hold住大量的长连接。
在性能测试过程中,经常会接触到连接数相关的问题,有一个问题曾经困扰我好长时间,那就是一台服务器最多能支持多少链接数呢?

有的朋友可能会说是65535,因为 *** 作系统有65535个端口,那么这个答案准确吗?

首先先了解下如何标识一个链接(记住下面的概念,文章后面要用到), *** 作系统是通过一个四元组来标识一个TCP链接:

{本地ip,本地port,远程ip,远程port}

这四个要素唯一确定一个TCP链接,任意一个要素不相同,就认为是一个不同的链接。
在Linux系统中,一切皆文件,每一个TCP链接都要占用一个文件句柄,系统允许创建的链接数取决于句柄数的上限。超过这个值再创建链接就会报这样的错误:“Can't open so many files"。

通过命令ulimit -n可以查看当前系统允许打开文件数量的上限,在Linux中这个值默认是1024,也就是说默认情况下,只能创建1024个链接。同时这个值也是可以修改的,通过修改/etc/security/limitsconf文件,可以把这个值改大,一般服务器都会改的很大,比如我们的服务器上一般设置为1000000。
那这么说是不是就意味着只要我改的很大,链接数可以无限大了?

其实也并不是这样,创建链接的时候,一般分为两个端, 即链接的发起端和链接接收端。
比如我们现在使用Jmeter进行压测,被测系统部署在Tomcat服务器10003上,使用的是8080端口。

如果我们用5个并发来进行压测的话,创建的链接如下图所示:
对于Jmeter来说,它是链接发起端,Jmeter创建了5个链接去连接服务端的8080端口,每个新建链接会占用了一个端口号,如图中的10001-10005。在 *** 作系统中,端口号的范围是0-65535,其中0-1024是预留端口号,不可使用,其他的端口都是可以使用的。也就是说, 在链接发起端,受端口号的限制理论上最多可以创建64000左右链接。

那么有没有办法超过这个限制呢,答案是肯定的!

通过TCP标识的四元组可以看到,对于链接发起端,影响链接数的是本地ip和port,端口号受限于65535,已经没办法增加了。那我们可以增加本地ip来达到这个目的。一般情况下,服务器的一个网卡上只绑定了一个ip,对外通信都使用这个ip进行。其实网卡是支持一个绑定多个IP的,当然必须确保ip是有效的且未使用的。

# ifconfig eth0:1 10005

以上命令可以在eth0网卡上增加一个ip 10005,服务器网卡每增加一个ip,就可以允许在这个ip上再创建65535左右的链接数。
曾经做过一个邮件网关的链接数测试,目的是为了测试网关服务器可以接收并且保持多少TCP长连接。正常情况下,受限于单台机器65535端口号的影响,客户端想创建25万TCP长连接,至少需要4台机器。通过对客户端网卡绑定多IP的方法,成功在一台机器上创建了25万个链接。

当然,这种手段只是一种非常规的 *** 作,只是为了进行某种特殊场景的测试。正常情况下不推荐网卡绑定多个IP。
对于Tomcat服务器来讲,它是链接接收端,它是不是也受限于65535呢?

并不是,从上面图中可以看到,Jmeter发起的所有链接都创建在Tomcat服务器的8080端口,也就是说对于链接接收端,所有的链接占用的是同一个端口。

根据TCP标识四元组可以分析出, 一个链接接收端,最大的TCP链接数=所有有效ip排列组合的数量端口数量64000 ,这个计算结果应该是一个天文数字。 因此链接接收端支持的链接数理论上可以认为是无限大的。

上面介绍的一些数据都是理论上单台机器可以支持的TCP链接数, 实际情况下,每创建一个链接需要消耗一定的内存,大概是4-10kb,所以链接数也受限于机器的总内存。

链接发起端,活力全开才64000左右链接,内存最多才占用640M,一般客户端都能 满足,内存限制主要还是考虑服务器端。
虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。
首先需要考虑文件句柄的限制。在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。这时你需要明白 *** 作系统对可以打开的最大文件数的限制。

我们可以通过ulimit -n命令、/etc/security/limitsconf 文件 以及 /etc/sysctlconf 文件等来修改文件句柄数。

其次要考虑的是端口范围的限制, *** 作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。
由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?

面试官也比较喜欢在这里引导挖坑,类似的问题还有:一个UDP连接可以复用已经被TCP连接占用的端口嘛?

如何标识一个TCP连接?

系统使用一个4四元组来唯一标识一个TCP连接:

本地端口号 local port、本地IP地址 local ip、远端端口号 remote port、远端IP地址 remote ip。

server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。

上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制。
单台服务器最大支持多少连接数

>正在做web聊天要用到长连接现在的理解是AJAX请求 PHP页面做一个循环一直循环直到聊天记录更新返回数据AJAX再请求不知道这样理解正确不还有没有其他解决办法高手指点

看你具体的需求与服务器能提供的接口类型了,如果是>>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/12683236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)