`

(转) MySQL的主从复制原理

 
阅读更多

一.主从复制

      MySQL的复制是通过将一台主(master)服务器的数据复制到其他主机(slaves) 上。从服务器可以有很多。而复制的原理跟MySQL的二进制日志是分不开关系的。

     主服务器将更新写入二进制日志系统,并维护一个索引跟踪日志的循环,这些日志发送到从服务器上更新。从服务器通知主服务器,并从主服务器的日志上读取最后一次的成功更新的位置。

 

    当使用事务的存储引擎InnoDB时,所有未提交的事务会记录到一个缓存中,等待事务提交时,直接将缓冲中的二进制日志写入二进制日志文件,而该缓冲的大小由binlog_cache_size决定,默认大小为32KB,此外,binlog_cache_size是基于回话的,也就是,当一个线程开始一个事务时,mysql会自动分配一个大小为binlog_cache_size的缓存,因此该值得设置需要相当小心,可以通过show global status 查看binlog_cache_usebinlog_cache_disk_use的状态.

 

   复制的过程

     整体来说,复制分为3个步骤。

(1). master 将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)。

(2).slave 将master的二进制日志(binary log)拷贝到它的中继日志中(relay log)。

(3).slave重做中继日志中的事件,将日志中记录的SQL语句在本机上执行一遍。

 

    MySQL的大体复制过程如上,下来详细介绍一下复制的过程。

步骤一:master记录二进制日志,在每个事务更新数据完成之前,master在二进制日志中记录这些改变,MySQL将事务串行写入二进制日志,在事件写入二进制日志完成后,会通知存储引擎提交事务。

 

步骤二:slave将master的二进制日志拷贝过来放到自己的中继日志中,首先,slave开始一个工作线程---I/O线程。I/O线程在master上打开一个普通的连接,开始接受二进制日志。I/O线程会将这些事件写入到中继日志中,如果已经跟上了master 的更新速度则睡眠等待产生新的事件。

 

步骤三:SQL从线程会处理最后一步,SQL线程会从中继日志中读取事件,并更新自己的数据。中继日志一般来说会保存到OS的缓存中,所以中继日志很小。

 

此外,在master中会有一个工作线程,复制过程中有一个限制---复制在slave上串行化,也就是master上并行更新操作不在slave上并行操作。所以导致slave上的同步数据很慢,慢于master服务器。

 

MySQL的日志类型:

因为和MySQL主从复制有关的主要是二进制日志(bin-log)和中继日志(relay log),所以主要介绍的是这两种日志,其他的会简单的提一下。

MySQL主要有五种日志:

错误日志(error-log):

查询日志(general query log):

慢查询日志(log-slow-queries):

二进制日志(binary-log):

中继日志(relay-log):

 

[sql] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. MariaDB [(none)]> show variables like 'log_%';  
  2. +---------------------------------+--------------------------------------------------------------------------------------------------------------+  
  3. | Variable_name                   | Value                                                                                                        |  
  4. +---------------------------------+--------------------------------------------------------------------------------------------------------------+  
  5. | log_bin                         | OFF                                                                                                          |  
  6. | log_bin_trust_function_creators | OFF                                                                                                          |  
  7. | log_error                       | /var/log/mariadb/mariadb.log                                                                                 |  
  8. | log_output                      | FILE                                                                                                         |  
  9. | log_queries_not_using_indexes   | OFF                                                                                                          |  
  10. | log_slave_updates               | OFF                                                                                                          |  
  11. | log_slow_filter                 | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |  
  12. | log_slow_queries                | OFF                                                                                                          |  
  13. | log_slow_rate_limit             | 1                                                                                                            |  
  14. | log_slow_verbosity              |                                                                                                              |  
  15. | log_warnings                    | 1                                                                                                            |  
  16. +---------------------------------+--------------------------------------------------------------------------------------------------------------+  
  17. 11 rows in set (0.12 sec)  


错误日志: 错误日志记录着mysqld的启动和停止,以及mysql在运行时发生的错误。在默认情况下,系统的记录错误日志的功能是关闭的。

 

查询日志:记录着服务器接收到的每一个查询或是命令。无论查询是否有语法错误。同样一般不会开启的。

慢查询日志:其中记录了每个语句的执行时间,消耗时间,执行的用户,连接主机等信息。

二进制日志(重点):

二进制日志(-log-bin)的主要功能是 恢复复制 

        binlog有一些其他的参数

max_binlog_size 设置的最大存储上线,当日志达到上限时,mysql会重新创建一个日志开始记录,不过偶尔也会超过上限。比如即将到达上限时来一个比较大的事务。为了保证事务的安全性,mysql会将同一个事务写进同一个binlog里面。

binlog-do-db =  db_name明确告诉mysql。只记录指定的数据库

binlog-ignore-db = db_name :忽略对某个数据库的日志记录。

 

[sql] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. mysql> show variables like '%binlog%';  
  2. +-----------------------------------------+----------------------+  
  3. | Variable_name                           | Value                |  
  4. +-----------------------------------------+----------------------+  
  5. | binlog_cache_size                       | 32768                |  
  6. | binlog_direct_non_transactional_updates | OFF                  |  
  7. | binlog_format                           | MIXED                |  
  8. | binlog_stmt_cache_size                  | 32768                |  
  9. | innodb_locks_unsafe_for_binlog          | OFF                  |  
  10. | max_binlog_cache_size                   | 18446744073709547520 |  
  11. | max_binlog_size                         | 1073741824           |  
  12. | max_binlog_stmt_cache_size              | 18446744073709547520 |  
  13. | sync_binlog                             | 0                    |  
  14. +-----------------------------------------+----------------------+  
  15. rows in set (0.00 sec)  


log-bin             = /var/log/mysql/mysql-bin.log    --指定二进制日志的名称

 

log_bin_index       = /var/log/mysql/mysql-bin.log.index     --二进制日志索引的名称

查看二进制日志。

 

[sql] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. [root@realser2 data]# mysqlbinlog mysql-bin.000007  
  2. /*!40019 SET @@session.max_insert_delayed_threads=0*/;  
  3. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;  
  4. DELIMITER /*!*/;  
  5. at 4  
  6. #170301 12:31:56 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.12-log created 170301 12:31:56 at startup  

可以使用 purgebinary logs 来清除binary logs。

 

 

binlog_format 参数很重要:

参数值 :(1)。STATEMENT格式和之前的mysql一样。二进制文件是记录日志的SQL语句

              (2)。ROW格式下,记录的是行的更改情况。(建议)

      (3)。MIXED格式。

 

中继日志(重点):

       中继日志也是二进制文件,但是用来给slave库恢复的。

       

   innodb 是一个事物安全的存储引擎,其事物安全性主要通过在线的redo日志和记录在表空间的undo信息来保证。redo 日志中记录了innodb所做的所有物理变更和事物信息。innodb的redo日志同样默认存放在数据目录下面。可以通过innodb_log_group_home_dir 来更改日志的存放位置。
通过innodb_log_files_in_group 设置日志的数量。

 

 

MySQL的复制类型:

(1). 基于语句的复制:在服务器上执行SQL语句,在从服务器上执行同样的语句,MySQL默认采用的基于语句的复制,效率高
(2). 基于行的复制:把改变的内容复制过去,而不是命令在从服务器上执行一遍,从MySQl5开始支持
(3). 混合类型的复制:默认采用的基于语句的复制,一旦发现基于语句无法精准的复制时,就会采用基于行的复制。
 

MySQL的复制方法:

同步复制:主服务器要等所有的从服务器都保存完(同步完)再运行,也就是主服务器要等从服务器。
异步复制:主只执行自己的,从服务器的同步不理会
半同步复制:主服务器只等一个从服务器,而不等其他的服务器。

MySQL主从复制的作用:

1.高可用
2.异地容灾
3.负载分担

MySQL的读写分离:


读写分离原理
 
   mysql 的读写分离,是用MySQL 代理实现的。基本的原理是让主数据库处理事务性的写方面的事,而从数据库去处理SELECT的查询,数据库的复制被用来把事务性查询导致的变更同步到集群的从服务器上去,让从服务器去应答查询请求。以缓解数据库的压力。(可以使用LVS将查询请求再做负载均衡,平摊查询请求)

 

 

 

REFS;http://blog.csdn.net/ghost_leader/article/details/60583336

分享到:
评论

相关推荐

    《深入理解MySQL主从原理32讲》推荐篇

    导读: 作者:高鹏(网名八怪),《深入理解...八怪写作风格很是严谨,几乎每篇都是从源码入手去剖析MySQL主从复制相关的知识点。 强烈推荐大家订阅本专栏 业界大咖推荐序 从2016年开始八怪(本名高鹏)经常向我请教一

    mysql主从复制原理详解图

    详细的结构分解,可以快速了解mysql主从复制的原理和对主从更清晰的了解。

    linux运维学习笔记:MySQL主从复制原理和实战.pdf

    在开始讨论MySQL主从复制的原理和实战之前,我们需要了解其重要性。主从复制的主要作用是保证数据安全性和服务的持续运行。当主数据库发生故障时,从数据库可以接管业务,保证服务的连续性。同时,通过将数据复制到...

    MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ GTID复制.pdf

    MySQL主从复制是一种重要的数据库高可用性和数据冗余策略,它允许数据从一个主服务器(Master)实时或近实时地复制到一个或多个从服务器(Slave)。这种技术在分布式系统、高并发应用以及数据安全等领域有着广泛的...

    Mysql主从复制原理(原理+实操).docx

    Mysql主从复制原理和实践 Mysql主从复制是一种提高数据库性能和可用性的技术,它可以实现在数据库中实现读写分离,提高数据库的整体性能和可用性。在本文中,我们将对Mysql主从复制的原理和实践进行详细的介绍。 ...

    MySQL 主从复制模式全面实践

    MySQL主从复制模式是数据库领域内一种重要的数据同步机制,它能够让一台主数据库服务器(master)的数据实时复制到一个或多个从数据库服务器(slave)上。这种机制在数据库的高可用性、数据备份、读写分离以及负载...

    mysql主从复制原理.md

    mysql主从复制原理.md

    mysql主从复制原理,操作流程

    MySQL 主从复制原理和操作流程 MySQL 主从复制是指在两个或多个 MySQL 实例之间实现数据的实时同步和复制,确保数据的一致性和可用性。这种技术广泛应用于大型数据库系统、数据仓库、数据分析等领域。 主从复制的...

    MySQL主从复制.docx

    本文将详细介绍 MySQL 主从复制的基本概念、实现原理以及具体的配置步骤。 #### 二、MySQL 主从复制的概念 MySQL 主从复制是指在一个 MySQL 数据库集群中,通过配置将一台或多台 MySQL 服务器定义为主服务器...

    MySQL主从复制模式全面实践

    MySQL主从复制是一种数据库高可用性和数据冗余的重要机制,它允许数据从一个服务器(主节点)同步到一个或多个其他服务器(从节点)。在本实践中,我们将深入探讨这一模式的各个方面,包括其工作原理、配置步骤、...

    MySQL主从复制架构原理与配置实践

    ### MySQL主从复制架构原理与配置实践 #### 一、MySQL主从复制概述 MySQL主从复制是一种常用的技术手段,用于提高数据库系统的可用性、扩展性和数据安全性。它通过将一个MySQL实例(主服务器)的数据实时复制到一...

    MySQL主从复制与读写分离

    MySQL主从复制与读写分离是数据库架构中的重要策略,旨在提高系统的可用性、扩展性和数据安全性。在大型系统中,随着数据量的增长和访问压力的增加,单一数据库服务器往往无法满足性能需求。主从复制和读写分离是...

    LNH_MySQL 05-回顾MySQL主从复制原理要点.mp4

    LNH_MySQL 05-回顾MySQL主从复制原理要点.mp4

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

    ### MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总结 #### 一、主从复制的搭建方法与参考 ##### 1. MySQL 5.6 数据库主从(Master/Slave)同步安装与配置详解 - **安装与配置**:在MySQL 5.6中...

    Mysql主从复制&半同步复制原理.pdf

    **主从复制原理** 1. **开启主库binlog**:主服务器必须启用Binary Log(binlog),这是一个记录所有改变数据库状态的SQL语句的日志,包括插入、更新和删除操作,但不包括查询语句。 2. **建立连接**:在从服务器...

    MySQL主从复制原理架构部署

    在MySQL主从复制原理架构中,数据的变化首先被记录在master服务器的二进制日志(binary log)中。每一个修改数据库的语句,如INSERT、UPDATE、DELETE等,都会作为二进制日志事件被记录下来。然后,一个或多个slave...

    MySQL主从复制 读写分离

    ### MySQL主从复制原理 MySQL主从复制是一种数据同步机制,它允许将一个MySQL服务器(主服务器)上的数据自动复制到一个或多个其他MySQL服务器(从服务器)上。这种架构能够提供数据冗余、负载均衡以及提高应用程序...

Global site tag (gtag.js) - Google Analytics