• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

MySQL使用binlog 主从复制教程

JAVA web前端中文站 2年前 (2018-02-02) 922次浏览 已收录 0个评论

复制是 mysql 最重要的功能之一,mysql 集群的高可用、负载均衡和读写分离都是基于复制来实现的;从 5.6 开始复制有两种实现方式,基于 binlog 和基于 GTID(全局事务标示符);本文接下来将介绍基于 binlog 的一主一从复制。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

基于 binlog 的主从复制过程如下:

  • Master 将数据改变记录到二进制日志(binary log)中
  • Slave 上面的 IO 进程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容
  • Master 接收到来自 Slave 的 IO 进程的请求后,负责复制的 IO 进程会根据请求信息读取日志指定位置之后的日志信息,返回给 Slave 的 IO 进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到 Master 端的 bin-log 文件的名称以及 bin-log 的位置
  • Slave 的 IO 进程接收到信息后,将接收到的日志内容依次添加到 Slave 端的 relay-log 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master 从某个 bin-log 的哪个位置开始往后的日志内容
  • Slave 的 Sql 进程检测到 relay-log 中新增加了内容后,会马上解析 relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容,并在自身执行

下面我们通过一个案例来学习它。

根据上面的主从复制过程,我们先要对 master 进行配置。主要包括设置复制账号,并授予 REPLICATION SLAVE 权限,具体信息会存储在于 master.info 文件中,及开启 binlog。

 mysql> CREATE USER 'test'@'%' IDENTIFIED BY '123456'; 
 mysql> GRANT REPLICATION SLAVE ON *.* TO 'test'@'%'; 
 mysql> show variables like "log_bin";  
 +---------------+-------+  | Variable_name | Value |  
 +---------------+-------+  | log_bin       | ON    |  
 +---------------+-------+
 //web 前端中文站 www.lisa33xiaoq.net

查看 master 当前 binlogmysql 状态:

 mysql> show master status; 
 +------------------+----------+--------------+------------------+-------------------+ 
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB 
 | Executed_Gtid_Set | 
 +------------------+----------+--------------+------------------+-------------------+ 
 | mysql-bin.000003 |      120 |              |                  
 |                   | 
 +------------------+----------+--------------+------------------+-------------------+

配置完 master 后,我们就可以建表插入数据,测试 binlog 是否产生了日志信息(可以通过上一篇文章,查看 binlog 日志。MySQL binlog(二进制日志)解析)。

接下来的第二步,我们需要对 slave 进行配置。Slave 的配置类似 master,需额外设置 relay_log 参数,slave 没有必要开启二进制日志,如果 slave 为其它 slave 的 master,须设置 bin_log。

再接下来,我们需要连接 master。

 mysql> CHANGE MASTER TO    
 MASTER_HOST='10.108.111.14',    MASTER_USER='test',    
 MASTER_PASSWORD='123456',    MASTER_LOG_FILE='mysql-bin.000003',    
 MASTER_LOG_POS=120;

使用 show slave status 查看从的状态:

 mysql> show slave status/G 
 *************************** 1. row ***************************       
 Slave_IO_State:   ---------------------------- 
 slave io 状态,表示还未启动       
 Master_Host: 10.108.111.14         
 Master_User: test         
 Master_Port: 20126       
 Connect_Retry: 60   
 --master 宕机或连接丢失从服务器线程重新尝试连接主服务器之前睡眠时间      
 Master_Log_File: mysql-bin.000003  ------------ 
 当前读取 master binlog 文件     
 Read_Master_Log_Pos: 120  ------------------------- 
 slave 读取 master binlog 文件位置       
 Relay_Log_File: relay-bin.000001  ------------ 
 回放 binlog//web 前端中文站     
 Relay_Log_Pos: 4   -------------------------- 
 回放 relay log 位置//www.lisa33xiaoq.net   
 Relay_Master_Log_File: mysql-bin.000003  ------------ 
 回放 log 对应 maser binlog 文件     
 Slave_IO_Running: No    
 Slave_SQL_Running: No     
 Exec_Master_Log_Pos: 0  --------------------------- 
 相对于 master 从库的 sql 线程执行到的位置   
 Seconds_Behind_Master: NULL

Slave_IO_State, Slave_IO_Running, 和 Slave_SQL_Running 为 NO 说明 slave 还没有开始复制过程。

再接下来,我们使用 start slave 启动复制。

 start slave

再次观察 slave 状态。

 mysql> show slave status/G 
 *************************** 1. row ***************************     
 Slave_IO_State: Waiting for master to send event 
 -- 等待 master 新的 event     
 Master_Host: 10.108.111.14     
 Master_User: test     
 Master_Port: 20126   
 Connect_Retry: 60    
 Master_Log_File: mysql-bin.000003   
 Read_Master_Log_Pos: 3469  
 ---- 3469  等于
 Exec_Master_Log_Pos,
 已完成回放     
 Relay_Log_File: relay-bin.000002                    
 ||   Relay_Log_Pos: 1423                                
 || Relay_Master_Log_File: mysql-bin.000003                    
 ||   Slave_IO_Running: Yes                                 
 ||  Slave_SQL_Running: Yes                                 
 ||   Exec_Master_Log_Pos: 3469  ---3469  
 等于 slave 读取 master binlog 位置,已完成回放 
 Seconds_Behind_Master: 0

可看到 slave 的 I/O 和 SQL 线程都已经开始运行,而且 Seconds_Behind_Master=0。Relay_Log_Pos 增加,意味着一些事件被获取并执行了。

最后看下如何正确判断 SLAVE 的延迟情况,判定 slave 是否追上 master 的 binlog:

  1. 首先看 Relay_Master_Log_File 和 Maser_Log_File 是否有差异;
  2. 如果 Relay_Master_Log_File 和 Master_Log_File 是一样的话,再来看 Exec_Master_Log_Pos 和 Read_Master_Log_Pos 的差异,对比 SQL 线程比 IO 线程慢了多少个 binlog 事件;
  3. 如果 Relay_Master_Log_File 和 Master_Log_File 不一样,那说明延迟可能较大,需要从 MASTER 上取得 binlog status,判断当前的 binlog 和 MASTER 上的差距;
  4. 如果以上都不能发现问题,可使用 pt_heartbeat 工具来监控主备复制的延迟。

查询 slave 数据,主从一致。

 mysql> select * from tb_person; 
 +----+-------+---------+-----+---------+ | id | name  | address 
 | sex | other   | +----+-------+---------+-----+---------+ |  5 | name4 
 | beijing | man | nothing | |  6 | name2 | beijing | man | nothing | |  7 
 | name1 | beijing | man | nothing | |  8 | name3 | beijing | man | nothing 
 | +----+-------+---------+-----+---------+

关于 binlog 的解析可以参考MYSQL BINLOG(二进制日志)解析教程

web 前端中文站点评:

关于 mysql 复制的内容还有很多,比如不同的同步方式、复制格式情况下有什么区别,有什么特点,应该在什么情况下使用等等。有兴趣的同学,可以自行的去研究一下!

 

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MySQL 使用 binlog 主从复制教程
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址