高并发的概念
高并发,是指的在同一时间点,系统可以同时处理很多个同时访问的请求。
高并发方案支持日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攻击和其他攻击,将应用的损失降低到最低。