Clickhouse原理與應用實踐(五)副本與分片

1怔蚌、概述

  • 下圖中N1和N2內(nèi)容不同桦踊,則N1 N2互為分片籍胯。如果內(nèi)容相同杖狼,則互為副本蝶涩。
分片與副本

2绿聘、數(shù)據(jù)副本

  • 只有使用了ReplicatedMergeTree復制表系列引擎熄攘,才能應用副本能力挪圾。
  • ReplicatedMergeTree增加了Zookeeper部分哲思,會進一步在ZooKeeper內(nèi)創(chuàng)建一系列的監(jiān)聽節(jié)點,并以此實現(xiàn)多個實例之間的通信也殖。
  • ZooKeeper不會涉及表數(shù)據(jù)傳輸。
ReplicatedMergeTree

2.1 副本的特定

  • 副本是定義在表級別的
  • 多主架構
  • Block數(shù)據(jù)塊是數(shù)據(jù)寫入的基本定遠己儒,并且具有寫入的原子性和唯一性捆毫。會計算Hash信息并記錄绩卤,通過Hash摘要對比是否唯一。

2.2 副本定義形式

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

  • 通常的zk_path命名 /clickhouse/tables/{shard}/table_name
  • zk_path用于指定在ZK中創(chuàng)建的數(shù)據(jù)表的路徑
  • 對于zk_path濒憋,同一張數(shù)據(jù)表的同一個分片的不同副本應該定義相同的路徑何暇。
  • 對于replica_name,同一張數(shù)據(jù)表的同一個分片的不同副本應該定義不同名稱凛驮。
命名的例子

3裆站、ReplicatedMergeTree

3.1 數(shù)據(jù)結構

  • 大量運用ZooKeeper能力,實現(xiàn)副本之間協(xié)同黔夭。

