首页 > 解决方案 > 如何在简单的 apache ignite 集群中的所有节点上完全复制数据?

问题描述

我正在尝试设置一个简单的 2 节点集群,其中所有数据都完全同步并保存到所有节点上的磁盘,但我无法弄清楚实现这一点的配置。

版本:apache 点燃 2.8.0。

这是我想要实现的目标:我的应用程序实例可以连接到集群中的任何节点并执行 CRUD 操作。如果 ignite 集群中的一个节点死亡,应用程序应该能够连接到另一个节点,并且那里的所有数据都应该可用。这是一个流量最小的小型数据集,所以我并不担心性能,而是担心一致性。

这是我的配置:

    .....
    .....
    <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 -->
    .....

我观察到的:

我清除每个节点上的所有数据(/工作目录)以重新开始。我第一次启动两个节点,激活集群(基线拓扑为 2),使用带有 jdbc 瘦驱动程序的 JDBC 客户端(例如 DBeaver)进行连接,然后创建一个表,插入一些数据。

我可以看到所有数据都在那里,无论我连接到哪个节点。

我现在杀死其中一个节点。连接到实时节点我只看到一些数据。使用我的配置,我希望所有数据都能备份并可用。或者,由于 partitionLossPolicy,如果数据尚未同步并且我正在尝试读取它,我希望得到一个异常。

看来这应该是可能的,我在这里错过了什么?

标签: ignite

解决方案


Ignite 有多种不同的方式来创建缓存。这里的问题是您(无意中)使用了其中两个。

首先,您创建一个名为myCache. 这是一个复制的缓存,并且能够在服务器节点发生故障时幸存下来。

然后使用 SQL 创建缓存。这和上面的缓存不一样,即使你调用了它myCache。默认是分区缓存,这就是您看到数据丢失的原因。

要使用 SQL 创建复制缓存,您需要使用 WITH 子句:

CREATE TABLE ignite (id LONG PRIMARY KEY, name VARCHAR) WITH “template=replicated”;

(您也可以backups=1改为,这将为您提供一个分区缓存,该缓存可以在一个服务器节点出现故障时继续存在。)


推荐阅读