美文网首页数据库-mysql
msyql 主从复制原理

msyql 主从复制原理

作者: 光小月 | 来源:发表于2019-05-05 10:35 被阅读0次

    mysql (master/slave)复制原理及配置

    image.png

    复制配置

    ### .1、创建复制帐号
    
    1、在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中
    
    命令如下: mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.*  TO backup@’10.100.0.200’  IDENTIFIED BY ‘1234’;
    
    建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234。
    
    (如果因为mysql版本新旧密码算法不同,可以设置:set password for 'backup'@'10.100.0.200'=old_password('1234'))
    
    ### 2.2、拷贝数据
    
    (假如是你完全新安装mysql主从服务器,这个一步就不需要。因为新安装的master和slave有相同的数据)
    
    关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,**禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!**
    
    ### 2.3、配置master
    
    接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值:
    
    server-id=1 log-bin=mysql-bin
    
    server-id:为主服务器A的ID值 log-bin:二进制变更日值
    
    重启master,运行SHOW MASTER STATUS,输出如下:
    
    ### 2.4、配置slave
    
    Slave的配置与master类似,你同样需要重启slave的MySQL。如下:
    log_bin           = mysql-bin
    server_id         = 2
    relay_log         = mysql-relay-bin
    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上创建表的应用。
    
    ### 2.5、启动slave
    
    接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:
    
    mysql> CHANGE MASTER TO MASTER_HOST='server1',
    
        -> MASTER_USER='repl',
    
        -> MASTER_PASSWORD='p4ssword',
    
        -> MASTER_LOG_FILE='mysql-bin.000001',
    
        -> MASTER_LOG_POS=0;
    
    MASTER_LOG_POS的值为0,因为它是日志的开始位置。
    
    你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:
    
    mysql> SHOW SLAVE STATUS\G
    
    Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running是No
    
    表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。
    
    为了开始复制,你可以运行:
    
    mysql> START SLAVE;
    
    运行SHOW SLAVE STATUS查看输出结果:
    
    mysql> SHOW SLAVE STATUS\G
    
    
    在这里主要是看:                    Slave_IO_Running=Yes                    Slave_SQL_Running=Yes
    slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
    
    你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:
    
    在master上输入show processlist\G;
    
    image.png
    行2为处理slave的I/O线程的连接。
    在slave服务器上运行该语句:
    
    image.png

    2.5、添加新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;

    相关文章

      网友评论

        本文标题:msyql 主从复制原理

        本文链接:https://www.haomeiwen.com/subject/tqgjgqtx.html