clickhouse之分布式(distribute)

本文介绍了ClickHouse的Distributed引擎,它不存储数据但支持分布式查询。数据读取是并行的,利用各节点的索引。在分布式查询中,数据在各个节点上进行计算,如`GROUP BY`操作。集群配置、节点参数、负载均衡和数据写入策略也进行了详细说明,包括如何根据分片键进行数据分布和内部复制。此外,还讨论了数据同步和故障处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Distribute

   原文地址:https://clickhouse.yandex/docs/en/table_engines/distributed.html

  clickhouse的分布式引擎本身不存储数据,但是允许查询分布式查询。读取数据自动就是并行化的。在读取数据的时候,会使用在不同节点上的索引。分布式引擎接受参数:在配置文件中配置的集群的名字,在远端的数据库名字,在远端的表名,可选的分片数,例如:

Distributed(logs,default,hits[,sharding_key])

  数据会从名字叫做logs的集群上被读取,从各个节点上的default.hits这个表上,数据不仅仅被读取,还会在各个节点上进行计算,例如,对于一个group by操作,数据将会在各个节点上做聚合,聚合结果会被发送到请求的server节点上,数据会被进行更进一步的聚合。

 logs-集群的名字,被配置在配置文件里。

集群的配置文件如下:

<remote_servers>
    <logs>
        <shard>
            <!-- Optional. Shard weight when writing data. By default, 1. -->
            <weight>1</weight>
            <!-- Optional. Whether to write data to just one of the replicas. By default, false - write data to all of the replicas. -->
            <internal_replication>false</internal_replication>
            <replica>
                <host>example01-01-1</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>example01-01-2</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <weight>2</weight>
            <internal_replication>false</internal_replication>
            <replica>
                <host>example01-02-1</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>example01-02-2</host>
                <port>9000</port>
            </replica>
        </shard>
    </logs>
</remote_servers>

上面展示的是一个集群名字是logs的配置文件。包含了两个分片节点,每个节点有两个数据副本。分片服务器节点存储了不同的数据,每个副本存储了该节点上的所有的数据,用作备份,便于恢复数据。

  对于每一个节点,有很多参数:如host,port,user,password

  1.host 远程节点的地址,可以是主机名或者是ip地址

   2.port tcp端口用作节点之间的通讯。

   3.user  用于与其他节点通讯用的用户名,通常情况下 这个用户名默认是default,这个用户名必须有权限登陆其他节点。权限配置在users.xml里

   4.password  登陆其他节点的密码,通常情况下是空字符串

 当指定使用副本后,在读取数据的时候其中的一个副本会被选中,可以指定算法来平衡load压力,通过修改load_balancing setting

如果服务器节点间的连接没有建立,会在超时时间内进行一次尝试重连,如果连接失败了,下一个数据副本会被选中,依次类推到其他的副本,如果全部的副本都连接失败了,尝试重连还会不断进行,因此有个缺陷,就是说一个远程节点可能会接受连接,但是可能该节点无法工作或者很低效的工作。

  你可以在配置文件中配置多个集群。

  如果想看集群的列表,可以用system.cluster表。

   这个分布式引擎允许像使用本地服务器一样使用集群,然而,这个集群是不可扩展的,你必须在配置文件中写死这个集群中节点的数量。

  这些分布式的引擎集群创建是热加载的,不需要重启server,如果你查询了一个数据,该数据不在你指定的节点上,只需要使用remote表即可。

  有两种方式来写入数据到集群:

 1.指定哪些数据写入到哪些节点里

 2.通过一个节点写,数据分到不同的节点里,通过指定分片的key来分发数据。

每一个分片服务器都有自己的权重,默认情况下,这个权重是1,数据写入到每个分片服务器的数量跟这个权重有关,例如,如果有两个分片服务器,其中一个的权重是9,另一个是10,第一个节点会接收到9/19的rows里的parts 剩下的给另外一个。

  Each shard can have the ‘internal_replication’ parameter defined in the config file.

  数据分片函数可以是任意的函数或者是个数值,例如,你可以使用随机函数。 此处有个优化,如果说有join操作,可以按照join的key进行随机分片,这样数据会比较均匀,性能高,或者可以用哈希函数来做。

  数据写入是异步的,对于插入数据到集群的其他节点,数据先是写入到本地磁盘,然后在后台发送到其他分片服务器,如果想查看数据有没有同步完,可以检查下面的目录:/var/lib/clickhouse/data/database/table//  如果发送出去的数据节点有问题,会被记录到broken 子目录里 同时不会再次被使用到。需要人工处理

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值