アービタ・ノードが有効なトポロジのデプロイ

アービタ・ノードは、ストア・レプリケーション係数が2で、単一のレプリケーション・ノードが使用不能になった場合に、書込み可用性をサポートするサービスです。アービタ・ノードの役割は、シャード内の2つのレプリケーション・ノードのいずれかが使用不能になった場合に、選択に参加し、受信確認リクエストに応答することです。

ストア・レプリケーション係数が2で、プライマリ・ゾーンがアービタ・ノードをホストするように構成されている場合、トポロジ内にアービタ・ノードが自動的に構成されます。

たとえば、あるストアが、プライマリ・ゾーンのマンハッタンと、同じシャード内にデプロイされている2つのストレージ・ノードで構成されているとします。この例では、シャード内の2つのレプリケーション・ノードのいずれかが使用不能になった場合でも書込み可用性を確保するために、3番目のストレージ・ノード(容量= 0)にアービタ・ノードがデプロイされています。

ノート:

Durability.ReplicaAckPolicyをSIMPLE_MAJORITYに設定して、シャード内のレプリケーション・ノードが使用不能になった場合に書込みが正常に行われるようにする必要があります。ReplicaAckPolicyの詳細は、このJavadocページを参照してください。

  1. ストアを作成、開始および構成します。アービタ・ノードをホストする、容量がゼロのストレージ・ノードがデプロイされることに注意してください。

    • ストアを作成します。

      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_MAX1に設定します。こうすることで、メモリー使用量が指定されたヒープ・サイズに制限されます。

      java -Xmx64m -Xms64m -jar KVHOME/lib/kvstore.jar \
      start -root KVROOT &  
  2. 次のスクリプト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 ###  
  3. トポロジを作成し、プレビューしてからデプロイします。

    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  
  4. アービタ・ノードが稼働していることを確認してください。

    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
    ...  
  5. ここで、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がリストアされると、書き込まれたデータがすべて移行されます。

  6. アービタ・ノードを利用してストアに書き込むことができることをテストします。たとえば、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}