zoukankan      html  css  js  c++  java
  • MySQL 主从同步配置

    1.   MySQL 主从同步配置

    1.1. 基础信息

    数据库主服务器IP:127.0.0.1
    数据库从服务器IP:192.168.1.31

    1.2. 主服务器配置文件my.ini配置 (master)

    [mysqld]
    #打开日志(主机需要打开) 表示二进制变更日值
    log-bin=mysql-bin
    #服务器唯一id
    server-id=1
    #给从机同步的数据库名称
    binlog-do-db=shenxianyun_console
    binlog-do-db=shenxianyun_portal
    binlog-do-db=test
    #自动清理1天前的log文件
    expire_logs_days=1

    1.3. 重启主MYSQL服务

    service mysqld restart

    1.4. 主数据库授权同步数据库的用户

    • 授权

    GRANT REPLICATION SLAVE ON *.* TO 'user'@'%' IDENTIFIED BY‘password’;

    • 刷新权限

    FLUSH PRIVILEGES;

    • 查看主服务状态

     SHOW MASTER STATUS;

     

    1.5. 从服务器配置文件my.ini配置(slave)

    [mysqld]
    #服务器id
    server-id=2
    #要从主机同步的库
    replicate-do-db=shenxianyun_console
    replicate-do-db=shenxianyun_portal
    replicate-do-db=test

     #配置中继日志(一般可以不用)
    #relay_log         = mysql-relay-bin

    # slave将复制事件写进自己的二进制日志(后面会看到它的用处)。
    #log_slave_updates = 1

    #它防止改变数据(除了特殊的线程) 慎重使用
    #read_only         = 1
    server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。
    relay_log配置中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。
    有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并不很实用,特别是那些需要在slave上创建表的应用。

    1.6. 重启从MYSQL服务

    service mysqld restart

    1.7.  启动slave (实现数据同步)

    接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:

    • 配置slave服务器用于连接master服务器的参数

     【注意:MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=594是通过前面的主数据库SHOW MASTER STATUS;得到】

    CHANGE MASTER TO MASTER_HOST='1.1.1.1',MASTER_USER='root', MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=594;

    • 开启SLAVE同步

    start slave;

    • 查看下slave状态

    show slave status;

     

    当Slave_IO_Running和Slave_SQL_Running都为Yes,才说明主从复制成功

    slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

    你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:

    在master上输入show processlistG;

     

    2为处理slaveI/O线程的连接。

    在slave服务器上运行该语句: show processlist;

     

    1I/O线程状态,行2SQL线程状态。

     

    1.8.  添加新slave服务器

    假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。
    此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西:
    (1)master的某个时刻的数据快照;
    (2)master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标(log file coordinate),因为它们确定了一个二进制日志的位置,你可以用SHOW MASTER STATUS命令找到日志文件的坐标;
    (3)master的二进制日志文件。

    可以通过以下几中方法来克隆一个slave:
    (1)    冷拷贝(cold copy)
    停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。
    (2)    热拷贝(warm copy)
    如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。
    (3)    使用mysqldump
    使用mysqldump来得到一个数据快照可分为以下几步:
    <1>锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:
    mysql> FLUSH TABLES WITH READ LOCK;
    < 2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:
    shell> mysqldump --all-databases --lock-all-tables >dbdump.db
    < 3>对表释放锁。
    mysql> UNLOCK TABLES;

    2.         复制的常用拓扑结构

    复制的体系结构有以下一些基本原则:
    (1)    每个slave只能有一个master;
    (2)    每个slave只能有一个唯一的服务器ID;
    (3)    每个master可以有很多slave;
    (4)    如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新。

    MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master。但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。

    1.9.  单一master和多slave

    由一个master和一个slave组成复制系统是最简单的情况。Slave之间并不相互通信,只能与master进行通信。如下:


     如果写操作较少,而读操作很时,可以采取这种结构。你可以将读操作分布到其它的slave,从而减小master的压力。但是,当slave增加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。
    这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。一些建议:
    (1)    不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);
    (2)    用一个slave作为备用master,只进行复制;
    (3)    用一个远程的slave,用于灾难恢复;

    1.10.    主动模式的Master-Master(Master-Master in Active-Active Mode)

    Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。如图:

    主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:
    在第一个服务器上执行:
    mysql> UPDATE tbl SET col=col + 1;
    在第二个服务器上执行:
    mysql> UPDATE tbl SET col=col * 2;
    那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。
    实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,你可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方式来模拟这种多主服务器的复制。

    1.11.    主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)

    这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。如图:

     

    1.12.     带从服务器的Master-Master结构(Master-Master with Slaves)

    这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。

  • 相关阅读:
    js-数组方法的使用和详谈
    JS中的作用域(一)-详谈
    vue中的axios
    GitHub使用
    nodejs项目文件搭建环境
    我的黑客和渗透测试学习路线
    带你了解后渗透工具Koadic
    黑客专用多功能记事本
    Kali环境使用Metasploit生成木马入侵安卓手机
    邪恶葫芦工具包
  • 原文地址:https://www.cnblogs.com/hxqcom/p/8083093.html
Copyright © 2011-2022 走看看