全部產品
Search
文件中心

Simple Log Service:採集MySQL Binlog(計劃棄用)

更新時間:Jun 30, 2024

本文介紹通過Logtail採集MySQL Binlog的操作步驟。

重要

Log Service後續計劃不再支援MySQL Binlog採集外掛程式,當前已不支援新使用者建立採集配置,原有的採集配置仍能正常使用,建議您使用DataWorks或Flink進行採集。具體操作,請參見MySQLMySQL資料來源

原理

Logtail內部實現了MySQL Slave節點的互動協議,具體流程如下所示。

  1. Logtail將自己偽裝為MySQL Slave節點向MySQL master節點發送dump請求。

  2. MySQL master節點收到dump請求後,會將自身的Binlog即時發送給Logtail。

  3. Logtail對Binlog進行事件解析、過濾、資料解析等操作,並將解析好的資料上傳到Log Service。

實現原理

功能特點

  • 通過Binlog增量採集資料庫的更新操作資料,效能優越。支援RDS等MySQL協議的資料庫。

  • 支援多種資料庫過濾方式。

  • 支援設定Binlog位點。

  • 支援通過Checkpoint機制同步儲存狀態。

使用限制

  • Logtail 1.0.31及以上版本支援採集MySQL 8.0的Binlog。

  • MySQL必須開啟Binlog,且Binlog必須為row模式(RDS預設已開啟Binlog)。

    # 查看是否開啟Binlog
    mysql> show variables like "log_bin";
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | log_bin       | ON    |
    +---------------+-------+
    1 row in set (0.02 sec)
    # 查看Binlog類型
    mysql> show variables like "binlog_format";
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | binlog_format | ROW   |
    +---------------+-------+
    1 row in set (0.03 sec)
  • ServerID唯一,即需要同步的MySQL的Slave ID唯一。

  • RDS限制

    • 無法直接在RDS伺服器上安裝Logtail,您需要將Logtail安裝在能連通RDS執行個體的伺服器上。

    • RDS備庫不支援Binlog採集,您需要配置RDS主庫進行採集。

  • 包括資料庫版本升級、表結構變更、磁碟變更等操作,可能造成資料同步中斷。如遇此情境,可嘗試刪除logtail的checkpoint目錄後,重啟logtail。如果問題仍然存在,推薦您使用DataWorks或Flink進行採集。checkpoint目錄位置預設為/etc/ilogtail/checkpoint

應用情境

適用於資料量較大且效能要求較高的資料同步情境。

  • 增量訂閱資料庫變動,進行即時查詢與分析。

  • 資料庫Action Trail。

  • 使用Log Service對資料庫更新資訊進行自訂查詢分析、可視化、對接下遊Realtime Compute、匯入MaxCompute離線計算、匯入OSS長期儲存等操作。

注意事項

建議您適當放開對Logtail的資源限制以應對流量突增等情況,避免Logtail因為資源超限被強制重啟,對您的資料造成不必要的風險。

您可以通過/usr/local/ilogtail/ilogtail_config.json檔案修改相關參數。更多資訊,請參見設定Logtail啟動參數

如下樣本表示將CPU的資源限制放寬到雙核,將記憶體資源的限制放寬到2048MB。

{
    ...
    "cpu_usage_limit":2,
    "mem_usage_limit":2048,

    ...
}

資料可靠性

