1. 什么是主从复制:

    通过将Mysql的某一台主机的 数据复制到其它主机,复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slave)。进行复制时,所有对数据表的写操作必须在主服务器上进行。否则,因为主服务器不会同步从服务器的数据,会导致主从数据不一致的问题。mysql的主从复制功能是构建高性能大型应用服务器的基础


  2. 主从复制的作用:

    1.辅助实现数据的备份

    2.实现数据服务的高可用和异地容灾

    3.实现多个服务器分摊负载


  3. 主从复制的实现原理:

    实现整个复制过程主要由三个线程来完成,其中slave端两个线程(Sql线程和IO线程) ,master端一个线程(IO线程)

    1.master将数据库改变的记录到二进制日志(binary log)中

    2.slave的IO线程向master请求二进制日志中的事件

    3.master服务器的IO线程将slave服务器的IO线程请求的数据相应给对方

    4.slave的IO线程接收到数据并依次写入到中继日志里面

    5.slave的SQL线程检测到中继日志发生改变,解析出master发生改变执行的sql语句并在自身执行一遍


  4. 主从复制类别:

    1.基于语句的复制:每一条会修改数据的语句都会记录到master的二进制中。slave在复制的时候SQL线程会解析成和原来master端执行过的相同的语句来再次执行

     优点:不需要记录每一行数据的变化,减少二进制日志量,节约了IO成本,提高了性能。

     缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。当master的某个SQL语句中执行了一些特殊函数,再复制到slave来执行可能会导致值不一样。例如:master表中的某个字段了插入一条select now();的执行结果,当这条语句再复制到slave上去执行的时候,结果数据就无法被正确复制。


    2.基于行的复制:二进制日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。

      优点:二进制日志中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以RowLevel的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或函数,以及触发器的调用和触发无法被正确复制的问题

      缺点:所有的执行的语句当记录到BinaryLog中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:update user_info set sal=15000 where user_id >= 3,执行之后,日志中记录的不是这条update语句所对应的事件(MySQL以事件的形式来记录BinaryLog日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件,增加了IO负担。


    3.混合方式:基于语句+基于行的混合方式 中和了前两种方式的优缺点,是一种相对比较理想的复制方式

    mysql的这个复制级别也就是通过配置二进制日志的记录格式来决定的。


  5. mysql主从复制配置:

    环境说明:

     master和slave数据初始都是没有数据的

     master:

      操作系统:centos6.7

      mysql版本:mysql5.7.10

      主机地址:192.168.1.223

     slave:

      操作系统:centos6.7

        mysql版本:mysql5.7.10

        主机地址:192.168.1.222


     1.master端配置工作

       启动二进制日志
       选择一个唯一的server-id

          vi /etc/my.cnf
           log-bin=/mydata/binlogs/master-bin  
           binlog_format=mixed
            server-id = 2

       重启mysql服务    

          service mysqld restart

       登录mysql创建具有复制权限的用户

         mysql -uroot -p 'password’
         grant replication slave on *.* to repuser@'192.168.1.222' identified by 'password'; 
         flush privileges;

      2.slave端配置工作

        修改server-id
        启用中继日志

            vi /etc/my.cnf
           server-id = 11
            relay-log = /mydata/relaylogs/relay-bin
             log-bin=OFF

        重启mysql服务 

         service mysqld restart

        登录mysql连接主服务器

         mysql -uroot -p 'password’
         change master to master_host='192.168.1.223',master_user='repuser',master_password='password'

        查看slave工作状态     

         show slave status \G;

 *************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 192.168.1.223
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No            #现在io线程处于关闭状态
            Slave_SQL_Running: No           #sql线程也处于关闭状态
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
                  Master_UUID:
             Master_Info_File: /mydata/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:


      启动复制:

        start slave;


 6.验证主从配置结果:

    登录主服务器创建一个数据库

       mysql -uroot -p'password'
       create database two_db;
       show databases;

    wKiom1bhcsyjNzRCAAA_M4XFpW0303.png


  登录slave服务器查看是否已同步

    wKioL1bhcyWD52KuAAAxXhuKxS8012.png

至此mysql简单主从复制基本完成