首页 > 解决方案 > 一个节点宕机时 Apache Ignite 数据丢失

问题描述

我是 Ignite 的新手,我正在尝试测试 Ignite 集群的数据质量和可用性。

我使用下面的 xml 配置来设置集群,

<property name="discoverySpi">
        <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
            <property name="socketTimeout" value="50000" />
            <property name="networkTimeout" value="50000" />
            <property name="reconnectCount" value="5" />
            <property name="ipFinder">
                <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                    <property name="addresses">
                        <list>
                            <value>x.x.x.1:47500..47509</value>
                            <value>x.x.x.2:47500..47509</value>
                        </list>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

还有 jthe CacheConfiguration 是,

<bean id="cache-template-bean" class="org.apache.ignite.configuration.CacheConfiguration">
                <property name="name" value="CACHE_TEMPLATE*"/>
                <property name="cacheMode" value="PARTITIONED" />
                <property name="backups" value="1" />
             <!--   <property name="backups" value="2" />
                <property name="backups" value="3" /> -->
                <property name="atomicityMode" value="TRANSACTIONAL" />
                <property name="writeSynchronizationMode" value="PRIMARY_SYNC" />
                <property name="rebalanceBatchSize" value="#{4 * 1024 * 1024}" />
                <property name="rebalanceMode" value="ASYNC" />
                <property name="statisticsEnabled" value="true" />
                <property name="rebalanceBatchesPrefetchCount" value="4" />
                <property name="defaultLockTimeout" value="5000" />
                <property name="readFromBackup" value="true" />
                <property name="queryParallelism" value="6" />
                <property name="nodeFilter">
                 <bean class="org.apache.ignite.util.AttributeNodeFilter">
                        <constructor-arg>
                            <map>
                                <entry key="ROLE" value="data.compute"/>
                            </map>
                        </constructor-arg>
                    </bean>
                </property>
            </bean>

我的场景是,

  1. 3个节点全部加载500万条数据
  2. 关闭一个节点
  3. 计数显示375万。(数据丢失)
  4. 启动节点再次计数 500 万。

我尝试备份 1,2,3 都导致相同的数据丢失。根据 Ignite 文档,似乎不应该发生数据丢失。如果解决了这个问题,我可以尝试在节点关闭时添加数据并检查它的行为。

请问有什么建议吗?

标签: ignite

解决方案


基线拓扑和持久性的主要思想是防止不必要的重新平衡并将数据仅存储在指定的服务器节点中。当基线节点停止时,预计会很快恢复,并且不会触发重新平衡过程。您可以使用 api 或 control.sh 实用程序从基线中排除节点。

IgniteCache.size()返回主条目的数量。因此,当基线节点停止时,size()显示较小的数字,表示无法访问许多主条目。

在您的情况下,数据不会丢失有两个原因:
1. 数据保留在活动基线节点上的备份条目中。
2. 位于停止节点上的主备条目在节点启动后会返回集群。

[1] https://apacheignite.readme.io/docs/baseline-topology


推荐阅读