リアルタイム百万製品データの同期、秒単位のクエリ結果

A 2次元を検索するために事業名及び製品名からのコンテンツを検索するときに背中が、上司がビジネスの製品検索システムを構築するために、新しいミッションのために配置され、迅速で正確な検索機能、ユーザーの入力をユーザに提供することができますが、業務システムへのAPIコールを提供しながら、データ構造の組み合わせに商品を所有して発注、協会やプレス事業の精度に応じて、結果を探し出します。

背景は非常に簡単ですが、現実はかなり複雑になっています!私たちは、次の課題に直面しています:
①コモディティビジネスデータベースおよびデータベースは、複数の異なるサーバがあり、百万のデータ容量、どのように我々はクロスデータベースのデータ同期も達成することができますか?

②商品の商人やデータが所属され、またはKFCのスパイシーなチキンバーガーマクドナルドがハングアップしますが、これを恥ずかしいです!

③商品業務データは、顧客が明らかに商品を見つけた場合は、その後、フレームにすでに、、、上下ので、後者の点を古くなったデータの束を押収することはできません検索サービスを価格、在庫を修正するなど、頻繁に更新されます顧客はTucaoう!データベースのCRUDソースデータを検索する方法、それをリアルタイムで同期していますか?

上記の3つの問題で、我々は全体的な建築設計サービスの検索を開始しました。

システムアーキテクチャ設計のアイデア

右のシステムアーキテクチャを設計するために、我々は現在の状況を分析しました。
まず、ビジネスデータや商品データは、ビジネスデータと製品データの関連を満たすために、二つの別々のMySQL8データベースに格納されている、私たちはテーブルに私達のデータベース検索システムにリアルタイムのETLのために必要な2つのライブラリを必要としています。

第二に、商人、商品データベースのETLシステムからのデータを使用して、リアルタイムのビジネスアソシエイトプロダクトデータ構造と文書の父と息子のフォーマットの組み合わせになるために必要な、データベースを検索し、それがESに格納されます。

最後に、商人、商品データベースのCRUD操作は、ES、リアルタイムの追加、削除および変更をサポートするために必要であるESデータに同期したリアルタイムを必要としています。

第二運河をリサイクルMySQLデータベース検索サービスを読んで、この目的のために、我々は2つの腔コンポーネント、データETLのための最初の運河、商人、テーブルとフィールドの商品データベースの一部、検索サービスのデータベースを抽出するように設計しましたメッセージキューへのbinlog、カフカリアルタイム伝送の場合、運河アダプタ、親子文書のマッピングに関連付けられたデータは、処理されたデータはElasticSearchに格納されます。

図に示すように詳細なシステムアーキテクチャ設計。

マーチャント製品検索システムアーキテクチャ設計


プロジェクト戦闘

1、およびソフトウェア環境

オペレーティングシステム:CentOSの7
運河:canal.adapter-1.1.4、canal.deployer-1.1.4
カフカ:kafka_2.12-2.3.0
ElasticSearch:elasticsearch-6.3.2
kibana:kibana-6.3.2

図2は、MySQL8にデータETL運河を使用して実装しました

このステップでは、運河の使用は、2つの別々のMySQL8データベースからのもので、抽出テーブルは、MySQLデータベースを検索する必要があります。

2.1インストールcanaldeployer

(1)抽出canal.deployer-1.1.4.tar.gz
(2)構成運河デプロイヤ
canal.propertiesファイル、メインの構成serverMode、MQと三つの部分の先を変更し、canaldeployer / confディレクトリを入力します。
まず第一に、我々は、システムの緩衝能を高め、カフカモードに修正し、システムの安定性を向上させるserverMode:

サーバモード


次に、MQカフカ情報の構成(カフカ独自のインストール):

カフカMQ情報


最後に、3の構成は、運河の展開3を発現インスタンス化インスタンスに設定ニーズはこの場合、トピックカフカへのMySQLバイナリログの同期化を開始します。下図のように:

配置された目的地の例


(3)配置運河デプロイヤインスタンス
canaldeployer / confに/ exampleディレクトリを入力し、見つかった instance.propertiesの 運河に例のファイルを、私たちは、その設定を参照することができます。
①の例は、両方つの宛先は、xxxsearchとして、ステップに構成名前カタログ全体をコピーします。
②、xxxsearchディレクトリ、編集instance.propertiesファイルを入力してくださいだけでなく、トピック名は、カフカが指定されているように構成データベースの情報の主な情報源は、データテーブルとフィールドを必要に応じ、このソース・データベースが運河デプロイヤてJSONデータ、およびリアルタイム伝送に変換されますBINLOGトピックのカフカへ。次のとおりです。

ソース・データベースの構成canaldeployインスタンス


canaldeployインスタンスカフカのトピック配置


③canaldeployer / binディレクトリに、実行./startup.sh、及びそれぞれの出発管デプロイヤ例。
したがって、運河のデプロイヤは、構造体を完了しました。

2.2インストールcanal.adapter

我々は、トピックにきれい変換操作、保存されたMySQL8をcanal.adapterカフカビンログJSONデータを使用する必要があります。運河以来ネイティブサポートMySQL8ではありませんので、我々はいくつかの調整をする必要があります。
(1)駆動接続MySQL8を増加させます
canal.adapter-1.1.4.tar.gzを解凍、canaladapter / libディレクトリを入力して、削除のmysql-コネクタ-javaの-5.1.40.jar、導入のmysql-コネクタ-javaの-8.0.18.jar

(2)構成運河アダプタなので、データがMySQL8に出力されます。
以下のように、canaladapter / confディレクトリを入力し、編集application.ymlファイル、メインコンフィギュレーション消費カフカ、ソースデータベース情報とデータベース情報検索システム:

