Clickhouse 集群:数据未复制
clickhouse cluster : data not replicated
我有一个包含 2 个节点的集群用于测试。
1 个分片和 2 个副本。
zookeeper 集群中的 3 个节点
<remote_servers>
<ch_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch1</host>
<port>9000</port>
</replica>
<replica>
<host>ch2</host>
<port>9000</port>
</replica>
</shard>
</ch_cluster>
</remote_servers>
ch1 中的宏:
<macros>
<shard>shard_01</shard>
<replica>replica-01</replica>
</macros>
ch2 中的宏:
<macros>
<shard>shard_01</shard>
<replica>replica-02</replica>
</macros>
动物园管理员配置:
<zookeeper>
<node>
<host>zoo1</host>
<port>2181</port>
</node>
<node>
<host>zoo2</host>
<port>2181</port>
</node>
<node>
<host>zoo3</host>
<port>2181</port>
</node>
</zookeeper>
我创造了第一个table
CREATE TABLE IF NOT EXISTS test.hits_local ON CLUSTER ch_cluster
(
`date` Datetime,
`user_id` String,
`pageviews` Int32
)
ENGINE = ReplicatedMergeTree('/clickhouse/ch_cluster/tables/{shard}/hits_local', '{replica}')
PARTITION BY toStartOfHour(date)
ORDER BY (date)
然后我创建一个分布式 table :
CREATE TABLE IF NOT EXISTS test.hits ON CLUSTER 'ch_cluster'
AS test.hits_local
(
`date` Datetime,
`user_id` String,
`pageviews` Int32
)
ENGINE = Distributed('ch_cluster', 'test', 'hits_local')
然后我在 test.hits_local table 中插入数据 ch1
当 select 来自 test.hits_local 的数据在 ch2 中没有数据
然后我尝试select从test.hits分发table到ch2数据5-6 分钟后出现
但 test.hits_local 在 ch2
中没有数据
我的问题是数据复制到 ch2 时?
谁负责将数据复制到另一个节点?它是动物园管理员还是我应该将数据插入到 ch1 和 ch2 的 tables 中?
我应该将 <internal_replication>trueinternal_replication> 更改为假 ?
是否需要将数据复制到ch2中的test.hits_local?
谢谢。
should i change <internal_replication>true</internal_replication> to false ?
不,你不应该。如果你使用 ReplicatedMergeTree internal_replication 必须是 true.
复制由 ReplicatedMergeTree table 引擎在内部完成。
副本使用它们的主机名和端口=9009 进行通信。
检查 system.replication_queue table 是否有错误。
很可能是节点“ch1”在 Zookeeper 中宣布了自己的主机名,即“localhost”。
所以第二个节点“ch2”无法访问 localhost:9009 或其他东西。
您可以在 clickhouse-server.log 或 system.replication_queue 中找到此类问题(它有一列有错误)。
即使在非常高负载的设置中,复制延迟通常也小于 2 秒。
我有一个包含 2 个节点的集群用于测试。 1 个分片和 2 个副本。 zookeeper 集群中的 3 个节点
<remote_servers>
<ch_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch1</host>
<port>9000</port>
</replica>
<replica>
<host>ch2</host>
<port>9000</port>
</replica>
</shard>
</ch_cluster>
</remote_servers>
ch1 中的宏:
<macros>
<shard>shard_01</shard>
<replica>replica-01</replica>
</macros>
ch2 中的宏:
<macros>
<shard>shard_01</shard>
<replica>replica-02</replica>
</macros>
动物园管理员配置:
<zookeeper>
<node>
<host>zoo1</host>
<port>2181</port>
</node>
<node>
<host>zoo2</host>
<port>2181</port>
</node>
<node>
<host>zoo3</host>
<port>2181</port>
</node>
</zookeeper>
我创造了第一个table
CREATE TABLE IF NOT EXISTS test.hits_local ON CLUSTER ch_cluster
(
`date` Datetime,
`user_id` String,
`pageviews` Int32
)
ENGINE = ReplicatedMergeTree('/clickhouse/ch_cluster/tables/{shard}/hits_local', '{replica}')
PARTITION BY toStartOfHour(date)
ORDER BY (date)
然后我创建一个分布式 table :
CREATE TABLE IF NOT EXISTS test.hits ON CLUSTER 'ch_cluster'
AS test.hits_local
(
`date` Datetime,
`user_id` String,
`pageviews` Int32
)
ENGINE = Distributed('ch_cluster', 'test', 'hits_local')
然后我在 test.hits_local table 中插入数据 ch1 当 select 来自 test.hits_local 的数据在 ch2 中没有数据
然后我尝试select从test.hits分发table到ch2数据5-6 分钟后出现 但 test.hits_local 在 ch2
中没有数据我的问题是数据复制到 ch2 时? 谁负责将数据复制到另一个节点?它是动物园管理员还是我应该将数据插入到 ch1 和 ch2 的 tables 中? 我应该将 <internal_replication>trueinternal_replication> 更改为假 ?
是否需要将数据复制到ch2中的test.hits_local?
谢谢。
should i change <internal_replication>true</internal_replication> to false ?
不,你不应该。如果你使用 ReplicatedMergeTree internal_replication 必须是 true.
复制由 ReplicatedMergeTree table 引擎在内部完成。
副本使用它们的主机名和端口=9009 进行通信。 检查 system.replication_queue table 是否有错误。
很可能是节点“ch1”在 Zookeeper 中宣布了自己的主机名,即“localhost”。 所以第二个节点“ch2”无法访问 localhost:9009 或其他东西。 您可以在 clickhouse-server.log 或 system.replication_queue 中找到此类问题(它有一列有错误)。
即使在非常高负载的设置中,复制延迟通常也小于 2 秒。