一文清晰阐述百万并发需要如何分析和设计

50人浏览 / 0人评论 / 添加收藏

现在网上有很多说如何支持百万并发,打开一看都没讲啥,等于0,这怎么能忍?不让我学习是不可能的。那么支持百万并发(同时在线)要如何分析和设计它,今天祥子哥哥就带大家来剖析一下要如何设计?

首先要阐述几个概念和问题:

  • linux系统打开文件描述符是有限的。文件描述符简写为FD(File Descrption),linux的有个核心思想是一切内容都用FD来描述,所以对应一个网络连接,实际上linux服务器打开的就是一个fd。
  • linux里面FD是分三层的,系统层面,用户层面,进程层面。这三层FD系统都有默认fd数量,我们可以修改配置信息。既然我们说百万并发,那么我们可以这样设置:
系统层 用户层 进程层
1,000,000 500,000 100,000
  • 一个系统能设置打开多少个fd跟内存大小+硬盘大小有关系(这里阐述下为啥要跟硬盘大小有关系,现在操作系统,windows、linux都会有一些swap区,何为swap区,就是操作系统划了一部分硬盘区的大小作为内存使用,从这里看出来SSD硬盘比机械硬盘要好,因为SSD读写快过机械硬盘)
  • socket四元组(源IP,源PORT,目标IP,目标PORT),四元组唯一标识一个connection。所以网上看到的一台服务只能打开最多65535个连接是错误的。作为客户端,可以绑定多个IP,一个IP最多可连接65535个(这个也取决于端口范围port_range,默认0-1024是不给开放给用户使用的)这里我们假设除了0端口,其他的都提供给我们使用,这里再阐述下为什么是65535,是因为端口号在操作系统层面是用16位来标识的,2的16次方-1(0这个端口)=65535。如果一个客户端绑定了2个IP,那么它连接一个固定服务器IP,可以打开IP个数*65535个连接。服务器能打开多少个连接取决于给进程配置最大打开多少个fd决定的。

     

现在我们开始来讲解系统架构:

先上图:
 

一般公司前置是用LVS+Nginx来做前置架构。之所以采用LVS+nginx设计有几种考虑:

  • LVS位于7层网络的第四层(传输层),nginx位于ISO7层网络的第7层,四层负载性能较好(现在nginx的新版本已经既可以做4层,也可以做7层负载,企业用的比较多的还是LVS做4层负载)
  • nginx做集群负载的话,前面使用LVS来做负载均分的话是最合适的,为什么nginx要做集群,是因为单台nginx支撑不了百万并发(同时在线)。分析nginx能支撑多少并发,我们下文来聊。
  • LVS是四层负载,它的高可用使用Keepalived中间件来做监控,这里我们采用一主一备LVS,主挂的话,VIP会自动切换到备机上,什么是VIP(virtual IP虚拟IP),如何切换,我们下文也会阐述。这里只要知道用户访问系统的时候是一个VIP的地址。LVS主备都会绑定这个VIP地址来对外提供服务。
  • 这是最重要的一点,用户访问LVS的IP地址,LVS接收到用户的请求,根据负载均衡算法,比如,轮询,随机,把请求转发到nginx节点来处理,nginx在这里做请求处理,并且nginx做的是反向代理,用户的请求到了nginx的时候不需要再回到lvs服务器,直接响应给客户的,这里如何做到的,也是VIP的功能,下一篇文章会一并阐述这里的知识点:)
  • 挖坑点:切记,LVS主备+nginx需要在一个局域网部署,为什么要强调局域网,这里还是跟VIP有关。

开始数据分析:

假如真实的业务逻辑处理,1个tomcat服务做核心逻辑处理TPS为1000(实际TPS需要做压测才能得到),那么1,000,000同时在线并发就需要超过1000台tomcat服务器(或者是node pod【K8s概念,因为现在云平台部署更加方便】,超过1000台是因为还要考虑到服务冗余),这里很多人会觉得1000台服务器很多,但是我们这里假设的场景我们这里是要支持1百万并发同时存在,也就是说需要支持的tps为1Million/s。

