MYSQL的主从介绍

1、在主服务器将客户端对数据操作的指令传到master的服务端,服务端会根据事务的提交顺序写到二进制日志。

2、在有新的操作后,master会通知slave有新的数据变化。slave通过IO线程将master的二进制日志传到slave的中继日志中。

3、slave会将中继日志中的事件通过SQL线程在备库上执行。从而实现数据更新,直到追赶上master的数据。

4、在master上并行执行的sql语句,在存储到备库的中继日志后,只有一个SQL语句对中继日志中的事务进行串行执行。

5、在master与slave中的数据达到一致后,slave就会进入休眠状态,等待下一次的数据同步,下一次的数据同步有master通知slave。

MYSQL的主从配置

一、主从数据库的基本配置

 我在配置主从服务器时,使用了两台服务器:10.19.34.126和10.19.34.91

1、首先需要在这两台上搭建单独的mysql服务。

2、在主数据库上创建账号,用于备库通过这个账号进行同步主库的二进制日志到备库的中继日志。

  

3、配置主库,要对每一个数据库服务配置唯一标示,参数名为server-id,可以配置主库为server-id=1,也可以通过ip来指定。

  server-id=10.19.34.92

  log-bin=mysql-bin        //设置主库的执行操作保存到二进制日志中,确保备库能够同步二进制日志到中继日志。

4、配置从库

  server-id=10.19.34.126

  log-bin=mysql-bin    //设置备库在执行中继日志中的事件时将事件重新保存到二进制日志中

  replay_log=mysql-replay-bin   //设置从库的中继日志

  log_slave_updates=1     //该设置是允许中继日志中的事件在二进制日志中进行重放

  read-only=1     //设置该从库为只读库

5、启动主从服务

  正常执行主库启动指令

  在备库上执行指令:change master to master_host='server1',master_user='repl' ,master_password='123456',mater_log_file='mysql-bin.000001',master_log_pos=0;

  在备库上执行指令:start slave;

二、主从数据库的配置优化

    sync_binlog=1      //所有的事务在提交前,将二进制日志保存到磁盘。保证在系统崩溃时,不至于数据丢失。该参数默认设置为0。但是该设置只对二进制日志起作用,而非中继日志。并且会带来一定的开销。

    innodb_flush_log_at_trx_commit = 2    //如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上。

MYSQL的主从原理

      1、基于语句的复制

      优点:基于语句的复制会在主库上执行的数据操作在备库上重新执行一遍。由于基于语句的复制只是简单的执行sql语句,实现比较简单。并且在二进制日志里事件更加紧凑。

      缺点:基于语句的复制在备库上执行时会带来数据的不一致性,例如在获取服务器的当前时间时,在同步到备库上时,可能与主库有一定的偏差。

     2、基于行的复制

      优点:基于行的复制将数据记录在二进制日志中,能够正确的复制每一行。数据的一致性很强。

      缺点:占用的带宽较大,可能一句简单的语句会带来较大的带宽。

     3、复制文件

      mysql-bin.index:该文件中保存着二进制的所有文件名称。

      mysql-replay-bin-index:该文件中保存着中继日志的文件名称。

      master.info:该文件保存在备库服务器上,该文件中保存着主库的信息,例如主库的端口,密码等。

      replay-log.info:该文件保存在备库上,用来记录同步主库的坐标位置。可以在备库重启时,通过该文件来判断从何处同步主库。

     4、发送复制事件到其他备库

      

      在将第一个备库作为其他备库的主库时,需要设置第一备库的二进制文件和log_slave_upodates为1,第二备库设置主库为第一备库即可。

     5、复制过滤器

      在设置过滤器时,可以在主库上设置,也可以在备库上设置。

      binlog-do-db=dbname     //该参数会设置将该数据库的变化保存到二进制日志中,将该数据库的变化同步到备库。

      binlog-ignore-db=dbname   //该参数会忽略该数据库的变化不会保存到二进制日志中,由于该数据库的二进制日志没有保存,所以在系统崩溃后,重新启动时,无法恢复该数据库。

      binlog-do-table=tablename   //该参数会设置将该数据库表的变化保存到二进制日志中,将该数据库表的变化同步到备库。

      binlog-ignore-table=tablename   //该参数会忽略该数据库表的变化不会保存到二进制日志中,由于该数据库表的二进制日志没有保存,所以在系统崩溃后,重新启动时,无法恢复该数据库表。

      replicat-do-db=dbname     //该参数会设置将该数据库的变化同步到中继日志中,将该数据库的变化在备库上执行。

      replicate-ignore-db=dbname   //该参数会忽略该数据库的变化不会保存到中继日志中。

      replicate-do-table=tablename   //该参数会设置将该数据库表的变化保存到中继日志中,将该数据库表的变化在备库上执行。

      replicate-ignore-table=tablename   //该参数会忽略该数据库表的变化不会保存到中继日志中。

      注意:1、binlog-ignore-db和binlog-ignore-table参数会过滤对该数据库和表的操作保存到二进制日志中,所以在数据恢复时,导致数据丢失,一般不建议在主库上设置该参数,

          可以在备库上进行过滤。    

         2、在同时使用binlog-do-db和binlog-ignore-db时,只对binlog-do-db参数有效。

建立新的slave

    change  master  to  通过两个参数master_log_file和master_log_pos来设置从主服务器同步的位置,而不是从开始同步。如果在新建立slave时,需要以下几步:

    1、master已经运行了很长一段时间了,可以先备份一次master的数据。

    2、记下master数据库的binlog的位置。

    3、到新的slave上恢复。

    4、同时设置slave服务器上的备份位置。

克隆master

    1、锁住master数据库的所有表:flush tables  with  read  lock。

    2、记录binlog位置和二进制文件名称:show  master  status和show  master  logs。

    3、使用mysqldump指令,创建备份。

    4、对master数据库解锁:unlock tables。

    5、在slave上对数据库备份进行恢复。

    6、在slave上设置开始同步的起点:change master  to  master_host="hostname",master_port="port",master_user="username",master_password="password",master_log_file="binglogname",master_log_pos="postion"

    7、启动slave:start slave。

克隆slave

  1、停止slave服务器:stop  slave。

  2、锁住slave数据库的所有表:flush tables  with  read  lock。

  3、查看slave的binlig的位置:show  slave  status;

  4、创建备份

  5、在新slave上恢复备份,设置新slave开始同步master的位置:change master  to  master_host="hostname",master_port="port",master_user="username",master_password="password",master_log_file="binglogname",master_log_pos="postion"。

  6、启动新的slave:start  slave。

一主多从

  在使用一主多从时一般有一下几个用途:

  1、每个从库只过滤一部分数据操作到中继日志中,对数据进行保存。这样可以分担数据库的压力。

  2、将一台数据库作为随时变为主库的可能。