本文介紹通過Logtail採集MySQL Binlog的操作步驟。
原理
Logtail內部實現了MySQL Slave節點的互動協議,具體流程如下所示。
Logtail將自己偽裝為MySQL Slave節點向MySQL master節點發送dump請求。
MySQL master節點收到dump請求後,會將自身的Binlog即時發送給Logtail。
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配置
在接入資料地區,選擇MySQL BinLog-外掛程式。
選擇目標Project和Logstore,單擊下一步。
建立機器組。
如果已有可用的機器組,請單擊使用現有機器組。
如果沒有可用的機器組,請執行以下操作。
重要以本帳號下與Log ServiceProject同地區的ECS執行個體為例。對於本帳號其他地區的ECS執行個體、其他帳號的ECS執行個體、其他雲廠商的伺服器或自建IDC,建立機器組的步驟請參見建立使用者自訂標識機器組(推薦)或建立IP地址機器組。
在ECS機器頁簽,選擇目標ECS執行個體,單擊建立。在指定ECS執行個體上安裝Logtail。
安裝完成後,單擊確認安裝完畢。
在建立機器組頁面,輸入名稱,單擊下一步。通過IP地址、使用者自訂標識定義機器組。
確認目標機器組已在應用機器組地區,單擊下一步。
重要建立機器組後立刻應用,可能因為串連未生效,導致心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。
設定資料來源,然後單擊下一步。
您可以通過表單配置方式或JSON配置方式完成資料來源設定。更多資訊,請參見Logtail配置詳情。
預覽資料及建立索引,然後單擊下一步。欄位索引的更多資訊,請參見建立索引。
全文索引和欄位索引同時啟用時,以欄位索引為準。
單擊查詢日誌,系統將跳轉至Logstore查詢分析頁面。您需要等待1分鐘左右,待索引生效後,才能在原始日誌頁簽中,查看已採集到的日誌。更多資訊,請參見查詢和分析日誌。
Logtail配置詳情
您可以通過表單配置方式或JSON配置方式完成資料來源設定。
表單配置方式
在資料來源設定步驟中,完成如下配置。
參數 | 說明 |
配置名稱 | Logtail配置名稱。 |
資料庫主機 | 資料庫所在主機的地址。 |
資料庫連接埠 | 資料庫的連接埠號碼。 |
資料庫使用者名稱 | 登入資料庫的使用者名稱稱。 需保證配置的使用者具有資料庫讀許可權以及MySQL REPLICATION許可權,樣本如下。
|
資料庫密碼 | 登入資料庫的帳號密碼。 如果安全需求較高,建議將訪問使用者名稱和密碼配置為 重要 如果您在控制台上修改了此參數,同步至本地後會覆蓋本地的配置。 |
ServerID | Logtail偽裝成的MySQL Slave的ID。 重要 ServerID對於MySQL資料庫必須唯一,否則會採集失敗。 |
包含的表 | 包含的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。
|
忽略的表 | 忽略的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。
|
首次採集的Binlog檔案名稱 | 首次採集的Binlog檔案名稱。不設定時,預設從目前時間點開始採集。 如果想從指定位置開始採集,可以查看當前的Binlog檔案以及檔案大小位移量,並將首次採集的Binlog檔案名稱、首次採集的Binlog檔案的位移量設定成對應的值,樣本如下。
說明 指定首次採集的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格式集中打包到data和old_data兩個欄位中,其中old_data欄位僅在row_update事件中有意義。 例如資料表有三列資料c1、c2、c3,並且取消選中是否將事件數目據打包成JSON格式,則row_insert事件數目據中會有c1、c2、c3三個欄位。而選中是否將事件數目據打包成JSON格式時,c1,c2,c3會被統一打包為data欄位,值為 重要 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許可權,樣本如下。
|
Password | string | 否 | 登入資料庫的使用者密碼,預設值為空白。 如果安全需求較高,建議將訪問使用者名稱和密碼配置為 重要 如果您在控制台上修改了此參數,同步至本地後會覆蓋本地的配置。 |
ServerID | int | 否 | Logtail偽裝成的Mysql Slave的ID。預設值為125。 重要 ServerID對於MySQL資料庫必須唯一,否則會採集失敗。 |
IncludeTables | string數組 | 是 | 包含的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。
|
ExcludeTables | string 數組 | 否 | 忽略的表名稱(包括資料庫名稱,例如test_db.test_table),支援Regex。
|
StartBinName | string | 否 | 首次採集的Binlog檔案名稱。預設從目前時間點開始採集。 如果想從指定位置開始採集,可以查看當前的Binlog檔案以及檔案大小位移量,並將StartBinName、StartBinlogPos設定成對應的值,樣本如下。
說明 指定StartBinName後,第一次採集會產生較大流量。 |
StartBinlogPos | int | 否 | 首次採集的Binlog檔案的位移量,預設值為0。 |
EnableGTID | bool | 否 | 上傳的資料中是否附加全域事務ID。
|
EnableInsert | bool | 否 | 是否採集insert事件的資料。
|
EnableUpdate | bool | 否 | 是否採集update事件的資料。
|
EnableDelete | bool | 否 | 是否採集delete事件的資料。
|
EnableDDL | bool | 否 | 是否採集DDL(data definition language)事件數目據。
說明 該選項不支援通過IncludeTables和ExcludeTables過濾。 |
Charset | string | 否 | 資料的編碼方式。預設值為utf8。 |
TextToString | bool | 否 | 是否將text類型的資料轉換成字串。
|
PackValues | bool | 否 | 是否將事件數目據以JSON格式集中打包到data和old_data兩個欄位中,其中old_data僅在row_update事件中有意義。
例如資料表有三列資料c1、c2、c3,並且設定PackValues為false,則row_insert事件數目據中會有c1、c2、c3三個欄位。而設定PackValues為true時,c1、c2、c3會被統一打包為data欄位,值為 重要 Logtail 0.16.19及以上版本支援該功能。 |
EnableEventMeta | bool | 否 | 是否採集事件的中繼資料。 Binlog事件的中繼資料套件括event_time、event_log_position、event_size和event_server_id。
重要 Logtail 0.16.21及以上版本支援該功能。 |
修改本地配置
如果您沒有在外掛程式配置中輸入真實的Host、User、Password等資訊,可以在外掛程式配置下發到本地後進行手動修改。
登入Logtail所在伺服器。
開啟/usr/local/ilogtail/user_log_config.json檔案,找到service_canal關鍵字,修改Host、User、Password等欄位。
執行以下命令重啟Logtail。
sudo /etc/init.d/ilogtaild stop; sudo /etc/init.d/ilogtaild start
相關文檔
Log Service為Linux系統提供Logtail自動診斷工具,可以根據工具提示快速定位並解決問題。請參見如何使用Logtail自動診斷工具。
使用Logtail採集日誌後,如果預覽頁面為空白或查詢頁面無資料,請按照Logtail採集日誌失敗的排查思路進行排查。
在使用Logtail採集日誌時,可能遇到正則解析失敗、檔案路徑不正確、流量超過Shard服務能力等錯誤。查看Logtail採集錯誤的步驟,請參見如何查看Logtail採集錯誤資訊。採集資料常見的錯誤類型請參見Log Service採集資料常見的錯誤類型。
預設情況下,一個記錄檔只能匹配一個Logtail配置。如果同一份日誌需要被採集多份,請參見如何?檔案中的日誌被採集多份。
將企業內網伺服器日誌採集到Log Service,請參見採集企業內網伺服器日誌。
不同伺服器上的日誌的儲存路徑或檔案名稱相同,需要區分不同伺服器,請參見機器組Topic屬性。區分不同使用者或執行個體產生的日誌資料,請參見檔案路徑正則。
資料庫表和日誌範例
例如對user_info
資料庫下的specialalarm
表分別執行INSERT
、UPDATE
、DELETE
操作,對應的資料庫表結構、資料庫操作及日誌範例如下所示。
表結構範例
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後更新。