再来分析下nginx需要多少台,ngnix有2个配置属性配置很关键:worker的数量和work_connection,因为nginx是master-worker架构,master主要负责接收请求,转发请求到worker进程,实际上worker进程才是处理请求的实际进程。nginx官方说nginx能支撑6万多并发性能最好,那么这里我们设置nginx进程最大能打开60,000个fd,假如是4核的CPU(内存我们假设足够大32G,64G等等),我们设置worker数量为4,那么worker_connection数量为15,000。那么nginx对外能提供多少并发数呢?你以为是60,000?那么你答错了,因为nginx作为反向代理,一个用户的请求实际上占了2个fd,一个fd是用户请求,一个fd是连接后台服务的。所以一个nginx在我们这样配置参数下,可以支持30,000并发。那么百万并发前置需要多少nginx的集群,起码超过40台,有人可能会问,1百万/3万不是=33台吗,我最多给34台就够了呀,非也,我们还要考虑nginx集群容错性,所以我们肯定是需要超过33台nginx的。

那么我们lVS需要多少台机器呢?实际上二个lvs集群足够了,一个lvs集群=一主+一备+keepalived。之所以要二个集群,主要是怕一个集群挂了,对外用户访问就彻底断了。既然是二个集群,那么我们需要二个VIP。那用户到底访问哪个VIP呢?这个简单,我们不会主动给用户提供VIP地址,现在大多都是提供的域名,一个域名下面绑定多个VIP地址,这样用户访问的时候DNS就可以返回这二个集群的VIP地址,很多人就喜欢刨根问底,好像一个域名只能绑定一个IP呀,非也,你这样想是不是可以换个角度呢?我国有很多IPS服务商(什么是IPS,就是网络提供商,联通,电信,移动等),一个IPS服务商我们绑定一个IP,那么我们不就可以解析到三个IP:)实际上真实也差不多,大家这样理解就够了。知道一个域名是可以绑定多个IP的。那么话说回来,有人会觉得二个集群够用吗?实际上主要网络入口带宽足够,LVS服务器配置够好,完全没问题,现在服务器都是万兆网卡。LVS在这里面只做接收请求,就把用户的数据包转发给nginx,然后就干完活了,至于维持长链接的事情,和他没关系,它不需要响应用户的请求。这也是VIP的功能。在大型的互联网公司,一般都会做异地多活架构设计,如果有感兴趣的伙伴,下次我们也可以聊聊如何做异地多活,异地多活存在的问题点:)。

最后我们再来讨论下网关zuul,网关做的功能主要是有操作审计,权限认证控制,流量控制,多租户控制等等,它不做具体的业务逻辑。(现在网关有太多,比如istio用的sidecar就可以做,应用层,springcloud gateway等等,云平台和应用层都可以做网关)假如zuul压测并发吞吐量为1万,那么我们需要部署超过100台zuul服务器网关。

最后总结我们要支持百万并发(同时在线)的架构设计可以这样设计数据:

系统设置FD为1百万,用户层面50万,进程层面为10万

2个LVS集群(一主一备+keepalived)

40台nginx服务器

起码100台zuul网关服务器(一台zuul网关服务器tps为10,000)

起码1000台tomcat服务器(一台tomcat业务逻辑的tps为1,000)
很多人是不是被吓到了,或者说我们公司没有这么多服务器也能支持百万并发呀,非也,你们大部分场景不是1million/TPS,不是每一秒都承受了100万的并发请求的,这个大家要清晰> 的认识到哟。

要不然拿一个我们的业务场景来分析,我们GPS数据汇报量是一台设备10S发一次请求GPS信息,现在有1万台设备,所以我们需要一秒承接1万/TPS,然后中间9秒不处理任何GPS的数据?那么我们是不是可以这样设计,用kafka来接收所有的1万条数据/10秒发一次。假如我们一台服务器一秒可以处理1000条,那么我2台业务服务器一秒可以处理2000条数据,因为我们是10秒1万条GPS信息,那么我只要2台业务服务器处理5秒就可以处理完,还有5秒是可以空闲下来的。你说是吧:),所以多少台服务器是需要根据业务场景设计的,这也再次说明技术不能脱离业务。哈哈有什么问题可以在下面留言沟通~~~

全部评论