Apache Ignite与Apache Cassandra(3.11.2)集成配置咨询
嘿,你已经完成了前期的准备工作,接下来咱们一步步把Ignite和Cassandra 3.11.2的集成配置落地,帮你把缓存和Cassandra的联动跑起来:
一、先精简依赖(不用全复制optional文件夹)
你之前把libs/optional/下的所有文件夹都移到libs/了,其实没必要,反而会增加冗余。建议把非必需的移回去,只保留:
libs/optional/ignite-cassandra:这是Ignite和Cassandra交互的核心依赖,必须留- 如果你的Cassandra集群开启了用户名密码认证,再加上
libs/optional/ignite-security(没开的话可以忽略)
其他像ignite-hadoop、ignite-spark这类用不上的依赖都可以放回原目录,避免启动时加载不必要的库。
二、完善Cassandra连接配置(connection-settings.xml)
这个文件是Ignite连接Cassandra集群的入口,给你一个基础模板,替换成你自己的集群信息就行:
<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集群地址,多个节点用逗号分隔 --> <bean id="cassandraCluster" class="org.apache.ignite.cache.store.cassandra.utils.ClusterHelper"> <constructor-arg type="java.lang.String" value="127.0.0.1:9042"/> <!-- 开启认证的话,取消下面两行注释并替换成你的用户名密码 --> <!-- <constructor-arg type="java.lang.String" value="your_username"/> --> <!-- <constructor-arg type="java.lang.String" value="your_password"/> --> </bean> </beans>
三、配置缓存与Cassandra的映射规则(cassandra-config.xml)
这个文件用来定义Ignite缓存如何对应到Cassandra的表结构,假设你有个Cassandra表my_keyspace.user,字段是user_id(UUID)、username(text)、age(int),给你一个参考模板:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <!-- 引入之前的连接配置 --> <import resource="connection-settings.xml"/> <!-- 定义缓存存储实现 --> <bean id="userCacheStore" class="org.apache.ignite.cache.store.cassandra.CassandraCacheStore"> <property name="dataSource" ref="cassandraCluster"/> <property name="cacheConfiguration"> <bean class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings"> <constructor-arg type="org.springframework.core.io.Resource" value="classpath:cassandra-config.xml"/> </bean> </property> </bean> <!-- 实体与Cassandra表的映射配置 --> <bean id="userCachePersistenceSettings" class="org.apache.ignite.cache.store.cassandra.persistence.GenericPersistenceSettings"> <constructor-arg> <value><![CDATA[ <persistence keyspace="my_keyspace" table="user"> <key> <column name="user_id" type="java.util.UUID"/> </key> <value> <column name="username" type="java.lang.String"/> <column name="age" type="java.lang.Integer"/> </value> </persistence> ]]></value> </constructor-arg> </bean> </beans>
小提示:如果你的业务有自定义Java实体类,也可以用注解方式映射(比如@QueryEntity、@QueryField),这样就不用在XML里写繁琐的映射规则,更灵活。
四、修改Ignite主配置文件(比如default-config.xml)
需要在Ignite的核心配置里关联上面的Cassandra存储,开启读/写穿透功能。找到<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">节点,添加以下缓存配置:
<!-- 导入Cassandra配置文件 --> <import resource="cassandra-config.xml"/> <!-- 缓存配置列表 --> <property name="cacheConfiguration"> <list> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <!-- 缓存名称,要和cassandra-config里的对应 --> <property name="name" value="userCache"/> <!-- 缓存模式,根据业务选PARTITIONED(分区)或REPLICATED(全复制) --> <property name="cacheMode" value="PARTITIONED"/> <!-- 开启读穿透:当缓存中没有数据时,自动从Cassandra加载 --> <property name="readThrough" value="true"/> <!-- 开启写穿透:更新缓存时同步写入Cassandra --> <property name="writeThrough" value="true"/> <property name="storeKeepBinary" value="true"/> <!-- 关联Cassandra缓存存储工厂 --> <property name="cacheStoreFactory"> <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory"> <property name="dataSourceBean" value="cassandraCluster"/> <property name="persistenceSettingsBean" value="userCachePersistenceSettings"/> </bean> </property> </bean> </list> </property>
五、启动验证
- 先确保你的Cassandra集群已经正常启动,用
cqlsh能连接上 - 启动Ignite时指定修改后的主配置:
./ignite.sh ../config/default-config.xml(Windows系统用ignite.bat) - 写个简单的测试代码验证联动:
public class IgniteCassandraDemo { public static void main(String[] args) { // 启动Ignite实例 try (Ignite ignite = Ignition.start("config/default-config.xml")) { Cache<UUID, User> userCache = ignite.getOrCreateCache("userCache"); // 写入一条数据到缓存(会同步到Cassandra) UUID userId = UUID.randomUUID(); userCache.put(userId, new User("alice", 28)); // 从缓存读取数据 User user = userCache.get(userId); System.out.println("从缓存读取到用户:" + user); // 去Cassandra验证数据是否存在:用cqlsh执行 SELECT * FROM my_keyspace.user WHERE user_id = ?; } } // 自定义用户实体类 static class User { private String username; private int age; public User(String username, int age) { this.username = username; this.age = age; } @Override public String toString() { return "User{username='" + username + "', age=" + age + "}"; } // 记得加getter和setter,否则映射可能出问题 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } }
常见踩坑提醒
- 版本兼容:Ignite 2.x系列对Cassandra 3.11.x支持很稳定,别用太老的Ignite版本(比如1.x)
- 网络问题:如果Ignite连不上Cassandra,检查Cassandra的
rpc_address是否设为可访问的IP,防火墙是否开放9042端口 - 一致性级别:Ignite默认用
LOCAL_QUORUM,如果你的Cassandra集群一致性配置不同,需要在连接配置里调整
内容的提问来源于stack exchange,提问作者Vishal Sharma
相关产品推荐
相关产品推荐

