アービタ・ノードが有効なトポロジのデプロイ
アービタ・ノード
は、ストア・レプリケーション係数が2で、単一のレプリケーション・ノードが使用不能になった場合に、書込み可用性をサポートするサービスです。アービタ・ノード
の役割は、シャード内の2つのレプリケーション・ノードのいずれかが使用不能になった場合に、選択に参加し、受信確認リクエストに応答することです。
ストア・レプリケーション係数が2で、プライマリ・ゾーンがアービタ・ノード
をホストするように構成されている場合、トポロジ内にアービタ・ノードが自動的に構成されます。
たとえば、あるストアが、プライマリ・ゾーンのマンハッタンと、同じシャード内にデプロイされている2つのストレージ・ノードで構成されているとします。この例では、シャード内の2つのレプリケーション・ノードのいずれかが使用不能になった場合でも書込み可用性を確保するために、3番目のストレージ・ノード(容量= 0)にアービタ・ノードがデプロイされています。
ノート:
Durability.ReplicaAckPolicyをSIMPLE_MAJORITYに設定して、シャード内のレプリケーション・ノードが使用不能になった場合に書込みが正常に行われるようにする必要があります。ReplicaAckPolicy
の詳細は、このJavadocページを参照してください。
-
ストアを作成、開始および構成します。アービタ・ノードをホストする、容量がゼロのストレージ・ノードがデプロイされることに注意してください。
-
ストアを作成します。
java -Xmx64m -Xms64m \ -jar kv/lib/kvstore.jar makebootconfig \ -root KVROOT \ -host node01 \ -port 8000 \ -harange 8010,8020 \ -capacity 1 java -Xmx64m -Xms64m \ -jar kv/lib/kvstore.jar makebootconfig \ -root KVROOT \ -host node02 \ -port 9000 \ -harange 9010,9020 \ -capacity 1 java -Xmx64m -Xms64m \ -jar kv/lib/kvstore.jar makebootconfig \ -root KVROOT \ -host node03 \ -port 10000 \ -harange 1000,10020 \ -capacity 0 \
-
セキュリティ・ディレクトリを作成してコピーします。
java -Xmx64m -Xms64m \ -jar kv/lib/kvstore.jar securityconfig \ config create -root KVROOT -kspwd password Created files KVROOT/security/security.xml KVROOT/security/store.keys KVROOT/security/store.trust KVROOT/security/client.trust KVROOT/security/client.security KVROOT/security/store.passwd (Generated in CE version) KVROOT/security/store.wallet/cwallet.sso (Generated in EE version) Created scp -r KVROOT/security node02:KVROOT/ scp -r KVROOT/security node03:KVROOT/
-
各ストレージ・ノードで次のコマンドを実行して、ストアを起動します。
ノート:
SNAを開始する前に、各ノードで環境変数
MALLOC_ARENA_MAX
を1
に設定します。こうすることで、メモリー使用量が指定されたヒープ・サイズに制限されます。java -Xmx64m -Xms64m -jar KVHOME/lib/kvstore.jar \ start -root KVROOT &
-
-
次のスクリプト
conf.txt
をロードして、ゾーン、管理およびストレージ・ノードをデプロイします。アービタ・ノードをホストするには、ゾーンがプライマリで、-arbiters
フラグが設定されている必要があります。ssh node01 java -Xmx64m -Xms64m -jar KVHOME/lib/kvstore.jar runadmin \ -port 8000 -host node01 load -file conf.txt \ -security KVROOT/security/client.security
ファイル
conf.txt
には次のような内容が含まれます。### Begin Script ### plan deploy-zone -name "Manhattan" -type primary -arbiters -rf 2 -wait plan deploy-sn -zn zn1 -host node01 -port 8000 -wait pool create -name SNs pool join -name SNs -sn sn1 plan deploy-admin -sn sn1 -port 8001 -wait plan deploy-sn -zn zn1 -host node02 -port 9000 -wait pool join -name SNs -sn sn2 plan deploy-sn -zn zn1 -host node03 -port 10000 -wait pool join -name SNs -sn sn3 ### End Script ###
-
トポロジを作成し、プレビューしてからデプロイします。
kv-> topology create -name arbTopo -pool SNs -partitions 300 Created: arbTopo
kv-> topology preview -name arbTopo Topology transformation from current deployed topology to arbTopo: Create 1 shard Create 2 RNs Create 300 partitions Create 1 AN shard rg1 2 new RNs : rg1-rn1 rg1-rn2 1 new AN : rg1-an1 300 new partitions
kv-> plan deploy-topology -name arbTopo -wait Executed plan 6, waiting for completion... Plan 6 ended successfully
-
アービタ・ノードが稼働していることを確認してください。
kv-> verify configuration Verify: starting verification of store mystore based upon topology sequence #308 300 partitions and 3 storage nodes Time: 2018-09-28 06:57:10 UTC Version: 18.3.2 See node01:KVROOT/mystore/log/mystore_{0..N}.log for progress messages Verify: Shard Status: healthy:1 writable-degraded:0 read-only:0 offline:0 Verify: Admin Status: healthy Verify: Zone [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] RN Status: online:2 offline:0 maxDelayMillis:6 maxCatchupTimeSecs:0 Verify: == checking storage node sn1 == Verify: Storage Node [sn1] on node01:8000 Zone: [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] Status: RUNNING Ver: 18.3.2 2018-09-17 09:33:45 UTC Build id: a72484b8b33c Verify: Admin [admin1] Status: RUNNING,MASTER Verify: Rep Node [rg1-rn1] Status: RUNNING,MASTER sequenceNumber:635 haPort:8011 available storage size:11 GB Verify: == checking storage node sn2 == Verify: Storage Node [sn2] on node02:9000 Zone: [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] Status: RUNNING Ver: 18.3.2 2018-09-17 09:33:45 UTC Build id: a72484b8b33c Verify: Rep Node [rg1-rn2] Status: RUNNING,REPLICA sequenceNumber:635 haPort:9010 available storage size:12 GB delayMillis:6 catchupTimeSecs:0 Verify: == checking storage node sn3 == Verify: Storage Node [sn3] on node03:10000 Zone: [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] Status: RUNNING Ver: 18.3.2 2018-09-17 09:33:45 UTC Build id: a72484b8b33c Verify: Arb Node [rg1-an1] Status: RUNNING,REPLICA sequenceNumber:0 haPort:node03:10010 ...
-
ここで、node02に到達できないとします。
verify configuration
を使用して、これを検証します。kv-> verify configuration Verify: starting verification of store mystore based upon topology sequence #308 300 partitions and 3 storage nodes Time: 2018-09-28 06:57:10 UTC Version: 18.3.2 See node01:KVROOT/mystore/log/mystore_{0..N}.log for progress messages Verify: Shard Status: healthy:0 writable-degraded:1 read-only:0 offline:0 Verify: Admin Status: healthy Verify: Zone [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] RN Status: online:1 offline:1 Verify: == checking storage node sn1 == Verify: Storage Node [sn1] on node01:8000 Zone: [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] Status: RUNNING Ver: 18.3.2 2018-09-17 09:33:45 UTC Build id: a72484b8b33c Verify: Admin [admin1] Status: RUNNING,MASTER Verify: Rep Node [rg1-rn1] Status: RUNNING,MASTER sequenceNumber:901 haPort:8011 available storage size:12 GB Verify: == checking storage node sn2 == Verify: sn2: ping() failed for sn2 : Unable to connect to the storage node agent at host node02, port 9000, which may not be running; nested exception is: java.rmi.ConnectException: Connection refused to host: node02; nested exception is: java.net.ConnectException: Connection refused Verify: Storage Node [sn2] on node02:9000 Zone: [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] UNREACHABLE Verify: rg1-rn2: ping() failed for rg1-rn2 : Unable to connect to the storage node agent at host node02, port 9000, which may not be running; nested exception is: java.rmi.ConnectException: Connection refused to host: node02; nested exception is: java.net.ConnectException: Connection refused Verify: Rep Node [rg1-rn2] Status: UNREACHABLE Verify: == checking storage node sn3 == Verify: Storage Node [sn3] on node03:10000 Zone: [name=Manhattan id=zn1 type=PRIMARY allowArbiters=true masterAffinity=false] Status: RUNNING Ver: 18.3.2 2018-09-17 09:33:45 UTC Build id: a72484b8b33c Verify: Arb Node [rg1-an1] Status: RUNNING,REPLICA sequenceNumber:901 haPort:node03:10010 available storage size:16 GB delayMillis:? catchupTimeSecs:? Verification complete, 3 violations, 0 notes found. Verification violation: [rg1-rn2] ping() failed for rg1-rn2 : Unable to connect to the storage node agent at host node02, port 9000, which may not be running; nested exception is: java.rmi.ConnectException: Connection refused to host: node02; nested exception is: java.net.ConnectException: Connection refused Verification violation: [sn2] ping() failed for sn2 : Unable to connect to the storage node agent at host node02, port 9000, which may not be running; nested exception is: java.rmi.ConnectException: Connection refused to host: node02; nested exception is: java.net.ConnectException: Connection refused ...
この場合、アービタ・ノードが書込み可用性をサポートするため、node02の修復中または置換中でも書込み操作を実行できます。node02がリストアされると、書き込まれたデータがすべて移行されます。
-
アービタ・ノードを利用してストアに書き込むことができることをテストします。たとえば、Oracle NoSQL Databaseシェル・ユーティリティ(次の例を参照)を使用して、スクリプト・ファイル
test.kvsql
(test.kvsqlについては次を参照)を実行します。これを行うには、問合せシェルでload
コマンドを使用します。> java -jar KVHOME/lib/sql.jar -helper-hosts node01:8000 \ -store mystore -security USER/security/admin.security kvsql-> load -file ./test.kvsql Statement completed successfully. Statement completed successfully. Loaded 3 rows to users.
ノート:
Enterprise Edition (EE)インストールの場合は、kvstore-ee.jarがクラスパスに追加されていることを確認します。
次のコマンドが
test.kvsql
で収集されます。### Begin Script ### load -file test.ddl import -table users -file users.json ### End Script ###
ファイル
test.ddl
には、次のような内容が含まれます。DROP TABLE IF EXISTS users; CREATE TABLE users(id INTEGER, firstname STRING, lastname STRING, age INTEGER, primary key (id));
ファイル
users.json
には、次のような内容が含まれます。{"id":1,"firstname":"Dean","lastname":"Morrison","age":51} {"id":2,"firstname":"Idona","lastname":"Roman","age":36} {"id":3,"firstname":"Bruno","lastname":"Nunez","age":49}