加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL主从复制的常见拓扑、原理分析以及如何提高效率

发布时间:2018-12-30 22:14:45 所属栏目:MySql教程 来源:刘弋
导读:副标题#e# 一、主从复制搭建方法参考 MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解 二、Mysql 主从复制的常用拓扑结构 2.1、一主一从 是最基础的复制结构,用来分担之前单台数据库服务器的压力,可以进行读写分离。 2.2、一主多从 一台 Slave 承

优点

  1. bin-log日志包含了描述数据库操作的事件,但是这些事件包含的情况只是对数据库进行改变的操作,例如 insert、update、create、delete等操作。相反对于select、desc等类似的操作并不会去记录,并且它记录的是语句,所以相对于Row-Based来说这样会占用更少的存储空间。
  2. 因为bin-log日志文件记录了所有的改变数据库的语句,所以此文件可以作为以后的数据库的审核依据

缺点

  1. 不安全,并不是所有的改变数据的语句都会被记录复制。任何的非确定性的行为都是很难被记录复制的。
  2. 例如:对于delete 或者update语句,如果使用了limit但是并没有 order by ,这就属于非确定性的语句,就不会被记录
  3. 对于没有索引条件的update语句,必须锁定更多的数据,降低了数据库的性能。
  4. insert……select 语句同样也需要锁定大量的数据,对数据库的性能有所损耗。
  5. 获取更详细的信息可以参考官方文档——Statement-Based的优点和缺点。

4.2、Row-Based优点和缺点分析

优点

  1. 所有的改变都会被复制,这是最安全的复制方式
  2. 对于 update、insert……select等语句锁定更少的行
  3. 此种方式和大多数的数据库系统一样,所以了解其他的系统的人员可以很容易的转到mysql

缺点

  1. 使用不方便,我们不能通过bin-log日志文件查看什么语句执行了,也无从知道在从服务器上接收到什么语句,我们只能看到什么数据改变了
  2. 因为记录的是数据,所以说bin-log日志文件占用的存储空间要比Statement-based大。
  3. 对于数据量大的操作其花费的时间有更长

获取更详细的信息可以参考官方文档——Row-Based的优点和缺点

bin-log日志文件默认的格式为Statement-Based,如果想改变其格式在开启服务的时候使用—binlog-format选项,其具体命令如下

mysqld_safe –user=msyql –binlog-format=格式 &

四、主服务器流程分析

4.1、主服务器线程 Binlog dump thread

Binlog dump 线程是当有从服务器连接的时候由主服务器创建,其大致工作过程经历如下几个阶段:

MySQL主从复制的常见拓扑、原理分析以及如何提高效率

首先bin-log日志文件加锁,然后读取更新的操作,读取完毕以后将锁释放掉,最后将读取的记录发送给从服务器。

我们可以使用如下的命令来查看该线程的信息

  1. mysql> SHOW PROCESSLISTG 

以我的系统为例,因为我这系统中是一台主服务器和两台从服务器,所以会列出两条Binlog dump线程的信息

  1. *************************** 1. row ***************************  
  2. Id: 2  
  3. User: repuser  
  4. Host: 192.168.144.131:41544  
  5. db: NULL  
  6. Command: Binlog Dump  
  7. Time: 54  
  8. State: Master has sent all binlog to slave; waiting for binlog to be updated  
  9. Info: NULL  
  10. *************************** 2. row ***************************  
  11. Id: 3  
  12. User: repuser  
  13. Host: 192.168.144.132:40888 
  14. db: NULL  
  15. Command: Binlog Dump  
  16. Time: 31  
  17. State: Master has sent all binlog to slave; waiting for binlog to be updated  
  18. Info: NULL  

上述字段中的state字段会有以下几种状态:

1. Sending binlog event to slave

表示Binlog dump 线程已经读取完binlog日志中更新的event,现在正在发送给从服务器

2. Finished reading one binlog; switching to next binlog

表示Binlog dump 线程已经读取完一个binlog日志,现在正在打开下一个binlog日志读取来发送给从服务器

3. Master has sent all binlog to slave; waiting for binlog to be updated

这就是上面我们看到的state的值,表示Binlog dump 线程已经读取完所有的binlog日志文件,并且将其发送给了从服务器。现在处于空闲状态,正在等待读取有新的操作的binlog日志文件

4. Waiting to finalize termination

这个状态持续的很短暂,我们几乎看不到。当线程停止的时候显示此状态。

上述几个状态就是一次主从复制过程中Binlog dump 线程所经历的状态,如果我们是在测试的环境中,上述1、2、4状态我们几乎是看不到的,因为它执行的很快。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读