永続性保証を設定するには、Durability
クラスを使用します。これを行う場合、3つの情報を指定する必要があります。
受信確認ポリシー。
マスター・ノードの同期ポリシー。
レプリカ・ノードの同期ポリシー。
使用するポリシーの組合せは、データが失われる可能性をアプリケーションでどの程度許容できるか、および書込みのパフォーマンス要件によって決まります。
たとえば、書込みパフォーマンスが最大限によくなるのは、次の永続性ポリシーによる場合です。
受信確認なし。
マスター・ノードでNO_SYNC。
レプリカでNO_SYNC。
ただし、この永続性ポリシーでは、操作からの復帰と永続的ストレージへのデータの書込みの間にアプリケーションまたはマシンの障害によってデータが失われるリスクが最も高くなります。
一方、永続性保証を最も高くする場合、次のものを使用します。
すべてのレプリカが書込み操作を受信確認する必要があります。
マスターでSYNC。
レプリカでSYNC。
当然、これによって、書込みパフォーマンスは最も悪くなります。
通常、永続性ポリシーでは、書込みパフォーマンスとデータ永続性保証との間でバランスをとります。次に例を示します。
過半数のレプリカが書込みを受信確認する必要があります。
マスターでSYNC。
レプリカでNO_SYNC。
KVStore
ハンドルにデフォルト永続性ポリシーを設定できますが、データにデフォルトの永続性が必要ない場合(またはデフォルト以上の永続性が必要な場合)、各操作ベースでポリシーをオーバーライドすることもできることに注意してください。
たとえば、ほとんどのデータに必要なのは中程度の永続性ポリシーで、一部のデータは永続性がそれほど重要でない一時的なデータか、簡単に再作成できるデータだとします。その場合、次のようにします。
まず、KVStore
ハンドルにデフォルト永続性ポリシーを設定します。
package kvstore.basicExample; import oracle.kv.Durability; import oracle.kv.KVStore; import oracle.kv.KVStoreConfig; import oracle.kv.KVStoreFactory; ... KVStoreConfig kconfig = new KVStoreConfig("exampleStore", "node1.example.org:5088, node2.example.org:4129"); Durability defaultDurability = new Durability(Durability.SyncPolicy.SYNC, // Master sync Durability.SyncPolicy.NO_SYNC, // Replica sync Durability.ReplicaAckPolicy.SIMPLE_MAJORITY); kconfig.setDurability(defaultDurability); KVStore kvstore = KVStoreFactory.getStore(kconfig);
コードの別の箇所で、通常以外の書込み操作の永続性保証を緩和し、それらの特定の書込み操作のパフォーマンスを向上させます。
package kvstore.basicExample; ... import oracle.kv.Durability; import oracle.kv.DurabilityException; import oracle.kv.Key; import oracle.kv.RequestTimeoutException; import oracle.kv.Value; import java.util.ArrayList; import org.apache.avro.Schema; import oracle.kv.avro.GenericAvroBinding; import oracle.kv.avro.GenericRecord; ... ArrayList<String> majorComponents = new ArrayList<String>(); ... // Define the major and minor path components for the key majorComponents.add("Smith"); majorComponents.add("Bob"); // Create the key Key myKey = Key.createKey(majorComponents); ... // Binding and schema creation omitted ... final GenericRecord person = new GenericData.Record(personSchema); person.put("ID", 100011); person.put("FamiliarName", "Bob"); person.put("Surname", "Smith"); person.put("PrimaryPhone", "408 555 5555"); Value myValue = binding.toValue(person); // Create the special durability policy Durability durability = new Durability(Durability.SyncPolicy.NO_SYNC, // Master sync Durability.SyncPolicy.NO_SYNC, // Replica sync Durability.ReplicaAckPolicy.NONE); // Now put the record. Note that we do not show the creation of the // kvstore handle here. try { kvstore.put(myKey, myValue, null, // ReturnValueVersion is null because // we aren't using it. durability, // The per-operation durability 0, // Use the default request timeout null); // Use the default timeunit value } catch (DurabilityException de) { // The durability guarantee was not met } catch (RequestTimeoutException re) { // The operation was not completed within the // timeout value }