111
社区成员
发帖
与我相关
我的任务
分享分布式表实际上是一种view,映射到ClickHouse集群的本地表。 从分布式表中执行SELECT查询会使用集群所有分片的资源。 您可以为多个集群指定configs,并创建多个分布式表,为不同的集群提供视图。
具有三个分片,每个分片一个副本的集群的示例配置:
<remote_servers> <perftest_3shards_1replicas> <shard> <replica> <host>example-perftest01j.yandex.ru</host> <port>9000</port> </replica> </shard> <shard> <replica> <host>example-perftest02j.yandex.ru</host> <port>9000</port> </replica> </shard> <shard> <replica> <host>example-perftest03j.yandex.ru</host> <port>9000</port> </replica> </shard> </perftest_3shards_1replicas> </remote_servers>
为了进一步演示,让我们使用和创建hits_v1表相同的CREATE TABLE语句创建一个新的本地表,但表名不同:
CREATE TABLE tutorial.hits_local (...) ENGINE = MergeTree() ...
创建提供集群本地表视图的分布式表:
CREATE TABLE tutorial.hits_all AS tutorial.hits_local ENGINE = Distributed(perftest_3shards_1replicas, tutorial, hits_local, rand());
常见的做法是在集群的所有计算机上创建类似的分布式表。 它允许在群集的任何计算机上运行分布式查询。 还有一个替代选项可以使用以下方法为给定的SELECT查询创建临时分布式表远程表功能。
让我们运行INSERT SELECT将该表传播到多个服务器。
INSERT INTO tutorial.hits_all SELECT * FROM tutorial.hits_v1;
注意:
这种方法不适合大型表的分片。 有一个单独的工具 clickhouse-copier 这可以重新分片任意大表。
正如您所期望的那样,如果计算量大的查询使用3台服务器而不是一个,则运行速度快N倍。
在这种情况下,我们使用了具有3个分片的集群,每个分片都包含一个副本。
为了在生产环境中提供弹性,我们建议每个分片应包含分布在多个可用区或数据中心(或至少机架)之间的2-3个副本。 请注意,ClickHouse支持无限数量的副本。
包含三个副本的一个分片集群的示例配置:
<remote_servers> ... <perftest_1shards_3replicas> <shard> <replica> <host>example-perftest01j.yandex.ru</host> <port>9000</port> </replica> <replica> <host>example-perftest02j.yandex.ru</host> <port>9000</port> </replica> <replica> <host>example-perftest03j.yandex.ru</host> <port>9000</port> </replica> </shard> </perftest_1shards_3replicas> </remote_servers>
启用本机复制Zookeeper是必需的。 ClickHouse负责所有副本的数据一致性,并在失败后自动运行恢复过程。建议将ZooKeeper集群部署在单独的服务器上(其中没有其他进程,包括运行的ClickHouse)。
注意
ZooKeeper不是一个严格的要求:在某些简单的情况下,您可以通过将数据写入应用程序代码中的所有副本来复制数据。 这种方法是不建议的,在这种情况下,ClickHouse将无法保证所有副本上的数据一致性。 因此需要由您的应用来保证这一点。
ZooKeeper位置在配置文件中指定:
<zookeeper> <node> <host>zoo01.yandex.ru</host> <port>2181</port> </node> <node> <host>zoo02.yandex.ru</host> <port>2181</port> </node> <node> <host>zoo03.yandex.ru</host> <port>2181</port> </node> </zookeeper>
此外,我们需要设置宏来识别每个用于创建表的分片和副本:
<macros> <shard>01</shard> <replica>01</replica> </macros>
如果在创建复制表时没有副本,则会实例化新的第一个副本。 如果已有实时副本,则新副本将克隆现有副本中的数据。 您可以选择首先创建所有复制的表,然后向其中插入数据。 另一种选择是创建一些副本,并在数据插入之后或期间添加其他副本。
CREATE TABLE tutorial.hits_replica (...) ENGINE = ReplcatedMergeTree( '/clickhouse_perftest/tables/{shard}/hits', '{replica}' ) ...
在这里,我们使用ReplicatedMergeTree表引擎。 在参数中,我们指定包含分片和副本标识符的ZooKeeper路径。
INSERT INTO tutorial.hits_replica SELECT * FROM tutorial.hits_local;
复制在多主机模式下运行。数据可以加载到任何副本中,然后系统自动将其与其他实例同步。复制是异步的,因此在给定时刻,并非所有副本都可能包含最近插入的数据。至少应该有一个副本允许数据摄入。另一些则会在重新激活后同步数据并修复一致性。请注意,这种方法允许最近插入的数据丢失的可能性很低。