大并发服务器开发01
基础
- Linux系统编程
- Linux网络编程
- C++
服务器设计目标
- 高性能(high performance):对于大量的并发请求,能及时快速做出响应,要求服务器最大限度发挥机器性能,使得机器在满负荷的情况下能够处理尽可能多的并发请求
- 高可用(high availability):服务器7*24小时不间断服务,故障转移
- 伸缩性(scalability):服务器具有良好的框架,业务分离,灵活部署
典型的服务器结构:网络I/O+服务器高性能编程技术+数据库
根据伸缩性,DAL(队列服务+连接池)应保证既可以跟应用服务放在同一台机器,也可以单独
降低数据库压力(提高并发能力):
- 队列+连接池
- 数据库只执行辅助操作
- 添加缓存(更新同步:timeout缓存失效,重新查询数据库)减少对数据库访问
缓存:
- 更新同步:timeout,缓存失效,重新查询数据库,实时性较差
- 缓存热点数据:一旦数据库中数据更新,立即通知前端缓存更新,实时性高
缓存换页:内存不够,讲不活跃的数据换出内存(FIFO、LRU、LFU)
使用nosql(基于key/value的非关系数据库(redis))缓存
如果缓存与应用服务器放在同一台机器为局部缓存,其它机器上的应用服务器无法访问
负载均衡:
- 对数据库的负载均衡
主从模式,读写分离(读>写),把一个数据库变成多个数据库服务器
replication机制:查询操作访问读数据库,更新等操作访问写数据库,replication机制将写数据库更新到读数据库
数据分区:
分库(按照一定逻辑把表分散到不同的数据库(垂直分区))(用户表、业务表、基础表)
(仍有三种表,但每个分区都有三种表中数据)
分表(水平分区) - 对应用服务器的负载均衡
业务分割
任务服务器(监控应用服务器状态,通过应用服务器暴露的接口(http协议))
任务服务器相当于http客户端,监视应用服务器当前的负载(CPU、IO、并发、内存换页),选取负载最低的应用服务器分配任务(应用服务器被动接收,不公平(当前正在处理的任务多但是任务都简单等))
应用服务器主动向任务服务器接收任务进行处理(应用服务器处理相同类型任务时最适用) - 前端负载均衡
DNS负载均衡:在DNS服务器中,可以为多个不同的地址配置同一个名字,对于不同的客户机访问同一个名字,得到不同的地址;
反向代理:使用代理服务器将请求发给内部服务器,让代理服务器请求均匀转发给多台内部web服务器之一,从而达到负载均衡的目的。标准代理方式是客户机使用代理访问多个外部web服务器,而这种代理方式是多个客户使用它访问内部web服务器,因此也被称为反向代理模式;
基于NAT的负载均衡技术(类似反向代理)
LVS(开源软件)
F5硬件负载均衡(贵)
服务器性能的四大杀手:
数据拷贝 (缓存
环境切换 (该不该用多线程,单核服务器(采用状态机编程效率最佳),多核服务器(多线程(尽可能避免线程切换))
内存分配 (内存池,减少向操作系统申请内存)
锁竞争 (通过逻辑尽可能避免锁的使用)