Clickhouse原理与应用实践(五)副本与分片

1、概述

  • 下图中N1和N2内容不同,则N1 N2互为分片。如果内容相同,则互为副本。
分片与副本

2、数据副本

  • 只有使用了ReplicatedMergeTree复制表系列引擎,才能应用副本能力。
  • ReplicatedMergeTree增加了Zookeeper部分,会进一步在ZooKeeper内创建一系列的监听节点,并以此实现多个实例之间的通信。
  • ZooKeeper不会涉及表数据传输。
ReplicatedMergeTree

2.1 副本的特定

  • 副本是定义在表级别的
  • 多主架构
  • Block数据块是数据写入的基本定远,并且具有写入的原子性和唯一性。会计算Hash信息并记录,通过Hash摘要对比是否唯一。

2.2 副本定义形式

ENGINE = ReplicatedMergeTree('zk_path', 'replica_name')

  • 通常的zk_path命名 /clickhouse/tables/{shard}/table_name
  • zk_path用于指定在ZK中创建的数据表的路径
  • 对于zk_path,同一张数据表的同一个分片的不同副本应该定义相同的路径。
  • 对于replica_name,同一张数据表的同一个分片的不同副本应该定义不同名称。
命名的例子

3、ReplicatedMergeTree

3.1 数据结构

  • 大量运用ZooKeeper能力,实现副本之间协同。

ZooKeeper内的节点结构

  • 元数据
    /metadata
    /columns
    /replicas
  • 判断标识
    /leader_election
    /blocks hash摘要
    /block_numbers
    /quorum 至少有quorum数量副本写入成功后才算写入成功
  • 操作日志
    /log
    /mutations ALTER DELTE ALTER UPDATE等操作的记录
    /replicas/{replica_name}/*

Entry日志多项数据结构

  • /log /mutations 是分发操作指令的信息通道,发送指令的方式是为这些父节点添加子节点。
  • 添加的子节点在Clickhouse中被统一抽象为Entry对象,具体实体由LogEntry和MutationEntry对象承载。

3.2 副本协同的核心流程

INSERT

INSERT流程
  • 由执行了INSERT操作的副本向/log节点推送操作日志。
  • 副本会一直监听/log节点变化,拉取LogEntry,将其转为任务对象放至队列。
  • 基于/queue队列开始执行任务,会选择一个远端副本作为数据的下载来源。选取拥有最大log_pointer的,并且/queue子节点数量最少的。然后建立起连接开始下载。

MERGE

  • 无论MERGE操作从哪个副本发起,其合并计划都会交由主副本来制定。
MERGE过程

MUTATION

  • 也是由主节点来制定计划

ALTER

  • 修改ZK内的共享元数据节点。
    /metadata /columns
ALTER

4、数据分片

  • ClickHouse中的每个服务节点都称为一个shard
  • ClickHouse数据分片需要结合Distributed表引擎一同使用,使得查询、写入能够进行路由。
  • Distributed表引擎本身不存储任何数据,知识作为分布式表的一层透明代理。

4.1 基于集群实现分布式DDL

CREATE/DROP/RENAME/ALTER TABLE ON CLUSTER cluster_name

数据结构

  • 默认分布式DDL在ZK内使用的根路径为/clickhouse/task_queue/ddl
  • /query-[seq]/active /query-[seq]/finished
  • DDLLogEntry日志对象数据中包含了 query、hosts、initiator

分布式DDL执行流程

  • 谁执行谁负责推送
  • 拉取日志并执行
  • 步骤1执行后,客户端会阻塞180秒,等待所有host执行完毕。
分布式DDL执行

5、Distributed原理解析

  • 由两部分组成,本地表和分布式表,分布式表以all后缀命名。
  • 采用读时检查,如果它们表结构不兼容,只有在查询时才抛出错误。

5.1 定义形式

ENGINE = Distributed(cluster, database, table [,shaeding_key])

CREATE TABLE test_shard_2_all ON CLUSTER sharding_simple ()
ENGINE = Distributed(sharding_simple, defalult, test_shard_2_local, rand())
  • cluster 集群名称
  • sharding_key 分片键,选填参数
读取模式
  • Distributed表不支持任何MUTATION类型操作

5.2 分片规则

  • 集群配置的分片权重,权重越大,写入数据越多
  • slot 数量等于所有分片的权重之和
  • 选择函数,slot = shard_value % sum_weight

5.3 写入流程

  • 在第一个分片节点写入本地分片数据
  • 建立远端连接,准备发送远端数据分片
  • 发送数据
  • 远端分片写入本地
  • 第一个分片确认完成写入
写入流程

副本写入

  • 可以用Distributed复制,也可以依赖ReplicatedgeTree
副本写入

5.4 查询过程

  • 多副本路由:randon\nearest_hostname(错误最少)\in_order(错误最少中的按定义逐个选择)\first_or_random 四种方式

  • 分布式查询是在本地查之后union的结果

分布式查询执行计划

使用Global优化分布式子查询

  • 使用本地表的问题
SELECT uniq(id) FROM test_query_all WHERE repo = 100 AND id IN (SELECT id FROM test_query_local WHERE repo = 200)
  • 扫的本地表里刚好没有这个数据,有希望在全局里找。
问题1
  • 使用分布式表又会有查询放大的问题,每次扫all都是全局广播,就会变成指数增长
SELECT uniq(id) FROM test_query_all WEHRE repo = 100 AND id IN (SELECT id FROM test_query_all WHERE repo = 200)
问题2
  • 所以有一个GLOBAL关键字,可以将中间过程缓存
GLOBAL JOIN
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容