MySQL Replication(Master与Slave基本原理及配置)

MySQL Replication(Master与Slave基本原理及配置)

PS:MySQL主从复制!

  1. Master与Slave基本原理

    MySQL Replication(Master与Slave基本原理及配置)_第1张图片
    Mysql的复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在 Master(IO进程)上。
    要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
    复制的基本过程如下:

    1. Master将用户对数据库更新的操作以二进制格式保存到 Binary Log日志文件中;
    2. Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
    3. Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给 Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
    4. Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;
    5. Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
  2. 主从复制配置

    Master A:192.168.1.34
    Slave B:192.168.1.38

  3. 配置master主服务器

    1. 修改my.cnf配置文件

      01 #指定唯一的servr ID,master和slave主机的server-id不能一样
      02 server-id   = 1
      03

      04 #设置此参数表示启用binlog功能,并制定二进制日志的存储目录,
      05 log-bin=/home/mysql/binlog/mysql-bin
      06

      07 #mysql-bin.*日志文件最大字节(单位:字节)
      08 #设置最大100MB
      09 max_binlog_size=104857600
      10

      11 #设置了只保留7天BINLOG(单位:天)
      12 expire_logs_days = 7
      13

      14 #binlog日志只记录指定库的更新
      15 #binlog-do-db=db_name
      16

      17 #binlog日志不记录指定库的更新
      18 #binlog-ignore-db=db_name
    2. 创建Slave复制帐号

      每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE 权限。

      1 mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.1.%'IDENTIFIED BY '123456';
    3. 重启master,运行SHOW MASTER STATUS

      1 mysql> SHOW MASTER STATUS;
      2 +------------------+--------+------------+----------------+
      3 | File             |Position|Binlog_Do_DB|Binlog_Ignore_DB|
      4 +------------------+--------+------------+----------------+
      5 | mysql-bin.000003 |    763 |            |                |
      6 +------------------+--------+------------+----------------+
      7 1 row inset
  4. 配置slave从服务器

    1. 修改my.cnf配置文件

      01 #指定唯一的servr ID,master和slave主机的server-id不能一样
      02 server-id   = 2
      03

      04 #设置此参数表示启用binlog功能,并制定二进制日志的存储目录,
      05 log-bin=/home/mysql/binlog/mysql-bin
      06

      07 #mysql-bin.*日志文件最大字节(单位:字节)
      08 #设置最大100MB
      09 max_binlog_size=104857600
      10

      11 #设置了只保留7天BINLOG(单位:天)
      12 expire_logs_days = 7
      13

      14 #binlog日志只记录指定库的更新
      15 #binlog-do-db=db_name
      16

      17 #binlog日志不记录指定库的更新
      18 #binlog-ignore-db=db_name
      19

      20 #设置要进行或不要进行主从复制的数据库名
      21 #replicate-do-db=db_name
      22 replicate-ignore-db=mysql,information_schema
      23

      24 #中继日志信息
      25 relay_log=/home/mysql/relaylog/relay-bin
      26 relay_log_index=/home/mysql/relaylog/relay-bin.index
      27 relay_log_info_file=/home/mysql/relaylog/relay-log.info
    2. slave上指定master同步信息

      每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE 权限。

      1 mysql>change master to master_host='192.168.1.34',master_user='slave',master_password='123456', master_log_file='mysql-bin.000001',master_log_pos=0;

      MASTER_LOG_POS的值为0,因为它是日志的开始位置

    3. 重启slave,运行SHOW SLAVE STATUS

      1 #开启slave服务
      2 mysql> start slave;
      3 #查看slave状态
      4 mysql> SHOW SLAVE STATUS\G;

      如果出现:
      Slave_IO_Running: Yes
      Slave_SQL_Running: Yes
      以上两项都为Yes,那说明没问题了。


主从配置设置完后要注意两点:

1,首先在主从没有生效的时候,要保持两台服务器数据库表相同,数据相同

master主机上执行:
/usr/local/mysql/bin/mysqldump -uroot -p --all-databases >/root/all_database.sql

slave从库上执行:
/usr/local/mysql/bin/mysql -uroot -p 

如此两步骤,主库和从库数据会追加相平,保持同步!再此过程中,若主库存在业务,并发较高,在同步的时候要先锁表,让其不要有修改!
等待主从数据追平,主从同步后在打开锁!

2,主从数据追平后,定位好从库到主库日志的文件名字,和相应的位置
主库运行:
mysql> show master status\G;
*************************** 1. row ***************************
            File: mysql-bin.000019
        Position: 716
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

ERROR: 
No query specified

看到相应文件名字和位置!

从库执行:

reset slave all

change master to master_host='192.168.150.128',
master_user='slave',
master_password='123456', 
master_log_file='mysql-bin.000019',
master_log_pos=716;

start slave;

show slave status\G;

显示:
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.150.128
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 803
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 357
        Relay_Master_Log_File: mysql-bin.000019
             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: 803
              Relay_Log_Space: 524
              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_UUID: 
             Master_Info_File: /home/mysql/data/master.info
                    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
           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
1 row in set (0.00 sec)

ERROR: 
No query specified



看到:
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

即可成功同步!

你可能感兴趣的:(mysql技术)