如何在简单的ApacheIgnite集群中的所有节点上完全复制数据?
我正在尝试设置一个简单的2节点集群,其中所有数据都完全同步并持久化到所有节点上的磁盘,但我无法确定实现这一点的配置 版本:ApacheIgnite2.8.0 以下是我努力实现的目标: 我的应用程序实例可以连接到群集中的任何节点并执行CRUD操作。如果ignite集群中的一个节点死亡,应用程序应该能够连接到另一个节点,并且所有数据都应该在那里可用。 这是一个流量最小的小数据集,所以我不担心性能,也不担心一致性 以下是我的配置:如何在简单的ApacheIgnite集群中的所有节点上完全复制数据?,ignite,Ignite,我正在尝试设置一个简单的2节点集群,其中所有数据都完全同步并持久化到所有节点上的磁盘,但我无法确定实现这一点的配置 版本:ApacheIgnite2.8.0 以下是我努力实现的目标: 我的应用程序实例可以连接到群集中的任何节点并执行CRUD操作。如果ignite集群中的一个节点死亡,应用程序应该能够连接到另一个节点,并且所有数据都应该在那里可用。 这是一个流量最小的小数据集,所以我不担心性能,也不担心一致性 以下是我的配置: ..... ..... <bean id
.....
.....
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"><property name="cacheConfiguration">
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="myCache"/>
<property name="cacheMode" value="REPLICATED"/>
<property name="backups" value="1"/>
<property name="rebalanceMode" value="SYNC"/>
<property name="writeSynchronizationMode" value="FULL_SYNC"/>
<property name="partitionLossPolicy" value="READ_ONLY_SAFE"/>
</bean>
</property>
<!-- Enabling Apache Ignite Persistent Store. -->
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="persistenceEnabled" value="true"/>
</bean>
</property>
<property name="walMode" value="FSYNC"/>
</bean>
</property>
.....
<!-- left out the discoverySpi config for brevity, it's just a multicast ip finder setup -->
.....
。。。。。
.....
.....
.....
我观察到:
我清除每个节点上的所有数据(/work directory)以重新开始。我第一次启动两个节点,激活集群(基线拓扑为2),使用JDBC客户机(例如DBeaver)和JDBC精简驱动程序连接,创建一个表,插入一些数据
我可以看到所有的数据,我连接到哪个节点
我现在杀死其中一个节点。连接到活动节点时,我只能看到部分数据。
通过我的配置,我希望所有数据都能备份并可用。或者,由于partitionLossPolicy,如果数据还没有同步,并且我正在尝试读取数据,我希望得到一个异常
这似乎是可能的,我在这里遗漏了什么?Ignite有多种不同的创建缓存的方法。这里的问题是您(无意中)使用了其中两个 首先,创建一个名为
myCache
的缓存。这是一个复制缓存,能够在服务器节点出现故障时生存下来
然后使用SQL创建缓存。这与上面的缓存不同,即使您将其称为myCache
。默认情况下是分区缓存,这就是您看到数据丢失的原因
要使用SQL创建复制缓存,需要使用WITH子句:
创建带有“template=replicated”的表ignite(id长主键,名称VARCHAR);
(您也可以将
backups=1
改为,这将为您提供一个分区缓存,可以在一个服务器节点出现故障时生存下来。)Ignite有多种不同的创建缓存的方法。这里的问题是您(无意中)使用了其中两个
首先,创建一个名为myCache
的缓存。这是一个复制缓存,能够在服务器节点出现故障时生存下来
然后使用SQL创建缓存。这与上面的缓存不同,即使您将其称为myCache
。默认情况下是分区缓存,这就是您看到数据丢失的原因
要使用SQL创建复制缓存,需要使用WITH子句:
创建带有“template=replicated”的表ignite(id长主键,名称VARCHAR);
(您也可以将
backups=1
改为,这将为您提供一个分区缓存,可以在一个服务器节点出现故障时生存。)这可能与基线拓扑有关,您是否尝试在节点加入或离开时调整基线拓扑?您所说的“我激活集群,我创建表”是什么意思?您可以在XML中创建一个复制缓存,该缓存应该能够在节点出现故障时生存。您是说您创建了另一个缓存(可能使用SQL?),而这就是您在中看到的数据丢失的缓存?@Alamar-据我所知,BLT确定哪些节点将实际将数据持久化到磁盘,因此,这两个节点应该在BLT中。如果一个节点死了,我希望(死的节点的)所有数据都已复制到另一个节点。@StephenDarlington-我应该更清楚这一点。因此:1-第一次启动两个节点后,您必须手动“激活”集群(如果我理解正确,这也会设置BLT,这是一项1次手动任务)。2-我连接一个jdbc客户机(jdbc瘦驱动程序)并使用sql创建一个表。我还插入了一些记录。然后,我可以使用jdbc连接到任意一个节点,查询该表,然后查看所有记录。3-如果我现在杀死任何节点,并且再次连接到“活动”节点,我将只看到一些记录。因此,并非所有数据都被复制。这可能与基线拓扑有关,您是否尝试在节点加入或离开时调整基线拓扑?您所说的“我激活集群,我创建表”是什么意思?您可以在XML中创建一个复制缓存,该缓存应该能够在节点出现故障时生存。您是说您创建了另一个缓存(可能使用SQL?),而这就是您在中看到的数据丢失的缓存?@Alamar-据我所知,BLT确定哪些节点将实际将数据持久化到磁盘,因此,这两个节点应该在BLT中。如果一个节点死了,我希望(死的节点的)所有数据都已复制到另一个节点。@StephenDarlington-我应该更清楚这一点。因此:1-第一次启动两个节点后,您必须手动“激活”集群(如果我理解正确,这也会设置BLT,这是一项1次手动任务)。2-我连接一个jdbc客户机(jdbc瘦驱动程序)并使用sql创建一个表。我还插入了一些记录。然后,我可以使用jdbc连接到任意一个节点,查询该表,然后查看所有记录。3-如果我现在杀死任何节点,并且再次连接到“活动”节点,我将只看到一些记录。因此,并不是所有的数据都被复制。这正是我所需要的,它与您的建议完美地结合在一起。非常感谢你,你为我节省了很多时间!对于遇到这种情况的其他人,如果您仔细阅读CREATE表格上的说明,这正是我所需要的,它与您的建议完美配合。T