ビッグデータ テクノロジーのマクスウェル エントリー ケース スタディ
記事ディレクトリ
1. 前に書く
バージョン 1.3.0 は JDK8 をサポートしていません. この記事は Shang Silicon Valley の教育文書であり、個人的な学習記録が含まれています.
- マクスウェルのバージョン:
Maxwell1.2.9
- Zookeeper のバージョン:
Zookeeper3.5.7
- カフカのバージョン:
Kafka2.4.1
- MySQL のバージョン:
MySQL5.7
2. マクスウェルの使用
2.1 Maxwell のインストールと展開
2.2 マクスウェル入門ケース
2.2.1 Mysql データを監視し、コンソールに出力する
- 実装手順:
(1) maxwell を実行して mysql データの更新を監視する
[whybigdata@node01 maxwell-1.29.2]$ bin/maxwell --user='maxwell' --password='123456' --host='node01' --producer=stdout
(2) mysql の test_maxwell ライブラリのテスト テーブルにデータを挿入し、maxwell のコンソール出力を確認します。
mysql> insert into test2 values(1,'aaa');
{
"database": "test_maxwell", --库名
"table": "test", --表名
"type": "insert", --数据更新类型
"ts": 1637244821, --操作时间
"xid": 8714, --操作 id
"commit": true, --提交成功
"data": {
--数据
"id": 1,
"name": "aaa"
}
(3) mysql の test_maxwell ライブラリの test テーブルに 3 つのデータを同時に挿入すると、コンソールは 3 つの json ログを検出し、maxwell がデータ行単位でログを収集していることを示します。
mysql> INSERT INTO test2 VALUES(2,'bbb'),(3,'ccc'),(4,'ddd');
{"database":"test_maxwell","table":"test","type":"insert","ts"
:1637245127,"xid":9129,"xoffset":0,"data":{"id":2,"name":"bbb"
}}
{"database":"test_maxwell","table":"test","type":"insert","ts"
:1637245127,"xid":9129,"xoffset":1,"data":{"id":3,"name":"ccc"
}}
{"database":"test_maxwell","table":"test","type":"insert","ts"
:1637245127,"xid":9129,"commit":true,"data":{"id":4,"name":"dd d"}}
mysql> update test2 set name='zaijian' where id =1;
{"database":"test_maxwell","table":"test","type":"update","ts"
:1631618614,"xid":535,"commit":true,"data":{"id":1,"name":"zai jian"},"old":{"name":"nihao"}}
複数のデータを挿入し、最後に挿入されたデータのコミットステータスのみが true で、その他のデータは
xoffset
識別子として後ろから順に並べられます
JSON データ
(4) test_maxwell ライブラリのテスト テーブルのデータを変更し、maxwell のコンソール出力を表示します。
mysql> update test2 set name='abc' where id =1;
(5) test_maxwell ライブラリの test テーブルのデータを削除し、maxwell のコンソール出力を表示します。
mysql> DELETE FROM test2 WHERE id =1;
表データ:
JSON データ
2.2.2 kafka への Mysql データ出力の監視
1) 実装手順:
(1) Zookeeper と kafka を起動する
[atguigu@hadoop102 bin]$ jpsall
=============== hadoop102 ===============
3511 QuorumPeerMain
4127 Kafka
=============== node02 ===============
1885 Kafka
1342 QuorumPeerMain
=============== node03 ===============
1345 QuorumPeerMain
1886 Kafka
(2) Maxwell を起動して binlog を監視する
whybigdata@node01 maxwell-1.29.2]$ bin/maxwell --user='maxwell' --password='123456' --host='node01' --producer=kafka -- kafka.bootstrap.servers=node01:9092 --kafka_topic=maxwell
起動結果グラフ
(3) kafka コンソールを開いたコンシューマーは maxwell トピックを消費します
[whybigdata@node01 ~]$ kafka-console-consumer.sh --bootstrap-server node01:9092 --topic maxwell
ここでは、
OffsetExplorer
ツールを直接使用して、Maxwell モニタリングの結果を表示します
maxwell
上記のコマンドを実行する前に、OffsetExplorer はテーマがないことを確認しました。
下図のように、maxwell
テーマが追加されていることがわかります
- データを挿入する
mysql> insert into test2 values (5,'eee');
1つはコンソールで見つけることができます
error
が、実験には影響しません.具体的な理由は明らかではありません, 下の図に示すように:
maxwell
件名欄確認Data
、文字化けあり
キーと値の値の文字化けを防ぐために、事前に
properties栏
コンテンツ タイプを設定しますString
。デフォルトはバイト配列です。
結果を見る
ビュー値: JSON 形式
- id=5 のデータを eef に変更します
JSON データ:
- id=5 のデータを削除
test2 テーブルは以前に操作されましたが、今回はデータの一部 (id=3、name=dd) が test テーブルに挿入されます。
JSON データ
maxwell で指定されたプロデューサは kafkaa であり、–kafka_topic=maxwell が指定されているため、maxwell ライブラリ内のすべてのテーブルの変更は maxwell トピック (パーティション 0) に表示されます。
- 新しいライブラリ test_maxwell2 とテーブル aaa (id, name) を作成し、新しいデータ (id=1, name=qqq) を挿入します
Maxwell テーマも更新され、まだパーティション 0 にあります
(4) test_maxwell ライブラリのテスト テーブルに別のデータを挿入します。
注: 前回起動した Maxwell プロセスを閉じ、再度 Maxwell を起動してから、上記の SQL 挿入コマンドを実行します。
mysql> insert into test values (5,'eee');
(5) データは kafka コンシューマーを介して表示され、データが正常に kafka に送信されたことを示します。
{"database":"test_maxwell","table":"test","type":"insert","ts"
:1637245889,"xid":10155,"commit":true,"data":{"id":5,"name":"e ee"}}
2) kafkaトピックデータのパーティション制御
会社の実稼働環境では、通常、maxwell を使用して複数の mysql データベースのデータを監視し、これらのデータを kafka のトピック トピックに送信します。このトピック多分区
は提高并发度
. したがって、これらのデータの分割をどのように制御するかが重要になります。実装手順は次のとおりです。
(1) maxwell の設定ファイルを修正し、カスタマイズして maxwell プロセスを起動する
[whybigdata@node01 maxwell-1.29.2]$ vim config.properties
# tl;dr config log_level=info
producer=kafka kafka.bootstrap.servers=node01:9092
# mysql login info
host=node01
user=maxwell
password=123456
# *** kafka ***
# list of kafka brokers #kafka.bootstrap.servers=hosta:9092,hostb:9092
# kafka topic to write to
# this can be static, e.g. 'maxwell', or dynamic, e.g. namespace_%{database}_%{table}
# in the latter case 'database' and 'table' will be replaced with the values for the row being processed kafka_topic=maxwell3
# *** partitioning ***
# What part of the data do we partition by? #producer_partition_by=database # [database, table, primary_key, transaction_id, column] producer_partition_by=database # 控制数据分区模式,可选模式有 库名,表名,主键,列名
# specify what fields to partition by when using producer_partition_by=column
# column separated list. #producer_partition_columns=name
# when using producer_partition_by=column, partition by this when
# the specified column(s) don't exist. #producer_partition_by_fallback=database
(2) maxwell3 という名前の 3 つのパーティションを持つトピックを手動で作成します。
[whybigdata@node01 maxwell-1.29.2]$ kafka-topics.sh --zookeeper node01:2181,hadoop103:2181,hadoop104:2181/kafka --create -- replication-factor 2 --partitions 3 --topic maxwell3
注:
node01:2181,node02:2181,node03:2181/kafka
Zookeeper に kafka のパスを追加する必要があります/kafka
。コンマの後に余分なスペースを残さないでください。そうしないと、次のエラーが発生します。
(3) 構成ファイルを使用して、Maxwell プロセスを開始します。
[whybigdata@node01 maxwell-1.29.2]$ bin/maxwell --config ./config.properties
(4) test_maxwell ライブラリのテスト テーブルに別のデータを挿入します。
(5) kafka ツールで見ると、このデータは maxwell3 トピックの第 1 パーティションに入っています。
結果グラフ
(6) テストライブラリのaaaテーブルにデータを挿入する
(7) kafka ツールで表示すると、このデータは maxwell3 テーマの No. 0 パーティションに入りました。これは、ライブラリ名がデータが入るパーティションに影響することを示しています。
(8) test_maxwell ライブラリの test2 テーブルに再度データを挿入すると、maxwell3 トピックの 1 番目のパーティションにデータが挿入されます。
2.2.3 Mysql指定のテーブルデータ出力コンソールを監視する
(1) maxwell を実行して、mysql で指定したテーブルのデータ更新を監視する
監視できるテーブルを制限します。
exclude
すべてのライブラリの下にあるすべてのテーブルを除外し、include
test_maxwell ライブラリの下にあるテスト テーブルのみを含めます (監視します)。
[whybigdata@node01 maxwell-1.29.2]$ bin/maxwell --user='maxwell' --password='123456' --host='node01' --filter 'exclude: *.*, include:test_maxwell.test' --producer=stdout
(2) test_maxwell.test テーブルにデータを挿入し、maxwell の監視を確認します。
mysql> insert into test_maxwell.test values(7,'ggg');
{
"database":"test_maxwell",
"table":"test",
"type":"insert","ts"
:1637247760,
"xid":11818,
"commit":true,
"data":{
"id":7,
"name":"g gg"
}
}
(3) test_maxwell.test2 テーブルにデータを挿入し、maxwell の監視を確認します。
mysql> insert into test1 values(1,'nihao');
今回は情報を受信しておらず、include パラメータが有効であることを示しており、指定された mysql テーブルの情報のみを監視できます
注: この方法で mysql ライブラリのすべてのテーブルを監視するように設定することもできますinclude:test_maxwell.*
。つまり、ライブラリ全体をフィルタリングします。読者は自分でテストできます。
2.2.4 Mysql指定テーブルフルデータ出力コンソールの監視、データ初期化
初期化(ブートストラップ)公式サイトアドレス:https://maxwells-daemon.io/bootstrapping/
デフォルトでは、Maxwell プロセスは mysql binlog ログの新規および変更されたデータのみを監視できますが、Maxwell はデータの初期化をサポートしています.Maxwell のメタデータを変更して、MySQL テーブルのデータを初期化することができます.これは、完全同期と呼ばれることがよくあります. . 具体的な操作手順は次のとおりです。
要件: test_maxwell ライブラリの下にある test2 テーブルの 4 つのデータすべてを、印刷用に maxwell コンソールにインポートします。
(1) Maxwell のメタデータを変更し、データ初期化メカニズムをトリガーし、mysql の maxwell ライブラリでブートストラップします。
- 完全なデータを必要とするライブラリー名とテーブル名を指定して、データの一部をテーブルに挿入します
mysql> insert into maxwell.bootstrap(database_name,table_name) values('test_maxwell','test2');
上記のステートメントを実行する前に:
実行後のブーストラップ テーブル:
(2) maxwell プロセスを開始します。この時点で、初期化プログラムは test2 テーブル内のすべてのデータを直接出力します。
[whybigdata@node01 maxwell-1.29.2]$ bin/maxwell --user='maxwell' --password='123456' --host='node01' producer=stdout
Using kafka version: 1.0.0
23:15:38,841 WARN MaxwellMetrics - Metrics will not be exposed: metricsReportingType not configured.
23:15:39,110 INFO Maxwell - Maxwell v1.22.0 is booting (StdoutProducer), starting at Position[BinlogPosition[mysql- bin.000004:611096], lastHeartbeat=1637248429242] 23:15:39,194 INFO MysqlSavedSchema - Restoring schema id 6 (last modified at Position[BinlogPosition[mysql- bin.000004:517625], lastHeartbeat=1637246435111])
23:15:39,299 INFO MysqlSavedSchema - Restoring schema id 1 (last modified at Position[BinlogPosition[mysql- bin.000004:158612], lastHeartbeat=0])
23:15:39,342 INFO MysqlSavedSchema - beginning to play deltas...
23:15:39,343 INFO MysqlSavedSchema - played 5 deltas in 1ms
{"database":"test_maxwell","table":"test2","type":"bootstrap- start","ts":1637248539,"data":{}}
23:15:39,367 INFO SynchronousBootstrapper - bootstrapping started for test_maxwell.test2
23:15:39,369 INFO BinlogConnectorReplicator - Setting initial binlog pos to: mysql-bin.000004:611096
{"database":"test_maxwell","table":"test2","type":"bootstrap- insert","ts":1637248539,"data":{"id":1,"name":"aa"}}
{"database":"test_maxwell","table":"test2","type":"bootstrap- insert","ts":1637248539,"data":{"id":2,"name":"bb"}}
{"database":"test_maxwell","table":"test2","type":"bootstrap- insert","ts":1637248539,"data":{"id":3,"name":"cc"}}
{"database":"test_maxwell","table":"test2","type":"bootstrap- insert","ts":1637248539,"data":{"id":4,"name":"dd"}}
{"database":"test_maxwell","table":"test2","type":"bootstrap- complete","ts":1637248539,"data":{}}
23:15:39,387 INFO SynchronousBootstrapper - bootstrapping ended for #8 test_maxwell.test2
23:15:39,465 INFO BinaryLogClient - Connected to node01:3306 at mysql-bin.000004/611096 (sid:6379, cid:108) 23:15:39,465 INFO BinlogConnectorLifecycleListener - Binlog connected.
私の実行結果:
(3) すべてのデータが初期化されると、Maxwell のメタデータが変更されます
-
is_complete フィールドが 0 から 1 に変更されました
-
start_at フィールドが null から特定の時刻 (データ同期の開始時刻) に変更されます。
-
complete_at フィールドが null から特定の時刻 (データ同期の終了時刻) に変更されます。
結果を実行します
maxwell を閉じて再起動しても、再度初期化されません (ブーストラップ)。再度初期化する必要がある場合は、SQL を再度実行する必要があります。
maxwell.bootstrap(database_name,table_name) に挿入します values('test_maxwell','test');
ブーストラップ テーブル:
終了!