开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
读写分离
什么是读写分离? 读写分离顾名思义就是把读和写分开,在数据库里面就是把数据库的读写操作分布在不同数据库节点上。这样做可以小幅度的提高读写性能。
一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读,主库和从库之间之间会进行数据同步,保证从库中数据的的准确性,这样的架构实现起来起来比较简单,并且也符合系统的写少读多的特点。
数据库分组架构解决什么问题
大多数互联网业务,往往读多写少,这时候数据库的读就叫做数据库的瓶颈。
这时候,我们就可以线性提升数据库的读性能,消除读写锁冲突,从而提升数据库的写性能,那么我们就可以使用读写分离架构。
也就是说,读写分离是用来解决数据库的读性能瓶颈的
读写分离会带来什么问题?如何解决?
在互联网应用场景中,常常数据量大,并发量大,并发量高,高可用要求高,一致性要求高,如果使用“读写分离”,就需要注意以下问题。
- 数据库连接池要进行区分,哪些是读连接池,哪个是写连接池,研发的难度会增加;
- 为了保证高可用,读连接池要能够实现故障自动转移;
- 主从的一致性问题需要考虑。
读写分离对于数据库的并发非常有效,但是同时也会引来一个问题,主库和从库的数据存在延迟,比如,我们刚写完主库,主库的数据同步到从库是需要时间的,这个时间差就会导致从库和主库不一致的问题,也就是我们常说的主从同步延迟
解决方案:
1.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。
2.不同业务的mysql物理上防止不同机器,分散压力。
3.强制将读请求路由到主库处理:当从库的数据过期了,可以选择从主库读取。
4.延迟读取:既然主从同步存在延迟,那我就在延迟之后读取啊,比如主从同步延迟 0.5s,那我就 1s 之后再读取数据。
如何实现读写分离?
读写分离需要:部署多台数据库,其中一个是主库,其余都是从库了,并且要保证主从数据库之间数据同步是实时的,这个过程也叫主从复制,并且系统把写请求交给主数据库处理,读请求交给从数据库处理。
分库分表
读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:如果 MySQL 一张表的数据量过大怎么办?
换言之,我们该如何解决 MySQL 的存储压力呢?
答案之一就是 分库分表。
分库也就是把数据库不同数据转到不同数据库上,分垂直分库和水平分库。
水平的意思,就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。可以用来扩容
垂直的意思,就是把一个有很多字段的表给拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。
什么情况下需要分库分表?
遇到下面几种场景可以考虑分库分表:
- 一张表的查询速度已经慢到影响使用的时候。
- sql经过优化
- 数据量大
- 当频繁插入或者联合查询时,速度变慢
分表解决的问题
分表后,单表的并发能力提高了,磁盘I/O性能也提高了,写操作效率提高了
- 查询一次的时间短了
- 数据分布在不同的文件,磁盘I/O性能提高
- 读写锁影响的数据量变小
- 插入数据库需要重新建立索引的数据减少