Mysql入门mysql(masterslave)主从复制原理及配置图文详解

Mysql入门mysql(masterslave)主从复制原理及配置图文详解,第1张

概述介绍《Mysql入门mysql(master/slave)主从复制原理及配置图文详解》开发教程,希望对您有用。

《MysqL入门MysqL(master/slave)主从复制原理及配置图文详解》要点:
本文介绍了MysqL入门MysqL(master/slave)主从复制原理及配置图文详解,希望对您有用。如果有疑问,可以联系我们。

1 复制概述MysqL必读

      MysqL内建的复制功能是构建大型,高性能应用程序的基础.将MysqL的数据分布到多个系统上去,这种分布的机制,是通过将MysqL的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新.MysqL必读

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行.否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突.MysqL必读

1.1 MysqL支持的复制类型:MysqL必读

  (1):基于语句的复制:  在主服务器上执行的SQL语句,在从服务器上执行同样的语句.MysqL默认采用基于语句的复制,效率比较高.  
            一旦发现没法精确复制时,   会自动选着基于行的复制.    
  (2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从MysqL5.0开始支持
  (3):混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制.MysqL必读

 1.2 . 复制解决的问题MysqL必读

         MysqL复制技术有以下一些特点:
         (1)    数据分布 (Data distribution )
         (2)    负载平衡(load balancing)
         (3)    备份(Backups) 
         (4)    高可用性和容错行 High availability and failover MysqL必读

  1.3 复制如何工作 MysqL必读

        整体上来说,复制有3个步骤:   MysqL必读

       (1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
       (2)    slave将master的binary log events拷贝到它的中继日志(relay log);
        (3)    slave重做中继日志中的事件,将改变反映它自己的数据.
MysqL必读

下图描述了复制的过程:MysqL必读

   

MysqL必读

          该过程的第一部分就是master记录二进制日志.在每个事务更新数据完成之前,master在二日志记录这些改变.MysqL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的.在事件写入二进制日志完成后,master通知存储引擎提交事务.
       下一步就是slave将master的binary log拷贝到它自己的中继日志.首先,slave开始一个工作线程――I/O线程.I/O线程在master上打开一个普通的连接,然后开始binlog dump process.binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件.I/O线程将这些事件写入中继日志.
       sql slave thread(sql从线程)处理该过程的最后一步.sql线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致.只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小.
        此外,在master中也有一个工作线程:和其它MysqL的连接一样,slave在master中打开一个连接也会使得master开始一个线程.复制过程有一个很重要的限制――复制在slave上是串行化的,也就是说master上的并行更新 *** 作不能在slave上并行 *** 作.
MysqL必读

 2 .复制配置MysqL必读

有两台MysqL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的.MysqL必读

要点:
负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作.因此,主服务器必须激活二进制日志功能.从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限.
        
环境:
Master和slave的MysqL数据库版本同为5.0.18
*** 作系统:unbuntu 11.10
IP地址:10.100.0.100
MysqL必读

2.1、创建复制帐号MysqL必读

1、在Master的数据库中建立一个备份帐户:每个slave使用标准的MysqL用户名和密码连接master.进行复制 *** 作的用户会授予REPliCATION SLAVE权限.用户名的密码都会存储在文本文件master.info中MysqL必读

命令如下:
MysqL > GRANT REPliCATION SLAVE,RELOAD,SUPER ON *.* 
TO backup@'10.100.0.200' 
IDENTIFIED BY ‘1234';MysqL必读

建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234.MysqL必读

(如果因为MysqL版本新旧密码算法不同,可以设置:set password for 'backup'@'10.100.0.200'=old_password('1234'))MysqL必读

2.2、拷贝数据MysqL必读

(假如是你完全新安装MysqL主从服务器,这个一步就不需要.因为新安装的master和slave有相同的数据)MysqL必读

关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置 *** 作结束前,禁止在Master和slave服务器中进行写 *** 作,使得两数据库中的数据一定要相同!
MysqL必读

2.3、配置masterMysqL必读

接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID.例如,在配置文件加入如下值:
MysqL必读

server-ID=1
log-bin=MysqL-binMysqL必读

server-ID:为主服务器A的ID值
log-bin:二进制变更日值MysqL必读

重启master,运行SHOW MASTER STATUS,输出如下:
MysqL必读


MysqL必读

2.4、配置slaveSlave的配置与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上创建表的应用.MysqL必读

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

MysqL> CHANGE MASTER TO MASTER_HOST='server1',MysqL必读

    -> MASTER_USER='repl',MysqL必读

    -> MASTER_PASSWORD='p4ssword',MysqL必读

    -> MASTER_LOG_@R_404_6852@='MysqL-bin.000001',MysqL必读

    -> MASTER_LOG_POS=0;MysqL必读

MASTER_LOG_POS的值为0,因为它是日志的开始位置.MysqL必读

你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:
MysqL必读

MysqL> SHOW SLAVE STATUS\GMysqL必读

*************************** 1. row ***************************MysqL必读

             Slave_IO_State:MysqL必读

                Master_Host: server1MysqL必读

                Master_User: replMysqL必读

                Master_Port: 3306MysqL必读

              Connect_Retry: 60MysqL必读

            Master_Log_@R_404_6852@: MysqL-bin.000001MysqL必读

        Read_Master_Log_Pos: 4MysqL必读

             Relay_Log_@R_404_6852@: MysqL-relay-bin.000001MysqL必读

              Relay_Log_Pos: 4MysqL必读

      Relay_Master_Log_@R_404_6852@: MysqL-bin.000001MysqL必读

           Slave_IO_Running: NoMysqL必读

          Slave_sql_Running: NoMysqL必读

                             ...omitted...MysqL必读

      Seconds_Behind_Master: NulLMysqL必读

Slave_IO_State,Slave_IO_Running, 和Slave_sql_Running是NoMysqL必读

表明slave还没有开始复制过程.日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置.实际上,MysqL知道的第一个事件的位置是4.MysqL必读

为了开始复制,你可以运行:MysqL必读

MysqL> START SLAVE;MysqL必读

运行SHOW SLAVE STATUS查看输出结果:MysqL必读

MysqL> SHOW SLAVE STATUS\GMysqL必读

*************************** 1. row ***************************MysqL必读

             Slave_IO_State: Waiting for master to send eventMysqL必读

                Master_Host: server1MysqL必读

                Master_User: replMysqL必读

                Master_Port: 3306MysqL必读

              Connect_Retry: 60MysqL必读

            Master_Log_@R_404_6852@: MysqL-bin.000001MysqL必读

        Read_Master_Log_Pos: 164MysqL必读

             Relay_Log_@R_404_6852@: MysqL-relay-bin.000001MysqL必读

              Relay_Log_Pos: 164MysqL必读

      Relay_Master_Log_@R_404_6852@: MysqL-bin.000001MysqL必读

           Slave_IO_Running: YesMysqL必读

          Slave_sql_Running: YesMysqL必读

                             ...omitted...MysqL必读

      Seconds_Behind_Master: 0MysqL必读

在这里主要是看:
                   Slave_IO_Running=Yes
                   Slave_sql_Running=Yes
MysqL必读

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

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

在master上输入show processList\G;MysqL必读

MysqL> show processList \GMysqL必读

*************************** 1. row ***************************MysqL必读

     ID: 1MysqL必读

   User: rootMysqL必读

   Host: localhost:2096MysqL必读

     db: testMysqL必读

Command: queryMysqL必读

   Time: 0MysqL必读

 State: NulLMysqL必读

   Info: show processListMysqL必读

*************************** 2. row ***************************MysqL必读

     ID: 2MysqL必读

   User: replMysqL必读

   Host: localhost:2144MysqL必读

     db: NulLMysqL必读

Command: binlog DumpMysqL必读

   Time: 1838MysqL必读

 State: Has sent all binlog to slave; waiting for binlog to be updatedMysqL必读

   Info: NulLMysqL必读

2 rows in set (0.00 sec)MysqL必读

行2为处理slave的I/O线程的连接.MysqL必读

在slave服务器上运行该语句:MysqL必读

MysqL> show processList \GMysqL必读

*************************** 1. row ***************************MysqL必读

     ID: 1MysqL必读

   User: system userMysqL必读

   Host:MysqL必读

     db: NulLMysqL必读

Command: ConnectMysqL必读

   Time: 2291MysqL必读

 State: Waiting for master to send eventMysqL必读

   Info: NulLMysqL必读

*************************** 2. row ***************************MysqL必读

     ID: 2MysqL必读

   User: system userMysqL必读

   Host:MysqL必读

     db: NulLMysqL必读

Command: ConnectMysqL必读

   Time: 1852MysqL必读

 State: Has read all relay log; waiting for the slave I/O thread to update itMysqL必读

   Info: NulLMysqL必读

*************************** 3. row ***************************MysqL必读

     ID: 5MysqL必读

   User: rootMysqL必读

   Host: localhost:2152MysqL必读

     db: testMysqL必读

Command: queryMysqL必读

   Time: 0MysqL必读

 State: NulLMysqL必读

   Info: show processListMysqL必读

3 rows in set (0.00 sec)MysqL必读

行1为I/O线程状态,行2为sql线程状态.
MysqL必读

2.5、添加新slave服务器MysqL必读

假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据.
此时,有几种方法可以使slave从另一个服务开始,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave.Slave与master同步时,需要三样东西:
(1)master的某个时刻的数据快照;
(2)master当前的日志文件、以及生成快照时的字节偏移.这两个值可以叫做日志文件坐标(log @R_404_6852@ 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;MysqL必读

3、深入了解复制已经讨论了关于复制的一些基本东西,下面深入讨论一下复制.
MysqL必读

3.1、基于语句的复制(Statement-Based Replication)     MysqL 5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logical replication),这在数据库并不常见.master记录下改变数据的查询,然后,slave从中继日志中读取事件,并执行它,这些SQL语句与master执行的语句一样.
这种方式的优点就是实现简单.此外,基于语句的复制的二进制日志可以很好的进行压缩,而且日志的数据量也较小,占用带宽少――例如,一个更新GB的数据的查询仅需要几十个字节的二进制日志.而MysqLbinlog对于基于语句的日志处理十分方便.
 
      但是,基于语句的复制并不是像它看起来那么简单,因为一些查询语句依赖于master的特定条件,master与slave可能有不同的时间.所以,MysqL的二进制日志的格式不仅仅是查询语句,还包括一些元数据信息,当前的时间戳.即使如此,还是有一些语句,比如,CURRENT USER函数,不能正确的进行复制.此外,存储过程和触发器也是一个问题.
     另外一个问题就是基于语句的复制必须是串行化的.这要求大量特殊的代码,配置,例如InnoDB的next-key锁等.并不是所有的存储引擎都支持基于语句的复制.
MysqL必读

3.2、基于记录的复制(Row-Based Replication)      MysqL增加基于记录的复制,在二进制日志中记录下实际数据的改变,这与其它一些DBMS的实现方式类似.这种方式有优点,也有缺点.优点就是可以对任何语句都能正确工作,一些语句的效率更高.主要的缺点就是二进制日志可能会很大,而且不直观,所以,你不能使用MysqLbinlog来查看二进制日志.
对于一些语句,基于记录的复制能够更有效的工作,如:
MysqL> INSERT INTO summary_table(col1,col2,sum_col3)
    -> SELECT col1,sum(col3)
    -> FROM enormous_table
    -> GROUP BY col1,col2;
     假设,只有三种唯一的col1和col2的组合,该查询会扫描原表的许多行,却仅返回三条记录.此时,基于记录的复制效率更高.
    另一方面,下面的语句,基于语句的复制更有效:
 MysqL> UPDATE enormous_table SET col1 = 0;
此时使用基于记录的复制代价会非常高.由于两种方式不能对所有情况都能很好的处理,MysqL 5.1支持在基于语句的复制和基于记录的复制之前动态交换.你可以通过设置session变量binlog_format来进行控制.
MysqL必读

3.3、复制相关的文件除了二进制日志和中继日志文件外,还有其它一些与复制相关的文件.如下:
MysqL必读

(1)MysqL-bin.index服务器一旦开启二进制日志,会产生一个与二日志文件同名,但是以.index结尾的文件.它用于跟踪磁盘上存在哪些二进制日志文件.MysqL用它来定位二进制日志文件.它的内容如下(我的机器上):


MysqL必读

 (2)MysqL-relay-bin.index该文件的功能与MysqL-bin.index类似,但是它是针对中继日志,而不是二进制日志.内容如下:
.\MysqL-02-relay-bin.000017
.\MysqL-02-relay-bin.000018
MysqL必读

(3)master.info保存master的相关信息.不要删除它,slave重启后不能连接master.内容如下(我的机器上):

MysqL必读

 I/O线程更新master.info文件,内容如下(我的机器上):MysqL必读

 MysqL必读

.\MysqL-02-relay-bin.000019MysqL必读

254MysqL必读

MysqL-01-bin.000010MysqL必读

286MysqL必读

0MysqL必读

52813MysqL必读

 (4)relay-log.info 包含slave中当前二进制日志和中继日志的信息.MysqL必读

3.4、发送复制事件到其它slave当设置log_slave_updates时,你可以让slave扮演其它slave的master.此时,slave把sql线程执行的事件写进行自己的二进制日志(binary log),它的slave可以获取这些事件并执行它.如下:


MysqL必读

 MysqL必读

3.5、复制过滤(Replication Filters)复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:在master上过滤二进制日志中的事件;在slave上过滤中继日志中的事件.如下:MysqL必读

MysqL必读

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

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

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


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

4.2、主动模式的Master-Master(Master-Master in Active-Active Mode)Master-Master复制的两台服务器,既是master,又是另一台服务器的slave.如图:


MysqL必读

主动的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结合起来,可以建立强大的高性能的数据库平台.但是,可以通过其它一些方式来模拟这种多主服务器的复制.
MysqL必读

4.3、主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统.它的不同点在于其中一个服务只能进行只读 *** 作.如图:


MysqL必读

 4.4、带从服务器的Master-Master结构(Master-Master with Slaves)这种结构的优点就是提供了冗余.在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上.

MysqL必读

总结

以上是内存溢出为你收集整理的Mysql入门mysql(master/slave)主从复制原理及配置图文详解全部内容,希望文章能够帮你解决Mysql入门mysql(master/slave)主从复制原理及配置图文详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1163158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存