clickhouse实现数据分片的方式主要有以下两种:

第一种: 客户端分片
假设有服务器节点A和B,A和B上面分别创建了本地mergetree表,这两个表的表结构一模一样,只是数据不同,使用这种分片方式时,客户端完全控制分片逻辑,比如客户端决定数据D应该写入哪个节点中,查询数据的时候由客户端分别向节点A和B的本地表发送请求,然后把请求合并返回给应用端,这里如何写数据和读数据的逻辑完全由客户端控制。这里需要考虑到比如A节点挂了之后,客户端要能感知到并使用比如A1节点代替,这里A和A1节点可以使用ReplicateMergeTree表的方式进行数据同步,A和A1的前面可以部署一个类似nginx的反向代理,这样当A节点 故障的时候就可以自动切换到A1节点了

第二种: clickhouse自带的分布式表
仍然是假设有服务器节点A和B,我们需要分别在A和B节点上创建mergetree本地表和分布式表,相当于每个节点都有一个分布式表和本地表,当往任何一个分布式表写数据时,假设往A节点的分布式表写数据,那么根据分布式表的数据分片规则,把属于A节点的数据写入A节点的本地表中,并把属于B节点的数据先放到A节点的本地临时磁盘目录中,然后A节点和B节点创建网络连接并通过网络连接把属于B的临时文件的内容传送给B节点,B节点接收到数据后会把数据插入到B的mergetree本地表中,从这个写入过程中我们可以看到,分布式表的写入需要A的临时磁盘存放数据,以及还需要网络连接来发送临时磁盘文件的数据,相比于第一种客户端分片的方式,额外消耗了磁盘和网络带宽。 当对节点A的分布式表进行数据读取时,分布式表会分别把请求发送给A节点的本地表和远程B节点的本地表,这个过程是并行的,然后分布式表会合并A的本地表和B的本地表的返回结果并返回给应用

附创建分布式表的方式:
create table distributeTable(id int32, name string) engine = Distributed(‘集群名称’,‘本地数据库’,‘代理的本地表’, rand())