分布式,A-B之间不能使用本地的进程间通信(如共享内存),而应使用TCP。
提高数据库的并发能力的手段:
1、加一个中间件DAL,让客户端请求排队:DAL队列+连接池
2、主要的业务逻辑应该放在应用服务上去处理,数据库只做辅助的业务处理。
3、增加缓存设计,将热点数据存至缓存(但缓存的更新、同步需要考虑。)
缓存同步:
1)缓存存在一定时间限制,若timeout,则缓存失效,需重新去数据库中查询,再更新缓存;【此方法实时性比较差】
2)一旦数据库中的数据更新,立即通知前端缓存更新【此法实时性较高,但实现起来麻烦一些】
缓存换页:内存不够,将不活跃的数据换出内存。
具体的策略有:FIFO
LRU(least recently used)(最近最少使用) 详细点击1、2面试题:LRU原理和Redis实现
LFU(least frequently used)(最不频繁使用)。
分布式缓存:
减轻服务器的负担
分布式缓存有哪些呢:
它们都是开源的。
nosql
redis
memcached
数据库读写分离:
写是独享的,会把整个程序阻塞。
对于大部分应用来说,读操作 > 写操作。
对数据库进行负载均衡:
- 现在主流数据库都具有 replication 机制。
- 数据库的主-从机制,分为主数据库和从数据库,分别提高写入和读出。
- 当主数据库被写入,发送改变时,需要更新从数据库,这时候是基于 replication机制,通过日志文件发送更新的数据。这就实现负载均衡。
应用服务器的负载均衡:
方案一:应用服务器被动接受任务
增加一个任务服务器来实现,任务服务器可以监视当前各个应用服务器的负载,看是CPU高、IO高、并发高、还是内存换页高。查询到这些信息后,选取负载最低的服务器分配任务。
方案二:应用服务器主动到任务服务器接收任务进行处理
根据自己的空闲程度,主动去选择。负载均衡更加公平一些。
1、应用服务器的负载均衡,就能接收更多的连接请求。
2、任务服务器不止一台,这样当一台发生故障可以用另外一台,即满足高可用。
数据分区(分库、分表)
分库:垂直分区。
如有三个表,用户表、业务表、基础表,则把每一个表都分成一个库。
水平分区(更常用)
每一个库里面都有用户表、业务表、基础表,三个表水平切分到各个库。
服务器高性能编程
服务器性能的四大杀手:
- 1、数据拷贝
缓存来解决
- 2、环境切换(理性创建线程)
该不该用多线程、
单线程还是多线程好、
单核服务器(采用状态机编程,效率最佳),若采用多线程,又不能并发处理,反而增加了线程间切换的开销。
多核服务器,多线程能充分发挥多核服务器的性能,但也要尽量减少线程间切换。
- 3、内存分配
增加内存池,减少向操作系统申请内存。
- 4、锁竞争
锁会降低性能,应尽量减低锁的使用。