永続性保証の設定

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

  • 受信確認ポリシー。

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

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

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

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

  • 受信確認なし。

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

  • レプリカでNO_SYNC。

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

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

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

  • マスターでSYNC。

  • レプリカでSYNC。

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

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

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

  • マスターでSYNC。

  • レプリカでNO_SYNC。

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

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

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

from nosqldb import Durability
### Constants needed for Durability
from nosqldb import ONDB_AP_NONE
from nosqldb import ONDB_AP_SIMPLE_MAJORITY
from nosqldb import ONDB_MASTER_SYNC
from nosqldb import ONDB_REPLICA_SYNC
from nosqldb import ONDB_REPLICA_ACK
from nosqldb import ONDB_SP_SYNC
from nosqldb import ONDB_SP_NO_SYNC
##      For Durability, could use one of
##      COMMIT_SYNC, COMMIT_NO_SYNC, or 
##      COMMIT_WRITE_NO_SYNC

from nosqldb import DurabilityException
from nosqldb import Factory
from nosqldb import IllegalArgumentException
from nosqldb import ProxyConfig
from nosqldb import RequestTimeoutException
from nosqldb import Row
from nosqldb import StoreConfig
from nosqldb import WriteOptions
##### Constants needed for the write options
from nosqldb import ONDB_DURABILITY
from nosqldb import ONDB_TIMEOUT

...

# locations where our store and proxy can be found
kvlite = 'localhost:5000'
proxy = 'localhost:7010'

...

# configure and open the store
def open_store():
    dg = Durability({ONDB_MASTER_SYNC : ONDB_SP_SYNC,
                     ONDB_REPLICA_SYNC : ONDB_SP_NO_SYNC,
                     ONDB_REPLICA_ACK : ONDB_AP_SIMPLE_MAJORITY})
    
    kvstoreconfig = StoreConfig('kvstore', [kvlite])
    kvstoreconfig.set_durability(dg)
    return Factory.open(proxy, kvstoreconfig) 

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

def do_store_ops(store):
    row_d = { 'item' : 'bolts',
               'description' : "Hex head, stainless",
               'count' : 5,
               'percentage' : 0.2173913}
    row = Row(row_d)

    ## Create the write options

    dur = Durability({ONDB_MASTER_SYNC : ONDB_SP_NO_SYNC,
                      ONDB_REPLICA_SYNC : ONDB_SP_NO_SYNC,
                      ONDB_REPLICA_ACK : ONDB_AP_NONE})

    wo = WriteOptions({ONDB_DURABILITY : dur,
                       ONDB_TIMEOUT : 600})
    try:
        store.put("myTable", row, wo)
        logging.debug("Store write succeeded.")
    except IllegalArgumentException, iae:
        logging.error("Could not write table.")
        logging.error(iae.message)
    except DurabilityException, de:
        logging.error("Could not write table. Durability failure.")
        logging.error(de.message)
    except RequestTimeoutException, rte:
        logging.error("Could not write table. Exceeded timeout.")
        logging.error(rte.message)