【问题标题】:Getting IgniteCheckedException: Default Ignite instance has already been started exception when enabling Persistence on single Node获取 IgniteCheckedException:在单个节点上启用持久性时,默认 Ignite 实例已启动异常
【发布时间】:2019-05-20 14:06:42
【问题描述】:

我正在部署一个需要在 Ignite 缓存中维护一些数据的应用程序。我在内存中使用了 Ignite 缓存。这是我使用的 Ignite 配置:

<property name="cacheConfiguration">
        <list>
            <bean
                class="org.apache.ignite.configuration.CacheConfiguration">
                <property name="name" value="IGNITE_DATA" />
                <property name="cacheMode" value="PARTITIONED" />
                <property name="atomicityMode" value="ATOMIC" />
                <property name="writeSync"
                    value="PRIMARY_SYNC" />
                <property name="backups"
                    value="${IGNITE_CACHE_BACKUPS}" />
            </bean>
        </list>
    </property>

现在,当我部署了多个应用程序实例并将数据存储在 Ignite 缓存中时。它在所有应用程序实例之间共享。 即使任何实例出现故障并在一段时间后重新启动,它也会通过 Ignite 缓存同步获得最新数据。

但是当所有应用程序实例都关闭时会出现问题。当他们出现时,数据就消失了,因为它没有被持久化。对于持久性,我使用了 dataStorageConfiguration 属性并启用了持久性。这是我添加到 Ignite 配置的更改:

<property name="dataStorageConfiguration">
        <bean
            class="org.apache.ignite.configuration.DataStorageConfiguration">
            <!-- Enabling Apache Ignite Persistent Store. -->
            <property name="defaultDataRegionConfiguration">
                <bean
                    class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <property name="persistenceEnabled" value="true" />

                </bean>
            </property>

            <!-- Changing Write Ahead Log Mode. -->
            <property name="storagePath" value="${IGNITE_BC_STORE_PATH}"/>
            <property name="walMode" value="LOG_ONLY" />
        </bean>
    </property>

现在,当我部署我的应用程序并尝试从 Java 代码启动 Ignite 时,如下所述:

log.info("Initializing IGNITE...");
ignite = Ignition.start(getClass().getResource(CONF_FILE));

每次说明默认实例已经启动时,我都会遇到异常。尝试了几件事,但没有奏效。即使我从 Ignite Configuration 中删除 CacheConfiguration 并只保留 dataStorageConfiguration 我仍然会遇到相同的错误。错误是:

Caused by: class org.apache.ignite.IgniteCheckedException: Default Ignite instance has already been started.
    at org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1141)
    at org.apache.ignite.internal.IgnitionEx.startConfigurations(IgnitionEx.java:1076)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:962)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:881)
    at org.apache.ignite.Ignition.start(Ignition.java:373)

通常,当我们尝试在同一 JVM 下运行多个 Ignite 节点时会出现此错误,但这里我在每个 JVM 下运行单个节点。然后也得到错误。 如果我错了,请纠正我。

我们将不胜感激。

【问题讨论】:

    标签: java spring ignite high-availability


    【解决方案1】:

    很可能,您的配置文件中有多个IgniteConfiguration bean。如果一个配置 bean 扩展了另一个配置 bean,那么请确保父级是抽象的。

    【讨论】:

    • 我检查了配置文件...它只包含 1 个 Ignite 配置 bean。如果我删除 dataStorageConfiguration 属性以实现持久性。错误消失了.. 这个属性有一些问题
    • 你能指定整个配置文件,不让节点启动吗?我想在我这边办理登机手续。
    【解决方案2】:

    我已经解决了这个问题。似乎问题不在于 Ignite 配置,而在于 Spring Framework 配置。

    我正在使用lazy-init=true 为Ignite 类创建bean。我将其切换为 eager-init 并解决了我的问题。 不知道它究竟是如何解决这个问题的,但至少在我的情况下它是有效的。

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2023-03-04
      • 2017-10-19
      相关资源
      最近更新 更多