2.Flink實時項目之Maxwell介紹

1. Maxwell介紹

Maxwell 是由美國 Zendesk 開源,用 Java 編寫的 MySQL 實時抓取軟件蛋欣。 實時讀取

MySQL 二進制日志 Binlog,并生成 JSON 格式的消息如贷,作為生產(chǎn)者發(fā)送給 Kafka豁状,Kinesis捉偏、

RabbitMQ、Redis泻红、Google Cloud Pub/Sub夭禽、文件或其它平臺的應用程序。

官網(wǎng)地址:http://maxwells-daemon.io/

2. MySQL 主從復制過程

  • Master 主庫將改變記錄谊路,寫到二進制日志(binary log)中

  • Slave 從庫向 mysql master 發(fā)送 dump 協(xié)議讹躯,將 master 主庫的 binary log events

拷貝到它的中繼日志(relay log);

  • Slave 從庫讀取并重做中繼日志中的事件缠劝,將改變的數(shù)據(jù)同步到自己的數(shù)據(jù)庫潮梯。
image

3. Maxwell 的工作原理

很簡單,就是把自己偽裝成 slave惨恭,假裝從 master 復制數(shù)據(jù)

4. MySQL 的 binlog

4.1 什么是 binlog

MySQL 的二進制日志可以說 MySQL 最重要的日志了秉馏,它記錄了所有的 DDL 和
DML(除了數(shù)據(jù)查詢語句)語句,以事件形式記錄脱羡,還包含語句所執(zhí)行的消耗的時間萝究,MySQL
的二進制日志是事務安全型的。

一般來說開啟二進制日志大概會有 1%的性能損耗锉罐。二進制有兩個最重要的使用場景:

  • 其一:MySQL Replication 在 Master 端開啟 binlog帆竹,Master 把它的二進制日志

    傳遞給 slaves 來達到 master-slave 數(shù)據(jù)一致的目的。

  • 其二:自然就是數(shù)據(jù)恢復了脓规,通過使用 mysqlbinlog 工具來使恢復數(shù)據(jù)栽连。

二進制日志包括兩類文件:二進制日志索引文件(文件名后綴為.index)用于記錄所有
的二進制文件,二進制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的 DDL 和 DML(除
了數(shù)據(jù)查詢語句)語句事件侨舆。

4.2 binlog 的開啟

找到 MySQL 配置文件的位置: /etc/my.cnf

在 mysql 的配置文件下,修改配置

在[mysqld] 區(qū)塊秒紧,設(shè)置/添加 log-bin=mysql-bin

這個表示 binlog 日志的前綴是 mysql-bin,以后生成的日志文件就是mysql-bin.123456 的文件后面的數(shù)字按順序生成挨下,每次 mysql 重啟或者到達單個文件大小的閾值時熔恢,新生一個文件,按順序編號复颈。

4.3 binlog 的分類設(shè)置

mysql binlog 的格式有三種绩聘,分別是 STATEMENT,MIXED,ROW。

在配置文件中可以選擇配置

binlog_format= statement|mixed|row

  • statement

    語句級耗啦,binlog 會記錄每次一執(zhí)行寫操作的語句凿菩。相對 row 模式節(jié)省空間,但是可能產(chǎn)生不一致性帜讲,比如

    update tt set create_date=now() 如果用 binlog 日志進行恢復衅谷,由于執(zhí)行時間不同可能產(chǎn)生的數(shù)據(jù)就不同。

    優(yōu)點: 節(jié)省空間

    缺點: 有可能造成數(shù)據(jù)不一致似将。

  • row

    行級获黔, binlog 會記錄每次操作后每行記錄的變化蚀苛。

    優(yōu)點:保持數(shù)據(jù)的絕對一致性。因為不管 sql 是什么玷氏,引用了什么函數(shù)堵未,他只記錄執(zhí)行后的效果。

    缺點:占用較大空間盏触。

  • mixed

    statement 的升級版渗蟹,一定程度上解決了,因為一些情況而造成的 statement 模式不一致問題

    默認還是 statement赞辩,在某些情況下譬如:當函數(shù)中包含 UUID() 時雌芽;包含 AUTO_INCREMENT 字段的表被更新時;執(zhí)行 INSERT DELAYED 語句時辨嗽;用 UDF 時世落;會按照 ROW 的方式進行處理

    優(yōu)點:節(jié)省空間,同時兼顧了一定的一致性糟需。

    缺點:還有些極個別情況依舊會造成不一致屉佳,另外 statement 和 mixed 對于需要對 binlog 的監(jiān)控的情況都不方便。

<font style="color:red">綜合上面對比篮灼,Maxwell 想做監(jiān)控分析忘古,選擇 row 格式比較合適</font>

5. Mysql的準備

5.1 創(chuàng)建實時業(yè)務數(shù)據(jù)庫

數(shù)據(jù)庫名:gmall2021

url:192.168.88.71:3306/gmall2021

username:root passwo:123456

導入數(shù)據(jù):https://github.com/zhangbaohpu/gmall-mock/blob/master/data/gmall.sql

