一、主从复制原理

      主服务器开启二进制日志功能后,主服务器的的变更就会记录到二进制日志中。从服务器把主服务器的二进制日志读到本地的中继日志,然后利用中继日志重做变更,以此保证主从两个环境变更一致。

二、搭建环境

       vmware虚拟机,centos7,mariadb 10.2.14

        主服务器IP:192.168.160.7

        从服务器IP:192.168.160.8

三、搭建步骤

1、安装mariadb

      分别在主从两个服务器上安装好mariadb,和安装单实例数据库没有差别,安装步骤直接略过。我的实验环境是直接通过虚拟机克隆获得的。

2、配置主服务器配置文件

     编辑my.cnf文件:vi /etc/mysql/my.cnf

     开启二进制日志:log-bin=mysql-bin

     添加不同步数据的数据库:

     binlog-ignore-db=information_schema
     binlog-ignore-db=mysql 

     binlog-ignore-db=performance_schema 

    (也可以指定同步的数据,本文两种配置都配置:binlog-do-db=hse_aq )

     修改server_id:server-id       = 1

     然后保存退出配置文件,完成配置

3、配置从服务器配置文件

     编辑my.cnf文件:vi /etc/mysql/my.cnf

     开启中继日志:relay-log = /app/data/relay-bin

     限制从服务器数据库只读(超级权限用户依然能修改从库的数据):read_only         = 1

     修改server_id:server-id       = 2

     然后保存退出配置文件,完成配置

4、在主服务器上创建复制用户

     登录mariadb,创建复制账户:GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'marry'@'192.168.160.8' IDENTIFIED BY '123456';

mariadb windows 服务 mariadb服务器_mariadb windows 服务

     查看主库二进制日志状态,以便在从服务器选择复制开始位置:show master status;

mariadb windows 服务 mariadb服务器_服务器_02


5、在从服务器上访问主服务器

      在从服务器上登录mariadb,使用复制账户marry访问主服务器,其中MASTER_LOG_FILE是主服务器当前使用的二进制日志,MASTER_LOG_POS是日志的开始位置:

CHANGE MASTER TO MASTER_HOST='192.168.160.7',MASTER_PORT=3306,MASTER_USER='marry',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=7000;

mariadb windows 服务 mariadb服务器_服务器_03


      查看同步状态:SHOW SLAVE STATUS\G
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
           

Slave_IO_State: 
                  Master_Host: 192.168.160.7
                  Master_User: marry
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 7000
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 7000
              Relay_Log_Space: 256
              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: 1
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
1 row in set (0.00 sec)



      从上面的内容可以看到

Slave_IO_Running: No
Slave_SQL_Running: No


      说明复制过程还没有开始,在从服务器上启动复制:START SLAVE;
       再查看同步状态:SHOW SLAVE STATUS\G

MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.160.7
                  Master_User: marry
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 7000
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 555
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              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: 7000
              Relay_Log_Space: 858
              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: 0
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: 1
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)



      两个状态都已经变成yes,说明同步已经开始。

6、验证

     在主服务器上新建数据库(如果主服务器配置了binlog-do-db参数,新建数据库不会同步到从服务器)、新建表、新增数据、修改数据、删除数据、删除表等操作,都能反应到从库,说明环境搭建成功。

7、备注

      如果在从服务器上访问主服务器出现问题,可以用stop slave、reset slave命令重新配置。

      还有很多配置参数在本次搭建没有配置,可以一点点配置测试。