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

    使用MySQL复制功能可以将主服务器上的数据复制到多台从服务器上。默认情况下,复制是异步传输方式,从服务器不需要总是连接主服务器去更新数据。也就是说,数据更新可以在远距离连接的情况下进行,甚至在使用拨号网络的临时连接环境下也可以进行。根据自定义设置,我们可以对所有的数据库或部分数据库甚至是部分数据表进行复制。通过主从复制在企业级应用环境中就不必再担心数据库的单点故障,当一台服务器宕机时,其他服务器一样可以提供非常稳定、可靠的数据服务。

    MySQL复制的优势如下:

    (1)高性能:通过将请求分配给多台不同的从服务器提高性能与速度。在这种环境中,所有对数据库的写操作必须提供给主服务器,但读操作可以被平均分配给多台从服务器。

    (2)数据安全:数据是从主服务器复制到从服务器的,而且从服务器可以随时暂停复制,这样我们就可实现数据备份与还原。

    (3)远程数据分享:如果企业拥有多处位于其他地理位置的分公司,而这些分公司希望共享总部的数据库资源,就可以使用复制实现数据的共享,而且分公司不必时时连接主服务器,可以仅在需要时进行复制。

    MySQL支持的复制方式:

    (1)基于SQL语句的复制 SBR(Statement Based Replication),就是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。

    (2)基于行的复制RBR(Row Based Replication),就是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,从MySQL5.0开始支持。

    (3)也可以使用混合模式复制,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

    复制如何工作:

    MySQL服务器之间的复制是基于二进制日志机制的。在主服务器上,当MySQL实例进行写操作时会同时生成一条操作事件日志并写入二进制日志文件中,而从服务器则负责读取主服务器上的二进制日志,并在从服务器本机上重新执行该事件,从而实现复制数据至本地服务器。当主服务器开启二进制日志功能后,所有的SOL语句都将被记录至日志。从服务器复制这些二进制日志条目,并根据自己的需要决定哪些语句需要重新在从服务器上执行,而哪些语句不需要再执行,我们无法控制主服务器仅记录特定语句到日志文件中。如果进行其他设置,所有主服务器中的日志事件都将在从服务器上重新执行,当然,你可以配置从服务器仅执行主服务器中的部分日志事件。因为从服务器会记录二进制日志的进度与位置(比如执行到了第几条语句),所以从服务器可以断开与主服务器之间的连接,并在重新建立连接后继续进行复制工作。

    或者再看看下面的图,或许能更清楚(图来自:https://www.jianshu.com/p/8903423f78ed

    从库生成两个线程,一个I/O线程,一个SQL线程;

    I/O线程去请求主库的Binary log,并将得到的Binary log日志写到Relay log(中继日志)文件中;

    主库会生成一个log dump线程,用来给从库I/O线程传Binary log;

    SQL线程,会读取Relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。

    在具体的操作过程中,主服务器与从服务器都需要配置一个唯一的ID编号。另外,所有的从服务器必须设置主服务器的主机名、日志文件名、文件位置等参数。

    整个过程一般分为以下几个步骤进行。

    (1)在主服务器上开启二进制日志功能,设置唯一的服务器ID编号,这些设置需要重启MySQL服务。

    (2)在所有的从服务器上设置唯一的服务器ID编号,这些设置需要重启MySQL服务。

    (3)在主服务器上为不同的从服务器创建可以读取主服务器日志文件的账户,或使用相同的统一账户。

    (4)在进行数据复制之前,你还需要记录主服务器上二进制日志的位置标记。

    Windows环境下MySQL主从配置,见另一篇博客:https://www.cnblogs.com/opsprobe/p/10904377.html

    参考自,丁明一    编著    《Linux运维之道》

  • 相关阅读:
    使用ArcMap将Excel转换成Shapefile文件
    vue(9)事件监听修饰符
    vue(8)事件监听v-on
    vue(7)computed属性的使用
    vue(6)v-bind指令
    vue(5)插值{{}}和一些简单指令v-pre v-once v-text
    C++ 插入迭代器insert iterator
    敏捷开发
    java-------2.interface接口类,实现接口
    java-------1.抽象类,抽象方法
  • 原文地址:https://www.cnblogs.com/opsprobe/p/11663570.html
Copyright © 2011-2022 走看看