5.2 開啟binlog

vim /etc/my.cnf

server-id= 1
log-bin=mysql-bin
binlog_format=row
#指定具體要同步的數(shù)據(jù)庫
binlog-do-db=gmall2021

重啟mysql服務徘禁,并查看初始化文件

service mysql restart

image
image

5.3 模擬生成數(shù)據(jù)

配置文件application.properties

logging.level.root=info

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.88.71:3306/gmall2021?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

logging.pattern.console=%m%n

mybatis-plus.global-config.db-config.field-strategy=not_null

#業(yè)務日期
mock.date=2021-05-30
#是否重置
mock.clear=1
#是否重置用戶
mock.clear.user=0

#生成新用戶數(shù)量
mock.user.count=1000
#男性比例
mock.user.male-rate=20
#用戶數(shù)據(jù)變化概率
mock.user.update-rate:20

#收藏取消比例
mock.favor.cancel-rate=10
#收藏數(shù)量
mock.favor.count=100

#購物車數(shù)量
mock.cart.count=300
#每個商品最多購物個數(shù)
mock.cart.sku-maxcount-per-cart=3
#購物車來源  用戶查詢诅诱,商品推廣,智能推薦, 促銷活動
mock.cart.source-type-rate=60:20:10:10

#用戶下單比例
mock.order.user-rate=95
#用戶從購物中購買商品比例
mock.order.sku-rate=70
#是否參加活動
mock.order.join-activity=1
#是否使用購物券
mock.order.use-coupon=1
#購物券領(lǐng)取人數(shù)
mock.coupon.user-count=1000

#支付比例
mock.payment.rate=70
#支付方式 支付寶:微信 :銀聯(lián)
mock.payment.payment-type=30:60:10


#評價比例 好:中:差:自動
mock.comment.appraise-rate=30:10:10:50

#退款原因比例:質(zhì)量問題 商品描述與實際描述不一致 缺貨 號碼不合適 拍錯 不想買了 其他
mock.refund.reason-rate=30:10:20:5:15:5:5

將mock-db模塊打包成jar

https://github.com/zhangbaohpu/gmall-mock.git

及配置文件上傳到hadoop101的/opt/software/applog目錄下送朱,并運行jar

java -jar mock-db-0.0.1-SNAPSHOT.jar

再次到到/var/lib/mysql 目錄下娘荡,查看 index 文件的大小,已經(jīng)增大

image

6. Maxwell安裝

6.1 安裝

  • 下載解壓

    下載地址:http://maxwells-daemon.io/

    tar -zxvf maxwell-1.25.0.tar.gz -C /opt/module/

  • 初始化maxwell元數(shù)據(jù)

    • 創(chuàng)建數(shù)據(jù)庫

      在 MySQL 中建立一個 maxwell 庫用于存儲 Maxwell 的元數(shù)據(jù)

      mysql -uroot -p123456

      mysql> create database maxwell;

    • 設(shè)置安全級別

      執(zhí)行如果錯誤請看:https://www.cnblogs.com/blog0403/p/14790397.html

      mysql> set global validate_password_length=4;

      mysql> set global validate_password_policy=0;

    • 分配一個賬號可以操作該數(shù)據(jù)庫

      mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY '123456';

      庫名:maxwell 賬號:maxwell 密碼:123456

    • 分配這個賬號可以監(jiān)控其他數(shù)據(jù)庫的權(quán)限

      mysql> GRANT SELECT ,REPLICATION SLAVE , REPLICATION CLIENT ON *.* TO maxwell@'%';

6.2 配置

拷貝并修改配置文件

cd /opt/module/maxwell-1.25.0

cp config.properties.example config.properties

vim config.properties

# tl;dr config
log_level=info

producer=kafka
kafka.bootstrap.servers=hadoop101:9092,hadoop102:9092,hadoop103:9092
#添加內(nèi)容
kafka_topic=ods_base_db_m
# mysql login info
#mysql所在機器
host=hadoop101
#maxwell采集用戶
user=maxwell
password=123456
#同步歷史數(shù)據(jù)需要用到
client_id=maxwell_1

<font style="color:red">注意:默認還是輸出到指定 Kafka 主題的一個 kafka 分區(qū)驶沼,因為多個分區(qū)并行可能會打亂binlog 的順序炮沐,如果要提高并行度,首先設(shè)置 kafka 的分區(qū)數(shù)>1回怜,然后設(shè)置 producer_partition_by 屬性大年,可選值producer_partition_by=database|table|primary_key|random| column</font>

6.3 啟動

在/home/zhangbao/bin創(chuàng)建啟動腳本

vim maxwell.sh

/opt/module/maxwell-1.25.0/bin/maxwell --config /opt/module/maxwell-1.25.0/config.properties >/dev/null 2>&1 &

maxwell已啟動

7. 監(jiān)控binglog日志

