无法使用 Zookeeper 在 ClickHouse 中设置复制
Unable to setup replication in ClickHouse using Zookeeper
过去两天我一直在尝试在 ClickHouse 中设置复制,但无论我尝试什么配置,我最终都会遇到相同的行为。
我能够在第一个节点上创建 ReplicatedMergeTree
table 并向其插入数据。然后我在第二个节点上创建一个副本。数据被复制,我可以看到它查询第二个节点。但是当我将数据插入第二个节点时,奇怪的行为开始了。数据未复制到第一个节点,出现以下错误:
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>
我这样创建所有 table:
CREATE TABLE t_r (
id UInt32,
d Date
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/t_r', '03', d, (d, id), 8192);
所有副本的唯一区别是相应设置的副本 ID '03'
。
感谢任何建议!
ReplicatedMergeTree('/clickhouse/tables/t_r', '03', d, (d, id), 8192);
您应该为每个副本配置zookeeper 唯一标识。目前您使用“03”,这是不正确的。
在教程中,{replica} 表示宏,在每个节点的 clickhouse 配置文件中配置。
参见 - https://clickhouse.yandex/docs/en/table_engines/replication.html#replicatedmergetree
p.s。如需进一步帮助,请提供所有节点的配置。
其实我自己想通了这个问题。感谢@egorlitvinenko,我再次检查了所有配置,我注意到我为所有三个节点设置了相同的 interserver_http_port
。如果所有节点 运行 都在不同的机器上,那不会有问题,但在我的测试场景中,它们 运行 并排托管在同一台 OS.
上
过去两天我一直在尝试在 ClickHouse 中设置复制,但无论我尝试什么配置,我最终都会遇到相同的行为。
我能够在第一个节点上创建 ReplicatedMergeTree
table 并向其插入数据。然后我在第二个节点上创建一个副本。数据被复制,我可以看到它查询第二个节点。但是当我将数据插入第二个节点时,奇怪的行为开始了。数据未复制到第一个节点,出现以下错误:
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>
我这样创建所有 table:
CREATE TABLE t_r (
id UInt32,
d Date
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/t_r', '03', d, (d, id), 8192);
所有副本的唯一区别是相应设置的副本 ID '03'
。
感谢任何建议!
ReplicatedMergeTree('/clickhouse/tables/t_r', '03', d, (d, id), 8192);
您应该为每个副本配置zookeeper 唯一标识。目前您使用“03”,这是不正确的。 在教程中,{replica} 表示宏,在每个节点的 clickhouse 配置文件中配置。
参见 - https://clickhouse.yandex/docs/en/table_engines/replication.html#replicatedmergetree
p.s。如需进一步帮助,请提供所有节点的配置。
其实我自己想通了这个问题。感谢@egorlitvinenko,我再次检查了所有配置,我注意到我为所有三个节点设置了相同的 interserver_http_port
。如果所有节点 运行 都在不同的机器上,那不会有问题,但在我的测试场景中,它们 运行 并排托管在同一台 OS.