mysql から hbase へのデータ移行に関する考えと設計

黄舟
リリース: 2017-03-02 16:45:52
オリジナル
1332 人が閲覧しました

1. 移行の理由

ビジネスの発展により、mysql を使用してインデックスを作成し、検索を行うと、たとえば、テーブル全体がダンプされるたびにデータ フローのボトルネックが発生します。過度の圧力がかかり、消費が発生します。現在のデータ量は基本的に 1 億レベルに達しています。mysql でより良いサービスを提供したい場合は、これに基づいてサブデータベースとテーブルを検討する必要があります。 hbase は mysql よりもデータ量がはるかに多く、カラムの拡張も非常に便利なので、データの保存に使用されます

2. リレーショナル データベースと Nosql のいくつかの違い

(1) 保存方法の違い

mysql、sqlserver、oracleなどのリレーショナルデータベースでは、下図のようにデータは行単位で保存されます。


しかし、hbaseではすべてのデータは行単位で保存されます。


hbase の論理モデルは次のとおりです:


その内: com.cnn.ww は、mysql の主キーの概念に相当する rowkey に対応します。

コンテンツ、アンカー: この 2 つは、物理ストレージの観点からは、同じ列ファミリーのデータが同じファイル

cnnsi.com、mylook.ca に格納されます。 hbase では、列ファミリーの下で列を次のように指定できます。動的に追加される

対応するグリッド データはユニット データ、つまり対応する行キーを表します。cf: 列の下の特定の値

ここで、tn: はタイムスタンプ、異なるバージョンを表します。

そのうちの1つが格納されるユニットデータの構造は次のとおりです:



(2) CRUDのいくつかの違い

CRUDはデータベースの最も基本的で一般的に使用される操作です。たとえば、テーブル作成ステートメントは mysql には適用されません。詳しくは、以下に示すように、hbase シェルで 'table'、'columnfamily' を作成します

という名前のテーブルを作成できます。は columnfamily であり、その他のブロックサイズとバージョン データはデフォルトです

read データを取得するとき、対応するデータは、get 'table'、'row'、'cf:column' などの hbase ステートメントを通じて取得できます。 、hbase には対応する更新の概念はありませんが、新しいバージョンがタイムスタンプから反映されます。 使用するステートメントは

put 'table'、'row'、'cf: name'、'value' です。

value の値を対応する cf 列ファミリーに割り当てます

mysql でのデータの削除の違いは、行を直接削除するか、hbase で特定の列を空に設定することだけです。特定の列を直接削除できます

(3) mysqlのインデックス

の違い hbaseではインデックスを作成したりクエリをフィルタリングしたりできますが、hbaseでは行キーに基づくクエリのみがサポートされており、これが最も高速です

(4) mysqlからnosqlへの開発の感想

リレーショナルデータベースは長い歴史がありますが、データ量が増大する例えばmysqlデータベースの場合、データ量が数億以上になると、クエリの効果は、最終的には主キーに従ってのみ実行されるか、徐々にサブデータベースおよびサブテーブル モデルに発展する可能性があります。データベースとサブテーブルは、運用、保守、使用に多くの手間をもたらします。そのため、hbase を使用してデータ量が劇的に増加するにつれて、nosql データベースの主キー開発 (nosql は SQL だけでなく) も徐々に開発され、拡張されました。例として nosql では、TB および PB データをサポートしており、列の拡張は特に柔軟です

(5) hbase はなぜ大量のデータを保存できるのか

実際、hbase は mysql サブデータベースの結果と見なすことができます唯一の違いは、mysql のサブデータベースとテーブルの分割がインデックスなどをサポートしていることですが、本でわかるように、hbase のデータは列に従って格納されます。データが大きすぎる場合は、以下に示すように行ごとに分割されます:



異なるリージョン 異なるマシンに配置され、最終的にマスターによって管理されます。これは分割と同等です。大量のデータを保存するための行と列

3. データ移行で発生するいくつかの問題

(1) ジョイントインデックスの問題

たとえば、mysql には、次のようなジョイントインデックスの状況があります。製品とカテゴリの対応付け 特定の製品のすべてのカテゴリを取得する必要があり、特定のカテゴリのすべての製品も取得したい場合は、mysql のジョイント インデックスを直接たどることで要件を満たすことができます。 hbase で rowkey に従ってのみクエリを実行できる場合はどうすればよいでしょうか? 関連するデータを読み取った後、次の 2 つの解決策が得られました。 1. hbase では、行の後に行を続けることができます。共通の列ファミリーがある限り、上記の状況では、以下に示すように、行キーによって分類された幅広いテーブルを構築できます

分類 ID、行キーとして

product_id、列名として

値は次のように格納されます削除するかどうか

上記の行キーは分類IDです。行からすべてのproduct_idを直接取得し、それを自分で削除するかどうかをフィルタリングできます

2. 上位テーブルの構築とはつまり、hbase は辞書順にソートされるため、それほど多くの列は必要なく、次の設計を実行できます
classification id_product id を rowkey として使用します

1から始まる行をスキャンしてすべてのデータを取得する限り

基本的に、上記の2つのメソッドはデータを保存するためのセカンダリインデックスを構築します


上記はデータの移行ですmysql より hbase に関する考え方と設計に関するコンテンツ。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!