maxwell服務已啟動,此時只要監(jiān)控的數(shù)據(jù)庫有數(shù)據(jù)變動玉雾,maxwell就可以監(jiān)控到變更的數(shù)據(jù)翔试,然后發(fā)送到kafka的topic:ods_base_db_m。

7.1 啟動kafka消費端

cd /opt/module/kafka/bin

./kafka-console-consumer.sh --zookeeper hadoop101:2181,hadoop102:2181,hadoop103:2181 --topic ods_base_db_m

7.2 啟動向數(shù)據(jù)庫導入數(shù)據(jù)

向數(shù)據(jù)庫gmall2021導入數(shù)據(jù)項目:https://github.com/zhangbaohpu/gmall-mock复旬,模塊mock-db

打包后有個jar包:mock-db-0.0.1-SNAPSHOT.jar垦缅,配置文件application.properties如下:

logging.level.root=info

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.88.71:3306/gmall2021?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

logging.pattern.console=%m%n

mybatis-plus.global-config.db-config.field-strategy=not_null

#業(yè)務日期
mock.date=2021-06-03
#是否重置
mock.clear=1
#是否重置用戶
mock.clear.user=1

#生成新用戶數(shù)量
mock.user.count=1000
#男性比例
mock.user.male-rate=20
#用戶數(shù)據(jù)變化概率
mock.user.update-rate:20

#收藏取消比例
mock.favor.cancel-rate=10
#收藏數(shù)量
mock.favor.count=100

#購物車數(shù)量
mock.cart.count=300
#每個商品最多購物個數(shù)
mock.cart.sku-maxcount-per-cart=3
#購物車來源  用戶查詢,商品推廣驹碍,智能推薦, 促銷活動
mock.cart.source-type-rate=60:20:10:10

#用戶下單比例
mock.order.user-rate=95
#用戶從購物中購買商品比例
mock.order.sku-rate=70
#是否參加活動
mock.order.join-activity=1
#是否使用購物券
mock.order.use-coupon=1
#購物券領(lǐng)取人數(shù)
mock.coupon.user-count=1000

#支付比例
mock.payment.rate=70
#支付方式 支付寶:微信 :銀聯(lián)
mock.payment.payment-type=30:60:10

#評價比例 好:中:差:自動
mock.comment.appraise-rate=30:10:10:50

#退款原因比例:質(zhì)量問題 商品描述與實際描述不一致 缺貨 號碼不合適 拍錯 不想買了 其他
mock.refund.reason-rate=30:10:20:5:15:5:5

記妆谙选:jar包和配置文件在同一目錄凡恍,方便修改配置

啟動jar

cd /opt/software/applog

java -jar mock-db-0.0.1-SNAPSHOT.jar

7.3 kafka接收數(shù)據(jù)

在kafka消費端接收到的數(shù)據(jù)

{
  "database": "gmall2021",
  "table": "comment_info",
  "type": "insert",
  "ts": 1622733351,
  "xid": 84599,
  "xoffset": 16492,
  "data": {
    "id": 1400471299563253795,
    "user_id": 125,
    "nick_name": null,
    "head_img": null,
    "sku_id": 16,
    "spu_id": 4,
    "order_id": 27460,
    "appraise": "1204",
    "comment_txt": "評論內(nèi)容:24831521569529734613146941532892748384314624527997",
    "create_time": "2021-06-03 23:15:51",
    "operate_time": null
  }
}

到此數(shù)倉的ods層已經(jīng)完成,包括怔球,日志數(shù)據(jù)及業(yè)務數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚼酝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子竟坛,更是在濱河造成了極大的恐慌革半,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流码,死亡現(xiàn)場離奇詭異又官,居然都是意外死亡,警方通過查閱死者的電腦和手機漫试,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門六敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驾荣,你說我怎么就攤上這事外构。” “怎么了播掷?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵审编,是天一觀的道長。 經(jīng)常有香客問我歧匈,道長垒酬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任件炉,我火速辦了婚禮勘究,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斟冕。我一直安慰自己口糕,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布磕蛇。 她就那樣靜靜地躺著景描,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秀撇。 梳的紋絲不亂的頭發(fā)上超棺,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音捌袜,去河邊找鬼说搅。 笑死,一個胖子當著我的面吹牛虏等,可吹牛的內(nèi)容都是我干的弄唧。 我是一名探鬼主播适肠,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼候引!你這毒婦竟也來了侯养?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤澄干,失蹤者是張志新(化名)和其女友劉穎逛揩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麸俘,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡辩稽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了从媚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞泄。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拜效,靈堂內(nèi)的尸體忽然破棺而出喷众,到底是詐尸還是另有隱情,我是刑警寧澤紧憾,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布到千,位于F島的核電站,受9級特大地震影響赴穗,放射性物質(zhì)發(fā)生泄漏憔四。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一望抽、第九天 我趴在偏房一處隱蔽的房頂上張望加矛。 院中可真熱鬧履婉,春花似錦煤篙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至已烤,卻和暖如春鸠窗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胯究。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工稍计, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裕循。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓臣嚣,卻偏偏與公主長得像净刮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硅则,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容