1、Maxwell 簡介
-
Maxwell 是一個能實時讀取 MySQL 二進制日志文件binlog,並生成 Json格式的消息,作為生產者發送給 Kafka,Kinesis、RabbitMQ、Redis、
Google Cloud Pub/Sub、文件或其它平台的應用程序。它的常見應用場景有ETL、維護緩存、收集表級別的dml指標、增量到搜索引擎、數據分區遷移、
切庫binlog回滾方案等。 -
Maxwell主要提供了下列功能
-
- 支持SELECT * FROM table的方式進行全量數據初始化。
-
- 支持在主庫發生failover后,自動恢復binlog位置,實現斷點續傳。
-
- 可以對數據進行分區,解決數據傾斜問題,發送到Kafka的數據支持庫、表、列等級別的數據分區。
-
- 工作方式是偽裝為slave接收binlog events,然后根據schema信息拼裝,可以接受ddl、xid、row等event。
-
2、Mysql Binlog介紹
2.1 Binlog 簡介
-
MySQL中一般有以下幾種日志
日志類型 寫入日志的信息 錯誤日志 記錄在啟動,運行或停止mysqld時遇到的問題 通用查詢日志 記錄建立的客戶端連接和執行的語句 二進制日志 binlog 記錄更改數據的語句 中繼日志 從服務器 復制 主服務器接收的數據更改 慢查詢日志 記錄所有執行時間超過 long_query_time秒的所有查詢或不使用索引的查詢DDL日志(元數據日志) 元數據操作由DDL語句執行 -
在默認情況下,系統僅僅打開錯誤日志,關閉了其他所有日志,以達到盡可能減少IO損耗提高系統性能的目的,但是在一般稍微重要一點的實際應用場景中,都至少需要打開二進制日志,因為這是MySQL很多存儲引擎進行增量備份的基礎,也是MySQL實現復制的基本條件
-
接下來主要介紹二進制日志 binlog。
- MySQL 的二進制日志 binlog 可以說是 MySQL 最重要的日志,它記錄了所有的
DDL和DML語句(除了數據查詢語句select、show等),以事件形式記錄,還包含語句所執行的消耗的時間,MySQL的二進制日志是事務安全型的。binlog 的主要目的是復制和恢復。
- MySQL 的二進制日志 binlog 可以說是 MySQL 最重要的日志,它記錄了所有的
-
Binlog日志的兩個最重要的使用場景
- MySQL主從復制
- MySQL Replication在Master端開啟binlog,Master把它的二進制日志傳遞給slaves來達到master-slave數據一致的目的。
- 數據恢復
- 通過使用 mysqlbinlog工具來使恢復數據。
- MySQL主從復制
2.2 Binlog 的日志格式
-
記錄在二進制日志中的事件的格式取決於二進制記錄格式。支持三種格式類型:
- Statement:基於SQL語句的復制(statement-based replication, SBR)
- Row:基於行的復制(row-based replication, RBR)
- Mixed:混合模式復制(mixed-based replication, MBR)
-
Statement
- 每一條會修改數據的sql都會記錄在binlog中。
- 優點
- 不需要記錄每一行的變化,減少了binlog日志量,節約了IO, 提高了性能。
- 缺點
- 在進行數據同步的過程中有可能出現數據不一致。
- 比如 update tt set create_date=now(),如果用binlog日志進行恢復,由於執行時間不同可能產生的數據就不同。
-
Row
- 它不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。
- 優點
- 保持數據的絕對一致性。因為不管sql是什么,引用了什么函數,它只記錄執行后的效果。
- 缺點
- 每行數據的修改都會記錄,最明顯的就是update語句,導致更新多少條數據就會產生多少事件,占用較大空間。
-
Mixed
- 從5.1.8版本開始,MySQL提供了Mixed格式,實際上就是Statement與Row的結合。
- 在Mixed模式下,一般的復制使用Statement模式保存binlog,對於Statement模式無法復制的操作使用Row模式保存binlog, MySQL會根據執行的SQL語句選擇日志保存方式(因為statement只有sql,沒有數據,無法獲取原始的變更日志,所以一般建議為Row模式)。
- 優點
- 節省空間,同時兼顧了一定的一致性。
- 缺點
- 還有些極個別情況依舊會造成不一致,另外statement和mixed對於需要對binlog的監控的情況都不方便。
3、Mysql 實時數據同步方案對比
-
mysql 數據實時同步可以通過解析mysql的 binlog 的方式來實現,解析binlog可以有多種方式,可以通過canal,或者maxwell等各種方式實現。以下是各種抽取方式的對比介紹。

-
其中
canal由 Java開發,分為服務端和客戶端,擁有眾多的衍生應用,性能穩定,功能強大;canal 需要自己編寫客戶端來消費canal解析到的數據。 -
Maxwell相對於canal的優勢是使用簡單,Maxwell比Canal更加輕量級,它直接將數據變更輸出為json字符串,不需要再編寫客戶端。對於缺乏基礎建設,短時間內需要快速迭代的項目和公司比較合適。
-
另外
Maxwell有一個亮點功能,就是Canal只能抓取最新數據,對已存在的歷史數據沒有辦法處理。而Maxwell有一個bootstrap功能,可以直接引導出完整的歷史數據用於初始化,非常好用。
4、開啟Mysql的Binlog
-
1、服務器當中安裝mysql(省略)
- 注意:mysql的版本盡量不要太低,也不要太高,最好使用5.6及以上版本。
-
2、添加mysql普通用戶
maxwell-
為mysql添加一個普通用戶maxwell,因為maxwell這個軟件默認用戶使用的是maxwell這個用戶。
-
進入mysql客戶端,然后執行以下命令,進行授權
mysql -uroot -p123456 -
執行sql語句
--校驗級別最低,只校驗密碼長度 mysql> set global validate_password_policy=LOW; mysql> set global validate_password_length=6; --創建maxwell庫(啟動時候會自動創建,不需手動創建)和用戶 mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY '123456'; mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%'; mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE on *.* to 'maxwell'@'%'; --刷新權限 mysql> flush privileges;
-
-
3、修改配置文件
/etc/my.cnf-
執行命令 sudo vim /etc/my.cnf, 添加或修改以下三行配置
#binlog日志名稱前綴 log-bin= /var/lib/mysql/mysql-bin #binlog日志格式 binlog-format=ROW #唯一標識,這個值的區間是:1到(2^32)-1 server_id=1
-
-
4、重啟mysql服務
-
執行如下命令
sudo service mysqld restart
-
-
5、驗證binlog是否配置成功
-
進入mysql客戶端,並執行以下命令進行驗證
mysql -uroot -p123456 mysql> show variables like '%log_bin%';
-
-
6、查看binlog日志文件生成
-
進入
/var/lib/mysql目錄,查看binlog日志文件.
-
