在最近的面试反馈中,不少小伙伴被问到,在项目中你是如何处理高并发的。针对高并发问题,我特意整理了企业高并发的成熟解决方法,希望小伙伴们被面试官问到了,可以和面试官聊一聊,也不至于场面一度尴尬。
什么是高并发呢?
多个进程或线程同时(或者说在同一段时间内)访问同一资源会产生并发问题。
高并发原理图
初期解决方案
系统或服务器级别的解决方案
1)增大服务器的CPU。
2)增加内存条。
3)增加硬盘个数,对硬盘做Raid5。
4)换掉免费的Tomcat,使用商用weblogic(美国Oracle公司出品的)
5)增加到二块网卡。
6)聘请系统架构师优化Linux内核
7)甚至花高价直接购买高性能服务器
随着业务的不断增加,服务器性能很快又到达瓶颈
2.应用级别的解决方案
1)网页HTML 静态化(需要CMS项目支持)
2)图片服务器分离(常用解决方案)
3)缓存(常用解决方案) 上上策为分布式缓存
4)镜像(下载较多)
随着业务的不断增加,服务器性能很快又到达瓶颈
能否增加服务器数量?
解决办法:增加App服务器
随之出现更多问题
问题1;用户访问IP多了,怎么解决?
问题2:数据库出现瓶颈 怎么办?
由上面的问题引出终极解决方案—— 负载均衡
由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。
针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。
负载均衡原理图
负载均衡的功能:
转发请求
故障移除
恢复添加
负载均衡种类
1)一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的
2)一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略
负载均衡——软件解决方案
主流软件:
1.apache+jk
2.nginx
3.lvs+keepalived
什么是Apache+JK?
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件
JK是apache提供的一款为解决大量请求而分流处理的开源插件
什么是nginx?
Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·西索夫)所开发,供俄国大型的入口网站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,*使用nginx网站用户有:新浪、网易、 腾讯等。
优点:
1:可运行linux,并有 Windows 移植版。
2:在高连接并发的情况下,Nginx是Apache服务器不错的替代品Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。
什么是LVS?
LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内核2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
为什么选择LVS? 优势
1、抗负载能力强,因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的 lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和 cpu方面基本无消耗。
2、配置性低,这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。
3、工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定的。
4、无流量,上面已经有所提及了。lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。
5、基本上能支持所有应用,因为lvs工作在4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等等。
LVS 对比 Nginx
负载度 LVS KO Nginx
功能多少 Nginx KO LVS
稳定度 LVS KO Nginx
服务器性能要求 LVS KO Nginx
效率最高的负载均衡技术
调度器的实现技术中,IP负载均衡技术是效率最高的,IP虚拟服务器软件(IPVS)是在linux内核中实现的
LVS中提供了八种不同的调度算法
1轮叫调度(Round-Robin Scheduling)
2 加权轮叫调度(Weighted Round-Robin Scheduling)
3最小连接调度(Least-Connection Scheduling)
4加权最小连接调度(Weighted Least-Connection Scheduling)
5基于局部性的最少链接(Locality-Based Least Connections Scheduling)
6带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
7目标地址散列调度(Destination Hashing Scheduling)
8源地址散列调度(Source Hashing Scheduling)
9最短预期延时调度(Shortest Expected Delay Scheduling)
10不排队调度(Never Queue Scheduling)
对应: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
上述是从访问人数过多时引起的高并发解决方案,接下来我来讨论数据库高并发的解决方案
大数据量
场景:我说的大数据量处理是指同时需要对数据进行检索查询,同时有高并发的增删改操作。
大数据的处理:例如腾讯,盛大,动辄数以亿计的帐号,怎么能这么快呢, 于是找到了互联网现在对数据处理的发展。
对于大数据量处理,如果是互联网处理的话,一般分为下面阶段:
第一阶段,所有数据都装入一个数据库,当数据量大了肯定就会出现问题,就像刚刚说的查询,于是想办法
第二阶段,那时肯定想做缓存机制,确实可以,如加上缓存Memcached,但缓存也是治标不治本,数据量太大了也是不行,于是
第三阶段,master-slave模式,进行主从数据库,master提供写,slave进行读,这个适合于有写造成数据库卡的方法,还是不行,于是
第四阶段,垂直分库,这个意义还是不大,于是
第五阶段,进行水平分库,这个不错,记得以前从兴也是按这个分时间水平分库,其实可以分的更细点估计效果更好
那么数据库出现瓶颈怎么办呢?
以Mysql为例:
对Mysql进行优化(重点讲解)
缓存,主流缓存Memcached,redis…
mysql读写分离 + 主从复制
Oracle
Oracle读写分离 + 主从复制
Oracle Partition 分区
Oracle RAC集群(终级解决方案)此方案:非常贵,即使是淘宝,京东这样的大公司,也是很难受的。
解决方案有:MySql 主从复制与读写分离
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
读写原理架构图