As described in configuration section, to configure Cassandra as a cache store you need to set CacheStoreFactory
for your Ignite caches to org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory
.
Below is an example of a typical configuration for Ignite cache to use Cassandra as a cache store. We will go step-by-step through all the configuration items, further down. The example is taken from the unit tests resource file store/src/test/resources/org/apache/ignite/tests/persistence/blob/ignite-config.xml
of the Cassandra module source code.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Cassandra connection settings --> <import resource="classpath:org/apache/ignite/tests/cassandra/connection-settings.xml" /> <!-- Persistence settings for 'cache1' --> <bean id="cache1_persistence_settings" class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings"> <constructor-arg type="org.springframework.core.io.Resource" value="classpath:org/apache/ignite/tests/persistence/blob/persistence-settings-1.xml" /> </bean> <!-- Persistence settings for 'cache2' --> <bean id="cache2_persistence_settings" class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings"> <constructor-arg type="org.springframework.core.io.Resource" value="classpath:org/apache/ignite/tests/persistence/blob/persistence-settings-3.xml" /> </bean> <!-- Ignite configuration --> <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="cacheConfiguration"> <list> <!-- Configuring persistence for "cache1" cache --> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="cache1"/> <property name="readThrough" value="true"/> <property name="writeThrough" value="true"/> <property name="cacheStoreFactory"> <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory"> <property name="dataSourceBean" value="cassandraAdminDataSource"/> <property name="persistenceSettingsBean" value="cache1_persistence_settings"/> </bean> </property> </bean> <!-- Configuring persistence for "cache2" cache --> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="cache2"/> <property name="readThrough" value="true"/> <property name="writeThrough" value="true"/> <property name="cacheStoreFactory"> <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory"> <property name="dataSourceBean" value="cassandraAdminDataSource"/> <property name="persistenceSettingsBean" value="cache2_persistence_settings"/> </bean> </property> </bean> </list> </property> <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <!-- Ignite provides several options for automatic discovery that can be used instead os static IP based discovery. For information on all options refer to our documentation: https://ignite.apache.org/docs/latest/clustering/clustering --> <!-- Uncomment static IP finder to enable static-based discovery of initial nodes. --> <!--<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">--> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="addresses"> <list> <!-- In distributed environment, replace with actual host IP address. --> <value>127.0.0.1:47500..47509</value> </list> </property> </bean> </property> </bean> </property> </bean> </beans>
In the specified example we have two Ignite caches configured: cache1
and cache2
. So lets look at the configuration details.
Lets start from the cache configuration details. They are pretty similar for both caches (cache1
and cache2
) and looks like that:
<bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="cache1"/> <property name="readThrough" value="true"/> <property name="writeThrough" value="true"/> <property name="cacheStoreFactory"> <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory"> <property name="dataSourceBean" value="cassandraAdminDataSource"/> <property name="persistenceSettingsBean" value="cache1_persistence_settings"/> </bean> </property> </bean>
First of all we can see that read-through
and write-through
options are enabled:
<property name="readThrough" value="true"/> <property name="writeThrough" value="true"/>
which is required for Ignite cache, if you plan to use a persistent store for cache entries which expired.
You can optionally specify the write-behind
setting if you prefer persistent store to be updated asynchronously:
<property name="readThrough" value="true"/> <property name="writeThrough" value="true"/>
The next important thing is CacheStoreFactory
configuration:
<property name="cacheStoreFactory"> <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory"> <property name="dataSourceBean" value="cassandraAdminDataSource"/> <property name="persistenceSettingsBean" value="cache1_persistence_settings"/> </bean> </property>
You should use org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory
as a CacheStoreFactory
for your Ignite caches to utilize Cassandra as a persistent store. For CassandraCacheStoreFactory
you should specify two required properties:
-
dataSourceBean
- name of the Spring bean, which specifies all the details about Cassandra database connection. -
persistenceSettingsBean
- name of the Spring bean, which specifies all the details about how objects should be persisted into Cassandra database.
In the specified example cassandraAdminDataSource
is a data source bean, which is imported into Ignite cache config file using this directive:
<import resource="classpath:org/apache/ignite/tests/cassandra/connection-settings.xml" />
and cache1_persistence_settings
is a persistence settings bean, which is defined in Ignite cache config file using such directive:
<bean id="cache1_persistence_settings" class="org.apache.ignite.cache.store.cassandra.utils.persistence.KeyValuePersistenceSettings"> <constructor-arg type="org.springframework.core.io.Resource" value="classpath:org/apache/ignite/tests/persistence/blob/persistence-settings-1.xml" /> </bean>
Now lets look at the specification of cassandraAdminDataSource
from store/src/test/resources/org/apache/ignite/tests/cassandra/connection-settings.xml
test resource.
Specifically,CassandraAdminCredentials
and CassandraRegularCredentials
are classes which extend org.apache.ignite.cache.store.cassandra.datasource.Credentials
. You are welcome to implement these classes and reference them afterwards.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cassandraAdminCredentials" class="org.my.project.CassandraAdminCredentials"/> <bean id="cassandraRegularCredentials" class="org.my.project.CassandraRegularCredentials"/> <bean id="loadBalancingPolicy" class="com.datastax.driver.core.policies.TokenAwarePolicy"> <constructor-arg type="com.datastax.driver.core.policies.LoadBalancingPolicy"> <bean class="com.datastax.driver.core.policies.RoundRobinPolicy"/> </constructor-arg> </bean> <bean id="contactPoints" class="org.apache.ignite.tests.utils.CassandraHelper" factory-method="getContactPointsArray"/> <bean id="cassandraAdminDataSource" class="org.apache.ignite.cache.store.cassandra.datasource.DataSource"> <property name="credentials" ref="cassandraAdminCredentials"/> <property name="contactPoints" ref="contactPoints"/> <property name="readConsistency" value="ONE"/> <property name="writeConsistency" value="ONE"/> <property name="loadBalancingPolicy" ref="loadBalancingPolicy"/> </bean> <bean id="cassandraRegularDataSource" class="org.apache.ignite.cache.store.cassandra.datasource.DataSource"> <property name="credentials" ref="cassandraRegularCredentials"/> <property name="contactPoints" ref="contactPoints"/> <property name="readConsistency" value="ONE"/> <property name="writeConsistency" value="ONE"/> <property name="loadBalancingPolicy" ref="loadBalancingPolicy"/> </bean> </beans>
For more details about Cassandra data source connection configuration visit the integration configuration page.
Finally, the last piece which wasn’t still described is persistence settings configuration. Lets look at the cache1_persistence_settings
from the org/apache/ignite/tests/persistence/blob/persistence-settings-1.xml
test resource.
<persistence keyspace="test1" table="blob_test1"> <keyPersistence class="java.lang.Integer" strategy="PRIMITIVE" /> <valuePersistence strategy="BLOB"/> </persistence>
In the configuration above, we can see that Cassandra test1.blob_test1
table will be used to store key/value objects for cache1 cache. Key objects of the cache will be stored as integer in key
column. Value objects of the cache will be stored as blob in value
column. For more information about persistence settings configuration visit the integration configuration page.
Next sections will provide examples of persistence settings configuration for different kind of persistence strategies (see more details about persistence strategies on the integration configuration page.