永続性保証の設定

永続性保証を設定するには、Durabilityクラスを使用します。これを行う場合、3つの情報を指定する必要があります。

  • 受信確認ポリシー。

  • マスター・ノードの同期ポリシー。

  • レプリカ・ノードの同期ポリシー。

使用するポリシーの組合せは、データが失われる可能性をアプリケーションでどの程度許容できるか、および書込みのパフォーマンス要件によって決まります。

たとえば、書込みパフォーマンスが最大限によくなるのは、次の永続性ポリシーによる場合です。

  • 受信確認なし。

  • マスター・ノードでNO_SYNC。

  • レプリカでNO_SYNC。

ただし、この永続性ポリシーでは、操作からの復帰と永続的ストレージへのデータの書込みの間にアプリケーションまたはマシンの障害によってデータが失われるリスクが最も高くなります。

一方、永続性保証を最も高くする場合、次のものを使用します。

  • すべてのレプリカが書込み操作を受信確認する必要があります。

  • マスターでSYNC。

  • レプリカでSYNC。

当然、これによって、書込みパフォーマンスは最も悪くなります。

通常、永続性ポリシーでは、書込みパフォーマンスとデータ永続性保証との間でバランスをとります。次に例を示します。

  • 過半数(> 50%)のレプリカで書込みを受信確認する必要があります。

  • マスターでSYNC。

  • レプリカでNO_SYNC。

Storeハンドルにデフォルト永続性ポリシーを設定できますが、データにデフォルトの永続性が必要ない場合(またはデフォルト以上の永続性が必要な場合)、各操作ベースでポリシーをオーバーライドすることもできることに注意してください。

たとえば、ほとんどのデータに必要なのは中程度の永続性ポリシーで、一部のデータは永続性がそれほど重要でない一時的なデータか、簡単に再作成できるデータだとします。その場合、次のようにします。

まず、Storeハンドルにデフォルト永続性ポリシーを設定します。

var nosqldb = require('nosqldb-oraclejs');

// Create a configuration object
var configuration = new nosqldb.Configuration();
configuration.proxy.startProxy = false;
configuration.proxy.host = 'localhost:7010';
configuration.storeHelperHosts = ['localhost:5000'];
configuration.storeName = 'kvstore';
configuration.defaultDurability =
    new nosqldb.Types.Durability(
         nosqldb.Types.SyncPolicy.SYNC, //Master sync
         nosqldb.Types.ReplicaAckPolicy.SIMPLE_MAJORITY, //Ack policy
         nosqldb.Types.SyncPolicy.NO_SYNC); //Replica sync

// Open the store with the specified configuration
var store = nosqldb.createStore(configuration); 

コードの別の箇所で、通常以外の書込み操作の永続性保証を緩和し、それらの特定の書込み操作のパフォーマンスを向上させます。

store.on('open', function () {
   console.log('Store opened');

   var row = {item: "Bolts",
              description: "Hex head, stainless",
              count: 5,
              percentage: 0.2173913};

    var durability = new nosqldb.Types.Durability(
                       nosqldb.Types.SyncPolicy.NO_SYNC,
                       nosqldb.Types.ReplicaAckPolicy.NONE,
                       nosqldb.Types.SyncPolicy.NO_SYNC);

    var writeOptions = new nosqldb.Types.WriteOptions(
                                    durability, 
                                    1000);

   store.put('myTable', row, writeOptions,
           function (err) {
                if (err)
                    throw err;
                else {
                    console.log("Row inserted.");
                    store.close();
                }
           });
}).on('close', function() {
    console.log('Store closed.');
}).on('error', function(error) {
    console.log(error);
});
store.open();