热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析半同步与异步的MySQL主从复制配置_MySQL

这篇文章主要介绍了半同步与异步的MySQL主从复制配置,包括不同的连接方案的讨论,需要的朋友可以参考下
简单来讲MySQL的主从复制就是一个C/S架构的应用。master可以认为是我们通常意义上所认为的server,slave可以当作是一台client。slave上的I/O线程去请求master上数据,而master验证通过slave的信息后就允许slave接入,然后进行数据变化信息的发送。
一、MySQL主从复制原理
这里我以MySQL5.5为例来说一下MySQL的主从复制的原理:

20151218173011422.jpg (357×306)

首先由备节点的I/O线程负责向主节点请求数据,主节点验证通过以后会由dump线程把数据发送给备用节点。备用节点的I/O线程收到资源后会把把这些数据写入到中继日志,备节点的SQL线程检测到中继日志变更后会立刻根据中继日志的内容跟新备库的内容。这样就完成了同步的过程。

二、常见的复制模型
1、一主一从模型

20151218173031597.jpg (285×133)

这种架构的优点就是比较简单,搭建和维护都比较容易,成本也比较低。对于一些负载量不是特别大、可靠性要求不是特别高的场合,完全可以采用这种模型。但是对于一些负载比较大站点,和对可用性要求比较高的场合,这种架构就不太适用了。因为如果访问量比较大,Master节点的压力会比较的,另外如果Master崩溃,也会导致业务的终止。
2、一主多从模型

20151218173048976.jpg (395×314)

在绝大多数场景中,我们的应用都是读多写。我们使用这种架构,通过读写分离的技术,可以有效降低Master上读的压力。我们在后端的slave上可以做一些数据备份,数据挖掘等方面的工作。但是如果备库比较多,同时主库又要负责其他的请求时,主库的压力会明显增大,此时主库会成为整个系统的性能瓶颈。

当然,还有其他的复制模型,比如多级中继,和环状复制等,这些复制的基本原理都和上面的差不多,这里不再详细的解释了。
3、配置主从复制
(1)、异步复制
主从同步的条件:
Master:
a:启用二进制日志;
b:选择一个server-id
c:创建具有复制权限的用户
Slave:
a:启用中继日志
b:选择一个唯一的server-id
c:连接主服务器,并开始复制数据
A、首先在主库上建立用于复制的最小权限的用户

mysql> grant replication slave,replication client on *.* to repl@'10.12.%'

 -> identified by '123456';
Query OK, 0 rows affected (0.03 sec)

B、在从库上连接主库

mysql> CHANGE MASTER TO MASTER_HOST='10.12.128.19',MASTER_PORT=3306,MASTER_USER='repl', 
MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=451;

#查看复制的状态
mysql> show slave status\G

*************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
     Master_Host: 10.12.128.19
     Master_User: repl
     Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000006
   Read_Master_Log_Pos: 1512
    Relay_Log_File: relay_index.000002
    Relay_Log_Pos: 283
  Relay_Master_Log_File: mysql-bin.000006
    Slave_IO_Running: Yes
   Slave_SQL_Running: Yes
    Replicate_Do_DB: 
   Replicate_Ignore_DB: 
   Replicate_Do_Table: 
  Replicate_Ignore_Table: 
  Replicate_Wild_Do_Table: 
 Replicate_Wild_Ignore_Table: 
     Last_Errno: 0
     Last_Error: 
     Skip_Counter: 0
   Exec_Master_Log_Pos: 1512
    Relay_Log_Space: 452
    Until_Condition: None
    Until_Log_File: 
    Until_Log_Pos: 0
   Master_SSL_Allowed: No
   Master_SSL_CA_File: 
   Master_SSL_CA_Path: 
    Master_SSL_Cert: 
   Master_SSL_Cipher: 
    Master_SSL_Key: 
  Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error: 
    Last_SQL_Errno: 0
    Last_SQL_Error: 
 Replicate_Ignore_Server_Ids: 
    Master_Server_Id: 3306
     Master_UUID: 97f33396-ed12-11e4-921a-000c29e8ee06
    Master_Info_File: /mydata/data5.6/master.info
     SQL_Delay: 0
   SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
   Master_Retry_Count: 86400
     Master_Bind: 
  Last_IO_Error_Timestamp: 
  Last_SQL_Error_Timestamp: 
    Master_SSL_Crl: 
   Master_SSL_Crlpath: 
   Retrieved_Gtid_Set: 
   Executed_Gtid_Set: 
    Auto_Position: 0
1 row in set (0.00 sec)

C、然后再从库上执行:

#启动复制
mysql> start slave;

也可以单独启动IO线程和SQL线程。
(如果从库的IO线程状态一直是connecting的状态,可能是防火墙的原因,一般来说关闭防火墙或者配置防火墙规则就可以了)
(2)、半同步复制
半同步复制是基于Google为MySQL开发的半同步复制的插件。半同步复制的原理是,一个事务在主服务器上执行完成后,必须至少确保至少在一台从服务器上执行完成后,事务才算提交成功。如果在一定时间内从服务器没有响应,则会自动降级为异步复制。
这个半同步复制是建立在异步复制的基础之上进行的。
首先需要安装Google的半同步插件:

master:

install plugin rpl_semi_sync_master soname 'semisync_master.so';


slave:

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

然后开启半同步的功能

master:

set global rpl_semi_sync_master_enabled = 1;
set global rpl_semi_sync_master_timeout = 100; //以毫秒计算

slave:

set global rpl_semi_sync_slave_enabled = ON;

在从库上还需要重启IO线程:

stop slave IO_thread;
start slave IO_thread;

分别在主库和备库上查看半同步插件运行的状态:

mysql> show global status like 'rpl%';

+--------------------------------------------+-------+
| Variable_name        | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients    | 1  |
| Rpl_semi_sync_master_net_avg_wait_time  | 0  |
| Rpl_semi_sync_master_net_wait_time   | 0  |
| Rpl_semi_sync_master_net_waits    | 0  |
| Rpl_semi_sync_master_no_times    | 1  |
| Rpl_semi_sync_master_no_tx     | 8  |
| Rpl_semi_sync_master_status    | ON |
| Rpl_semi_sync_master_timefunc_failures  | 0  |
| Rpl_semi_sync_master_tx_avg_wait_time  | 0  |
| Rpl_semi_sync_master_tx_wait_time   | 0  |
| Rpl_semi_sync_master_tx_waits    | 0  |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0  |
| Rpl_semi_sync_master_wait_sessions   | 0  |
| Rpl_semi_sync_master_yes_tx    | 0  |
+--------------------------------------------+-------+
14 rows in set (0.04 sec)

mysql> show global status like 'rpl%';

+----------------------------+-------+
| Variable_name    | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.04 sec)

可以看到,主库和备库的半同步插件都已经处于启用状态。
至此,异步主从配置结束。

推荐阅读
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • CRZ.im:一款极简的网址缩短服务及其安装指南
    本文介绍了一款名为CRZ.im的极简网址缩短服务,该服务采用PHP和SQLite开发,体积小巧,约10KB。本文还提供了详细的安装步骤,包括环境配置、域名解析及Nginx伪静态设置。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
author-avatar
旺小旺大_693
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有