I’ve created a small project to demonstrate issues I’ve had with Cassandra
write behind configuration: https://github.com/cgenrich/ignite-cassandra
My intention is to use a partitioned ignite cache that will persist
asynchronously to Cassandra. When using a single node cluster, the data is
sent to Cassandra as expected.
I’d appreciate any suggested changes to the configuration:
DataSource ds = new DataSource();
ds.setPort(9042);
ds.setContactPoints("localhost");
ds.setReconnectionPolicy(new ConstantReconnectionPolicy(1000));
ds.setAuthProvider(new PlainTextAuthProvider(null, null));
ds.setReadConsistency("ONE");
ds.setWriteConsistency("ONE");
ds.setLoadBalancingPolicy(new TokenAwarePolicy(new
RoundRobinPolicy()));
Ignition.getOrStart(localCluster(new IgniteConfiguration()))
.getOrCreateCache(new
CacheConfiguration<>(WRITEBEHIND).setCacheMode(CacheMode.PARTITIONED)
.setExpiryPolicyFactory(TouchedExpiryPolicy.factoryOf(Duration.ONE_HOUR))
.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC).setBackups(1)
.setReadThrough(false).setWriteThrough(true).setWriteBehindEnabled(true)
.setWriteBehindFlushFrequency(100).setCopyOnRead(false).setCacheStoreFactory(
new
CassandraCacheStoreFactory<>().setDataSource(ds).setPersistenceSettings(
new
KeyValuePersistenceSettings(new ClassPathResource("cassandra.xml")))));
<?xml version="1.0" encoding="UTF-8"?>
<persistence keyspace="ks" table="tbl">
<keyPersistence class="com.example.ignite.cassandra.CompositeKey"
strategy="POJO">
<partitionKey>
<field name="first" column="first" />
</partitionKey>
<clusterKey>
<field name="first" column="first" />
<field name="second" column="second" />
</clusterKey>
</keyPersistence>
<valuePersistence class="com.example.ignite.cassandra.CompositeValue"
strategy="POJO">
<field name="third" column="third" />
<field name="fourth" column="fourth" />
<field name="fifth" column="fifth" />
<field name="sixth" column="sixth" />
<field name="seventh" column="seventh" />
<field name="eighth" column="eighth" />
</valuePersistence>
</persistence>
With larger clusters I’ve encountered issues such as the following errors:
2019-02-11 09:59:44 ERROR GridDhtPartitionsExchangeFuture:161 - Failed to
initialize cache(s) (will try to rollback). GridDhtPartitionExchangeId
[topVer=AffinityTopologyVersion [topVer=8, minorTopVer=1],
discoEvt=DiscoveryCustomEvent [customMsg=DynamicCacheChangeBatch
[id=1bbff7dd861-4da0b1ed-6b7a-418f-9d65-d57552e74a30,
reqs=[DynamicCacheChangeRequest [cacheName=writebehind, hasCfg=true,
nodeId=813dd53e-5e05-4e4d-9f63-5a41634937c0, clientStartOnly=false, stop=false,
destroy=false, disabledAfterStartfalse]], exchangeActions=ExchangeActions
[startCaches=[writebehind], stopCaches=null, startGrps=[writebehind],
stopGrps=[], resetParts=null, stateChangeRequest=null], startCaches=false],
affTopVer=AffinityTopologyVersion [topVer=8, minorTopVer=1],
super=DiscoveryEvent [evtNode=TcpDiscoveryNode
[id=813dd53e-5e05-4e4d-9f63-5a41634937c0, addrs=[0:0:0:0:0:0:0:1%lo0,
10.68.228.62, 127.0.0.1], sockAddrs=[/0:0:0:0:0:0:0:1%lo0:5021,
/127.0.0.1:5021], discPort=5021, order=1, intOrder=1,
lastExchangeTime=1549904383332, loc=false, ver=2.7.0#20181130-sha1:256ae401,
isClient=false], topVer=8, nodeId8=eca7beb4, msg=null,
type=DISCOVERY_CUSTOM_EVT, tstamp=1549904384518]], nodeId=813dd53e,
evt=DISCOVERY_CUSTOM_EVT]
java.lang.NullPointerException
at
org.apache.ignite.cache.store.cassandra.persistence.PojoField.calculatedField(PojoField.java:155)
at
org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.prepareLoadStatements(PersistenceController.java:297)
at
org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.<init>(PersistenceController.java:85)
at
org.apache.ignite.cache.store.cassandra.CassandraCacheStore.<init>(CassandraCacheStore.java:106)
at
org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory.create(CassandraCacheStoreFactory.java:59)
at
org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory.create(CassandraCacheStoreFactory.java:34)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.createCache(GridCacheProcessor.java:1558)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStart(GridCacheProcessor.java:2146)
at
org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager.processCacheStartRequests(CacheAffinitySharedManager.java:898)
at
org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager.onCacheChangeRequest(CacheAffinitySharedManager.java:798)
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onCacheChangeRequest(GridDhtPartitionsExchangeFuture.java:1231)
at
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.init(GridDhtPartitionsExchangeFuture.java:738)
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:2667)
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:2539)
at
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120)
at java.lang.Thread.run(Thread.java:748)
SEVERE: Failed to process 1 of 1 elements, during BULK_WRITE operation with
Cassandra
class org.apache.ignite.IgniteException: Failed to execute Cassandra BULK_WRITE
operation
at
org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl.execute(CassandraSessionImpl.java:268)
at
org.apache.ignite.cache.store.cassandra.CassandraCacheStore.writeAll(CassandraCacheStore.java:355)
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore.updateStore(GridCacheWriteBehindStore.java:816)
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore.applyBatch(GridCacheWriteBehindStore.java:726)
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore.access$2400(GridCacheWriteBehindStore.java:76)
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore$Flusher.flushCacheCoalescing(GridCacheWriteBehindStore.java:1147)
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore$Flusher.body(GridCacheWriteBehindStore.java:1018)
at
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at
org.apache.ignite.cache.store.cassandra.persistence.PojoField.getValueFromObject(PojoField.java:167)
at
org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.bindValues(PersistenceController.java:450)
at
org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.bindKeyValue(PersistenceController.java:202)
at
org.apache.ignite.cache.store.cassandra.CassandraCacheStore$4.bindStatement(CassandraCacheStore.java:369)
at
org.apache.ignite.cache.store.cassandra.CassandraCacheStore$4.bindStatement(CassandraCacheStore.java:355)
at
org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl.execute(CassandraSessionImpl.java:230)
... 8 more
Client node when trying to view the Size of the Ignite Cache:
SEVERE: Critical system error detected. Will be handled accordingly to
configured handler [hnd=class o.a.i.failure.StopNodeOrHaltFailureHandler,
failureCtx=FailureContext [type=SYSTEM_WORKER_TERMINATION,
err=java.lang.AssertionError]]
java.lang.AssertionError
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore$Flusher.<init>(GridCacheWriteBehindStore.java:914)
at
org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore.start(GridCacheWriteBehindStore.java:342)
at
org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.start0(GridCacheStoreManagerAdapter.java:205)
at
org.apache.ignite.internal.processors.cache.store.CacheOsStoreManager.start0(CacheOsStoreManager.java:64)
at
org.apache.ignite.internal.processors.cache.GridCacheManagerAdapter.start(GridCacheManagerAdapter.java:50)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.startCache(GridCacheProcessor.java:1188)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.prepareCacheStart(GridCacheProcessor.java:1964)
at
org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager.processClientCacheStartRequests(CacheAffinitySharedManager.java:438)
at
org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager.processClientCachesChanges(CacheAffinitySharedManager.java:622)
at
org.apache.ignite.internal.processors.cache.GridCacheProcessor.processCustomExchangeTask(GridCacheProcessor.java:376)
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.processCustomTask(GridCachePartitionExchangeManager.java:2235)
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:2371)
at
org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:2299)
at
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
at java.lang.Thread.run(Thread.java:748)
American Express made the following annotations
"This message and any attachments are solely for the intended recipient and may
contain confidential or privileged information. If you are not the intended
recipient, any disclosure, copying, use, or distribution of the information
included in this message and any attachments is prohibited. If you have
received this communication in error, please notify us by reply e-mail and
immediately and permanently delete this message and any attachments. Thank
you."
American Express a ajouté le commentaire suivant le
Ce courrier et toute pièce jointe qu'il contient sont réservés au seul
destinataire indiqué et peuvent renfermer des renseignements confidentiels et
privilégiés. Si vous n'êtes pas le destinataire prévu, toute divulgation,
duplication, utilisation ou distribution du courrier ou de toute pièce jointe
est interdite. Si vous avez reçu cette communication par erreur, veuillez nous
en aviser par courrier et détruire immédiatement le courrier et les pièces
jointes. Merci.