2019年4月16日 星期二

【MYSQL】Seconds_Behind_Master的數據問題

MySQL的同步是異步完成的,其中IO thread負責接收從主庫丟過來的binlog到從庫上生成relay log,然後SQL thead負責解析relay log後在從庫上進行重放來完成同步。這個2步是完全異步的,單獨停止其中一個,並不會影響另一個的正行工作。當這兩個thread都正常工作的時候,show slave status會顯示雙Yes狀態,表示同步正常。

一般主從複製都會show slave status \G 來查看數據
而Seconds_Behind_Master 就是裡面其實的一個數據,它的計算並不準確和可靠。並行複製下的Seconds_Behind_Master值比非並行複製時偏大。因此當我們判斷備庫是否延遲時,根據的Seconds_Behind_Master = 0不一定可靠。但是,當我們進行主備切換時,在主庫停寫的情況下,我們可以根據位點來判斷是否完全同步。
對此數據監控一段時間,發現會突然有很大的落差!
例如有時Seconds_Behind_Master=1866,然後隔30秒,數值又變成0
經測試發現,原來是MASTER與SLAVE的時間不一致導致,經調整後異常狀態就沒出現了!
因為校時壞掉了

測試 :實際時間 16 apr 2019 14:56:00
slave 時間:Tue Apr 16 15:13:32 CST 2019
master 時間:Tue Apr 16 14:56:59 CST 2019
相差約17分鐘


slave 更改時間往前
[root@rosalie slave~]# date -s "16 apr 2019 15:13:32"
Tue Apr 16 15:13:32 CST 2019

[root@rosalie slave~]# mysql -uroot -p

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.73.76
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000014
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 407
        Relay_Master_Log_File: mysql-bin.000014
             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: 194
              Relay_Log_Space: 180267140
              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: a57afe45-51e5-11e9-8c72-000c292c01ba
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: a57afe45-51e5-11e9-8c72-000c292c01ba:1-60
            Executed_Gtid_Set: a57afe45-51e5-11e9-8c72-000c292c01ba:1-60
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)


master創建一個table,並插入約二十萬的數據(測試用原有DB,COPY大量數據,才有長時間的執行,在slave監控時才能抓的到延遲的數據)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> CREATE TABLE test_table LIKE db_tlc.customer;
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT test_table SELECT * FROM db_tlc.customer;
Query OK, 251327 rows affected (20.00 sec)
Records: 251327  Duplicates: 0  Warnings: 0

master執行完後,進入salve 監控查看偵測的秒數,我是設定每30秒
2019/04/16_15:19:31 Seconds_Behind_Master=0
2019/04/16_15:20:01 Seconds_Behind_Master=0
2019/04/16_15:20:31 Seconds_Behind_Master=1018
2019/04/16_15:21:01 Seconds_Behind_Master=1048
2019/04/16_15:21:31 Seconds_Behind_Master=0
2019/04/16_15:22:01 Seconds_Behind_Master=0
2019/04/16_15:22:31 Seconds_Behind_Master=0
秒數瞬間從0變為1018,然後不到一分鐘就變0
1018/60=約17分鐘
與系統上的時間一致,因為SLAVE時間較快,導致時間計算出現問題,所以 Seconds_Behind_Master 秒差出現一下下就消失了!




沒有留言:

張貼留言