clickhouse读写分离模式 -读分布式表写本地表

本文沿着上一篇文章clickhouse 副本与分片继续讨论如何对副本与分片进行读写,简单回顾下:我们组建了四个几点的集群,其中分片1由10.100.0.1和10.100.0.2节点组成,互为副本,分片2由10.100.0.3和10.100.0.4节点组成,互为副本.

读写分布式表的缺点:
我们知道如果通过读写都是通过分布式表进行,那么对于写操作来说,会有写放大的问题,也就是比如我们通过节点10.100.0.1的分布式表default.distribute_table写入分片1和分片2的数据,那么对于分片1的数据,10.100.0.1节点会把数据直接写入到10.100.0.1的本地表default.local_table中,而对于分片2的数据,分布式表会先把这些数据写入到10.100.0.1节点的临时目录中,然后在和10.100.0.3这个属于分片2节点的服务器创建tcp连接,把属于分片2的临时目录中的数据传送给10.100.0.3节点,这个过程中写入10.100.0.1的临时目录的数据就属于写放大,会大量消耗cpu和磁盘等资源

改进措施:
针对写分布式表的写放大问题,我们有没有方式来避开?答案是有,既然通过分布式表进行读取查询操作很方便,那么我们就只利用分布式表进行数据读取操作,这样我们依然可以利用分布式表进行读负载均衡,至于写入操作,我们可以通过自定义写的方式,具体如下:
客户端自定义写的逻辑,也就是说客户端决定写入哪个节点的本地表,而不是写入到分布式表中,当然此时我们可以把10.100.0.1和10.100.0.2组成一个后端组,通过比如域名a.domain.com的nginx进行负载均衡,同理我们也会把10.100.0.3和10.100.0.4组成一个后端组,通过b.domain.com的nginx域名进行负载均衡,当通过客户端分片好数据之后(属于分片1或者分片2),就通过域名a.domain.com(如果是分片1的数据) 或者域名b.domain.com(如果是分片2的数据)把数据写入到本地表default.local_table中,在这个过程中,分布式表default.distribute_table是不参与的.

你可能感兴趣的:(clickhouse,分布式,大数据)