ShardingSphereは、分散データベースミドルウェアソリューションのセットで構成されるオープンソースのエコシステムです。
前提条件
ApsaraDB RDSで使用されるすべてのPostgreSQLバージョンは、ShardingSphereをサポートしています。背景情報
ShardingSphereは、徹底的に整理された論理シャーディングを備えたデータベースで実行されるサービスに適しています。 ShardingSphereは次の機能を提供します。
- データシャーディング
- データベースのシャーディングとテーブルのシャーディング
- 読み書き分離
- Sharding戦略のカスタマイズ
- センターレス分散プライマリキー
- 分散トランザクション
- 統合トランザクションAPI
- XAトランザクション
- BASEトランザクション
- データベースオーケストレーション
- ダイナミック設定
- オーケストレーションとガバナンス
- データ暗号化
- トレースと可视性
- 柔軟なスケールアウト (計画)
詳細については、「ShardingSphereドキュメント」をご参照ください。
ShardingSphere製品
ShardingSphereは3つの独立した製品を含む。 ビジネス要件に最適な製品を選択できます。 次の表でこれらの製品を説明します。
| カテゴリ | シャーディング-JDBC | Sharding-プロキシ | シャーディング-サイドカー |
| サポートされているデータベースエンジン | MySQL、PostgreSQL、Oracle、SQL ServerなどのすべてのJDBC互換データベースエンジン | MySQL および PostgreSQL | MySQL および PostgreSQL |
| 消費された接続数 | 高い | 低い | 高い |
| サポートされている異種言語 | Java | 無制限 | 無制限 |
| パフォーマンスへの影響 | 低い | 中程度 | 低い |
| Centerless | 対応 | 非対応 | 対応 |
| ステートレスAPI | 非対応 | 対応 | 非対応 |
設定ファイルの変更
- Elastic Compute Service (ECS) インスタンスで、次のコマンドを実行して、設定ファイルが保存されているディレクトリに移動します。
cd apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin cd conf - 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: 共通設定ファイル。
- 設定ファイルを変更します。 説明 設定ファイルの詳細については、「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アドレスホワイトリストに追加します。
説明- ApsaraDB RDS For PostgreSQLインスタンス、データベース、およびアカウントの作成方法の詳細については、「快適なApsaraDB RDS for PostgreSQLインスタンスの作成」および「ApsaraDB RDS for PostgreSQLインスタンスでのデータベースとアカウントの作成」をご参照ください。
- IPアドレスホワイトリストの設定方法の詳細については、「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
水平シャーディングをテスト
- データシャーディング設定ファイルを変更します。
- viコマンドを実行して、共通設定ファイルを開きます。
vi /home/apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin/conf/config-sharding.yaml - 次の例に基づいて、共通設定ファイルを設定します。
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:
- viコマンドを実行して、共通設定ファイルを開きます。
- ShardingSphereを起動し、ポート8001を聞きます。
cd ~/apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin /ビン / . /start.sh 8001 - 所有者がユーザーr1であるデータベースに接続します。
psql -h 127.0.0.1 -p 8001 -U r1 sdb - テーブルを作成します。
テーブル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文をログに記録します。
- viコマンドを実行して、共通設定ファイルを開きます。
- 書き込みとクエリをテストする場合は、次のコマンドを実行します。
- 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行)
- t_order (user_id、info、c1、crt_time) 値 (0、'a' 、1、now()) に挿入する例
- ShardingSphereログを表示する場合は、次のパスに移動します。
/home/apache-shardingsphere-incubating-4.0.0-sharding-proxy-bin/logs/stdout.log - pgbenchストレステストを使用する場合は、次の操作を実行します。
- test sqlという名前のファイルを作成し、そのファイルを開きます。
vi test.sql - 次の例に基づいて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
- test sqlという名前のファイルを作成し、そのファイルを開きます。