建議您啟用MySQL伺服器的全域事務ID(GTID)功能,並將Logtail升級到0.16.15及以上版本以保證資料可靠性,避免因主備切換造成的資料重複採集。

  • 資料漏採集:Logtail與MySQL伺服器之間的網路長時間中斷時,可能會產生資料漏採集情況。

    如果Logtail和MySQL master節點之間的網路發生中斷,MySQL master節點仍會不斷地產生新的Binlog資料並且回收舊的Binlog資料。當網路恢複,Logtail與MySQL master節點重連成功後,Logtail會使用自身的checkpoint向MySQL master節點請求更多的Binlog資料。但由於長時間的網路中斷,它所需要的資料很可能已經被回收,這時會觸發Logtail的異常恢複機制。在異常恢複機制中,Logtail會從MySQL master節點擷取最近的Binlog位置,以它為起點繼續採集,這樣就會跳過checkpoint和最近的Binlog位置之間的資料,導致資料漏採集。

  • 資料重複採集:當MySQL master節點和slave節點之間的Binlog序號不同步時,發生了主備切換事件,可能會產生資料重複採集情況。

    在MySQL主備同步的設定下,MySQL master節點會將產生的Binlog同步給MySQL slave節點,MySQL slave節點收到後儲存到本地的Binlog檔案中。當MySQL master節點和slave節點之間的Binlog序號不同步時,發生了主備切換事件,以Binlog檔案名稱和檔案大小位移量作為checkpoint的機制將導致資料重複採集。

    例如,有一段資料在MySQL master節點上位於(binlog.100, 4)(binlog.105, 4)之間,而在MySQL slave節點上位於(binlog.1000, 4)(binlog.1005, 4)之間,並且Logtail已經從MySQL master節點擷取了這部分資料,將本地checkpoint更新到了(binlog.105, 4)。如果此時發生了主備切換且無任何異常發生,Logtail將會繼續使用本地checkpoint(binlog.105, 4)去向新的MySQL master節點採集binlog。但是因為新的MySQL master上的(binlog.1000, 4)(binlog.1005, 4)這部分資料的序號都大於Logtail所請求的序號,MySQL master將它們返回給Logtail,導致重複採集。

建立Logtail配置

  1. 登入Log Service控制台

  2. 接入資料地區,選擇MySQL BinLog-外掛程式

  3. 選擇目標Project和Logstore,單擊下一步

  4. 建立機器組。

    • 如果已有可用的機器組,請單擊使用現有機器組

      image

    • 如果沒有可用的機器組,請執行以下操作。

      重要

      以本帳號下與Log ServiceProject同地區的ECS執行個體為例。對於本帳號其他地區的ECS執行個體、其他帳號的ECS執行個體、其他雲廠商的伺服器或自建IDC,建立機器組的步驟請參見建立使用者自訂標識機器組(推薦)建立IP地址機器組

      1. ECS機器頁簽,選擇目標ECS執行個體,單擊建立。在指定ECS執行個體上安裝Logtail。

      2. 安裝完成後,單擊確認安裝完畢

      3. 建立機器組頁面,輸入名稱,單擊下一步。通過IP地址、使用者自訂標識定義機器組。

  5. 確認目標機器組已在應用機器組地區,單擊下一步

    重要

    建立機器組後立刻應用,可能因為串連未生效,導致心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。

  6. 設定資料來源,然後單擊下一步

    您可以通過表單配置方式或JSON配置方式完成資料來源設定。更多資訊,請參見Logtail配置詳情

  7. 預覽資料及建立索引,然後單擊下一步。欄位索引的更多資訊,請參見建立索引

    • 全文索引和欄位索引同時啟用時,以欄位索引為準。

  8. 單擊查詢日誌,系統將跳轉至Logstore查詢分析頁面。您需要等待1分鐘左右,待索引生效後,才能在原始日誌頁簽中,查看已採集到的日誌。更多資訊,請參見查詢和分析日誌

Logtail配置詳情

您可以通過表單配置方式或JSON配置方式完成資料來源設定。

表單配置方式

資料來源設定步驟中,完成如下配置。

參數

說明

配置名稱

Logtail配置名稱。

資料庫主機

資料庫所在主機的地址。

資料庫連接埠

資料庫的連接埠號碼。

資料庫使用者名稱

登入資料庫的使用者名稱稱。

需保證配置的使用者具有資料庫讀許可權以及MySQL REPLICATION許可權,樣本如下。

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

資料庫密碼

登入資料庫的帳號密碼。

如果安全需求較高,建議將訪問使用者名稱和密碼配置為xxx,待配置同步至本地機器後,在本地檔案/usr/local/ilogtail/user_log_config.json中找到對應配置進行修改。具體操作,請參見修改本地配置

重要

如果您在控制台上修改了此參數,同步至本地後會覆蓋本地的配置。

ServerID

Logtail偽裝成的MySQL Slave的ID。

重要

ServerID對於MySQL資料庫必須唯一,否則會採集失敗。

包含的表

包含的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。

  • 如果需要完全符合,請加上首碼^,加上尾碼$,例如^test_db\\.test_table$

  • 如果需要採集所有表,請設定為.*\\..*

  • 如果某個表名稱不符合包含的表中的任一條件,則該表中的資料不會被採集。

