ClickHouse之数据复制

ClickHouse在集群中的数据分布是非常灵活的,例如可以将不同的拓扑结合在一个集群中,使用共享配置等管理多个逻辑集群。

分布式拓扑由两个主要属性定义,这两个主要属性对接两个主要的集群特征:可伸缩性和可靠性。

可伸缩性由数据分片或分段(shard/segment)保证。

可靠性是由数据复制(replication)保证。

数据分片和复制是完全独立的。ClickHouse天然支持分片,而复制严重依赖于Zookeeper,用于通知副本server状态变更。

ClickHouse可以在没有复制的情况下运行,但是即使现在没用到复制,提前配置好也是有意义的。

原因有二:

1.即使现在不使用复制,之后也有可能需要复制。

2.对复制表的插入由Zookeeper确认,跟踪最后100个插入块的校验和,以避免重复,如果检查到之前已经插入过同样的数据则会悄悄丢弃这部分的插入。

分布式表(Distributed tables):

分布式表用于使用一张表访问位于不同服务器的表(数据分片)。分布式表由“分布式”引擎定义,实际上是分片表上的接口或视图。你可以简单的理解为

它就是一个视图,并不存储数据,会从各个不同的shard中汇总数据。

这里的“集群”(cluster)指的是在ClickHouse配置文件中的集群拓扑定义,它定义了数据如何在不同节点间分布。

shard table必须存在并且在每个节点具有相同的结构。可以同时在一个系统中定义不同的拓扑结构,例如:

(segmented):每个集群节点都存储数据的一部分。

(segmented mirrored):两个(或更多)集群中的节点组成分片,每个数据段存储在分片的所有节点处。

(cross segmented):每个节点存储两个或更多的分片,每个分片存储在两个或更多的节点上。

(single server):数据位于单个服务器上,但可以通过分布式接口从每个节点访问。

我们来看两个节点上不同拓扑的两个简单例子。

例子

举个例子,假定你有6个nodes:

replcated:

1=2=3=4=5=6

every shard has the same copy of the table. Works for small tables

segmented:

1,2,3,4,5,6 (all different)

segmented_mirrored:

1=4,2=5,3=6 (or in a different order)

集群配置可以即时更新。所以如果新的节点被添加到分布式表中,不需要重新启动服务器。

在一个ClickHouse系统内部,可以使用不同的集群,例如一些表可以归类到没有复制的shard,另外一些归类到存在复制的shard等。另外,可以在“子集群”存储一些数据,但是可以通过全局分布表访问它们。

可以把分布式表视为一个接口。建议进行客户端分段,并将数据插入到ClickHouse节点上的本地分片表中。但是也可以直接插入到分布式表中。在这种情况下,ClickHouse在分片键上使用散列函数分配数据。

所以如果有一个单节点表需要被扩展到多个服务器,过程如下:

1.在新服务器上创建分片表

2.必要时重新分配数据(手动更好,尽管ClickHouse也支持重新分片)

3.定义群集配置并将其放置在每个ClickHouse节点上

4.创建一个分布式表来访问来自多个分片的数据

5.群集扩展更容易,因为它只需要在配置文件中添加新的服务器配置就可以了。

复制表:

复制表用于在不同的服务器上存储数据的多个副本。如上所述,复制依赖Zookeeper集群可用。Zookeper由配置文件中的部分引用:


它可以是一个或多个节点部分,每个主机可以解析为一个或多个IP。

为了创建复制表,应该使用Replicated *系列的表引擎。基本的语法如下:ENGINE = ReplicatedMergeTree('', '{replica}',, (sort columns), 8192)

不同的Zookeeper路径允许支持不同的复制拓扑。由于很难为每个节点的每个表创建一个自定义路径,因此ClickHouse提供了宏替代机制。宏在每个节点的配置文件中定义(为此目的有一个单独的文件是合理的,例如/etc/clickhouse-server/conf.d/macros.xml),并在大括号中引用。

