MySQL复制

前言

在上一篇文章,我们整理总结MySQL的常用知识点,在这里,我们尝试学习MySQL复制的相关概念。

什么是MySQL的复制

MySQL的复制允许将主服务器的数据复制到一个或多个从服务器中。默认情况下,复制是异步的。从服务器不需要永久连接就可以从主服务器获取最新的数据。根据配置,可以在数据库中复制所有的数据库,选定数据库,甚至是选定的表。

为什么要实现MySQL复制

MySQL的复制有以下优点:

  1. 在多个从服务器中做负载均衡提升性能
  2. 数据安全性,可以在多个从服务器复制数据,而不会影响主服务器。
  3. 离线数据分析,可以在从服务器上做实时数据分析。
  4. 远程数据分发,为网站创建本地的副本。

MySQL复制方式

MySQL支持不同的复制方式。传统的方方式是基于从主二进制日志记录和位置进行同步。新的基于全局事务标示符GTIDs(Global Transaction Identifiers 是事务性的,因此不需要关注日志文件或位置,极大地简化了许多常见的复制任务。

同步 vs 半同步

MySQL的复制支持不同类型的同步。最初的同步是单向异步复制,也就是说一个服务器充当主服务器,一个或多个服务器充当从服务器。

异步复制的机制是主服务器将事件写入其二进制日志,但不知道从服务器是否或合适检索和处理这些事件。使用异步复制是,如果主服务器出现奔溃,它提交的事务可能不会传输到任何从服务器。因此,在这种情况下,把一个从服务器提升为主服务器,可能会缺少奔溃的主服务器丢失的部分事务。

半同步复制,可用做异步复制的升级版:

  1. 从服务器链接到主服务器时会显示是否具有半同步的能力。
  2. 如果主服务器启用了半同步复制,并且至少有一个半同步从服务器,那么在主服务器上执行事务提交的线程,会等待至少一个从服务器确认接受到事务的全部事件,或者直到超时发生。
  3. 只有将事件写入其中继日志并刷新到磁盘,从服务器才会确认收到事务的事件。
  4. 如果在没有任何从服务器确认事务的情况下发生超时,则主服务器将恢复为异步复制。当至少有一个版同步从服务器赶上时,主服务器将恢复版同步复制。
  5. 必须在主服务器和从服务器都启用版同步复制。如果在主服务器上禁用了版同步复制,或者在主服务器上启用了但没有在从服务器上启用半同步复制,则主服务器使用同步复制。

配置参数

server-id

指定服务器ID.当启用二进制日志记录时,需要为每一个服务器设置一个唯一的服务器ID,范围为1到232 − 1。唯一意味着每个ID必须与任何其他复制主或者从服务器使用的ID不同。

如果设置0 ,则意味着主服务器拒绝从服务器连接,从服务器会拒绝连接到主服务器。

binlog-do-db

设置需要记录二进制日志的数据库。多个数据库,需要设置多行记录,由于MySQL的数据库名称可以包含逗号,因此带有逗号分割列表,被认为是一个数据库。

binlog-ignore-db

设置不需要二进制日记记录的数据库。

日志

MySQL自定义较多的日志概念,这里尝试整理总结下。

binary log

二进制日志包含描述数据库更改,如表创建操作或表数据更改的事件。它包含可能进行更改的语句事件,还包含有关每个语句花费更新数据的时间信息。二进制日志有2个重要的目的:

  1. 对于复制,主复制服务器上的二进制日志提供要发送到从服务器的数据更改记录。
  2. 部分数据恢复操作需要使用二进制日志。

relay log

中继日志由从主服务器的二进制日志读取并由I/O线程写入的事件构成。中继日志中的事件作为SQL线程的一部分在从服务器上执行。

undo log

撤销日志,用于数据一致性读取,或者用于事务的回滚和撤销。存在与撤销表空间,保存由当前事务修改的数据副本的存储区域。如果另外一个事务需要作为一致性读取操作的一部分,则返回该区域检索到的未经修改的数据。

redo log

在服务器奔溃恢复期间使用的一种基于磁盘的数据结构,用于更正由不完全事务写入的数据。在意外之前没有完成的数据文件更新的修改将自动重放。

参考链接

  1. MySQL Replication
  2. MySQL Semisynchronous Replication
  3. Server System Variables
  4. The Binary Log

发表评论

电子邮件地址不会被公开。 必填项已用*标注