mysql的主从复制和读写分离

230 阅读3分钟

从本质上来说,目前一些主流应用得数据库都是单机系统,像oracle、sql server等。但mysql作为一种发端自开源的数据库,很有自己的想法,很容易就可以支持多个数据库实例一同工作,一主多从,实行主从复制,读写分离,隐隐然有分布式数据库之风。

当然,这应该不是分布式数据库。主从模式,应该算集群模式吧。分布式是指一份数据拆成多个小部分,分别存储在不同的机器上;而集群则是一份数据同时存在多台机器。分布式意在解决的是高并发问题;集群则主要是为了高可用。当然啦,集群也可以利用负载均衡,解决一些高并发的压力。(以上纯粹是我目前水平的个人理解,也许纯属胡说八道,说错了勿怪)

言归正传。主从复制、读写分离,这两样机制是一体两面,其实是同一样东西:数据库分为主、从两种库,主库接受写入,从库用于读取,有效减轻压力,提高效率;数据由主库复制到从库,保持一致性。
在这里插入图片描述

其中,首先要部署主从复制,只有主从复制完成了,才能再此基础上进行数据的读写分离。具体原理:

一、主从复制的类型

1、 基于语句的复制:在主库上执行的sql语句,在从库上也执行一遍。Mysql默认采用基于语句的复制,效率比较高,但是有时不能实现精准复制。

2, 基于行的复制:直接把改变的内容复制过去。

3、 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的复制不能精准复制时,就会采用基于行的复制。

二、主从复制的过程

主要是主库和从库间通过日志拷贝进行同步。

1、 主库数据写入时,变动会记入二进制日志(binlog);

2、 从库的IO线程在指定位置读取主库binlog内容存储到本地的中继日志(Relay Log)中;然后IO线程睡眠挂起,直到有新的数据写入。

3、从库的Sql线程读取中继日志,重放其中的事件而更新从库数据。
在这里插入图片描述

三、读写分离的实现方式

目前较为常见的mysql读写分离有两种:

1、 基于程序代码的内部实现

在代码中根据select、insert进行路由分类,这类方法也是目前生产环境中较为常用的,优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要研发人员来实现,运维人员无从下手。

2、 基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接收到客户端请求后通过判断后转发到后端数据库。

参看文章:
Mysql主从复制和读写分离