一敬尺、原理
1.1 Maxwell介紹
Maxwell是一個能實時讀取MySQL二進制日志binlog闰围,并生成 JSON 格式的消息消恍,作為生產(chǎn)者發(fā)送給 Kafka,Kinesis豺总、RabbitMQ车伞、Redis、Google Cloud Pub/Sub喻喳、文件或其它平臺的應用程序另玖。它的常見應用場景有ETL、維護緩存表伦、收集表級別的dml指標谦去、增量到搜索引擎、數(shù)據(jù)分區(qū)遷移蹦哼、切庫binlog回滾方案等鳄哭。
- 支持 SELECT * FROM table 的方式進行全量數(shù)據(jù)初始化;
- 支持在主庫發(fā)生failover后纲熏,自動恢復binlog位置(GTID)妆丘;
- 可以對數(shù)據(jù)進行分區(qū),解決數(shù)據(jù)傾斜問題局劲,發(fā)送到kafka的數(shù)據(jù)支持database勺拣、table、column等級別的數(shù)據(jù)分區(qū)容握;
- 工作方式是偽裝為Slave宣脉,接收binlog events,然后根據(jù)schemas信息拼裝剔氏,可以接受ddl塑猖、xid、row等各種event谈跛。
1.2 對比Canal
- Maxwell沒有canal那種server+client模式羊苟,只有一個server把數(shù)據(jù)發(fā)送到消息隊列或redis。如果需要多個實例感憾,通過指定不同配置文件啟動多個進程蜡励。
- Maxwell有一個亮點功能,就是canal只能抓取最新數(shù)據(jù)阻桅,對已存在的歷史數(shù)據(jù)沒有辦法處理凉倚。而Maxwell有一個bootstrap功能,可以直接引導出完整的歷史數(shù)據(jù)用于初始化嫂沉,非常好用稽寒。
- Maxwell不能直接支持HA,但是它支持斷點還原趟章,即錯誤解決后重啟繼續(xù)上次點兒讀取數(shù)據(jù)杏糙。
- Maxwell只支持json格式慎王,而Canal如果用Server+client模式的話,可以自定義格式宏侍。
- Maxwell比Canal更加輕量級赖淤。
1.3 流程圖
可以通過Maxwell實現(xiàn)MySQL與Elasticsearch的數(shù)據(jù)同步。
二谅河、實現(xiàn)
① vi my.cnf 修改mysql的配置文件
[mysqld]
server_id=1
log-bin=master
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=1 # 設置為主從強一致性
log-slave-updates=1 # 記錄日志
② 設置權限
mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY 'XXXXXX';
mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%';
mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';
③ 啟動Maxwell并與RabbitMQ關聯(lián)
方式一:通過在docker命令中指定屬性的值關聯(lián)RabbitMQ
docker run -it --rm zendesk/maxwell bin/maxwell --user='maxwell' --password='hxr' --host='mysql.hostname' --producer=rabbitmq --rabbitmq_host='rabbitmq.hostname'
備注:測試時咱旱,可以通過在控制臺打印的方式查看配置是否正確。
docker run -it --rm zendesk/maxwell bin/maxwell --user='maxwell' --password='hxr' --host='mysql.hostname' --producer=stdout
方式二:通過配置文件啟動,配置文件名稱為config.properties
docker run -it -d -p 6111:6111 -v /root/maxwell/config.properties:/app/config.properties -n maxwell zendesk/maxwell bin/maxwell
config.properties配置文件如下
# tl;dr config 生產(chǎn)環(huán)境配置為info級別
log_level=DEBUG
producer=rabbitmq
# mysql login info, mysql用戶必須擁有讀取binlog權限和新建庫表的權限
host=192.168.32.225
user=maxwell
password=hxr
output_nulls=true
# options to pass into the jdbc connection, given as opt=val&opt2=val2
#jdbc_options=opt1=100&opt2=hello
jdbc_options=autoReconnet=true
#需要同步的數(shù)據(jù)庫旧蛾,表莽龟,及不包含的字段
#filter=exclude: *.*, include: foo.*, include: bar.baz
filter=exclude: *.*, include: dev_smartcook.menu.publish_status=2
#replica_server_id 和 client_id 唯一標示,用于集群部署
replica_server_id=64
client_id=maxwell_dev
metrics_type=http
metrics_slf4j_interval=60
http_port=8111
http_diagnostic=true # default false
#rabbitmq
rabbitmq_host=116.62.148.11
rabbitmq_port=5672
rabbitmq_user=guest
rabbitmq_pass=guest
rabbitmq_virtual_host=/vhost_mmr
rabbitmq_exchange=maxwell
rabbitmq_exchange_type=topic
rabbitmq_exchange_durable=false
rabbitmq_exchange_autodelete=false
rabbitmq_routing_key_template=dev_smartcook.menu
rabbitmq_message_persistent=false
rabbitmq_declare_exchange=true
# 僅匹配foodb數(shù)據(jù)庫的tbl表和所有table_數(shù)字的表
--filter='exclude: foodb.*, include: foodb.tbl, include: foodb./table_\d+/'
# 排除所有庫所有表锨天,僅匹配db1數(shù)據(jù)庫
--filter = 'exclude: *.*, include: db1.*'
# 排除含db.tbl.col列值為reject的所有更新
--filter = 'exclude: db.tbl.col = reject'
# 排除任何包含col_a列的更新
--filter = 'exclude: *.*.col_a = *'
# blacklist 黑名單毯盈,完全排除bad_db數(shù)據(jù)庫,若要恢復病袄,必須刪除maxwell庫
--filter = 'blacklist: bad_db.*'
也可以通過Kafka來接收Maxwell的消息:
docker run -p 8080:8080 -it --rm zendesk/maxwell bin/maxwell --user='maxwell' --password='123456' --host='10.100.97.246' --producer=kafka --kafka.bootstrap.servers='10.100.97.246:9092' --kafka_topic=maxwell --log_level=debug --metrics_type=http --metrics_jvm=true --http_port=8080
配置了通過http方式發(fā)布指標搂赋,啟用收集JVM信息,端口為8080益缠,之后可以通過 http://10.100.97.246:8080/metrics 便可獲取所有的指標脑奠,http 方式有四種后綴,分別對應四種不同的格式:
endpoint 說明:
/metrics 所有指標以JSON格式返回
/prometheus 所有指標以Prometheus格式返回(Prometheus是一套開源的監(jiān)控&報警&時間序列數(shù)據(jù)庫的組合)
/healthcheck 返回Maxwell過去15分鐘是否健康
/ping 簡單的測試幅慌,返回 pong
三宋欺、參考
maxwell官網(wǎng)地址 http://maxwells-daemon.io/
Github官方地址 https://github.com/zendesk/maxwell