读写分离是大型架构的必备技能,也是大厂重点考察对象,下面我就全面来详解读写分离及原理机制@mikechen
读写分离
读写分离是一种常见的数据库架构设计,从字面上就很容易理解,就是数据的:“读”、和“写”分离。
如下图所示:
写操作(包括:插入、更新和删除操作…等等),由主数据库(Master)处理。
而读操作(包括:查询…等操作),由从数据库(Slave)处理。
这就是“读写分离”,通过将读操作分散到多个从数据库上,减少主数据库的负载,从而,极大的提升整个系统的并发处理能力。
读写分离实现原理
上面我们谈了“读写分离”的价值,对于互联网应用“读多”和“写少”的场景,比如:电商等典型业务是非常适用的。
知道了其重要性,下面我接着谈:如何来实现”读写分离“?
读写分离的架构实现,整体如下图所示:
从上图可看出,读写分离是基于:“主从复制架构”来实现的。
- 主数据库:负责处理所有的写操作(比如:插入、更新、删除…)。
- 从数据库:通过复制机制从主数据库获取并应用数据更改,处理所有的读操作。
通过上面的讲述,知道了实现机制依赖于“主从复制”。
所以,要掌握好读写分离的原理,还需要掌握“主从复制”的实现机制原理。
下面,我接着谈@mikechen
我以MySQL的主从复制为例,整体架构实现,如下图所示:
实现步骤,大致分为如下几点:
第一步:主数据库记录二进制日志(binlog);
比如:当主数据库执行写操作,比如:INSERT、UPDATE、DELETE。。。等操作时,首先,这些操作会被记录到二进制日志中。
MySQL 二进制日志(Binlog):是 MySQL 服务器用来记录所有更改数据库数据操作的日志文件,包括 DDL 语句和 DML 语句。
[mysqld] log-bin=mysql-bin # 启用二进制日志并指定日志文件前缀 server-id=1 # 设置服务器唯一 ID binlog-format=row # 设置 Binlog 格式(row、statement、mixed) expire-logs-days=7 # 自动清除超过7天的 Binlog 文件 max_binlog_size=100M # 单个 Binlog 文件的最大大小
所有数据更改的详细信息,都放在这个二进制文件中,是主从复制的核心。
第二步:从数据库读取二进制日志(binlog);
从数据库通过I/O线程,连接到主数据库,读取主数据库的二进制日志,并将其保存到本地的中继日志(relay log)中。
大致流程:
- I/O线程启动:从数据库上的I/O线程,使用专用的复制用户连接到主数据库;
- 读取二进制日志:I/O线程读取主数据库的二进制日志,将其内容写入到从数据库的中继日志中;
- 日志同步:I/O线程不断地从主数据库读取新的二进制日志,并更新到中继日志中。
第三步:从数据库应用中继日志(relay log)。
从数据库的SQL线程读取中继日志,并重放其中的写操作,更新从数据库中的数据。
这样,从数据库的数据状态就会逐步跟上主数据库。
通过以上步骤,主从复制实现了主数据库与从数据库之间的数据同步,从而可以实现读写分离了。
读写分离总结
总之,读写分离是提升数据库性能和扩展性的有效手段,通过将读操作分散到多个从数据库上,可以显著提高系统的并发处理能力、和响应速度。
作者简介
陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》