ZooKeeper內(nèi)的節(jié)點結構

  • 元數(shù)據(jù)
    /metadata
    /columns
    /replicas
  • 判斷標識
    /leader_election
    /blocks hash摘要
    /block_numbers
    /quorum 至少有quorum數(shù)量副本寫入成功后才算寫入成功
  • 操作日志
    /log
    /mutations ALTER DELTE ALTER UPDATE等操作的記錄
    /replicas/{replica_name}/*

Entry日志多項數(shù)據(jù)結構

  • /log /mutations 是分發(fā)操作指令的信息通道宏胯,發(fā)送指令的方式是為這些父節(jié)點添加子節(jié)點。
  • 添加的子節(jié)點在Clickhouse中被統(tǒng)一抽象為Entry對象本姥,具體實體由LogEntry和MutationEntry對象承載肩袍。

3.2 副本協(xié)同的核心流程

INSERT

INSERT流程
  • 由執(zhí)行了INSERT操作的副本向/log節(jié)點推送操作日志婚惫。
  • 副本會一直監(jiān)聽/log節(jié)點變化辰妙,拉取LogEntry鹰祸,將其轉為任務對象放至隊列密浑。
  • 基于/queue隊列開始執(zhí)行任務蛙婴,會選擇一個遠端副本作為數(shù)據(jù)的下載來源。選取擁有最大log_pointer的尔破,并且/queue子節(jié)點數(shù)量最少的浇衬。然后建立起連接開始下載。

MERGE

  • 無論MERGE操作從哪個副本發(fā)起,其合并計劃都會交由主副本來制定蚁阳。
MERGE過程

MUTATION

  • 也是由主節(jié)點來制定計劃

ALTER

  • 修改ZK內(nèi)的共享元數(shù)據(jù)節(jié)點。
    /metadata /columns
ALTER

4、數(shù)據(jù)分片

  • ClickHouse中的每個服務節(jié)點都稱為一個shard
  • ClickHouse數(shù)據(jù)分片需要結合Distributed表引擎一同使用铝条,使得查詢贤壁、寫入能夠進行路由莹妒。
  • Distributed表引擎本身不存儲任何數(shù)據(jù),知識作為分布式表的一層透明代理迷扇。

4.1 基于集群實現(xiàn)分布式DDL

CREATE/DROP/RENAME/ALTER TABLE ON CLUSTER cluster_name

數(shù)據(jù)結構

  • 默認分布式DDL在ZK內(nèi)使用的根路徑為/clickhouse/task_queue/ddl
  • /query-[seq]/active /query-[seq]/finished
  • DDLLogEntry日志對象數(shù)據(jù)中包含了 query厨内、hosts、initiator

分布式DDL執(zhí)行流程

  • 誰執(zhí)行誰負責推送
  • 拉取日志并執(zhí)行
  • 步驟1執(zhí)行后获印,客戶端會阻塞180秒,等待所有host執(zhí)行完畢街州。
分布式DDL執(zhí)行

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 分片鍵,選填參數(shù)
讀取模式
  • Distributed表不支持任何MUTATION類型操作

5.2 分片規(guī)則

  • 集群配置的分片權重趟紊,權重越大氮双,寫入數(shù)據(jù)越多
  • slot 數(shù)量等于所有分片的權重之和
  • 選擇函數(shù),slot = shard_value % sum_weight

5.3 寫入流程

  • 在第一個分片節(jié)點寫入本地分片數(shù)據(jù)
  • 建立遠端連接霎匈,準備發(fā)送遠端數(shù)據(jù)分片
  • 發(fā)送數(shù)據(jù)
  • 遠端分片寫入本地
  • 第一個分片確認完成寫入
寫入流程

副本寫入

  • 可以用Distributed復制戴差,也可以依賴ReplicatedgeTree
副本寫入

5.4 查詢過程

  • 多副本路由:randon\nearest_hostname(錯誤最少)\in_order(錯誤最少中的按定義逐個選擇)\first_or_random 四種方式

  • 分布式查詢是在本地查之后union的結果

分布式查詢執(zhí)行計劃

使用Global優(yōu)化分布式子查詢

  • 使用本地表的問題
SELECT uniq(id) FROM test_query_all WHERE repo = 100 AND id IN (SELECT id FROM test_query_local WHERE repo = 200)
  • 掃的本地表里剛好沒有這個數(shù)據(jù),有希望在全局里找铛嘱。
問題1
  • 使用分布式表又會有查詢放大的問題暖释,每次掃all都是全局廣播,就會變成指數(shù)增長
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
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末球匕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帖烘,更是在濱河造成了極大的恐慌亮曹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乾忱,居然都是意外死亡讥珍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門窄瘟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷佃,“玉大人,你說我怎么就攤上這事蹄葱∈弦澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵图云,是天一觀的道長惯悠。 經(jīng)常有香客問我,道長竣况,這世上最難降的妖魔是什么克婶? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮丹泉,結果婚禮上情萤,老公的妹妹穿的比我還像新娘。我一直安慰自己摹恨,他們只是感情好筋岛,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晒哄,像睡著了一般睁宰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寝凌,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天柒傻,我揣著相機與錄音,去河邊找鬼硫兰。 笑死诅愚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的劫映。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刹前,長吁一口氣:“原來是場噩夢啊……” “哼泳赋!你這毒婦竟也來了?” 一聲冷哼從身側響起喇喉,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祖今,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體千诬,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耍目,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徐绑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邪驮。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖傲茄,靈堂內(nèi)的尸體忽然破棺而出毅访,到底是詐尸還是另有隱情,我是刑警寧澤盘榨,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布喻粹,位于F島的核電站,受9級特大地震影響草巡,放射性物質(zhì)發(fā)生泄漏守呜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一山憨、第九天 我趴在偏房一處隱蔽的房頂上張望弛饭。 院中可真熱鬧,春花似錦萍歉、人聲如沸侣颂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憔晒。三九已至,卻和暖如春蔑舞,著一層夾襖步出監(jiān)牢的瞬間拒担,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工攻询, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留从撼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓钧栖,卻偏偏與公主長得像低零,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拯杠,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容