忽略的表

忽略的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。

  • 如果需要完全符合,請加上首碼^,加上尾碼$,例如^test_db\\.test_table$

  • 如果某個表符合忽略的表中的任一條件,則該表中的資料不會被採集。

首次採集的Binlog檔案名稱

首次採集的Binlog檔案名稱。不設定時,預設從目前時間點開始採集。

如果想從指定位置開始採集,可以查看當前的Binlog檔案以及檔案大小位移量,並將首次採集的Binlog檔案名稱首次採集的Binlog檔案的位移量設定成對應的值,樣本如下。

# 設定首次採集的Binlog檔案名稱為mysql-bin.000063, 設定首次採集的Binlog檔案的位移量為0。
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000063 |       241 |
| mysql-bin.000064 |       241 |
| mysql-bin.000065 |       241 |
| mysql-bin.000066 |     10778 |
+------------------+-----------+
4 rows in set (0.02 sec)
說明

指定首次採集的Binlog檔案名稱後,第一次採集會產生較大流量。

首次採集的Binlog檔案的位移量

首次採集的Binlog檔案的位移量。

是否附加全域事務ID

選中該選項,則上傳的資料中將附加全域事務ID

是否採集insert事件的資料

選中該選項,則Logtail將採集insert事件數目據。

是否採集update事件的資料

選中該選項,則Logtail將採集update事件數目據。

是否採集delete事件的資料

選中該選項,則Logtail將採集delete事件數目據。

是否採集DDL事件數目據

選中該選項,則Logtail將採集DDL(data definition language)事件數目據。

說明

該選項不支援通過包含的表忽略的表過濾。

編碼方式

資料的編碼方式。

是否將text類型的資料轉換成字串

選中該選項,則Logtail會將text類型的資料轉換成字串。

是否將事件數目據打包成JSON格式

選中該選項,則Logtail會將事件數目據以JSON格式集中打包到dataold_data兩個欄位中,其中old_data欄位僅在row_update事件中有意義。

例如資料表有三列資料c1、c2、c3,並且取消選中是否將事件數目據打包成JSON格式,則row_insert事件數目據中會有c1c2c3三個欄位。而選中是否將事件數目據打包成JSON格式時,c1,c2,c3會被統一打包為data欄位,值為{"c1":"...", "c2": "...", "c3": "..."}

重要

Logtail 0.16.19及以上版本支援該功能。

是否採集事件的中繼資料

選中該選項,則Logtail將採集事件的中繼資料。Binlog事件的中繼資料套件括event_time、event_log_position、event_size和event_server_id。

重要

Logtail 0.16.21及以上版本支援該功能。

資料處理

處理配置,用於解析資料,例如提取欄位、提取日誌時間、脫敏資料、過濾日誌等。可選項,您可以配置一種或多種處理方式。更多資訊,請參見使用Logtail外掛程式處理資料

JSON配置方式

外掛程式配置中填寫您的Logtail配置資訊,樣本如下所示。

  • inputs為資料來源配置,必選項。

    重要

    一個inputs中只允許配置一個類型的資料來源。

  • processors為處理配置,用於解析資料。可選項,您可以配置一種或多種處理方式。

    如果當前的inputs配置無法滿足日誌解析需求,您可以在外掛程式配置中添加processors配置,即添加Logtail外掛程式處理資料。例如提取欄位、提取日誌時間、脫敏資料、過濾日誌等。更多資訊,請參見使用Logtail外掛程式處理資料

{
 "inputs": [
     {
         "type": "service_canal",
         "detail": {
             "Host": "************.mysql.rds.aliyuncs.com",
             "Port": 3306,
             "User" : "user1",
             "ServerID" : 56321,
             "Password": "*******",
             "IncludeTables": [
                 "user_info\\..*"
             ],
             "ExcludeTables": [
                 ".*\\.\\S+_inner"
             ],
             "TextToString" : true,
             "EnableDDL" : true
         }
     }
 ]
}

參數

類型

是否必須

說明

type

string

資料來源類型,固定為service_canal

Host

string

資料庫所在主機地址,預設值為127.0.0.1

Port

int

資料庫連接埠,預設值為3306

