数据库⾼并发的处理⽅法
1、增加缓存
在web层和db层之间加⼀层缓存。减少数据库读取负担,提⾼数据读取速度。
2、业务拆分
分库:以电商平台为例,包含了⽤户、商品、评价、订单等⼏⼤模块,最简单的是在⼀个数据库中创建四张表。
随着业务规模的增⼤,需要对业务进⾏拆分。每个表都使⽤单独的数据库进⾏存储,将原本对⼀个数据库的依赖拆分成对4个数据库同时承担压⼒,提⾼系统吞吐量。
3、Mysql主从复制、读写分离
当数据库的写压⼒增加,cache只能缓解数据库的读取压⼒。使⽤主从复制技术达到读写分离,以提⾼读写性能和读库的可扩展性。
require的用法和短语读写分离就是只在主服务器上写,从服务器上读:主数据库处理事务性查询,从数据库处理select查询。
主从只负责各⾃的读和写,极⼤程度缓解X锁和S锁的竞争。
slave可以配置MyISAM引擎,提⾼查询性能节约系统开销。
增加冗余,提⾼可⽤性。
3.1 主从复制概念
数据可以从⼀个MySQL数据库服务器主节点复制到⼀个或多个从节点。MySQL 默认采⽤异步复制⽅式,这样从节点不⽤⼀直访问主服务器来更新⾃⼰的数据,数据的更新可以在远程连接上进⾏,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
3.2 主从复制⽤途
读写分离
在开发⼯作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使⽤读的服务,这样就会影响现有
业务,使⽤主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
数据实时备份,当系统中某个节点发⽣故障时,可以⽅便的故障切换
架构扩展
随着系统中业务访问量的增⼤,如果是单机部署数据库,就会导致I/O访问频率过⾼。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提⾼单个机器的I/O性能。
coderesources翻译3.3 Mysql主从形式
⼀主⼀从
⼀主多从
⼀主⼀从和⼀主多从是最常见的主从架构,实施起来简单并且有效,不仅可以实现HA,⽽且还能读写分离,进⽽提升集的并发能⼒。
多主⼀从
多主⼀从可以将多个mysql数据库备份到⼀台存储性能⽐较好的服务器上。
双主复制,也就是互做主从复制,每个master既是master,⼜是另外⼀台服务器的slave。这样任何⼀⽅所做的变更,都会通过复制应⽤到另外⼀⽅的数据库中。
级联复制
级联复制模式下,部分slave的数据同步不连接主节点,⽽是连接从节点。因为如果主节点有太多的从节点,就会损耗⼀部分性能⽤于replication,那么我们可以让3~5个从节点连接主节点,其它从节点作为⼆级或者三级与从节点连接,这样不仅可以缓解主节点的压⼒,并且对数据⼀致性没有负⾯影响。
3.4 Mysql主从复制原理
MySQL主从复制涉及到三个线程,⼀个运⾏在主节点(log dump thread),其余两个(I/O thread, SQL thread)运⾏在从节点
whiletrue什么意思
主数据库有个bin-log⼆进制⽂件,记录了所有增删改sql语句。(binlog线程)
从数据库把主数据库的bin-log⽂件的sql语句复制过来。(io线程)
从数据库的relay-log重做⽇志⽂件中再执⾏⼀次sql语句。(sql执⾏线程)
上图主从复制分了五个步骤进⾏:
步骤⼀:主库的更新事件(update、insert、delete)被写到binlog
步骤⼆:从库发起连接,连接到主库。
步骤三:此时主库创建⼀个binlog dump thread,把binlog的内容发送到从库。
步骤四:从库启动之后,创建⼀个I/O线程,读取主库传过来的binlog内容并写⼊到relay log
步骤五:还会创建⼀个SQL线程,从relay log⾥⾯读取内容,从Exec_Master_Log_Pos位置开始执⾏读取到的更新事件,将更新内容写⼊到slave的db。
3.5 mysql主从复制模式
MySQL 主从复制默认是异步的模式。MySQL增删改操作会全部记录在binary log中,当slave节点连接master时,会主动从master处获取最新的bin log⽂件。并把bin log中的sql relay。
异步模式
半同步模式
全同步模式
4、分表分库
在cache层的⾼速缓存,MySQL的主从复制,读写分离的基础上,这时MySQL主库的写压⼒开始出现瓶颈,⽽数据量的持续猛增,由于MyISAM使⽤表锁,在⾼并发下会出现严重的锁问题,⼤量的⾼并发MySQL应⽤开始使⽤InnoDB引擎代替MyISAM。采⽤Master-Slave 复制模式的MySQL架构,只能对数据库的读进⾏扩展,⽽对数据的写操作还是集中在Master上。这时需要对数据库的吞吐能⼒进⼀步地扩展,以满⾜⾼并发访问与海量数据存储的需求。
mysql无法连接到服务器 对于访问极为频繁且数据量巨⼤的单表来说,⾸先要做的是减少单表的记录条数,以便减少数据查询所需的时间,提⾼数据库的吞吐,这就是所谓的分表。在分表之前,⾸先需要选择适当的分表策略,使得数据能够较为均衡地分布到多张表中,并且不影响正常的查询。
分表能够解决单表数据量过⼤带来的查询效率下降的问题,但是却⽆法给数据库的并发处理能⼒带来质的提升。⾯对⾼并发的读写访问,当数据库master服务器⽆法承载写操作压⼒时,不管如何扩展Slave服务器都是没有意义的,对数据库进⾏拆分,从⽽提⾼数据库写⼊能⼒,即分库。
数据库经过业务拆分及分库分表,虽然查询性能和并发处理能⼒提⾼了。但是原本跨表的事务上升为分布式事务;由于记录被切分到不同的库和不同的表中,难以进⾏多表关联查询,并且不能不指定路由字段对数据进⾏查询。且分库分表后需要进⼀步对系统进⾏扩容(路由策略变更)将变得⾮常不⽅便,需要重新进⾏数据迁移。
使⽤⽤户ID是最常⽤的分库的路由策略。
当数据⽐较⼤的时候,对数据进⾏分表操作,⾸先要确定需要将数据平均分配到多少张表中,也就是:表容量。
这⾥假设有100张表进⾏存储,则我们在进⾏存储数据的时候,⾸先对⽤户ID进⾏取模操作,根据 user_id%100 获取对应的表进⾏存储查询操作。
在实际的开发中,我们的⽤户ID更多的可能是通过UUID⽣成的,这样的话,我们可以⾸先将UUID进⾏hash获取到整数值,然后在进⾏取模操作。
分库策略:
数据库分表能够解决单表数据量很⼤的时候数据查询的效率问题,但是⽆法给数据库的并发操作带来效率上的提⾼,因为分表的实质还是在⼀个数据库上进⾏的操作,很容易受数据库IO性能的限制。霹雳布袋戏2021年最新
因此,如何将数据库IO性能的问题平均分配出来,很显然将数据进⾏分库操作可以很好地解决单台数据库的性能问题。
分库策略与分表策略的实现很相似,最简单的都是可以通过取模的⽅式进⾏路由。
分库与分表实现策略:
上述的配置中,数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压⼒问题。
有时候,我们需要同时考虑这两个问题,因此,我们既需要对单表进⾏分表操作,还需要进⾏分库操作,以便同时扩展系统的并发处理能⼒和提升单表的查询性能,就是我们使⽤到的分库分表。
分库分表的策略相对于前边两种复杂⼀些,⼀种常见的路由策略如下:
1、中间变量 = user_id%(库数量*每个库的表数量);
access中switch函数 2、库序号 = 取整(中间变量/每个库的表数量);
3、表序号 = 中间变量%每个库的表数量;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论