【问题标题】:Unable to setup replication in ClickHouse using Zookeeper无法使用 Zookeeper 在 ClickHouse 中设置复制
【发布时间】:2018-04-27 07:14:22
【问题描述】:

过去两天我一直在尝试在 ClickHouse 中设置复制,但无论我尝试什么配置,最终都会出现相同的行为。

我能够在第一个节点上创建一个ReplicatedMergeTree 表并向其插入数据。然后我在第二个节点上创建一个副本。数据被复制,我可以看到它正在查询第二个节点。但是当我将数据插入第二个节点时,奇怪的行为就开始了。数据没有复制到第一个节点,它得到以下错误:

2017.11.14 11:16:43.464565 [ 30 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, 

和这个issue on GitHub很像。

当我重新启动第一个节点时,它能够加载插入到第二个节点的新数据并且似乎正在工作。但是再插入一些数据会再次出现同样的错误。

我最近尝试的设置:

按照tutorial,我有一个具有以下配置的三节点 Zookeeper 集群:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zoo2/data
clientPort=12181
server.1=10.201.1.4:2888:3888
server.2=0.0.0.0:12888:13888
server.3=10.201.1.4:22888:23888

ClickHouse 的 zookeeper 配置如下所示:

<?xml version="1.0"?>
<yandex>
    <zookeeper>
        <node>
            <host>10.201.1.4</host>
            <port>2181</port>
        </node>
        <node>
            <host>10.201.1.4</host>
            <port>12181</port>
        </node>
        <node>
            <host>10.201.1.4</host>
            <port>22181</port>
        </node>
    </zookeeper>
</yandex>

我像这样创建所有表:

CREATE TABLE t_r (
  id UInt32,
  d Date
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/t_r', '03', d, (d, id), 8192);

所有副本的唯一区别是副本 id '03' 进行了相应设置。

感谢您的建议!

【问题讨论】:

    标签: database replication clickhouse


    【解决方案1】:

    ReplicatedMergeTree('/clickhouse/tables/t_r', '03', d, (d, id), 8192);

    您应该为每个副本配置 zookeeper 唯一 ID。当前您使用'03',这是不正确的。 在教程中,{replica} 表示宏,在每个节点的 clickhouse 配置文件中配置。

    见 - https://clickhouse.yandex/docs/en/table_engines/replication.html#replicatedmergetree

    附言如需进一步帮助,请提供所有节点的配置。

    【讨论】:

    • 创建replicated 表时,我正在为每个 ClickHouse 服务器节点设置唯一的副本 ID。我对所有三个节点都使用或多或少的默认配置,每个节点都有一个单独的 data、tmp、log、errlog 目录。
    • 如我所见,在您的 create 语句中只有一个 id = '03'。 't_r' 也是 zookeeper 中节点的 id,对于分片应该是唯一的。如果您在不同的节点上运行不同的语句,请提供所有。
    • 命令创建表的唯一区别是根据节点号设置的副本ID。因为我使用的是单个分片机制,所以在所有节点上都设置了相同的 't_r' id。
    • @TomášRepík 帮助您并调查此问题对我来说非常有趣,使用配置会更容易。我正在尝试重现它。
    【解决方案2】:

    实际上,我自己解决了这个问题。感谢@egorlitvinenko,我再次检查了所有配置,我注意到我为所有三个节点设置了相同的interserver_http_port。如果所有节点都在不同的机器上运行,这不会有问题,但在我的测试场景中,它们并排运行在同一个操作系统上。

    【讨论】:

    • 谢谢你的评论也帮助了我:)
    猜你喜欢
    • 2019-06-22
    • 2019-11-16
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多