碑文
リレーショナルデータベースMysql / Oracleインクリメンタル同期Elasticsearchは継続的な懸念事項であり、コミュニティおよびQQグループで最も議論されている問題の1つです。質問には次のものが含まれますが、これらに限定されません。1。MysqlはElasticsearchとどのように同期しますか?2。Logstash、kafka_connector、およびcanalの選択の違いと、選択方法は何ですか?3.追加、削除、変更、チェックを同時に行うことはできますか?.....この記事は答えを与えます。
1.運河の同期
1.1 Canalは、ES6.Xを同期するためにMysqlを公式にサポートしています
同期の原則、前を参照:乾物| Debeziumは、MysqlからElasticsearchへの効率的なリアルタイム同期を実現します。
Canal 1.1.1バージョン以降、クライアントデータランディングの適応および起動機能が追加されました。運河アダプターのElasticSearchバージョンは6.xx以降をサポートします。達成するにはアダプターを使用する必要があります。
1.2同期効果
1)検証済み:増分同期のみがサポートされており、既存の完全なデータ同期はサポートされていません。この点で、canalの本来の目的は、「Alibabamysqlデータベースbinlogの増分サブスクリプションおよび消費コンポーネント」です。
2)検証済み:binlogメカニズム、Mysqlの新規、更新、および削除された操作により、対応するElasticsearchをリアルタイムで追加、更新、および削除できます。
3)推奨される使用シナリオの運河は、MysqlおよびElasticsearchデータのリアルタイムの追加、削除、および変更を必要とするビジネスシナリオに適しています。リアルタイムシナリオはビジネスシナリオを要求するものではなく、logstashinputjdbcも満たすことができます。
適切な仕事の選択とスクリーニングを行うことをお勧めします。
2.同期バージョン:
- EN:6.6.1
- Mysql:5.7.25
- チャネル:v1.1.3-alpha-2
- canal-adapter:v1.1.3-alpha-2
- 運河のダウンロードアドレス:https://github.com/alibaba/canal/releases
3.同期ステップの解釈
3.1運河を開始します。これは、常駐プロセスとしてバックグラウンドで実行できます。
公式ウェブサイトには詳細な説明がありますhttps://github.com/alibaba/canal/wiki/QuickStart、以下は重要な注意事項のみをリストしています。
対応するダウンロードファイル:canal.deployer-1.1.3-SNAPSHOT.tar.gzを使用すると、最新バージョンをリアルタイムで追跡できます。
3.1.1binlogを有効にする
運河の原理はmysqlbinlogテクノロジーに基づいているため、ここでmysqlのbinlog書き込み機能を有効にする必要があります。binlogモードを行として構成することをお勧めします。
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
3.1.2構成ファイルの変更
vi conf/example/instance.properties
データベースの基本情報を構成します。
3.1.3運河を開始する
Bin / startup.shは、ログを介してエラーを確認できます。
3.2 ElasticSearchアダプターを構成し、同期を実現します。
公式ウェブサイトは詳細に説明されています:https://github.com/alibaba/canal/wiki/Sync-ES。以下では、展開中に発生したピットについてのみ説明します。
3.2.1展開バージョン
anal.adapter-1.1.3-SNAPSHOT.tar.gz、更新された場合は、最新バージョンを使用することをお勧めします。
3.2.2コア構成
[root@localhost es]# cat mytest_user.yml
dataSourceKey: defaultDS
destination: example
esMapping:
_index: baidu_index
_type: _doc
_id: _id
pk: id
sql: "select a.id as _id, a.title, a.url, a.publish_time, a.content,
from baidu_info as a"
# objFields:
# _labels: array:;
etlCondition: "where a.id >= 1"
commitBatch: 3000
実現目的:自己インクリメントを実現するために、ライブラリテーブルのidフィールドがElasticsearchの_idとして使用されます。
4.マルチテーブルアソシエーションの実現
公式ウェブサイトを参照することをお勧めします:https://github.com/alibaba/canal/wiki/Sync-ESサポート:
- 1対1
- 1対多
- 多から多へ
5.ピット
ピット1:canal.adapter-1.1.2の起動に失敗しました
起動の失敗:https://github.com/alibaba/canal/issues/1513この問題はバージョン1.1.3で修正されています。
ピット2:完全同期をサポートしていません
完全な同期には、logstashまたはその他のツールを使用することをお勧めします。
ピット3:対応するインデックスのマッピングを最初にESで作成する必要があります
そうしないと、インデックスが認識されず、書き込みエラーが報告されます。
ピット4:複数のテーブルを同期する方法は?
canal.adapter-1.1.3 / conf / esに* .yml構成を追加します。つまり、Mysqlテーブルごとに1つの構成ファイルが存在する可能性があります。
ピット5:ヌルポインタ例外エラー
解決策:SQLステートメントセクションで、対応するライブラリテーブルIDをESの_idとして指定します。指定しないと、エラーが報告されます。例えば:
select sx_sid as _id, name from baidu_info
ピット6:行モードに基づくbinlogは、変更の前後の値を記録しますか?
- 挿入:変更された値のみ。
- 更新:変更の前後の値が含まれています。
- 削除:変更前の値
完全同期について:https://github.com/alibaba/canal/issues/376
6同期選択の要約
上記の異なる選択には、それぞれ長所と短所があります。実際のビジネスに応じて選択することをお勧めします。同期練習計画と思考を残すことを歓迎します。
惑星に参加して、上司と技術を解決してください!