sql >> データベース >  >> NoSQL >> HBase

Clouderaオペレーショナルデータベースにトランザクションサポートをもたらします

    ClouderaのオペレーショナルデータベースにANSISQL、セカンダリインデックス、スタースキーマ、ビュー機能を追加した後、今後数か月以内に分散トランザクションサポートを導入することをお知らせします。

    ACIDとは何ですか?

    データベース設計のACIDモデルは、データベースで最も重要な概念の1つです。 ACIDは、アトミック性、一貫性、分離、および耐久性を表します。非常に長い間、商業的に成功するデータベースには、これら4つのプロパティを厳密に順守する必要がありました。ただし、このモデルでは、1台のサーバーデータベースを超えて拡張する場合に問題が発生しました。この制限に対応するために、お客様はデータベースが展開されているハードウェアをスケールアップしました。

    NoSQLデータベースは、スケーラビリティの劇的な改善を達成するために、これら4つのプロパティの1つ以上を緩めました— Cloudera Operational Database(Powered by Apache HBase)はそのようなデータベースの1つでした。アトミック性についてトレードオフを行いました。具体的には、Clouderaは単一行のアトミック性を提供しました。これを補うために、非常に幅の広いテーブル(数百万の列が含まれる可能性があります)をサポートしました。これにより、顧客はスタースキーマを非正規化し、単一の行として表現して、以前は複数のテーブルとして表されていたものの単一の行でアトミックコミットを行うことができました。

    HBaseの誕生以来、NoSQLのスケーラビリティ、一貫性、耐久性、分離のメリットを維持しながら、従来のRDBMとの機能のギャップを狭める機能の構築に取り組んできました。

    今年の初めに、Apache HBase上でANSISQL、セカンダリインデックス、スタースキーマ、ビューのサポートを提供し、MySQLまたはPostGresを使用するアプリケーションを構築したことのあるすべてのアプリケーション開発者に馴染みのあるインターフェイスと機能を提供しました。

    現在、クラスター全体で行とテーブルを横断するデータにアトミックコミットを行う機能を提供しようとしています。

    アトミックトランザクションとは何ですか?

    トランザクション アトミックに管理されるデータベース内の一連の操作で構成されているため、すべての操作は完全に完了する(コミットされる)か、効果がない(中止される)必要があります。

    現在、単一行のアトミックトランザクションのみをサポートしています。つまり、開発者がClouderaの運用データベースの採用を検討する場合、スキーマについて異なる考え方をする必要があります。

    現在、複数の行とテーブルにまたがる複雑なトランザクションを持つ機能を導入しています。つまり、開発者は、ニーズに応じて、従来のスタースキーマを実装するか、幅の広い列を利用するか、またはその両方を利用できます。この柔軟性とClouderaOperationalDatabaseの進化的スキーマアプローチを組み合わせることで、開発者は既存のスキルセットを前進させながら、最新のスケールアウトデータベースを利用できます。

    注意すべき重要な点は、Cloudera Operational Databaseのトランザクションサポートは「ロックフリー」であり、スナップショットアイソレーションの保証を提供することです。従来のデータベースは、トランザクションに関連付けられたすべてのデータに「ロック」を実装しているため、データにアクセスする他のクライアントは、データベースにコミットされる前にデータを変更しません。ただし、これにより競合状態が発生し、循環依存が発生してハングする可能性があります。また、ロックは、アプリケーションがロックを取得して続行できるように相互に待機しているため、アプリケーションのパフォーマンスが大幅に低下する原因でもありました。

    私たちのアプローチでは、完了した最初のトランザクションを先に進め、同じデータセットに変更を加えようとした他のトランザクションを再試行する必要があります。これにより、データベースで同時に実行されているアプリケーションのエコシステム全体の速度低下を防ぐことができます。言い換えれば、私たちのアプローチは、従来のトランザクションデータベースが提供できるアトミック性を提供しながら、線形スケーラビリティを可能にします。

    暫定的なパフォーマンス結果

    当社のトランザクションサポート機能は現在ベータ版であり、広範なパフォーマンステストが実施されています。

    現在のテストには、OLTPベンチアプリケーションを使用した業界標準のTPC-Cベンチマークが含まれています。 TPC-Cベンチマークは、複数の倉庫で同時に行われる多数の購入をシミュレートします。 TPC-Cで使用されるスキーマは、次の実体関連図で表されます。

    エンティティブロック内の数字は、テーブルのカーディナリティ(行数)を表します。これらの数は、データベースのスケーリングを示すために、ウェアハウスの数であるWで因数分解されます。関係の矢印の横にある数字は、関係のカーディナリティ(親ごとの子の平均数)を表します。 +記号は、データベース母集団の小さなバリエーションの数を表します。

    注文を出すには、次の10個のクエリを単一のアトミックトランザクションとして実行する必要があります。

    1.SELECT c_discount,               
            c_last,
            C_credit
    FROM   customer
    WHERE  c_w_id = ?
            AND c_d_id = ?
            AND c_id = ? 
    
    2. SELECT w_tax
    FROM   warehouse
    WHERE  w_id = ?
    
    3. SELECT d_next_o_id,
            D_tax
    FROM   district
    WHERE  d_w_id = ?
            AND d_id = ?
    4. UPSERT INTO district
                (d_next_o_id,
                  d_w_id,
                  d_id)
    SELECT d_next_o_id + 1,
           d_w_id,
            D_id
    FROM   district
    WHERE  d_w_id = ?
            AND d_id = ?  
    5. UPSERT INTO new_order
                (no_o_id,
                 no_d_id,
                 no_w_id)
    VALUES (?,?,?)
    
    6. UPSERT INTO order
                (o_id,
                 o_d_id,
                 o_w_id,
                 o_c_id,
                 o_entry_d,
                 o_ol_cnt,
                 o_all_local)
    VALUES (?,?,?,?, ?,?,?)
    Repeat following queries for each item selected for order.
    
     7.   SELECT i_price,
                 i_name,
                 i_data
          FROM   item
          WHERE  i_id = ?
    
     8.   SELECT s_quantity,
                 s_data,
                 s_dist_01,
                 s_dist_02,
                 s_dist_03,
                 s_dist_04,
                 s_dist_05,
                 s_dist_06,
                 s_dist_07,
                 s_dist_08,
                 s_dist_09,
                 s_dist_10
          FROM   stock
          WHERE  s_i_id = ?
                 AND s_w_id = ?  
    
     9.   UPSERT INTO stock
                (s_quantity,
                 s_ytd,
                 s_order_cnt,
                 s_remote_cnt,
                 s_i_id,
                 s_w_id)
    SELECT ?,
           s_ytd + ?,
           s_order_cnt + 1,
           s_remote_cnt + ?,
           s_i_id,
           s_w_id
    FROM   stock
    WHERE  s_i_id = ?
           AND s_w_id = ?
    
    10.   INSERT INTO order_line
                (ol_o_id,
                 ol_d_id,
                 ol_w_id,
                 ol_number,
                 ol_i_id,
                 ol_supply_w_id,
                 ol_quantity,
                 ol_amount,
                 ol_dist_info)
    VALUES      (?,?,?,?,?,?,?,?,?)

    支払いトランザクションでは、次の6つのクエリを単一のアトミックトランザクションとして実行する必要があります。

    1. UPSERT INTO warehouse
                      (w_ytd,
                      w_id)
          SELECT w_ytd + ?,
                 w_id
          FROM   warehouse
          WHERE  w_id =?   
    2. SELECT w_street_1,
           w_street_2,
           w_city,
           w_state,
           w_zip,
           w_name
    FROM   warehouse
    WHERE  w_id = ?
    
    3. UPSERT INTO district
                      (d_ytd,
                      d_w_id,
                      d_id)
          SELECT d_ytd + ?,
                 d_w_id,
                 d_id
          FROM   district
          WHERE  d_w_id = ?
                 AND d_id = ?  
    4. SELECT d_street_1,
                 d_street_2,
                 d_city,
                 d_state,
                 d_zip,
                 d_name
          FROM   district
          WHERE  d_w_id = ?
                 AND d_id = ?  
    6. UPSERT INTO customer
                (c_balance,
                c_ytd_payment,
                c_payment_cnt,
                c_w_id,
                c_d_id,
                c_id)
    SELECT ?,
           ?,
           ?,
           c_w_id,
           c_d_id,
           c_id
    FROM   customer
    WHERE  c_w_id = ?
           AND c_d_id = ?
           AND c_id = ?  
    7. INSERT INTO history
                (h_c_d_id,
                 h_c_w_id,
                 h_c_id,
                 h_d_id,
                 h_w_id,
                 h_date,
                 h_amount,
                 h_data)
    VALUES      (?,?,?,?,?,?,?,?)  

    3つのリージョンサーバーがDellPowerEdgeR440ノードで実行されているため、次の結果を達成できました。

    このグラフのY軸は、1分あたりに完全に処理できる注文数(新規注文の作成、支払い、配信などを含む)を表し、tpm-Cベンチマークで表されます。 X軸は、トランザクションを並行して実行しているエンティティの数を表します。

    これらの予備的な結果は、システムが150〜300のトランザクションのピークトランザクションスループットに到達し、そのピークを特定するためにさらにテストが必要であることを示しています。

    この機能が成熟するにつれて、OpDBスループットとスループットを測定する機能の両方が向上します。

    結論

    ほとんどのアプリケーションは、トランザクションを活用して、企業が直面する無数のニーズをサポートします。ただし、従来のRDBMSを拡張できない場合、お客様はデータベースを手動でシャーディングし、シャーディングされた各データベースを独自の独立したデータベースとして管理する必要があります。

    これを管理するのが面倒になった場合、お客様はそのアプリケーションをClouderaの運用データベースに移行することを検討する必要があります。複雑なトランザクションサポートとANSISQLサポートおよびApacheHBaseのスケールアウトの性質を組み合わせることで、成長管理の運用上の複雑さを大幅に軽減できる組み合わせが提供されます。

    シャーディングされたデータベースの管理にうんざりしていて、データベースのTCOを下げることにうんざりしている場合は、Clouderaアカウントチームに連絡して、私たちがどのように支援できるかを確認してください。


    1. mongod forkを開始しています、エラー:子プロセスが失敗し、エラー番号1で終了しました

    2. redisデータストアのトリガーを実装するにはどうすればよいですか?

    3. MongoDBデータベースの自動化がセキュリティを向上させる方法

    4. ループ内の非同期関数の完了後に関数を呼び出す方法は?