高并发的概念
高并发,是指的在同一时间点,系统可以同时处理很多个同时访问的请求。 好的高并发方案支持日PV在百万甚至千万以上,百度就是一个高并发的示例网站,它会允许非常多的人同时在线查询但不会卡顿。
高并发通常会应用在高PV的网站中,其他应用环境如:秒杀、抢票、游戏等等也会经常用到。 目前大多数互联网企业的系统环境都会应用高并发。
高并发常用指标包括: 响应时间Response Time 吞吐量Throughput 每秒查询率QPS(Query Per Second) 并发用户数 日活量等
高并发的实现
那么如何实现高并发呢?
我们知道服务器都是有硬件性能限制的,再好的配置,也有请求处理上限。 当服务器并发请求超过硬件性能处理的上线,就会存在一个性能瓶颈。服务器会变得卡顿。 所以理论上我们不停的增加服务器硬件或服务器数量,也可以实现高并发。 这个就是高并发的垂直扩展的概念。
垂直扩展通常用于系统搭建的初期,通过扩充服务器硬件来并发处理越来越多的处理请求。 垂直扩展优点是见效快,缺点是成本高。
另外一种是高并发的水平扩展。也是目前应用最多的一种。本文主要讨论的也是高并发的水平扩展。水平扩展是通过软件和优化的手段实现高并发的效果。
高并发系统的设计主要考虑以下几个方面: 1、前端过滤请求 2、利用缓存和请求队列 3、中间件负载均衡 4、动静分离和CDN加速 5、优化数据库 6、压力测试 7、监控 8、安全和攻击处理
前端过滤请求
通常是通过前端的优化来进行请求的过滤,比如秒杀,我们可以限制用户在多少秒内只能请求一次, 过滤掉用户由于响应慢而重复提交的多余请求。
利用缓存和请求队列
1、如果只是对数据库进行读操作,可以利用缓存(redis, memcached),将数据写入更快读取速度的内存中, 用户读取速度提升的同时也可以减小数据库的压力。 2、请求队列通常在秒杀和抢票中用的较多,通过代码实现对海量请求的排序,让请求排个队。 如果缓存中还有剩余商品,则加入请求队列中,否则,返回商品卖完的提示。
web中间件负载均衡
web中间件主要是指的web站点层应用。其负载均衡用的比较多的是lvs+nginx,也有用keepalived+nginx、haproxy或者直接通过nginx的反向代理。 原理都是通过负载均衡实现高可用,同时对请求流量进行分流, 从而减轻服务器或站点的压力。
动静分离和CDN加速
所谓动静分离,就是静态页面和动态页面分离开,通过不同的方式去访问。 静态页面不会变化,可以通过nginx优化或者CDN加速。 动态页面由于涉及到数据库查询、逻辑计算等,访问相对较慢。 我们也可以通过动态页面静态化,就是将原本需要动态生成的页面提前生成好。再使用静态页面加速的方式访问。
优化数据库
数据库数据是存储在硬盘,读写慢。通常web高并发的瓶颈很多都来源于数据库的压力, 优化数据库就显得尤为重要。 同时数据库的数据是非常重要的,数据库的高可用的设计也是不容忽视的问题。 简单说一下常用的数据库优化方案: 1、数据库读写分离 在系统的并发请求中有很大一部分都是进行数据库读操作,所以数据库读写分离显得尤为重要。 一般通过配置mysql主从实现。通过读写分离,来减轻数据库的压力。 2、数据库水平拆分 水平拆分就是把同一张表拆分到不同的数据库中,解决单库存储海量数据的问题。 水平拆分通常适用于数据库数据量过大。 3、数据库集群 数据库集群是一个分布式节点架构的存储方案,可以提高性能,并增加容错性和高可用性。 方案可以采用haproxy+keepalived或者LVS+keepalived等
压力测试
完成高并发配置以后,对系统的压力测试也是非常必要的。 压力测试的是为了找到系统的瓶颈,目的就是把系统搞挂,从而发现问题,再进行针对性的系统优化。 压力测试工具很多,linux下web压测常用工具有http_load、siege等
监控
监控是高并发系统中非常重要的环节,对系统不间断的实时监控可以及时预警发现问题。并通知运维人员处理。 常用的监控是zabbix,报警可以通过微信报警。 监控范围可以包括服务器连接、服务器应用端口状态、服务器硬件信息、数据库状态等等。
安全和攻击处理
安全包括服务器安全和漏洞处理,高级防火墙设置、病毒、黑客入侵检测等。 通常企业需要制定完整的方案应对DDOS攻击和其他攻击,将应用的损失降低到最低。
![]() |
![]() |