解决数据库高并发
解决数据库高并发的常见方案:
1) 缓存式的 Web 应用程序架构:
在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数 据读取速度。cache 存取的媒介是内存,可以考虑采用分布式的 cache 层,这样更容易破除内存容量 的限制,同时增加了灵活性。
2) 增加 Redis 缓存数据库:
把经常访问到的数据而且不需要经常变化的数据放在缓存中。
主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减少数据库的压力。
第一获取数据从数据库中提取,然后保存在缓存中,以后就可以直接从缓存中加载数据,需要有机制维持缓存和数据库的一致性。
3) 增加数据库索引:
索引可以看作是特殊的缓存,尽量使用索引就要求where字句中精确的给出索引列的值。
4) 页面静态化:
效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能使我们的网站上的页面采 用静态页面来实现,这个最简单的方法其实也是最有效的方法。用户可以直接获取页面,不用像 MVC 结构走那么多流程,比较适用于页面信息大量被前台程序调用,但是更新频率很小的情况。
5) 使用存储过程:
处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了。
6) MySQL 主从读写分离:
当数据库的写压力增加,cache 层(如 Memcached)只能缓解数据库的读取压力。读写集 中在一个数据库上让数据库不堪重负。使用主从复制技术(master-slave 模式)来达到读写分离,以 提高读写性能和读库的可扩展性。读写分离就是只在主服务器上写,只在从服务器上读,基本原理是 让主数据库处理事务性查询,而从数据库处理 select 查询,数据库复制被用于把事务性查询(增删改) 导致的改变更新同步到集群中的从数据库。
MySQL 读写分离提升系统性能:
1、主从只负责各自的读和写,极大程度缓解 X 锁和 S 锁争用。
2、slave 可以配置 MyISAM 引擎,提升查询性能以及节约系统开销。
3、master 直接写是并发的,slave 通过主库发送来的 binlog 恢复数据是异步的。
4、slave 可以单独设置一些参数来提升其读的性能。
5、增加冗余,提高可用性。
实现主从分离可以使用 MySQL 中间件如:Atlas
7) 分表分库:
在 cache 层的高速缓存,MySQL 的主从复制,读写分离的基础上,这时 MySQL 主库的写 压力开始出现瓶颈,而数据量的持续猛增,由于 MyISAM 使用表锁,在高并发下会出现严重的锁问 题,大量的高并发 MySQL 应用开始使用 InnoDB 引擎代替 MyISAM。采用 Master-Slave 复制模式 的 MySQL 架构,只能对数据库的读进行扩展,而对数据的写操作还是集中在 Master 上。这时需要 对数据库的吞吐能力进一步地扩展,以满足高并发访问与海量数据存储的需求。
对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少 数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】。在分表之前,首先需要 选择适当的分表策略(尽量避免分出来的多表关联查询),使得数据能够较为均衡地分布到多张表中, 并且不影响正常的查询。
分表能够解决单表数据量过大带来的查询效率下降的问题,但是却无法给数据库的并发处理 能力带来质的提升。面对高并发的读写访问,当数据库 master 服务器无法承载写操作压力时,不管 如何扩展 Slave 服务器都是没有意义的,对数据库进行拆分,从而提高数据库写入能力,即分库【垂直拆分】。
8) 负载均衡集群:
将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。