对于复制表宏,在两个地方有用到:

1.Zookeeper中表的znode的路径

2.副本名称具有相同ZooKeeper路径的表将是特定数据分片的副本。插入操作不限定任何副本,ClickHouse接管复制以确保所有副本处于一致状态。一致性不强制插入,复制是异步的。

可以使用不同的Zookeper路径模拟不同的复制拓扑。例如,宏配置文件可能如下所示:


在这个例子中定义了3个宏:

{cluster} - ClickHouse集群的昵称,用于区分不同集群之间的数据。

{分片} - 分片号或符号引用

{副本} - 副本的名称通常是主机名

来看一些设置复制表的例子:

不可变维度(单个节点上保存完整副本)

ENGINE = ReplicatedMergeTree('/clickhouse/{cluster}/tables/', '{replica}',, (sort columns), 8192)

可变维度(单个节点上保存完整副本)

ENGINE = ReplicatedReplacingMergeTree('/clickhouse/{cluster}/tables/', '{replica}',, (sort columns), 8192)

与前面的例子唯一不同的是'Replacing'替换掉'MergeTree',允许用主键替换数据。

分片表(每个节点都有一个数据子集)

ENGINE = ReplicatedMergeTree('/clickhouse/{cluster}/tables//{shard}', '{replica}',, (sort columns), 8192)

正如你所看到的,设置复制需要首先创建带副本的表。所以建立系统时先考虑它是有意义的。配置完成后,可以在配置级别上执行增加或替换副本,增加复制因子等维护操作。

Plus:

四种复制模式:

非复制表,internal_replication=false。插入到分布式表中的数据被插入到两个本地表中,如果在插入期间没有问题,则两个本地表上的数据保持同步。我们称之为“穷人的复制”,因为复制在网络出现问题的情况下容易发生分歧,没有一个简单的方法来确定哪一个是正确的复制。

复制表,internal_replication=true。插入到分布式表中的数据仅插入到其中一个本地表中,但通过复制机制传输到另一个主机上的表中。因此两个本地表上的数据保持同步。这是推荐的配置。

非复制表,internal_replication=true。数据只被插入到一个本地表中,但没有任何机制可以将它转移到另一个表中。因此,在不同主机上的本地表看到了不同的数据,查询分布式表时会出现非预期的数据。显然,这是配置ClickHouse集群的一种不正确的方法。

复制表,internal_replication=false。数据被插入到两个本地表中,但同时复制表的机制保证重复数据会被删除。数据会从插入的第一个节点复制到其它的节点。其它节点拿到数据后如果发现数据重复,数据会被丢弃。这种情况下,虽然复制保持同步,没有错误发生。但由于不断的重复复制流,会导致写入性能明显的下降。所以这种配置实际应该是避免的,应该使用配置2。

FAQ:

1.distributed表依赖Zookeeper吗?

ClickHouse的复制依赖Zookeeper。非复制的distributed表不要Zookeeper。所以其实可以创建一个distributed表,既不需要复制,也不需要依赖Zookeeper。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 分布式系统面临的第一个问题就是数据分布,即将数据均匀地分布到多个存储节点。另外,为了保证可靠性和可用性,需要将数据...
    olostin阅读 4,426评论 2 26
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Druid 是一个为在大数据集之上做实时统计分析而设计的开源数据存储。这个系统集合了一个面向列存储的层,一个分布式...
    曹振华阅读 8,379评论 1 24
  • 首席工程师揭秘:LinkedIn大数据后台是如何运作的1http://mp.weixin.qq.com/s?__b...
    葡萄喃喃呓语阅读 2,136评论 0 7
  • 只是去实习之前的随笔,没想到起了个这么消极的标题。 来学校半个月了,好多该见的人还没见,该做的事情还没做,该来的人...
    JeanR阅读 287评论 0 0