思想:
1.主服务器(master) 接受用户的内容更新,并写入bin-log中
2.一个或多个从服务器(slave) ,接受来自 主服务器的 binlog 日志文件(I/O 线程), 解析出sql(sql 线程),
3.重新更新到服务器(slave),完成数据的一致(sql 线程)
主从服务器应用场景:
1.更好的支持大规模高并发读写
1.1主服务器实现读写分离, 从服务器实现负载均衡(lvs)
1.2数据库读写分离架构
2.更有效的保护物理服务器宕机场景下的数据备份
2.1从服务器 作为 主服务器的实时数据备份
主从同步的原理:
1.mysql 的主从复制是一个 异步 的复制过程,(虽然一般情况下感觉是实时的), 数据将从一个 mysql 数据库( 我们称为 master) 复制到另一个 mysql数据库( 我们称之为 slave)
在 master 与 slave 之间实现整个主从复制的过程是由3个 线程参与完成的
2.一个线程在 moster端口 ( I/O 线程), 两个线程在 slave端 (一个 sql 线程, 一个i/o线程)
3.要实现mysql 的主从复制功能,首先必须打开 master 端的 bin-log 记录功能, 否则无法实现, 因为整个复制过程实际上就是 slave 从 master 端获取 binlog 日志,然后在 slave 上以相同的顺序执行获取 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 线程。
返回的信息有:
3.1.binlog 日志信息
3.2.master 服务器记录的新的 binlog 文件名称,以及在新的 binlog 中的下一个指定更新位置
4.当 slave 服务器的 i/o 线程 获取到 master 服务器上的 I/0 线程发送的日志内容(日志文件 和 日志位置点)后,
4.1. 会将 binlog 日志内容 依次 写到 slave 端 自身的 relay log (中继日志)文件的最末端,格式: mysql-relay-bin.xxxx,
4.2.将新的 bin-log 文件名 和文件位置 记录到 master-info 文件中, 以便一下次读取master 端 bin-log 日志时能够告诉 master 服务器 从新 bin-log 日志指定的文件和位置开始请求新的 bin-log 日志内 容
5.slave 服务器的 sql线程 会实时的检测本地的 relay log 中 I/O线程 新增加的日志内容,
5.1然后及时的把 relay log 文件中的内容解析成 sql 语句,
5.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) 语句