zoukankan      html  css  js  c++  java
  • MySQL的主从复制原理

    一.主从复制

          MySQL的复制是通过将一台主(master)server的数据拷贝到其它主机(slaves) 上。

    从server能够有非常多。而复制的原理跟MySQL的二进制日志是分不开关系的。

         主server将更新写入二进制日志系统。并维护一个索引跟踪日志的循环,这些日志发送到从server上更新。

    从server通知主server,并从主server的日志上读取最后一次的成功更新的位置。


        当使用事务的存储引擎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上的同步数据非常慢,慢于masterserver。


    MySQL的日志类型:

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

    MySQL主要有五种日志:

    错误日志(error-log):

    查询日志(general query log):

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

    二进制日志(binary-log):

    中继日志(relay-log):

    MariaDB [(none)]> show variables like 'log_%';
    +---------------------------------+--------------------------------------------------------------------------------------------------------------+
    | Variable_name                   | Value                                                                                                        |
    +---------------------------------+--------------------------------------------------------------------------------------------------------------+
    | log_bin                         | OFF                                                                                                          |
    | log_bin_trust_function_creators | OFF                                                                                                          |
    | log_error                       | /var/log/mariadb/mariadb.log                                                                                 |
    | log_output                      | FILE                                                                                                         |
    | log_queries_not_using_indexes   | OFF                                                                                                          |
    | log_slave_updates               | OFF                                                                                                          |
    | log_slow_filter                 | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
    | log_slow_queries                | OFF                                                                                                          |
    | log_slow_rate_limit             | 1                                                                                                            |
    | log_slow_verbosity              |                                                                                                              |
    | log_warnings                    | 1                                                                                                            |
    +---------------------------------+--------------------------------------------------------------------------------------------------------------+
    11 rows in set (0.12 sec)
    

    错误日志: 错误日志记录着mysqld的启动和停止。以及mysql在执行时发生的错误。

    在默认情况下。系统的记录错误日志的功能是关闭的。

    查询日志:记录着server接收到的每个查询或是命令。

    不管查询是否有语法错误。相同一般不会开启的。

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

    二进制日志(重点):

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

            binlog有一些其它的參数

    max_binlog_size 设置的最大存储上线,当日志达到上限时。mysql会又一次创建一个日志開始记录,只是偶尔也会超过上限。

    比方即将到达上限时来一个比較大的事务。为了保证事务的安全性。mysql会将同一个事务写进同一个binlog里面。

    binlog-do-db =  db_name明白告诉mysql。

    仅仅记录指定的数据库。

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

    mysql> show variables like '%binlog%';
    +-----------------------------------------+----------------------+
    | Variable_name                           | Value                |
    +-----------------------------------------+----------------------+
    | binlog_cache_size                       | 32768                |
    | binlog_direct_non_transactional_updates | OFF                  |
    | binlog_format                           | MIXED                |
    | binlog_stmt_cache_size                  | 32768                |
    | innodb_locks_unsafe_for_binlog          | OFF                  |
    | max_binlog_cache_size                   | 18446744073709547520 |
    | max_binlog_size                         | 1073741824           |
    | max_binlog_stmt_cache_size              | 18446744073709547520 |
    | sync_binlog                             | 0                    |
    +-----------------------------------------+----------------------+
    9 rows in set (0.00 sec)
    

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

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

    查看二进制日志。

    [root@realser2 data]# mysqlbinlog mysql-bin.000007
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #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). 基于语句的复制:在server上运行SQL语句,在从server上运行相同的语句。MySQL默认採用的基于语句的复制,效率高
    (2). 基于行的复制:把改变的内容复制过去。而不是命令在从server上运行一遍,从MySQl5開始支持
    (3). 混合类型的复制:默认採用的基于语句的复制,一旦发现基于语句无法精准的复制时,就会採用基于行的复制。

    MySQL的复制方法:

    同步复制:主server要等全部的从server都保存完(同步完)再执行,也就是主server要等从server。
    异步复制:主仅仅运行自己的。从server的同步不理会
    半同步复制:主server仅仅等一个从server,而不等其它的server。

    MySQL主从复制的作用:

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

    MySQL的读写分离:


    读写分离原理

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

      




  • 相关阅读:
    【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)
    【洛谷】P1052 过河(状压dp)
    【洛谷】P1541 乌龟棋(四维背包dp)
    【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
    【洛谷】P1064 金明的预算方案(dp)
    【洛谷】P3908 异或之和(异或)
    【洛谷】P2434 [SDOI2005]区间(暴力)
    【洛谷】P2694 接金币(排序)
    【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
    【游记】noip2017酱油记
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7307377.html
Copyright © 2011-2022 走看看