读写分离最全详解(作用目的及架构原理)

读写分离最全详解(作用目的及架构原理)-mikechen

什么是读写分离

读写分离就是将数据库分为主从库,一个主库(Master)用于写数据,多个从库(Slaver)进行轮询读取数据的过程。

读写分离最全详解(作用目的及架构原理)-mikechen

主从库之间通过某种通讯机制进行数据的同步,是一种常见的数据库架构。

 

为什么要读写分离呢?

因为数据库的“写”,比如:10000条数据到oracle可能要3分钟,操作是比较耗时的。

但是数据库的“读”,比如:从oracle读10000条数据可能只要5秒钟,相对应写就没有这么耗时。

所以读写分离解决的是:把数据库的写入与查询,在服务器上分开来,从而可以极大的提升查询效率。

 

什么时候要读写分离?

数据库不一定要读写分离,但是如果程序使用数据库较多时,而更新少,查询多的情况下就可以考虑使用。

这样可以减少数据库压力,提高性能,当然数据库也有其它优化方案,比如: 分库分表,或是搜索引擎等都是解决方法。

 

读写分离的原理

读写分离基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。

读写分离是为了将请求流量分散到不同的数据库节点上,将写入数据的请求分发到主数据库,读取数据的请求分发到从数据库,从数据可以有多台,即一主多从。

整体架构如下图:

读写分离最全详解(作用目的及架构原理)-mikechen

从上图可看出,有个关键技术就是主从复制,每次写入数据的时候,需要将主服务器数据复制到从服务器中,用来确保数据一致性。

下面我以MySQL的主从复制为例,如下图所示:

读写分离最全详解(作用目的及架构原理)-mikechen

主从复制

  1. 从服务器连接上主服务器,启动复制的时候,则会自身创建一个IO线程去像主数据库服务器拉取binlog的更新信息。
  2. 把拉过来的binlog信息写到自己服务器的一个relay log日志文件中。
  3. 从数据库服务器创建一个SQL线程,是为了将relay log的所有日志信息,进行sql回写到自己的数据库中,这样就和主库的数据一模一样了。
  4. 当主数据库有数据更新的时候,比如新插入了一条或者update了一条数据,这时候主库会将这些数据更新到binlog二进制文件中,同时,主库会创建一个binlog dump线程,这个线程将更新了的binlog信息发送到从库的IO线程,需要注意的是,这个过程是异步的,如果等着从库接受完成,是不是特别慢,且影响性能。

 

读写分离总结

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。

因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力,即可以解决可用性的问题,又解决了数据库性能问题。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法