User

string

登入資料庫使用者名稱稱,預設值為root

需保證配置的使用者具有資料庫讀許可權以及MySQL REPLICATION許可權,樣本如下。

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

Password

string

登入資料庫的使用者密碼,預設值為空白。

如果安全需求較高,建議將訪問使用者名稱和密碼配置為xxx,待配置同步至本地機器後,在本地檔案/usr/local/ilogtail/user_log_config.json中找到對應配置進行修改。具體操作,請參見修改本地配置

重要

如果您在控制台上修改了此參數,同步至本地後會覆蓋本地的配置。

ServerID

int

Logtail偽裝成的Mysql Slave的ID。預設值為125

重要

ServerID對於MySQL資料庫必須唯一,否則會採集失敗。

IncludeTables

string數組

包含的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。

  • 如果需要完全符合,請加上首碼^,加上尾碼$,例如^test_db\\.test_table$

  • 如果需要採集所有表,請設定為.*\\..*

  • 如果某個表名稱不符合IncludeTables中的任一條件,則該表中的資料不會被採集。

ExcludeTables

string 數組

忽略的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。

  • 如果需要完全符合,請加上首碼^,加上尾碼$,例如^test_db\\.test_table$

  • 如果某個表符合ExcludeTables中的任一條件,則該表中的資料不會被採集。

StartBinName

string

首次採集的Binlog檔案名稱。預設從目前時間點開始採集。

如果想從指定位置開始採集,可以查看當前的Binlog檔案以及檔案大小位移量,並將StartBinNameStartBinlogPos設定成對應的值,樣本如下。

# 設定StartBinName為"mysql-bin.000063", 設定StartBinlogPos為0
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000063 |       241 |
| mysql-bin.000064 |       241 |
| mysql-bin.000065 |       241 |
| mysql-bin.000066 |     10778 |
+------------------+-----------+
4 rows in set (0.02 sec)
說明

指定StartBinName後,第一次採集會產生較大流量。

StartBinlogPos

int

首次採集的Binlog檔案的位移量,預設值為0

EnableGTID

bool

上傳的資料中是否附加全域事務ID

  • true(預設值):附加全域事務ID。

  • false:不附加全域事務ID。

EnableInsert

bool

是否採集insert事件的資料。

  • true(預設值):採集。

  • false:不採集。

EnableUpdate

bool

是否採集update事件的資料。

  • true(預設值):採集。

  • false:不採集。

EnableDelete

bool

是否採集delete事件的資料。

  • true(預設值):採集。

  • false:不採集。

EnableDDL

bool

是否採集DDL(data definition language)事件數目據。

  • true:採集。

  • false(預設值):不採集。

說明

該選項不支援通過IncludeTablesExcludeTables過濾。

Charset

string

資料的編碼方式。預設值為utf8

TextToString

bool

是否將text類型的資料轉換成字串。

  • true:轉換。

  • false(預設值):不轉換。

PackValues

bool

是否將事件數目據以JSON格式集中打包到dataold_data兩個欄位中,其中old_data僅在row_update事件中有意義。

  • true:打包。

  • false(預設值):不打包。

例如資料表有三列資料c1、c2、c3,並且設定PackValuesfalse,則row_insert事件數目據中會有c1c2c3三個欄位。而設定PackValuestrue時,c1、c2、c3會被統一打包為data欄位,值為{"c1":"...", "c2": "...", "c3": "..."}

重要

Logtail 0.16.19及以上版本支援該功能。

EnableEventMeta

bool

是否採集事件的中繼資料。 Binlog事件的中繼資料套件括event_time、event_log_position、event_size和event_server_id。

  • true:採集。

  • false(預設值):不採集。

重要

Logtail 0.16.21及以上版本支援該功能。

修改本地配置

如果您沒有在外掛程式配置中輸入真實的Host、User、Password等資訊,可以在外掛程式配置下發到本地後進行手動修改。

  1. 登入Logtail所在伺服器。

  2. 開啟/usr/local/ilogtail/user_log_config.json檔案,找到service_canal關鍵字,修改HostUserPassword等欄位。

  3. 執行以下命令重啟Logtail。

    sudo /etc/init.d/ilogtaild stop; sudo /etc/init.d/ilogtaild start

相關文檔

