繁体   English   中英

编年史队列复制错误:收到主机 ID 的处理程序:1,我的主机 ID 是:2 这可能是配置错误

[英]Chronicle-queue replication error: Received a handler for host ID: 1, my host ID is: 2 this is probably a configuration error

我目前正在使用以下文档测试和学习编年史队列企业复制:

https://github.com/OpenHFT/Chronicle-Queue/blob/ea/docs/replication.adoc#the-mechanics-of-chronicle-queue-replication

https://github.com/OpenHFT/Chronicle-Queue/blob/ea/docs/queue-replication-message-protocol-overview.adoc#sinkreplicationhandler

但是,我收到以下错误:

java.lang.IllegalArgumentException :收到主机 ID 的处理程序:1,我的主机 ID 是:2 这可能是配置错误。

我的复制配置如下,我缺少什么? 下面是我的复制配置。

!ChronicleQueueReplicationCfg {
  eventId: "",
  serviceId: "",
  replicaSets: {
    global: !!set [
      host1,
      host2
    ]
  },
  allowSinkToSource: false,
  context: {
    networkContextFactory: !software.chronicle.enterprise.queue.replication.QueueClusterNetworkContext$Factory INSTANCE,
    heartbeatTimeoutMs: 500000,
    heartbeatIntervalMs: 300000,
    pauserSupplier: !PauserMode busy,
    replicationPauserSupplier: !!null "",
    affinityCPU: !!null "",
    wireType: BINARY_LIGHT,
    localIdentifier: 1,
    localName: host1,
    serverThreadingStrategy: SINGLE_THREADED,
    retryInterval: 1000,
    procPrefix: !!null "",
    baseSourcePath: source,
    baseSinkPath: replica,
    backfillTimeoutListener: !software.chronicle.enterprise.queue.replication.NoopBackfillListener INSTANCE,
    tcpBias: !!null ""
  },
  hosts: {
    host1: { hostId: 1, tcpBufferSize: 0, connectUri: "localhost:5001" },
    host2: { hostId: 2, tcpBufferSize: 0, connectUri: "localhost:5002" }
  },
  queues: {
    queue1: {
      name: queue1,
      path: queue1,
      replicaSets: [
        global
      ],
      masterId: 1,
      waitForSinks: 0
    }
  }
}

编年史队列企业所有 2.23ea26

我将其发布为答案,因为我需要共享一些配置。

您的配置似乎正确,但是,使用它的代码可能存在问题。 chronicle-queue-enterprise中有许多测试展示了如何使用复制功能。

您可以应用配置的最简单的方法称为ReplicationTest.shouldReplicate 该测试只是将两条消息写入source并验证它是否可以从接收sink读取相同的消息(这意味着复制工作)。

我在此测试中应用了您的配置,并进行了细微更改。

!ChronicleQueueReplicationCfg {
  eventId: "",
  serviceId: "",
  replicaSets: {
    global: !!set [
      host1,
      host2
    ]
  },
  allowSinkToSource: false,
  context: {
    networkContextFactory: !software.chronicle.enterprise.queue.replication.QueueClusterNetworkContext$Factory INSTANCE,
    heartbeatTimeoutMs: 500000,
    heartbeatIntervalMs: 300000,
    pauserSupplier: !PauserMode busy,
    replicationPauserSupplier: !!null "",
    affinityCPU: !!null "",
    wireType: BINARY_LIGHT,
    localIdentifier: 1,
    localName: host1,
    serverThreadingStrategy: SINGLE_THREADED,
    retryInterval: 1000,
    procPrefix: !!null "",
    baseSourcePath: "replica/source",
    baseSinkPath: "replica/sink$hostId",
    backfillTimeoutListener: !software.chronicle.enterprise.queue.replication.NoopBackfillListener INSTANCE,
    tcpBias: !!null ""
  },
  hosts: {
    host1: { hostId: 1, tcpBufferSize: 0, connectUri: host.port1 },
    host2: { hostId: 2, tcpBufferSize: 0, connectUri: host.port2 }
  },
  queues: {
    queue1: {
      name: queue1,
      path: queue1,
      acknowledge: true,
      allowUnknownSinks: true,
      replicaSets: [
        global
      ],
      masterId: 1,
      waitForSinks: 0
    }
  }
}

我无法复制您遇到的相同IllegalArgumentException ,请分享使用您的配置的代码,我相信我们会找出问题所在并更新此答案。

我将根据给出的反馈回答我自己的问题。 该问题是由于我在创建 ReplicatedQueue 对象时将相同的 ChronicleQueueReplicationCfg 实例传递到复制的每一侧引起的。 我错过了 ChronicleQueueReplicationCfg 对象在复制启动时是有状态的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM