すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ShardingSphereを使用したApsaraDB RDS for PostgreSQLの開発

最終更新日:Jan 17, 2024

ShardingSphereは、分散データベースミドルウェアソリューションのセットで構成されるオープンソースのエコシステムです。

前提条件

ApsaraDB RDSで使用されるすべてのPostgreSQLバージョンは、ShardingSphereをサポートしています。

背景情報

ShardingSphereは、徹底的に整理された論理シャーディングを備えたデータベースで実行されるサービスに適しています。 ShardingSphereは次の機能を提供します。

  • データシャーディング
    • データベースのシャーディングとテーブルのシャーディング
    • 読み書き分離
    • Sharding戦略のカスタマイズ
    • センターレス分散プライマリキー
  • 分散トランザクション
    • 統合トランザクションAPI
    • XAトランザクション
    • BASEトランザクション
  • データベースオーケストレーション
    • ダイナミック設定
    • オーケストレーションとガバナンス
    • データ暗号化
    • トレースと可视性
    • 柔軟なスケールアウト (計画)

詳細については、「ShardingSphereドキュメント」をご参照ください。

ShardingSphere製品

ShardingSphereは3つの独立した製品を含む。 ビジネス要件に最適な製品を選択できます。 次の表でこれらの製品を説明します。

カテゴリシャーディング-JDBCSharding-プロキシシャーディング-サイドカー
サポートされているデータベースエンジンMySQL、PostgreSQL、Oracle、SQL ServerなどのすべてのJDBC互換データベースエンジンMySQL および PostgreSQLMySQL および PostgreSQL
消費された接続数高い低い高い
サポートされている異種言語Java無制限無制限
パフォーマンスへの影響低い中程度低い
Centerless対応非対応対応
ステートレスAPI非対応対応非対応

設定ファイルの変更

  1. Elastic Compute Service (ECS) インスタンスで、次のコマンドを実行して、設定ファイルが保存されているディレクトリに移動します。
    cd apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin
    cd conf 
  2. llコマンドを実行して、ディレクトリに格納されているすべてのファイルを表示します。
    次のコマンド出力に似た情報が表示されます:
    合計24
    -rw-r -- r -- 1 501ゲーム3019 7月30 2019 config-encrypt.yaml
    -rw-r -- r -- 1 501ゲーム3582 Apr 22 2019 config-master_slave.yaml
    -rw-r -- r -- 1 501ゲーム4278 Apr 22 2019 config-sharding.yaml
    -rw-r -- r -- 1 501ゲーム1918 7月30 2019 server.yaml 
    説明
    • config-encrypt.yaml: データ暗号化設定ファイル。
    • config-master_slave.yaml: 読み書き分離設定ファイル。
    • config-sharding.yaml: データシャーディング設定ファイル。
    • server.yaml: 共通設定ファイル。
  3. 設定ファイルを変更します。
    説明 設定ファイルの詳細については、「ShardingSphere」をご参照ください。 このトピックでは、データシャーディング構成ファイルと共通構成ファイルを変更する方法についてのみ説明します。
    • データシャーディング構成ファイルの変更例:
      schemaName: # 論理データソースの名前。  
      
      dataSources: # データソースの設定。 data_source_name要素を使用して、複数のデータソースを設定できます。  
        <data_source_name>: # データベース接続プールを設定する必要はありません。 これは、Sharding-JDBCでは異なります。 
          url: # RDSインスタンスへの接続に使用されるURL。  
          username: # RDSインスタンスへのログインに使用されるユーザー名。  
          password: # RDSインスタンスへのログインに使用されるパスワード。  
          connectionTimeoutMillisecond: 30000# 接続タイムアウト時間 (ミリ秒単位) 。
          idleTimeoutMillisecond: 60000# アイドル接続の再利用タイムアウト期間。ミリ秒単位です。
          maxLifetimeMilliseconds: 1800000# ミリ秒単位で測定される最大接続有効時間 (TTL) 。
          maxPoolSize: 65# 許可されている接続の最大数。
      
      shardingRule: # シャーディングルールを設定する必要はありません。 シャーディングルールは、sharding-JDBCのシャーディングルールと同じです。 
    • 共通設定ファイルの変更例:
      • プロキシプロパティ
        # Sharding-JDBCで見つけることができるプロキシプロパティを構成する必要はありません。  
        
        小道具:  
          acceptor.size: # クライアントからリクエストを受信するワーカースレッドの数。 デフォルトの数は、コアの数に2を掛けたものに等しくなります。   
          proxy.transaction.type: # プロキシによって処理されるトランザクションのタイプ。 有効な値: LOCAL、XA、およびBASE。 デフォルト値: LOCAL。 値XAは、トランザクション・マネージャとしてAtomikosを使用することを指定する。 値BASEはコピーを指定します。libディレクトリへのShardingTransactionManager操作を実装するjarパッケージ。   
          proxy.opentracing.enabled: # リンクトレース機能を有効にするかどうかを指定します。 デフォルトで、この機能は無効化されています。 
          check.table.metadata.enabled: # 起動時に、シェーディングされたテーブル間のメタデータの整合性をチェックするかどうかを指定します。 デフォルト値:false 
          proxy.frontend.flush.threshold: # 複雑なクエリ中にバッチで返されるパケットの数。 
      • 権限の確認
        構成のこの部分は、Sharding-Proxyにログオンしようとするときに権限を確認するために使用されます。 ユーザー名、パスワード、および承認されたデータベースを設定したら、正しいユーザー名とパスワードを使用して、承認されたデータベースからSharding-Proxyにログインする必要があります。   
        
        認証:  
          ユーザー:  
            username: # ユーザー名。  
              password: ****# パスワード。  
            sharding: # ユーザー名。  
              password: sharding# シャーディングユーザーのパスワード。  
              authorizedSchemas: sharding_db, masterslave_db# 指定されたユーザーが権限を持つデータベース。 複数のデータベースを指定する場合は、コンマ (,) で区切ります。 デフォルトでは、rootユーザーの権限が付与されます。 つまり、すべてのデータベースにアクセスできます。 

テスト環境を設定する

  • ECSインスタンスに、Javaを実行するデータベースクライアントをインストールします。
    sodu yum install -y java
  • PostgreSQL 12を実行するRDSインスタンスを設定します。
    • ユーザー名がr1のアカウントを作成します。
    • アカウントのパスワードを「PW123321! 」に設定します。
    • 所有者がユーザーr1であるデータベースdb0、db1、db2、db3を作成します。
    • ECSインスタンスのIPアドレスをRDSインスタンスのIPアドレスホワイトリストに追加します。
    説明
  • 共通設定ファイルでviコマンドを実行します。
    vi /ホーム /apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin/conf/server.yaml
  • 次の認証例に基づいて、共通設定ファイルを設定します
    。  
      ユーザー:  
        r1:  
          パスワード: PW123321!  
          authorizedSchemas: db0、db1、db2、db3
    小道具:  
      executor.size: 16  
      sql.show: false 

水平シャーディングをテスト

  1. データシャーディング設定ファイルを変更します。
    1. viコマンドを実行して、共通設定ファイルを開きます。
      vi /home/apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin/conf/config-sharding.yaml
    2. 次の例に基づいて、共通設定ファイルを設定します。
      schemaName: sdb
      
      dataSources:
        db0:
          url: jdbc:postgresql:// pgm-bpxxxxx.pg.rds.aliyuncs.com:1433/db0
          username: r1
          パスワード: PW123321!
          connectionTimeoutMillisecond: 30000
          idleTimeoutMillisecond: 60000
          maxLifetimeMillisecond: 1800000
          maxPoolSize: 65
        db1:
          url: jdbc:postgresql:// pgm-bpxxxxx.pg.rds.aliyuncs.com:1433/db1
          username: r1
          パスワード: PW123321!
          connectionTimeoutMillisecond: 30000
          idleTimeoutMillisecond: 60000
          maxLifetimeMillisecond: 1800000
          maxPoolSize: 65
        db2:
          url: jdbc:postgresql:// pgm-bpxxxxx.pg.rds.aliyuncs.com:1433/db2
          username: r1
          パスワード: PW123321!
          connectionTimeoutMillisecond: 30000
          idleTimeoutMillisecond: 60000
          maxLifetimeMillisecond: 1800000
          maxPoolSize: 65
        db3:
          url: jdbc:postgresql:// pgm-bpxxxxx.pg.rds.aliyuncs.com:1433/db3
          username: r1
          パスワード: PW123321!
          connectionTimeoutMillisecond: 30000
          idleTimeoutMillisecond: 60000
          maxLifetimeMillisecond: 1800000
          maxPoolSize: 65
      
      shardingRule:
        テーブル:
          t_order:
            actualDataNodes: db${0 .. 3}.t_order${0 .. 7}
            databaseStrategy:
              inline:
                shardingColumn: user_id
                algorithmExpression: db${user_id % 4}
            tableStrategy:
              inline:
                shardingColumn: order_id
                algorithmExpression: t_order${order_id % 8}
            keyGenerator:
              タイプ: SNOWFLAKE
              列: order_id
          t_order_item:
            actualDataNodes: db${0 .. 3}.t_order_item${0 .. 7}
            databaseStrategy:
              inline:
                shardingColumn: user_id
                algorithmExpression: db${user_id % 4}
            tableStrategy:
              inline:
                shardingColumn: order_id
                アルゴリズム式: t_order_item${order_id % 8}
            keyGenerator:
              タイプ: SNOWFLAKE
              列: order_item_id
        bindingTables:
          -t_order,t_order_item
        defaultTableStrategy:
          none: 
  2. ShardingSphereを起動し、ポート8001を聞きます。
    cd ~/apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin /ビン /
    . /start.sh 8001 
  3. 所有者がユーザーr1であるデータベースに接続します。
    psql -h 127.0.0.1 -p 8001 -U r1 sdb
  4. テーブルを作成します。
    テーブルt_orderを作成します (order_id int8プライマリキー、user_id int8、info text、c1 int、crt_time timestamp) 。テーブルt_order_itemを作成します (order_item_id int8プライマリキー、order_id int8、user_id int8、info text、c1 int、c2 int、c3 int、c4 int、c5 int、crt_time timestamp); 
    説明 テーブルを作成すると、指定したシャーディング戦略に基づいて、特定のデータベースに水平シャードが自動的に作成されます。

