大并发服务器架构介绍
一、服务器设计目标
(1)高性能(High Performance):快速请求响应;
(2)高可用(High Availability):能7X24小时工作,能够进行故障转移;
(3)伸缩性(Scalability):能跨机器通信;
二、分布式
(1)负载均载
(2)分布式存储
(3)分布式计算
三、C/S结构
任何网络系统都可以抽象为C/S结构
四、一个典型的服务器结构
网络I/O + 服务器高性能编程技术 + 数据库
1.超出数据库连接数:
(1)问题描述:
数据库并发连接数10个,应用服务器这边有1000个并发请求,将会有990个请求失败;
(2)解决方案:
我们可以加一个队列进行排队,中间层DAL数据访问层(队列服务+连接池)。
2.超出时限:
(1)问题描述:
数据库并发连接数10个,数据库1秒钟之内最能处理1000个请求,应用服务器这边有10000个并发请求,会出现0-10秒的等待;
(2)解决方案:
主要的业务逻辑挪到应用服务器处理,数据库只做辅助的业务处理,利用缓存cache。
3.缓存更新(缓存同步)
(1)如果缓存失效(timeout),重新去数据库查询,这种方法实时性比较差;
(2)将热点数据存至缓存,一旦数据库中数据更新,立即通知前端的缓存更新,这种方法实时性比较高。
4.缓存换页:
内存不够,将不活跃的数据换出内存。常见换出算法有:FIFO(先进先出) LRU(最近最少使用) LFU(最不频繁使用换出),这些在大家的操作系统课程中应该有介绍过。
5.nosql:
key/value 存放非关系数据,一致性要求不是很高的数据,可以把nosql当做缓存来使用,比如分布式缓存开源软件:redis memcached等。
6.数据库读写分离:
对大部分应用来说数据库的读操作,>写操作,对数据库进行负载均衡,master(主人) slave(奴隶)实现主从机制,主库负责写的操作,从库负责读的操作,利用大部分数据库都有的replication机制。
7.应用服务器的负载均衡:
增加一个任务服务器来实现,任务服务器查询可以监视应用服务器当前的负载。如CPU高、IO高、并发高、内存换页高等情况。
(1)应用服务器被动接收任务:查询到这些信息之后,选取负载最低的服务器分配任务;
(2)应用服务器主动接收任务:更公平。
8.数据分区(分库、分表):
(1)垂直分区:分库,数据库可以按照一定的逻辑,把表分散到不同的数据库,如分为用户表、业务表、基础表;
(2)水平分区:如把用户表的10条记录分到10个数据库,每个数据库分到一条记录。这种方式更常用。
9.服务器性能的四大杀手:
(1)数据拷贝:尽量减少数据拷贝,服务器内部一些缓存解决;
(2)环境切换(理性创建线程): 该不该用多线程,单线程好还是多线程好,例如单核服务器(采用状态机编程,效率最佳) 采用多线程编程时不能并发,反而增加了线程间的切换开销;多核服务器使用多线程能够充分发挥多核服务器的性能;
(3)内存分配: 内存池;
(4)锁竞争:尽可能减少锁的竞争;
欢迎大家学习交流,如有不足恳请批评指正,转载请注明出处,感谢您的支持。如果您也喜欢我的博客可以持续关注我,让我们一起成长,共同进步。
生活很精彩 剔除杂质,留下对编程的穷极探索 纯粹追求。