本文介紹通過Logtail采集MySQL Binlog的操作步驟。
原理
Logtail內部實現了MySQL Slave節點的交互協議,具體流程如下所示。
Logtail將自己偽裝為MySQL Slave節點向MySQL master節點發送dump請求。
MySQL master節點收到dump請求后,會將自身的Binlog實時發送給Logtail。
Logtail對Binlog進行事件解析、過濾、數據解析等操作,并將解析好的數據上傳到日志服務。
功能特點
通過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
。
應用場景
適用于數據量較大且性能要求較高的數據同步場景。
增量訂閱數據庫變動,進行實時查詢與分析。
數據庫操作審計。
使用日志服務對數據庫更新信息進行自定義查詢分析、可視化、對接下游流計算、導入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,單擊下一步。
- 創建機器組。
- 如果您已有可用的機器組,請單擊使用現有機器組。
- 如果您還沒有可用的機器組,請執行以下操作(以ECS為例)。
- 在ECS機器頁簽中,通過手動選擇實例方式選擇目標ECS實例,單擊創建。
具體操作,請參見安裝Logtail(ECS實例)。
重要 如果您的服務器是與日志服務屬于不同賬號的ECS、其他云廠商的服務器和自建IDC時,您需要手動安裝Logtail。更多信息,請參見安裝Logtail(Linux系統)或安裝Logtail(Windows系統)。手動安裝Logtail后,您必須在該服務器上手動配置用戶標識。具體操作,請參見配置用戶標識。
- 安裝完成后,單擊確認安裝完畢。
- 在創建機器組頁面,輸入名稱,單擊下一步。
日志服務支持創建IP地址機器組和用戶自定義標識機器組,詳細參數說明請參見創建IP地址機器組和創建用戶自定義標識機器組。
- 在ECS機器頁簽中,通過手動選擇實例方式選擇目標ECS實例,單擊創建。
確認目標機器組已在應用機器組區域,單擊下一步。
重要創建機器組后立刻應用,可能因為連接未生效,導致心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。
設置數據源,然后單擊下一步。
您可以通過表單配置方式或JSON配置方式完成數據源設置。更多信息,請參見Logtail配置詳情。
- 預覽數據及創建索引,然后單擊下一步。日志服務默認開啟全文索引。您也可以根據采集到的日志,手動創建字段索引,或者單擊自動生成索引,日志服務將自動生成字段索引。更多信息,請參見創建索引。重要 如果您要查詢和分析日志,那么全文索引和字段索引必須至少啟用一種。同時啟用時,以字段索引為準。
- 單擊查詢日志,系統將跳轉至Logstore查詢分析頁面。您需要等待1分鐘左右,待索引生效后,才能在原始日志頁簽中,查看已采集到的日志。更多信息,請參見查詢和分析日志。
Logtail配置詳情
您可以通過表單配置方式或JSON配置方式完成數據源設置。
表單配置方式
在數據源設置步驟中,完成如下配置。
參數 | 說明 |
配置名稱 | Logtail配置名稱。 |
數據庫主機 | 數據庫所在主機的地址。 |
數據庫端口 | 數據庫的端口號。 |
數據庫用戶名 | 登錄數據庫的用戶名稱。 需保證配置的用戶具有數據庫讀權限以及MySQL REPLICATION權限,示例如下。
|
數據庫密碼 | 登錄數據庫的賬號密碼。 如果安全需求較高,建議將訪問用戶名和密碼配置為 重要 如果您在控制臺上修改了此參數,同步至本地后會覆蓋本地的配置。 |
ServerID | Logtail偽裝成的MySQL Slave的ID。 重要 ServerID對于MySQL數據庫必須唯一,否則會采集失敗。 |
包含的表 | 包含的表名稱(包括數據庫名稱,例如test_db.test_table),支持正則表達式。
|
忽略的表 | 忽略的表名稱(包括數據庫名稱,例如test_db.test_table),支持正則表達式。
|
首次采集的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),支持正則表達式。
|
ExcludeTables | string 數組 | 否 | 忽略的表名稱(包括數據庫名稱,例如test_db.test_table),支持正則表達式。
|
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
問題排查
使用Logtail采集日志后,如果預覽頁面或查詢頁面無數據,您可以參見Logtail采集日志失敗的排查思路進行排查。
數據庫表和日志樣例
例如對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后更新。