資料庫表和日誌範例

例如對user_info資料庫下的specialalarm表分別執行INSERTUPDATEDELETE操作,對應的資料庫表結構、資料庫操作及日誌範例如下所示。

  • 表結構範例

    CREATE TABLE `specialalarm` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `time` datetime NOT NULL,
    `alarmtype` varchar(64) NOT NULL,
    `ip` varchar(16) NOT NULL,
    `count` int(11) unsigned NOT NULL,
    PRIMARY KEY (`id`),
    KEY `time` (`time`) USING BTREE,
    KEY `alarmtype` (`alarmtype`) USING BTREE
    ) ENGINE=MyISAM AUTO_INCREMENT=1;
  • 資料庫操作

    執行INSERT、DELETE和UPDATE三種操作。

    insert into specialalarm (`time`, `alarmType`, `ip`, `count`) values(now(), "NO_ALARM", "10.10.**.***", 55);
    delete from specialalarm where id = 4829235  ;
    update specialalarm set ip = "10.11.***.**" where id = "4829234";

    zc.specialalarm建立一個索引。

    ALTER TABLE `zc`.`specialalarm` 
    ADD INDEX `time_index` (`time` ASC);
  • 日誌範例

    在查詢分析頁面,查看每種操作對應的日誌,日誌範例如下所示。

    • INSERT語句

      __source__:  10.30.**.**  
      __tag__:__hostname__:  iZbp145dd9fccu*****  
      __topic__:    
      _db_:  zc  
      _event_:  row_insert  
      _gtid_:  7d2ea78d-b631-11e7-8afb-00163e0eef52:536  
      _host_:  *********.mysql.rds.aliyuncs.com  
      _id_:  113  
      _table_:  specialalarm  
      alarmtype:  NO_ALARM  
      count:  55  
      id:  4829235  
      ip:  10.10.***.***  
      time:  2017-11-01 12:31:41
    • DELETE語句

      __source__:  10.30.**.**  
      __tag__:__hostname__:  iZbp145dd9fccu****
      __topic__:    
      _db_:  zc  
      _event_:  row_delete  
      _gtid_:  7d2ea78d-b631-11e7-8afb-00163e0eef52:537  
      _host_:  *********.mysql.rds.aliyuncs.com  
      _id_:  114  
      _table_:  specialalarm  
      alarmtype:  NO_ALARM  
      count:  55  
      id:  4829235  
      ip:  10.10.**.***
      time:  2017-11-01 12:31:41
    • UPDATE語句

      __source__:  10.30.**.**  
      __tag__:__hostname__:  iZbp145dd9fccu****  
      __topic__:    
      _db_:  zc  
      _event_:  row_update  
      _gtid_:  7d2ea78d-b631-11e7-8afb-00163e0eef52:538  
      _host_:  *********.mysql.rds.aliyuncs.com  
      _id_:  115  
      _old_alarmtype:  NO_ALARM  
      _old_count:  55  
      _old_id:  4829234  
      _old_ip:  10.10.22.133  
      _old_time:  2017-10-31 12:04:54  
      _table_:  specialalarm  
      alarmtype:  NO_ALARM  
      count:  55  
      id:  4829234  
      ip:  10.11.***.***
      time:  2017-10-31 12:04:54
    • DDL(data definition language)語句

      __source__:  10.30.**.**  
      __tag__:__hostname__:  iZbp145dd9fccu****  
      __topic__:    
      _db_:  zc  
      _event_:  row_update  
      _gtid_:  7d2ea78d-b631-11e7-8afb-00163e0eef52:539  
      _host_:  *********.mysql.rds.aliyuncs.com  
      ErrorCode:  0
      ExecutionTime:  0
      Query:  ALTER TABLE `zc`.`specialalarm` 
      ADD INDEX `time_index` (`time` ASC)
      StatusVars:

    欄位

    說明

    _host_

    資料庫host名稱。

    _db_

    資料庫名稱。

    _table_

    表的名稱。

    _event_

    事件類型。

    _id_

    本次採集的自增ID,從0開始,每次採集一個binlog事件後加1。

    _gtid_

    全域事務ID。

    _filename_

    Binlog檔案名稱。

    _offset_

    Binlog檔案大小位移量,該值只會在每次commit後更新。