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ù)庫潮梯。
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
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)增大
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ù)