1.集群模式
单分片多副本模式MergeTree+distribute
特点
集群中只有一个分片,多个节点组成此分片的副本,每个节点保留全量的数据,通过在创建Distributed表不声明分片键实现全量写入
数据流向
读:由于每个节点都拥有全量数据,因此读请求通过负载均衡到达任意一个节点的本地表或分布式表(由于是单分片,distributed只需要根据负载均衡算法选择某个副本的本地表后查询即可,不需要查询其他分片数据)都可查询到数据
写:写请求通过负载均衡到某个节点的distributed表,经过distributed向所有节点里的本地表写入数据。
优缺点
优点:由于每个节点都有全量数据,因此容灾性非常好,只剩一台节点也能对外提供查询,在数据量不是极大的情况下单节点查询性能也还行。
缺点:
1.写的时候由于是往所有节点进行写入,若某些节点出错了,容易导致整个集群节点的数据不一致现象
2.由于数据需要分别写入所有节点,因此写的性能较差
3.没有利用到分布式存储分片和分布式计算性能,存储容易达到瓶颈,计算在极大数据量时也容易有瓶颈
多分片单副本模式mergeTree+distribute
特点
集群中多个分片,每个分片只有一个节点,没有副本。
数据流向
读:读请求通过负载均衡到达任意一个节点的分布式表distributed,distributed根据查询的语句进行分片处理,往每个分片对应的目标节点(因为没有副本,所以跳过了分片后的负载均衡步骤)发送查询请求,节点收到查询请求后直接查询本地表后返回数据给请求节点做合并。
写:写请求通过负载均衡到某个节点的distributed表,经过distributed对查询语句分片处理后,往符合分片策略的目标节点(一个shard只有一个目标节点)里的本地表写入数据。
优缺点
优点:
1.由于做了数据分片,因此没有冗余,且由于单分片没有副本,一个分片只需写一份,因此在写入性能是最高的。
2.由于做了数据分片,因此读请求时能充分利用分布式集群的计算性能,查询速度较快。
缺点:
1.由于数据没有副本,可靠性极低,有极大的数据丢失风险。
多分片多副本模式mergeTree+distribute
特点
在上一个方案的基础上增加了副本,集群中多个分片多副本。
数据流向
读:读请求通过负载均衡到达任意一个节点的分布式表distributed,distributed准备往每个分片发送查询请求,但此时由于每个分片都有副本,因此还需要从分片的副本中负载均衡算法选取合适的副本节点发送查询请求,节点收到查询请求后直接查询本地表后返回数据给请求节点做合并。
写:写请求通过负载均衡到某个节点的distributed表,经过distributed对写入的数据进行分片处理,由于分片有副本,因此需要往符合分片策略的所有副本节点里的本地表写入数据。
优缺点
优点:
1.由于做了数据分片,没有冗余,数据存储能力增强了;由于多了副本做数据备份,因此可靠性也增加了。
2.由于做了数据分片,因此读请求时能充分利用分布式集群的计算性能,查询速度较快
缺点:
1.distributed在处理写请求时,除了写分片之外,还要负责分片的所有副本节点的写入,对distributed来说压力比较大,容易造成写入瓶颈。
2.如果某台节点挂了且不可恢复问题,由于没有自动同步机制,虽然有副本备份,但恢复需要手工操作,略为繁琐。
多分片多副本ReplicatedMergeTree+distribute
特点
集群拥有多分片多副本,副本之间的同步使用zookeeper实现,写入不再通过distributed进行写入,而是通过负载均衡直接写入节点。
数据流向
读:读请求通过负载均衡到达任意一个节点的分布式表distributed,distributed准备往每个分片发送请求,但由于每个分片都有副本,因此还需要从分片的副本中负载均衡算法选取合适的副本节点才可以发送查询请求,节点收到查询请求后直接查询本地表后返回数据给请求节点做合并。
写:写请求通过负载均衡到所属某个分片的节点直接写入本地表,然后该节点的本地表通过replicatedMergeTree副本同步机制同步到同个分片的其他所有副本中。
优缺点
优点
1.由于做了数据分片,没有冗余,数据存储能力增强了;副本做数据备份,因此可靠性也增加了。
2.由于做了数据分片,因此读请求时能充分利用分布式集群的计算性能,查询速度较快。
3.写入时不经过distributed,而是通过负载均衡直接写入指定分片的某节点,数据只写一份,因此写入速度相比上个方案提高了。
缺点:
1.引入了zookeeper,在超大数据量写入后,副本之间对写入的同步可能会存在问题。
2.负载均衡策略需要脱离clickhouse集群在客户端或者独立的负载均衡上实现。