ETL構成にMySQL8


次に、一例としてmytest_user.yml公式にcanaladapter / CONF / RDBディレクトリを入力し、構成カフカトピック名、ソースデータベースの名前、データソーステーブル名、ターゲット・データベースおよびターゲット・データ・テーブル名の名前は、 YMLにテーブルの対応する推奨しましたファイル

ETLマッピング設定のテーブル構造


(3)スタートcanaladapter
canaladapter / binディレクトリを入力し、./startup.sh実行し、運河のアダプターを開始し、観察ログ/アダプタ/ adapter.log二つのレコードがあること、それは次のログを印刷するかどうかを確認するために、データベース検索システムでレコードを手動で追加し、ログファイル、INFO、DEBUGは、構成が成功しています。
ログcanaladapter
これまでのところ、設定データのETLステージは、二つの異なるMySQL8データベース、MySQLデータベース検索サービスへのリアルタイム同期からデータ完了です。

3、マルチテーブルに関連付けられたデータ、および彼の息子のドキュメントマップ

第二運河canaladapterの(1)構成
下に示すように、編集application.ymlファイル、メインコンフィギュレーション消費カフカ、データベース検索システム、ESとの接続情報をcanaladapter / confディレクトリを入力します。

canaladapter MQの構成とMySQL


ES設定canaladapter


(2)は、複数の相関テーブルを設定しました
canaladapter / confに/ ESディレクトリを入力し、vimのmytest_user.yml、共同編集者、マルチテーブルの構成:

マルチテーブル関連構成

注、その自由な組み合わせに関連付けられたSQLのサポート、マルチテーブルが、いくつかの制限があります。
(A)主テーブルサブクエリすることができません
唯一の左端結合テーブルを左外側を使用することができる(B)は、プライマリ・テーブルである必要があります
(C)は、それがテーブルサブクエリからリンクされている場合は複数のテーブルを持つことができません
(このような条件フィールドの内容変更などの条件があることができるテーブルサブクエリから、推奨されておらず、矛盾したデータの同期をもたらすことができる)を主SQLクエリが存在することはできない(D)
a.role_id = b.idオンとb.statues = 1:(E)は、一次リンク条件は、アクションのような他の定数、で発生する可能性が分析「=」のみ外部キーを許可します
a.role_id = b.id請求a.role_id b.idにメインまたはSELECT文に表示されなければならない:(F)のようなメイン・クエリステートメントで条件フィールドに関連付ける必要があります
(G)及び弾性検索のSQLクエリ属性値マッピングされるものなど(SELECT * FROMでサポートされていない)に1:名がマップされたユーザから_emailとして_id、a.name、a.emailとして選択a.id ES名前フィールドのマッピングは、_emailは、最終的なマップフィールドとしてエイリアスが(もし別名)_idプロファイル:. _idマップに記入することができ、ここで_id _emailフィールドマッピングにマップされます。
(3)の構成と彼の息子のドキュメント
例えばbiz_order.yml、vimのbiz_order.yml、父と息子のconfigure文書マッピングの公式:

父と息子のマッピング構成ファイル


(4)ではElasticSearch6は、インデックスと親子関係のマッピング文書を作成します
kibanaページを入力し、開発ツールをクリックし、インデックスとドキュメントのマッピング父と息子を作成するには、次のコマンドを実行します。
親子指数及び文書のマッピングを確立
前記は、ES6とkibanaがインストールのために、この構成は特に、本明細書に記載されていません。

(5)スタート運河アダプタ
canaladapter / binディレクトリを入力し、./startup.sh実行し、運河のアダプターを開始し、観察ログ/アダプタ/ adapter.logそれは、このような印刷コマンド設定するとして、次のログを印刷するかどうかを確認するために、データベース検索システムでレコードを手動で追加し、ログファイル成功。
ログの例アダプタが正しく設定されています

図4に示すように、動作結果

私たちは、今見て照会するkibanaのDSLステートメントによって実行することができます。
私たちは、業務システムに「KFC」店舗を増加し、その後に「トマト」とコモディティシステムの「フレッシュトマト」2件の商品、および関連アイテムを追加していた「KFC。」その後、我々は、以下のクエリ(ESは、デフォルトのフィールドを削除します)の結果は、「KFC」または「トマト」であるクエリ:
DSLのクエリ結果
チャートから見て、私たちがすることができますまた、問い合わせ商品名事業名商品、店舗や商品によって照会し、運河にリアルタイムデータの追加および削除をサポートすることができ、ESデータは、ビジネス・システムおよび商用システムと一致するだろう、とのデータ構造が含まれています企業や対応品は、ビジネスニーズを満たすために。

5、要約

完全に構築するために、この時点では、運河に基づいて、カフカ、MySQL8、ビジネス製品検索システムの基本的な枠組みElasticSearch6技術。私たちは、リアルタイムアクセス運河デプロイヤ商人、商品データベースシステムのMySQLのバイナリログを使用して、消費カフカに関連付けられた運河アダプタ、およびバイナリログJSONデータ、文書マッピング父と息子のことで、マルチテーブルで、カフカに送られ、その後、最終的に上位のため、ES6に保存されていますサービスコールを検索します。
あなたがビジネス要件を達成するためのオンライン検索サービスシステムの最終的な成功、リアルタイムのデータ同期、セカンドレベルの結果が、上司は財の会社の百万商人のために人のR&Dチームごとに鶏肉を追加するために、言いました!笑~~、少し興奮があると思います

著者:ケビン、ピコ・テクノロジーシニアのJavaエンジニア、より技術的な乾燥のために、「わずかな技術」を懸念


おすすめ

転載: juejin.im/post/5e6989faf265da5756326908