數據庫數據實時采集 -- Maxwell


1、Maxwell 簡介

  • Maxwell 是一個能實時讀取 MySQL 二進制日志文件binlog,並生成 Json格式的消息,作為生產者發送給 Kafka,Kinesis、RabbitMQ、Redis、
    Google Cloud Pub/Sub、文件或其它平台的應用程序。它的常見應用場景有ETL、維護緩存、收集表級別的dml指標、增量到搜索引擎、數據分區遷移、
    切庫binlog回滾方案等。

  • Maxwell主要提供了下列功能

      1. 支持SELECT * FROM table的方式進行全量數據初始化。
      1. 支持在主庫發生failover后,自動恢復binlog位置,實現斷點續傳。
      1. 可以對數據進行分區,解決數據傾斜問題,發送到Kafka的數據支持庫、表、列等級別的數據分區。
      1. 工作方式是偽裝為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 最重要的日志,它記錄了所有的 DDLDML 語句(除了數據查詢語句select、show等),以事件形式記錄,還包含語句所執行的消耗的時間,MySQL的二進制日志是事務安全型的。binlog 的主要目的是復制和恢復
  • Binlog日志的兩個最重要的使用場景

    • MySQL主從復制
      • MySQL Replication在Master端開啟binlog,Master把它的二進制日志傳遞給slaves來達到master-slave數據一致的目的。
    • 數據恢復
      • 通過使用 mysqlbinlog工具來使恢復數據。

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日志文件.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM