如何配置双节点Pivotal GemFire集群实现区域数据同步?
搭建双节点Pivotal GemFire集群(每节点含Locator+Cache Server,复制区域同步)
看起来你已经迈出了搭建GemFire集群的第一步,我来帮你完成剩下的配置,确保复制区域的数据同步和locator的负载均衡功能正常运行。
一、完成剩余节点的启动配置
既然你已经启动了第一台服务器的locator1和cache-server1,接下来需要让第二台服务器的节点加入集群:
1. 启动第二台服务器的Locator(locator2)
通过gfsh执行以下命令,让locator2发现并加入已有集群:
gfsh> start locator --name=locator2 --bind-address=你的server2-IP --port=10334 --peer-discovery-address=你的server1-IP --peer-discovery-port=10334
这里--peer-discovery-address指定第一台locator的IP,这样两个locator会形成一个对等组,实现负载均衡和故障转移——后续客户端连接任意一个locator都能获取整个集群的节点信息。
2. 启动第二台服务器的Cache Server(cache-server2)
同样通过locator注册到集群,建议同时指定两个locator地址,提升可靠性:
gfsh> start server --name=cache-server2 --bind-address=你的server2-IP --server-port=40404 --locators=你的server1-IP[10334],你的server2-IP[10334]
二、创建复制区域(Replicated Region)
要实现数据在两个cache server间自动同步,核心是创建复制类型的区域,不管用gfsh还是Java API都能实现:
方法1:用gfsh快速创建
先连接到集群(随便连一个locator即可):
gfsh> connect --locator=你的server1-IP[10334]
然后创建复制区域:
gfsh> create region --name=myReplicatedRegion --type=REPLICATE
--type=REPLICATE参数会让GemFire自动在所有在线的cache server上创建这个区域,并且所有写入操作都会同步到所有节点。
方法2:用Java API创建(客户端侧)
如果是在客户端代码中动态创建区域,需要指定复制类型的RegionShortcut:
ClientCache cache = new ClientCacheFactory() // 连接到两个locator,实现负载均衡 .addPoolLocator("你的server1-IP", 10334) .addPoolLocator("你的server2-IP", 10334) .create(); // 创建复制区域 RegionFactory<String, Object> regionFactory = cache.createRegionFactory(RegionShortcut.REPLICATE); Region<String, Object> region = regionFactory.create("myReplicatedRegion");
注意:客户端一定要通过locator连接集群,而不是直接连单个cache server,这样locator会自动帮你做请求负载均衡。
三、验证数据同步是否正常
1. 用gfsh验证
- 先在集群中写入一条数据:
gfsh> put --region=myReplicatedRegion --key="testKey" --value="testValue"
- 然后查询这条数据,不管你连接的是哪个cache server或者locator,都应该能返回相同的结果:
gfsh> get --region=myReplicatedRegion --key="testKey"
如果返回testValue,说明数据已经在两个节点间同步成功。
2. 用Java客户端验证
写两个简单的客户端程序,一个写入数据,另一个读取:
// 客户端1:写入数据 ClientCache cache1 = new ClientCacheFactory() .addPoolLocator("你的server1-IP", 10334) .create(); Region<String, Object> region1 = cache1.getRegion("myReplicatedRegion"); region1.put("user1", "Alice"); // 客户端2:读取数据(可以部署在另一台机器) ClientCache cache2 = new ClientCacheFactory() .addPoolLocator("你的server2-IP", 10334) .create(); Region<String, Object> region2 = cache2.getRegion("myReplicatedRegion"); System.out.println("读取到的数据:" + region2.get("user1")); // 应该输出Alice
四、关键注意事项
- Locator的对等通信:两个locator必须能互相访问,所以要确保服务器之间的10334端口(默认locator端口)是开放的,否则无法形成对等组。
- 区域类型别选错:不要用
PARTITION(分区类型),它是把数据分片存储在不同节点,不会全量同步;REPLICATE才是全节点复制的类型。 - Cache Server的端口开放:除了server端口(默认40404),还要开放peer-to-peer通信端口(默认40405),否则cache server之间无法同步数据。
- 配置持久化(可选):如果需要重启节点后保留数据,可以在创建区域时加上
--persistent=true参数,或者在Java API中调用setPersistent(true)。
内容的提问来源于stack exchange,提问作者Sudharsan
相关产品推荐
相关产品推荐

