详解高性能服务器架构设计
本文从一个简单的服务器 架构 ,通过讨论出现的问题,进行一步一步优化,最后进化成高性能分布式服务器架构。
1. 初始情况:一个典型的服务器结构
一个典型的服务器结构以及面临的问题
1.网络I/O +服务器高性能编程技术+数据库
2.超出数据连接数
假设数据库支持并发连接数最大为10个,应用服务器这边有1000个并发请求,将会有990个请求失败。
3.超出时限
数据库并发连接数10个,数据库1秒中之内最多能处理1000个请求,应用服务器这边有10000个并发请求,会出现0~10秒的等待。
2. 添加数据访问层DAL,解决超出连接次数的问题
超出数据连接数,应该怎么解决?
答:添加数据访问层DAL (队列+连接池)
1.大量的请求连接数据库时,让请求排队
2.当连接建立好之后,放入连接池中,下一次请求数据库资源时不需要重新与数据库建立连接,可以直接从连接池中获得连接。
这样可以通过减少连接请求数据库的次数来提高反应速度
3. 添加缓存,减少与数据库建立连接
即使添加了DAL,但是数据库每秒允许建立的连接总会有上限,可以从不与数据库建立连接就能访问数据库中的数据着手,来提高访问效率。
答案:添加缓存,将数据库经常访问的数据,假如到缓存,可以使得访问数据时不与数据库建立连接,而是直接从缓存中查找。
超出时限,应该怎么解决?答:将数据库经常访问的数据添加到缓存中,在查找数据库之前先从缓存中
查找;如果缓存中有,直接返回;如果缓存中没有,则将数据添加到缓存中。
优点:使用缓存,可以使得[不是每-次访问数据库都要和数据库建立连接],可以从缓存中直接获取。
4. 数据库主从复制实现读写分离
对数据库进行访问时,有两种情况,读、写。当写数据库时,数据库不能被读,降低了效率。因此使用读写分离,master服务器只用于write,只从slaver上读取数据。
5. APP服务器的负载均衡
(1)在实际开发中,APP服务器肯定并不是一个,而是根据事先的功能有很多种APP服务器,如APP1、APP2、APP3等服务器,它们分别负责实现不同的功能。
(2)由于服务器的变多,因此就存在有的服务器任务很多,有的服务器无任务可做,造成负载分配不均衡的问题。
解决方案:
(1)添加任务服务器:客户端请求都发送给任务服务器
(2)空闲的APP服务器主动从任务服务器中“拿”任务
6. 水平/垂直分库分表
数据库中的数据太多,将会导致激烈的锁竞争
垂直分表/分库 :数据库可以按照一定的逻辑,将表分散到不同的数据库,比如有3中表:用户表、业务表、基础信息表。采用垂直分区,将用户表、业务表、基础信息表分别存放到3个数据库中。
水平分表 :一般情况下不使用垂直分表,而是使用水平分表,将数据库切分成10块,每块都包含用户表、业务表、基础信息表,将每块都存放到一个数据库上。
服务器性能的四大杀手
- 数据拷贝 —— 缓存
- 环境切换 —— 该不该用多线程?单线程好还是多线程好?
- 内存分配 —— 内存池
- 锁竞争 —— 通过逻辑避免锁
C/C++Linux服务器开发/高级架构师面试题、学习资料、教学视频和学习路线图,分享有需要的可以自行添加 学习交流群960994558