Hazelcast集群配置需求:Web节点保留ReplicatedMap,排除PartitionedMap存储
解决Hazelcast集群分区Map与复制Map的差异化存储需求
嘿,这个需求完全可以实现!你想要Web应用节点(LM1)不存储Partitioned Map(PM1、PM2)的数据,但要保留Replicated Map(RM)的所有条目,同时其他成员(M1、M2)正常存储两种Map。既然Lite Member不符合要求(它完全不存储任何数据,包括Replicated Map),咱们可以通过节点属性标记+Map过滤配置来精准控制数据存储范围。
1. 给Web节点标记专属属性
首先,在Web节点的Hazelcast配置里添加一个自定义属性,用来区分它和其他数据存储节点:
XML配置方式
<hazelcast> <instance-name>LM1-Web-Node</instance-name> <properties> <!-- 标记该节点为web类型 --> <property name="hazelcast.member.type">web</property> </properties> <!-- 其他基础配置(比如网络、集群发现等) --> </hazelcast>
Java代码配置方式
Config webNodeConfig = new Config(); webNodeConfig.setInstanceName("LM1-Web-Node"); // 添加web类型标记属性 webNodeConfig.setProperty("hazelcast.member.type", "web"); // 其他基础配置...
2. 配置Partitioned Map,排除Web节点存储
接下来,针对PM1和PM2,设置节点过滤规则,让它们只在非Web节点(M1、M2)上存储数据。Web节点仍然可以对这些Map执行读写操作(Hazelcast会自动路由到存储数据的节点),但不会本地存储任何分区数据。
XML配置方式
<!-- 配置PM1,排除web类型节点 --> <map name="PM1"> <node-filter>!member.getAttribute('hazelcast.member.type').equals('web')</node-filter> </map> <!-- 对PM2应用同样的过滤规则 --> <map name="PM2"> <node-filter>!member.getAttribute('hazelcast.member.type').equals('web')</node-filter> </map>
Java代码配置方式
Config clusterConfig = new Config(); // 配置PM1的节点过滤规则 MapConfig pm1Config = clusterConfig.getMapConfig("PM1"); pm1Config.setNodeFilter(member -> !"web".equals(member.getAttribute("hazelcast.member.type")) ); // 给PM2复用同样的过滤规则 MapConfig pm2Config = clusterConfig.getMapConfig("PM2"); pm2Config.setNodeFilter(pm1Config.getNodeFilter());
3. 确保Replicated Map在所有节点同步
Replicated Map默认就是把数据复制到所有集群成员的,咱们只需要确认配置没有修改这个默认行为,保证Web节点加入时能自动同步所有RM条目:
XML配置方式
<replicated-map name="RM"> <!-- 开启异步填充,节点加入时自动同步所有数据 --> <async-fillup>true</async-fillup> <!-- replication-count设为0表示复制到所有成员(默认值) --> <replication-count>0</replication-count> </replicated-map>
Java代码配置方式
ReplicatedMapConfig rmConfig = clusterConfig.getReplicatedMapConfig("RM"); // 开启异步填充,确保新节点加入时自动拉取所有数据 rmConfig.setAsyncFillup(true); // 0表示复制到所有集群成员,无需修改默认值,这里显式写出更清晰 rmConfig.setReplicationCount(0);
4. 验证配置效果
配置完成后,你可以通过以下方式验证:
- 用Hazelcast管理中心查看PM1/PM2的存储分布,确认Web节点没有存储这些Map的数据
- 检查RM的存储状态,确保所有节点(包括Web节点)都有完整的Replicated Map副本
- 在Web节点上测试读写RM,确认可以直接访问本地数据;测试读写PM1/PM2,确认操作能正常执行(数据会路由到M1/M2节点)
内容的提问来源于stack exchange,提问作者T. Gawęda
相关产品推荐
相关产品推荐

