百万并发服务器的搭建

一 高并发服务搭建

1.1 背景

单台Tomcat的并发数量非常有限,一般情况下最高的并发数量为500,而Nginx的并发能力非常强,可高达50K,基本满足所有系统的需求,Nginx可以采用LVS来做负载均衡

1.2 各种负载均衡方案的介绍

1.2.1 基于DNS的负载均衡

在这里插入图片描述
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

​ DNS负载均衡技术是最早的负载均衡解决方案,它是通过DNS服务中的随机名字解析来实现的,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时得到其中的一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,它们也就访问不同地址上的Web服务器,从而达到负载均衡的目的。

优点: 实现简单、实施容易、成本低、适用于大多数TCP/IP应用;

缺点

1、 负载分配不均匀,DNS服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况;如果后台的Web服务器的配置和处理能力不同,最慢的Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用;

2、可靠性低,如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS请求分配到这台故障服务器上,导致不能响应客户端。

3、变更生效时间长,如果更改DNS有可能造成相当一部分客户不能享受Web服务,并且由于DNS缓存的原因,所造成的后果要持续相当长一段时间(一般DNS的刷新周期约为24小时)。

1.2.2 基于四层交换技术的负载均衡

在这里插入图片描述
基于四层交换技术的负载均衡是通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器与请求客户端建立TCP连接,然后发送Client请求的数据。

具有代表意义的产品:LVS(开源软件),F5、Array(硬件)

优点:性能高、支持各种网络协议

缺点:对网络依赖较大,负载智能化方面没有7层负载好(比如不支持对url个性化负载),F5硬件性能很高但成本也高需要人民币几十万,对于小公司就望而却步了。

1.2.3 基于七层交换技术的负载均衡

在这里插入图片描述
基于七层交换技术的负载均衡也称内容交换,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的服务器。七层负载均衡服务器起了一个代理服务器的作用,client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client。

具有代表意义的产品:nginx(软件)

优点:对网络依赖少,负载智能方案多(比如可根据不同的url进行负载)

缺点:网络协议有限,nginx支持http负载,性能没有4层负载

1.2.4 确定使用四层+七层负载结合方案

四层负载使用lvs软件或F5硬件实现

七层负载使用nginx实现

nginx集群背景:
在keepalived+nginx的高可用的架构中,nginx是作为外部访问系统的唯一入口,理论上一台nginx的最大并发量可以高达50000,但是当并发量更大的时候,keepalived+nginx的高可用机制是没办法满足需求的,因为keepalived+nginx的架构中确确实实是一台nginx在工作,只有当master宕机或异常时候,备份机才会上位。那么如何解决更大的高并发问题呢,也许会问能不能搭建nginx集群,直接对外提供访问?

很显然这是欠妥当的,因为当nginx作为外部的唯一访问入口,没办法直接以集群的形式对外提供服务,没有那么多的公网ip资源可用,既太浪费也不友好。但是在内网环境下,是可以用nginx集群(nginx横向扩展服务集合)的,当然总得有一个对外入口,所以需要在nginx集群之上,在加一层负载均衡器,作为系统的唯一入口。

架构图如下:
在这里插入图片描述

二 OpenResty的介绍

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关

OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统

OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应

OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑,而不再像之前,还需要在nginx中自己编写lua的脚本,再进行调用了

OpenRestry安装

安装依赖库

yum install libtermcap-devel ncurses-devel libevent-devel readline-devel gcc

添加仓库路径

yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

安装OpenResty

yum install openresty

安装好了后会多一个目录 /usr/local/openrestry,里面有nginx模块,如下图:
在这里插入图片描述
安装好了后,访问服务器: http://192.168.211.130

在这里插入图片描述
系统参数调整

由于系统参数限制,我们运行的软件很难达到特别大的高并发效果,如果想让并发能力提升,需要修改系统参数.

/etc/sysctl.conf中添加如下参数:

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 100
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_syn_backlog = 3240000
net.ipv4.tcp_window_scaling = 1
#net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.conf.lo.arp_announce=2
fs.file-max = 40000500
fs.nr_open = 40000500
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_keepalive_time = 1
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_mem = 768432 2097152 15242880
net.ipv4.tcp_rmem = 4096 4096 33554432
net.ipv4.tcp_wmem = 4096 4096 33554432
net.core.somaxconn = 6553600
net.ipv4.ip_local_port_range = 2048 64500
net.core.wmem_default = 183888608
net.core.rmem_default = 183888608
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.core.netdev_max_backlog = 2621244
kernel.sem=250 65536 100 2048
kernel.shmmni = 655360
kernel.shmmax = 34359738368
kerntl.shmall = 4194304
kernel.msgmni = 65535
kernel.msgmax = 65536
kernel.msgmnb = 65536

net.netfilter.nf_conntrack_max=1000000
net.nf_conntrack_max=1000000
net.ipv4.netfilter.ip_conntrack_max=1000000
kernel.perf_cpu_time_max_percent=60
kernel.perf_event_max_sample_rate=6250

net.ipv4.tcp_max_orphans=1048576
kernel.sched_migration_cost_ns=5000000
net.core.optmem_max = 25165824
kernel.sem=10000 2560000 10000 256

修改/etc/security/limits.conf配置进程参数,在文件尾部添加如下配置:

* soft nofile 20000500
* hard nofile 20000500

重启后,上面配置生效。

三 Wrk性能测试

wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等.

wrk安装:

cd /usr/local/src
yum install git -y
git clone https://github.com/wg/wrk.git
cd wrk
yum -y install gcc
make
ln -s /usr/local/src/wrk/wrk /usr/local/bin

wrk -t4 -c2500 -d20s "http://127.0.0.1:80"

测试参数:

-t 需要模拟的线程数
-c 需要模拟的连接数
-d 测试的持续时间
–timeout 超时的时间
–latency 显示延迟统计

测试结果:

- Latency:响应时间 
- Req/Sec:每个线程每秒钟的完成的请求数 
- Avg:平均 
- Max:最大 
- Stdev:标准差

单机测试案例如下:
在这里插入图片描述
我们这里测出来的QPS是14万,这个数据取决于电脑的配置,如果配置越高这里的QPS越高,可高达百万。

猜你喜欢

转载自blog.csdn.net/qq_33417321/article/details/112726199
今日推荐