Msql 主从原理介绍-通俗易懂

思想:

  1. 主服务器(master) 接受用户的内容更新,并写入bin-log中
  2. 一个或多个从服务器(slave) ,接受来自 主服务器的 binlog 日志文件(I/O 线程), 解析出sql(sql 线程),
  3. 重新更新到服务器(slave),完成数据的一致(sql 线程)


主从服务器应用场景:
  1. 更好的支持大规模高并发读写
    1. 主服务器实现读写分离, 从服务器实现负载均衡(lvs)
    2. 数据库读写分离架构
  2. 更有效的保护物理服务器宕机场景下的数据备份
    1. 从服务器 作为 主服务器的实时数据备份


主从同步的原理:
mysql 的主从复制是一个 异步 的复制过程,(虽然一般情况下感觉是实时的), 数据将从一个 mysql 数据库( 我们称为 master) 复制到另一个 mysql数据库( 我们称之为 slave)
在 master 与 slave 之间实现整个主从复制的过程是由3个 线程参与完成的
一个线程在 moster端口 ( I/O 线程), 两个线程在 slave端 (一个 sql 线程, 一个i/o线程)
要实现mysql 的主从复制功能,首先必须打开 master 端的 bin-log 记录功能, 否则无法实现, 因为整个复制过程实际上就是 slave 从 master 端获取 binlog 日志,然后在 slace 上以相同的顺序执行获取 binlog 日志中的所记录的各种sql操作。

1、如何打开 master 的binlog 记录功能
master 服务器的 mysql 配置文件, my.cnf, 添加信息如下
[mysqld]
log-bin = /data/3306/mysql-bin

mysql Replication 主从复制原理箱体过程描述
  1. 在 slave 服务器上 执行 start slave 命令,开启复制开关,开始进行主从复制
  2. 此时, slave 服务器的 I/O 线程会通过 master 上 已经授权的复制用户权限 请求连接 master 服务器, 并请求从指定 binlog 日志文件的指定位置 (日志文件名和位置就是在配置主从复制服务时执行 change master 命令指定的)之后开始发送 binlog 日志内容,
  3. master 服务器接收到来自 slave 服务器的 I/O 线程的请求后, master 上负责复制的 I/O 线程会根据 slave 服务器的 I/O 线程请求的信息分批读取指定 binlog 日志文件指定位置之后的 binlog 日志信息, 然后返回给 slave 端的 I/O 线程。
    1. 返回的信息有
      1. binlog 日志信息
      2. master 服务器记录的新的 binlog 文件名称,以及在新的 binlog 中的下一个指定更新位置
  4. 当 slave 服务器的 i/o 线程 获取到 master 服务器上的 I/0 线程发送的日志内容(日志文件 和 日志位置点)后,
    1. 1. 会将 binlog 日志内容 依次 写到 slave 端 自身的 relay log (中继日志)文件的最末端,格式: mysql-relay-bin.xxxx,
    2. 2.将新的 bin-log 文件名 和文件位置 记录到 master-info 文件中, 以便一下次读取master 端 bin-log 日志时能够告诉 master 服务器 从新 bin-log 日志指定的文件和位置开始请求新的 bin-log 日志内容
  5. slave 服务器的 sql线程 会实时的检测本地的 relay log 中 I/O线程 新增加的日志内容,
    1. 然后及时把 relay log 文件中的内容解析成 sql 语句,
    2. 并在 relay-log.info 中记录当前应用中继日志的文件名和位置点
  6. 经历了上面的过程, 就可以保证 master 端 和 slave 端执行了相同的 sql 语句,当复制状态正常时, master 和 slave 端的数据是完全一样的


针对mysql 主从复制原理的重点进行小结:
  1. 主从复制是异步逻辑sql语句级别的复制
  2. 复制时,主库有一个 I/O 线程, 从库有2个线程,即 i/o 和 sql 线程
  3. 实现主从复制的必要条件是: 主库开启 binlog 功能
  4. 作为复制的所有 mysql 节点的 server-id 都不能相同
  5. bin-log 只记录对数据可以有更改的 sql 语句(来自数据库内容的变更), 不记录任何查询(select 、show) 语句

    参考: 跟老男孩学linux-web集群-第九章
*文章为作者原创或网络转载
转载此文请于文首标明作者姓名,保持文章完整性,并请附上出处
未按照规范转载者,陈帅同学保留追究相应责任的权利
编程改变世界

干了这碗鸡汤