前端node高并发负载均衡策略-网易云课堂听课笔记

并发与负载均衡

一般来说,中高级前端可能会问到:有没有处理过高并发问题:访问量高,同时在线,同时访问。
负载均衡:把流量分摊到不同的机器上去用以平衡流量。

高级前端还需要掌握redis..等,不直接对接数据库,通过redis缓存。


系统扩展方向

例子: 双十一高峰期,并发量,系统流量不断扩大。

垂直扩展
  • 随着系统访问量增大,系统处理不了这么大的流量,那么可以通过提高系统部件的能力来实现。
    比如:增加CPU,增加内存,更换网卡

  • 垂直扩展的缺点:
    由于摩尔定律,每一美元能买到的电脑性能随时间不断翻倍。单机扩展性能提高是有限的,并且==成本会不断的提高。==

水平扩展

目前高并发高可用的系统架构中,最优的方案是==水平扩展==。
理论上,在系统能支持水平扩展的前提下,增加服务器数量,部署更多的系统集群,能够带来无限的系统提升。

如何将网络请求分布给多个机器去处理?


负载均衡-Nginx

nginx:高性能的web服务器和反向代理服务,最常用的软件负载均衡器。

核心概念: 用户请求先到nginx,再由nginx转发请求到后边的应用服务器(如node..)

nginx配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream xx{
least_conn; //优先连接最少连接数的连接
ip_hash; //优先连接ip地址最相近的
server 127.0.0.1:8080 weight=5; //weight表示权重,权重越大访问的几率越高
server 127.0.0.1:8081 weight=1;
}
// 如果同时写的话,优先使用最后写的规则。
server {
listen: 80;
server_name 127.0.0.1;
location /{
proxy_pass http://xx //转发请求
} // 可以达到不同请求路径请求不同端口的效果
}
nginx调优

Nginx一般能做到十万并发,常用的调优手法:

  • Nginx参数:
    进程与CPU绑定worker_cpu_affinity、并发连接数、缓存区、超时时间、压缩、日志
  • 操作系统的网络参数:
    能打开的最大文件数、net.ipv4.tcp_keepalive_time、tcp缓冲区/proc/sys/net/ipv4/tcp_mem、rmem、wmem

    设置操作系统网络参数的原因:tcp请求先到达操作系统,然后转发到nginx。操作系统内有tcp缓存区,当网络连接过多的时候,显然多出来的溢出缓存的tcp连接就会造成阻塞。nginx可以支持10w并发,因此可以设置操作系统tcp缓冲区的大小,使得缓冲区可以存有更多的数据,减缓阻塞。

  • 为什么只能支持10w并发?
    nginx通常用在http反向代理的场景,属于网络模型第7层应用层的协议。
    http请求的处理包括解析和封装http内容,要处理更多请求,需要更多内存和cpu资源。
    所以,nginx需要处理解析和封装http内容,因此nginx运行也受到系统性能的限制。(又回到了垂直扩展的问题)

高配置硬件太贵,通常会组成集群来获取更高的处理能力。


Nginx集群

单台Nginx处理能力在10w左右,也就是说它也是有限的,可以通过集群的方式,来获得更高的处理能力。那么谁来将请求分发给Nginx?

LVS

Linux Virtual Server,Linux虚拟服务器,是基于第四层,也就是传输层的软件负载解决方案。

  • 核心理念:原本请求LVS服务器的数据包,被LVS软件篡改了数据包的目的地,将流量转移到Nginx所在的机器IP,从而实现负载均衡。
  • 为什么LVS比Nginx快?
    传输层所使用的协议比http简单,解析和组装消耗的CPU内存等资源比Nginx低。

如何支持更多的访问?

硬件设备,例如F5。
专门的硬件设备。一台F5连接着很多LVS服务器,一个LVS服务器又连接着很多Nginx服务器。


最终的技术:DNS-无限水平扩展
一个域名可以对应多个ip。


总结

  • 技术随业务发展而变化
  • 技术选型上,不仅要考虑技术本身,还需要考虑团队能力
  • 行业变化快,需要不断学习技术拓宽视野