OBKV-Tableは弱い整合性読み取りと最寄りデータセンターからの読み取り機能をサポートしています。このドキュメントでは、弱い整合性読み取りと最寄りデータセンターからの読み取りの仕組み、対応バージョン、ルーティングポリシー、使用方法について説明します。
従来の強い整合性読み取りでは、同時実行数が多い場合や低レイテンシが求められる場合に、性能がボトルネックになることがあります。OBKV-Tableは、弱い整合性読み取り(Weak Read)と最寄りデータセンターからの読み取り(Near Read)を提供し、データ整合性とアクセス効率のバランスを調整できるようにしています。
原理
データベースを複数のデータセンター(例えば北京、上海、広州)にデプロイし、データのレプリカを配置した構成を考えます。
従来の強い整合性読み取りモードでは、クライアントは読み取りを行う際にリーダーレプリカ(Leader)を優先的に選択します。これにより、次の2つの問題が生じます:
- リーダーの負荷が高くなり、パフォーマンスのボトルネックになりやすいです。また、リーダーに障害が発生した場合、そのデータセンター全体が使用不能になります。
- 広州や上海のユーザーがデータを読み取る際にも、北京のデータセンターを経由するため、ネットワーク遅延が増加します。
この問題を解決するために、弱い整合性読み取りと最寄りデータセンターからの読み取りの方式を導入しました:
- 弱い整合性読み取り:フォロアーレプリカなど、リーダーレプリカ以外からもデータを読み取ります。読み取るデータへの更新の反映には多少の遅れが生じますが、読み取り性能と可用性を高められます。
- 最寄りデータセンターからの読み取り:クライアントは、自身の地理的位置またはネットワーク距離が最も近いデータセンターのレプリカを優先的に選択してデータを読み取り、ネットワーク遅延を低減し、アクセス速度とユーザーエクスペリエンスを向上させます。
サポートされているバージョン
この機能を使用するには、OceanBaseクラスタ、ODP、およびOBKV-Table Javaクライアントのバージョン要件を満たす必要があります。
コンポーネント |
サポートバージョン |
|---|---|
| ObServer | 4.4.2.0以降 |
| ODP | 4.3.6.2 |
| OBKV-Table | 2.3.0 |
直接接続モードの使用手順
ステップ1:OceanBaseクラスタのIDCを設定する
root@sysでOceanBaseクラスタにログインし、以下の手順でOceanBaseクラスタのデータセンター情報を設定します。クラスタには3つのZoneが含まれ、各Zoneに1つのOBServerノードがあると仮定します。例では、各ZoneのIPアドレスはそれぞれ10.0.0.1、10.0.0.2、10.0.0.3です。
z1のリージョンを設定します。REGIONパラメータはZoneが属する地域情報を指定するために使用されます。都市名の使用を推奨します(大文字小文字を区別します)。ALTER SYSTEM MODIFY ZONE "z1" SET REGION = "SHANGHAI";z1のデータセンターを設定します。IDCパラメータはZoneが属するデータセンター情報を指定するために使用されます。データセンター名の使用を推奨します(小文字のみ使用)。ALTER SYSTEM MODIFY ZONE "z1" SET IDC = "zue";
完了後のクラスタのデプロイ状況は次の表のとおりです:
OBServerノードIPアドレス |
Zone |
IDC |
Region |
|---|---|---|---|
| 10.0.0.1 | z1 | zue | SHANGHAI |
| 10.0.0.2 | z2 | xue | SHANGHAI |
| 10.0.0.3 | z3 | yue | HANGZHOU |
ステップ2:クライアントの弱い整合性読み取りパラメータを設定する
インターフェースとパラメータの説明
インターフェース |
パラメータ説明 |
大小文字区別 |
値の範囲 |
機能説明 |
|---|---|---|---|---|
| public void setReadConsistency(ObReadConsistency readConsistency) | readConsistency:整合性レベル | いいえ |
|
弱い整合性読み取りを有効にするかどうかを制御する整合性レベル。
|
| public void setCurrentIDC(String idc) | idc:クライアントの所在地のデータセンター名 | いいえ | 実際のデータセンター名 | クライアントが存在するデータセンター名。
|
| public void setRoutePolicy(ObRoutePolicy policy) | policy:ルーティングポリシー | いいえ |
|
ルーティングポリシー。
|
OBKV-Tableでは、クライアント全体に適用するグローバルパラメータと、個々の操作に適用するステートメントレベルのパラメータを設定できます。ステートメントレベルの設定がグローバル設定より優先されます。以下に設定例を示します。
ObTableClientで弱い整合性読み取りのグローバルパラメータを設定する
以下の例は、ObTableClientで弱い整合性読み取り関連のパラメータを設定する方法を示しています。一貫性レベルをObReadConsistency.WEAKに設定し、クライアントの現在のデータセンターを「idc1」と指定し、ObRoutePolicy.FOLLOWER_FIRSTルーティングポリシーを選択します。設定完了後、クエリ操作は「idc1」データセンターのフォロアーレプリカに優先的にルーティングされ、パフォーマンス向上と遅延低減が実現されます。
ObTableClient client = new ObTableClient();
... // その他の接続パラメータの設定
client.setCurrentIDC("idc1");
client.setReadConsistency(ObReadConsistency.WEAK);
client.setRoutePolicy(ObRoutePolicy.FOLLOWER_FIRST);
client.init();
クエリでステートメントレベルの弱い整合性読み取りパラメータを設定する
例では、ObTableClientでクライアントの現在のIDCを「idc1」に設定し、ルーティングポリシーをObRoutePolicy.FOLLOWER_FIRSTに設定します。また、get操作で一貫性レベルをObReadConsistency.WEAKに設定します。これにより、get操作時には「idc1」IDCのフォロアーレプリカに優先的にルーティングされます。
ObTableClient client = new ObTableClient();
... // その他の接続パラメータの設定
client.setCurrentIDC("idc1"); // 現在のIDCを設定
client.setRoutePolicy(ObRoutePolicy.FOLLOWER_FIRST); // ルーティングポリシーを設定
client.init();
String tableName = "test";
String rowkey = "key";
Map<String, Object> result = client.get(tableName).setRowKey(row(colVal("c1", rowkey)))
.setReadConsistency(ObReadConsistency.WEAK) // 弱い整合性読み取りを設定
.select("c2").execute();
例では、ObTableClient のクライアントの現在のデータセンターを "idc1" に設定し、ルーティングポリシーを ObRoutePolicy.FOLLOWER_FIRST に設定します。また、BatchOperation インターフェースで一貫性レベルを ObReadConsistency.WEAK に設定します。これにより、バッチ get 操作を実行する際には、"idc1" データセンターのフォロアーレプリカに優先的にルーティングされます。
ObTableClient client = new ObTableClient();
... // その他の接続パラメータの設定
client.setCurrentIDC("idc1"); // 現在のIDCを設定
client.setRoutePolicy(ObRoutePolicy.FOLLOWER_FIRST); // ルーティングポリシーを設定
client.init();
String tableName = "test";
String rowkey1 = "key1";
String rowkey2 = "key2";
BatchOperation batch = client.batchOperation(tableName);
batch.setReadConsistency(ObReadConsistency.WEAK); // 弱い整合性読み取りを設定します。注意:同一バッチ内のget操作では、すべてについて弱い整合性読み取りを設定する必要があります。部分的な設定はサポートされません。
Get get1 = client.get(tableName).setRowKey(row(colVal("c1", rowkey1)))
.select("c2");
Get get2 = client.get(tableName).setRowKey(row(colVal("c1", rowkey2)))
.select("c2");
batch.addOperation(get1, get2);
BatchOperationResult res = batch.execute();
例では、ObTableClient でクライアントの現在のデータセンターを "idc1"、ルーティングポリシーを ObRoutePolicy.FOLLOWER_FIRST に設定します。また、query操作で一貫性レベルを ObReadConsistency.WEAK に設定します。これにより、query操作を実行する際には、"idc1" データセンターのフォロアーレプリカに優先的にルーティングされます。
ObTableClient client = new ObTableClient();
... // その他の接続パラメータの設定
client.setCurrentIDC("idc1"); // 現在のIDCを設定
client.setRoutePolicy(ObRoutePolicy.FOLLOWER_FIRST); // ルーティングポリシーを設定
client.init();
String tableName = "test";
String startRowkey = "key1";
String endRowkey = "key5";
QueryResultSet res = client.query(tableName)
.addScanRange(new Object[] { startRowkey }, new Object[] { endRowkey })
.setScanRangeColumns("c1")
.setReadConsistency(ObReadConsistency.WEAK)
.select("c2")
.execute();
while (res.next()) {
Map<String, Object> valueMap = res.getRow();
System.out.println(valueMap.get("c2"));
}
ODPモードの使用手順
ステップ1:OceanBaseクラスタのIDCを設定する
root@sys でOceanBaseクラスタにログインし、以下の手順でクラスタのデータセンターとリージョン情報を設定します。クラスタが3つのZoneを含み、各Zoneに1つのOBServerノードがある場合を想定し、以下ではz1の設定を例に示します。
z1のリージョンを設定します。
REGIONパラメータはZoneが属する地域情報を指定するために使用され、都市名(大文字小文字を区別)に設定することを推奨します。ALTER SYSTEM MODIFY ZONE "z1" SET REGION = "SHANGHAI";z1のデータセンターを設定します。
IDCパラメータはZoneが属するデータセンター情報を指定するために使用され、データセンターの実際の名前(小文字)に設定することを推奨します。ALTER SYSTEM MODIFY ZONE "z1" SET IDC = "zue";
完了後、クラスタのデプロイメント情報は次の表のとおりです:
OBServerノードIPアドレス |
Zone |
IDC |
Region |
|---|---|---|---|
| 10.0.0.1 | z1 | zue | SHANGHAI |
| 10.0.0.2 | z2 | xue | SHANGHAI |
| 10.0.0.3 | z3 | yue | HANGZHOU |
ステップ2:ODPの弱い整合性読み取りパラメータを設定する
proxy_idc_nameパラメータを設定することで、ODPがLDC体系内で属するデータセンターを指定できます。実際のデプロイメントに合わせて、弱い整合性読み取りトラフィックを対応するデータセンターのレプリカにより適切にルーティングできます。例えば、すべての弱い整合性読み取りリクエストを優先的にz1があるデータセンターにルーティングする場合、以下の設定を参照できます:ALTER PROXYCONFIG SET proxy_idc_name = 'zue';proxy_route_policyパラメータを設定することで、レプリカのルーティングポリシーをさらに指定できます。以下の例は、Followerレプリカの読み取りを優先するものです:ALTER PROXYCONFIG SET proxy_route_policy = 'follower_first';
ステップ3:クライアントの弱い整合性読み取りパラメータを設定する
「直接接続モードの使用手順」の「ステップ2:クライアントの弱い整合性読み取りパラメータを設定する」の例を参照してください。