【问题标题】:Ignite Cache Persistence server for DB with servers for compute用于 DB 的 Ignite Cache Persistence 服务器和用于计算的服务器
【发布时间】:2018-09-13 00:42:15
【问题描述】:

我正在使用 Ignite 2.5 并且已经部署了几个这样的服务器:

  1. 一台计算机充当启用持久性的 DB 服务器。
  2. 其他三台计算机是计算服务器,具有与 DB 服务器上相同的缓存,但没有持久性。

我有这样的课程:

public class Address implements Serializable
{
  String streetName;
  String houseNumber;
  String cityName;
  String countryName;
}

public class Person implements Serializable
{
  @QuerySqlField
  String firstName;

  @QuerySqlField
  String lastName;

  @QuerySqlField
  Address homeAddress;
}

在所有服务器上都使用此 XML 配置缓存:

 <bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="Persons" />
    <property name="cacheMode" value="PARTITIONED" />
    <property name="backups" value="0" />
    <property name="storeKeepBinary" value="true" />
    <property name="atomicityMode" value="TRANSACTIONAL"/> 
    <property name="writeSynchronizationMode" value="FULL_SYNC"/>
    <property name="indexedTypes">
        <list>
            <value>java.lang.String</value>
            <value>Person</value>
        </list>
    </property>
 </bean>

在数据库服务器上,另外还有这样启用的持久性:

<property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
        <property name="storagePath" value="/data/Storage" />
        <property name="walPath" value="/data/Wal" />
        <property name="walArchivePath" value="/data/WalArchive" />
        <property name="defaultDataRegionConfiguration">
            <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                <property name="initialSize" value="536870912" />
                <property name="maxSize" value="1073741824" />
                <property name="persistenceEnabled" value="true" />
            </bean>
        </property>
    </bean>
</property>

<property name="binaryConfiguration">
    <bean class="org.apache.ignite.configuration.BinaryConfiguration">
        <property name="compactFooter" value="false" />
    </bean>
</property>

缓存与 put/get 一起使用,但也与 SqlQuery 和 SqlFieldsQuery 一起使用。

有时我必须更新类定义,即添加另一个字段左右。我可以关闭整个集群以更新类,因为它无论如何都需要更新应用程序。

  • 我相信上述配置通常可以用于 Ignite?
  • 我是否正确理解了另一个问题 (Apache Ignite persistent store recommended way for class versions),即在数据库服务器上,类路径中不应包含 Person 类?那么 XML 配置不会因为缺少索引类而失败吗?
  • 在计算服务器上,我也不应该使用 Person 类,而是从缓存中读取到 BinaryObject?是否可以从 BinaryObject 手动填充我的 Person 类?

目前,当我更新 Person 类中的字段时,会出现以下奇怪的错误:

未知对 [platformId=0, typeId=1968448811]

对不起,如果这里有多个问题,我不知何故迷失了“未知对”问题,现在我质疑我的完整设置是否正确。

感谢您的建议。

【问题讨论】:

    标签: ignite


    【解决方案1】:
    • 我相信上述配置通常可以用于 Ignite?

    不,您不能只为一个节点配置持久性。因此,在您的情况下,所有节点都会存储数据,但只有一个节点会持久化其数据,因此只有部分数据会被持久化,这可能会导致不可预知的后果。如果只希望一个节点存储数据,则需要配置node filter

    使用节点过滤器,缓存将仅位于一个节点上,并且该节点将存储数据,但是在这种情况下,您的计算节点必须执行网络 IO 才能从缓存中读取。

    • 我了解这个其他问题吗(Apache Ignite 持久存储 类版本的推荐方法)正确地在数据库服务器上我 类路径中不应有 Person 类?那么不会 XML 配置失败,因为它缺少索引类?

    您不需要模型的类位于类路径中,但请确保您仅在服务器端使用 BinaryObjects,因此所有计算任务都应使用 BinaryObjects。也如您所说,此配置不起作用,您需要使用Query Entity 代替索引配置。

    • 在计算服务器上,我也不应该使用 Person 类,而是从缓存中读取到 BinaryObject?是否可以从 BinaryObject 手动填充我的 Person 类?

    好吧,如果您在服务器端没有 Person 类,您就无法创建 Person 类,您需要在计算作业中使用 BinaryObject。

    目前,当我更新 Person 类中的字段时,会出现奇怪的错误,例如:Unknown pair [platformId=0, typeId=1968448811]

    您能否提供完整的堆栈跟踪并说明您在什么操作中遇到此错误?

    【讨论】:

    • 谢谢,非常有帮助。我接受你的回答,尽管我有几个问题需要澄清。查询实体需要设置valueType,但是,这不是我在类路径中实际上不应该有的模型类吗?实际上我可以在这个字段中写任何虚拟值,它仍然有效。
    • 另外,我理解使用 BinaryObject 和 Query Entity 的主要思想是灵活地选择进入缓存的类型,对吧?在我上面的例子中,如果我在缓存已经填充数据之后更新 Address 类会发生什么,这可能还是我不应该使用子类?
    猜你喜欢
    • 1970-01-01
    • 2022-04-20
    • 2016-06-22
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多