その他

  • ShardingSphereで使用されているSQLの解析文とルーティング文を知りたい場合は、次の操作を実行します。
    • viコマンドを実行して、共通設定ファイルを開きます。
      vi /ホーム /apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin/conf/server.yaml
    • 次の認証例に基づいて、共通設定ファイルを設定します
      。  
        ユーザー:  
          r1:  
            パスワード: PW123321!  
            authorizedSchemas: db0、db1、db2、db3
      小道具:  
        executor.size: 16  
        sql.show: true# 解析されるSQL文をログに記録します。
  • 書き込みとクエリをテストする場合は、次のコマンドを実行します。
    • t_order (user_id、info、c1、crt_time) 値 (0、'a' 、1、now()) に挿入する例
      を記述します。insert into t_order (user_id, info, c1, crt_time) 値 (1,'b',2,now());
      insert into t_order (user_id, info, c1, crt_time) 値 (2,'c',3,now());
      insert into t_order (user_id, info, c1, crt_time) 値 (3,'c',4,now()); 
    • クエリ例1
      select * from t_order;
      サンプル結果
      のorder_id | user_id | info | c1 | crt_time
      -------------------- -------- ----------------- ----------------------------  
       433352561047633921 | 0 | a | 1 | 2020-02-09 19:48:21.856555  
       433352585668198400 | 1 | b | 2 | 2020-02-09 19:48:27.726815  
       433352610813050881 | 2 | c | 3 | 2020-02-09 19:48:33.721754  
       433352628370407424 | 3 | c | 4 | 2020-02-09 19:48:37.907683
      (4行) 
    • クエリ例2
      sdb=> select * from t_order where user_id=1;
      サンプル結果
      のorder_id | user_id | info | c1 | crt_time
      -------------------- -------- ----------------- ----------------------------  
       433352585668198400 | 1 | b | 2 | 2020-02-09 19:48:27.726815
      (1行) 
  • ShardingSphereログを表示する場合は、次のパスに移動します。
    /home/apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin/logs/stdout.log
  • pgbenchストレステストを使用する場合は、次の操作を実行します。
    1. test sqlという名前のファイルを作成し、そのファイルを開きます。
      vi test.sql
    2. 次の例に基づいてpgbenchストレステスト用のコマンドを設定します。
      \set user_id random(1,100000000)
      \set order_id random(1,2000000000)
      \set order_item_id random(1,2000000000)
      insert into t_order (user_id, order_id, info, c1, crt_time) 値 (:user_id, :order_id,random()::text, random()* 1000, now()) on conflict (order_id) do update set inf o=excluded.info,c1=excluded.c1, crt_time=excluded.crt_time;
      insert into t_order_item (order_item_id, user_id, order_id, info, c1,c2,c3,c4,c5,crt_time) 値 (:order_item_id, :user_id,:order_id,random():: テキスト, random()* 1000,random()* 1000 * ランダム, (1000) now()) on conflict(order_item_id) 何もしません。pgbench -M simple -n -r-P1-f。/test.sql -c 24 -j 24 -h 127.0.0.1 -p 8001 -U r1 sdb -T 120
      進行状況: 1.0秒、1100.9 tps、lat 21.266 ms stddev 6.349
      進行状況: 2.0秒、1253.0 tps、lat 18.779 ms stddev 7.913
      進行状況: 3.0 s、1219.0 tps、lat 20.083 ms stddev 13.212