0
点赞
收藏
分享

微信扫一扫

MySQL复制细节01——理解复制

悄然丝语 2024-11-13 阅读 27

mysql相对于其他数据库优秀的地方在于:innodb存储引擎和复制

innodb存储引擎提供了事务,行级别的锁,mvcc,基于以上几个特性,MySQL可以实现高并发,真正进入了关系型数据库的领域。回望myisam存储引擎,那只是一个普通的存储引擎。

复制使得MySQL可以将数据同步至另外一个数据库,从而实现数据灾备和读写分离。并且,由于简单的复制协议,可以很轻松的打造一个生态圈。很多好用的开源产品都是基于mysql的复制协议,比如阿里的canel,美团的myflash等等。

复制可以横向扩展数据库的读能力。读写分离可以让从库承担大量的读流量,而让主库专一写数据的操作,主从同步binlog,除了网络流量开销外,基本没有其他开销。读写分离主要考虑的事情是:主从延迟,主从延迟是主从问题的核心。

从库除了可以分担主库的读写压力外,还主要承担数据分析,备份两方面的操作。对于数据分析,我们要知道,数据分析会扫描大量的数据,将热点数据挤出缓冲区,对数据库的使用有很大的影响。对于备份,我们要知道,备份操作一方面是io密集型操作,一方面会对数据库进行加锁,锁的管理是非常繁琐复杂的事情,一不小心,dml操作锁等待就出现了。

有了从库,我们便可以借助高可用组件,在主库故障的时候进行主从切换。业务流量可以很快的切换到从库上,实现数据库服务的高可用。mysql默认的复制是异步复制,对于可用性要求很高的业务,我们需要采用半同步复制或组复制。在这里,我们要注意两点,虽然半同步复制和组复制可以提供很高的业务可用性,但是它也需要低延迟的网络复制环境。

在这里,需要补充一下,半同步复制和组复制,前者是介于异步复制和全同步复制之间的一种复制思想,组复制则是一种高级的容错机制手段。在架构上,半同步体现为主从,在逻辑上的拓扑结构为不同级别,而组复制在逻辑上的拓扑结构体现为同级别的不同节点。

由于优秀的复制协议,使得MySQL不是一个简单的数据孤岛,而是,一个可以灵活对接到其他产品的数据分发商。

MySQL复制的内容,学习时应当分为两个部分:

1、接收主库binlog并在不同位置ack反馈的复制。(类似oracle DATAGUARD)

2、组复制(理解为oracle RAC)

接下来的内容,将采用问答的形式进一步讲解MySQL复制。

1、既然有了redo,为什么还需要binlog?

提出这个问题的,应该是类比了oracle数据库。首先,MySQL数据库支持多种存储引擎,redo log仅仅持久化了innodb的存储引擎的操作,并不持久化其他存储引擎的操作,相比之下,binlog会记录所有存储引擎的操作。深入一点来说,redo log和binlog一个是存储引擎层记录数据库操作,一个是服务层记录数据库操作。所有的数据库操作都需要经过sever层的处理,但不同的存储引擎层对不同sql的处理是各不相同的。所以即使拥有了redolog,我们仍然需要通过binlog 记录数据库的所有操作。

bin log 是二进制日志,这意味着通常我们不能直接用 vim 等命令查看。它的本质是记录当前 MySQL 服务端执行的所有写操作(如 Update,Insert 等,不包含 Select)。

复制的原理是什么?它的操作流程是什么?

复制的本质,就是将 bin log 从一个MySQL实例发送给另外一个实例,通过重放 bin log,达到数据复制的目的。


它的操作流程是:

(1) 在主库上记录二进制日志,在每个事务更新数据完成之前,master在二日志记录这些改变。       MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

(2)备库将主库的二进制日志复制到其本地的中继日志中。首先备库会启动一个工作线程,称为I/O线程,I/O线程 跟主库建立一个普通的客户端连接。然后在主库上启动一个特殊的二进制转储线程binlog dump process,这个二进制转储线程会读取主库上二进制日志中的事件,他不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库I/O 线程会将接收到的事件记录到中继日志中

(3)备库的sql线程SQL slave thread执行最后一步,SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

      此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。

整个过程涉及到 2 类日志(bin log 和 relay log),三个线程 (dump thread, io thread, sql thread)

      细节:复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

       备注:I/O线程 和sql线程 都是备库 生成,I/O线程 读取主库二进制日志到自身的中继日志,sql线程读取中继日志写入到自身的数据库中




举报

相关推荐

0 条评论