国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Clickhouse分布式表引擎(Distributed)寫入核心原理解析

這篇具有很好參考價(jià)值的文章主要介紹了Clickhouse分布式表引擎(Distributed)寫入核心原理解析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Clickhouse分布式表引擎(Distributed)寫入核心原理解析

  • Clickhouse分布式表引擎(Distributed)寫入核心原理解析
  • Clickhouse分布式表引擎(Distributed)查詢核心原理解析

Distributed表引擎是分布式表的代名詞,它自身不存儲(chǔ)任何數(shù)據(jù),而是作為數(shù)據(jù)分片的透明代理,能夠自動(dòng)路由數(shù)據(jù)至集群中的各個(gè)節(jié)點(diǎn),所以Distributed表引擎需要和其他數(shù)據(jù)表引擎一起協(xié)同工作。

從實(shí)體表層面來看,一張分片表由兩部分組成:

  • 本地表:通常以_local為后綴進(jìn)行命名。本地表是承載數(shù)據(jù)的載體,可以使用非Distributed的任意表引擎,一張本地表對(duì)應(yīng)了一個(gè)數(shù)據(jù)分片。
  • 分布式表:通常以_dist為后綴進(jìn)行命名。分布式表只能使用Distributed表引擎,它與本地表形成一對(duì)多的映射關(guān)系,日后將通過分布式表代理操作多張本地表。

對(duì)于分布式表與本地表之間表結(jié)構(gòu)的一致性檢查,Distributed表引擎采用了讀時(shí)檢查的機(jī)制,這意味著如果它們的表結(jié)構(gòu)不兼容,只有在查詢時(shí)才會(huì)拋出錯(cuò)誤,而在創(chuàng)建表時(shí)并不會(huì)進(jìn)行檢查。

定義形式

Distributed表引擎的定義形式如下所示:

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

其中,各個(gè)參數(shù)的含義分別如下:

  • cluster:集群名稱,與集群配置中的自定義名稱相對(duì)應(yīng)。在對(duì)分布式表執(zhí)行寫入和查詢的過程中,它會(huì)使用集群的配置信息來找到相應(yīng)的host節(jié)點(diǎn)。
  • database和table:分別對(duì)應(yīng)數(shù)據(jù)庫和表的名稱,分布式表使用這組配置映射到本地表。
  • sharding_key:分片鍵,選填參數(shù)。在數(shù)據(jù)寫入的過程中,分布式表會(huì)依據(jù)分片鍵的規(guī)則,將數(shù)據(jù)分布到各個(gè)host節(jié)點(diǎn)的本地表。

比如如下分布式表:

CREATE TABLE test_shard_dist on cluster ch_cluster(
    `id` Int8
) ENGINE=Distributed('ch_cluster', 'test', 'test_shard_local', rand());

上述建表語句將分片鍵指定為rand()函數(shù),此時(shí)在數(shù)據(jù)寫入時(shí)會(huì)根據(jù)隨機(jī)函數(shù)的取值決定數(shù)據(jù)寫入哪個(gè)分片。

值得注意的是,此時(shí)對(duì)應(yīng)的本地表還未創(chuàng)建,所以從這里也可以看出來,Distributed表運(yùn)用的是讀時(shí)檢查的機(jī)制,對(duì)創(chuàng)建分布式表和本地表的順序并沒有強(qiáng)制要求。

接著,創(chuàng)建本地表,一張本地表代表著一個(gè)數(shù)據(jù)分片。

CREATE TABLE test_shard_local on cluster ch_cluster(
    `id` Int8
)ENGINE=MergeTree()
order by id
partition by id

在本次案例中,我們的ch_cluster由三個(gè)節(jié)點(diǎn)組成,因此會(huì)在三個(gè)節(jié)點(diǎn)上都創(chuàng)建出對(duì)應(yīng)的本地表和分布式表。

分布式寫入的核心流程

在向集群內(nèi)的分片寫入數(shù)據(jù)時(shí),通常有兩種思路:一種是借助外部計(jì)算系統(tǒng),事先將數(shù)據(jù)均勻分片,再借由計(jì)算系統(tǒng)直接將數(shù)據(jù)寫入Clickhouse集群的各個(gè)本地表。如下圖所示:

Clickhouse分布式表引擎(Distributed)寫入核心原理解析

在這個(gè)流程中,繼續(xù)使用集群ch_cluster的示例,該集群由2個(gè)分片和0個(gè)副本組成。整個(gè)流程從上至下按照時(shí)間順序進(jìn)行,其大致分為5個(gè)步驟:

(1)在第一個(gè)分片節(jié)點(diǎn)寫入本地分片數(shù)據(jù)

首先在Linux121節(jié)點(diǎn),對(duì)分布式表test_shard_dist執(zhí)行INSERT查詢,嘗試寫入10、30、200、55四行數(shù)據(jù)。

執(zhí)行后分布式表主要會(huì)做兩件事情:

  1. 根據(jù)分片規(guī)則劃分?jǐn)?shù)據(jù),將不同的數(shù)據(jù)標(biāo)記劃分給不同的節(jié)點(diǎn)插入。
  2. 將屬于當(dāng)前分片的數(shù)據(jù)直接寫入本地表test_shard_local

(2)第一個(gè)分片建立遠(yuǎn)端連接,準(zhǔn)備發(fā)送遠(yuǎn)端分片數(shù)據(jù)

將歸至遠(yuǎn)端分片的數(shù)據(jù)以分區(qū)為單位,分別寫入test_shard_all存儲(chǔ)目錄下的臨時(shí)bin文件,如下圖所示:

Clickhouse分布式表引擎(Distributed)寫入核心原理解析

這里的1.bin是一個(gè)[increase_num].bin,有幾個(gè)shard分片,則依次遞增。

(3)第一個(gè)分片向遠(yuǎn)端分片發(fā)送數(shù)據(jù)

此時(shí),Clickhouse會(huì)有另一組監(jiān)聽任務(wù)負(fù)責(zé)監(jiān)聽/test_shard_dist目錄下的文件變化,這些任務(wù)負(fù)責(zé)將目錄數(shù)據(jù)發(fā)送至遠(yuǎn)端分片。

<Debug> test.test_shard_dist.DirectoryMonitor: Started processing `/var/lib/clickhouse/data/test/test_shard_dist/shard2_replica1/1.bin` (2.00 rows, 2.00 B bytes)

<Debug> test.test_shard_dist.DirectoryMonitor: Started processing `/var/lib/clickhouse/data/test/test_shard_dist/shard3_all_replicas/2.bin` (2.00 rows, 2.00 B bytes)

從Linux121節(jié)點(diǎn)的Clickhouse日志中我們可以看到,其負(fù)責(zé)將分片數(shù)據(jù)發(fā)送到對(duì)應(yīng)的遠(yuǎn)端節(jié)點(diǎn)上。我這里一共有三個(gè)節(jié)點(diǎn),所以Linux121節(jié)點(diǎn)將分片數(shù)據(jù)發(fā)往對(duì)應(yīng)的Linux122、Linux123節(jié)點(diǎn),分別對(duì)應(yīng)數(shù)據(jù)塊1.bin和2.bin。

其中需要注意的是,每份目錄將會(huì)由獨(dú)立的線程負(fù)責(zé)發(fā)送,數(shù)據(jù)在傳輸之前會(huì)被壓縮。

(4)第二個(gè)分片接收數(shù)據(jù)并寫入本地

Linux122和Linux123節(jié)點(diǎn)確認(rèn)建立與Linux121的連接

<Trace> Connection (linux121:9000): Connected to ClickHouse server version 22.4.6.

在接收到來自Linux121節(jié)點(diǎn)發(fā)送的數(shù)據(jù)后,將它們寫入本地表中

Linux122節(jié)點(diǎn)服務(wù)日志:

<Debug> executeQuery: (from [::ffff:192.168.80.121]:56626, initial_query_id: 8579dc90-d839-4e63-8442-b31a8c7fe6cf) INSERT INTO test.test_shard_local (id) VALUES
<Trace> ContextAccess (default): Access granted: INSERT(id) ON test.test_shard_local
<Trace> test.test_shard_local (e43a2707-58a8-4bfb-8615-d9b175debdfe): Renaming temporary part tmp_insert_10_1_1_0 to 10_1_1_0

Linux123節(jié)點(diǎn)服務(wù)日志:

<Debug> executeQuery: (from [::ffff:192.168.80.121]:44996, initial_query_id: 8579dc90-d839-4e63-8442-b31a8c7fe6cf) INSERT INTO test.test_shard_local (id) VALUES
<Trace> ContextAccess (default): Access granted: INSERT(id) ON test.test_shard_local
 <Trace> test.test_shard_local (e43a2707-58a8-4bfb-8615-d9b175debdfe): Renaming temporary part tmp_insert_-56_1_1_0 to -56_1_1_0.

接收數(shù)據(jù)–>執(zhí)行寫入命令->重命名臨時(shí)分區(qū)->實(shí)際分區(qū)(這里原表是按id作為分區(qū)的,所以是-56_1_1_0)

(5)由第一個(gè)分片確認(rèn)完成寫入

最后,還是由Linux121節(jié)點(diǎn)確認(rèn)所有的數(shù)據(jù)發(fā)送完畢:

 <Trace> test.test_shard_dist.DirectoryMonitor: Finished processing `/var/lib/clickhouse/data/test/test_shard_dist/shard2_replica1/1.bin` (took 5 ms)
 
  <Trace> test.test_shard_dist.DirectoryMonitor: Finished processing `/var/lib/clickhouse/data/test/test_shard_dist/shard3_all_replicas/2.bin` (took 5 ms)

至此,整個(gè)流程結(jié)束。

可以看到,在整個(gè)流程中,Distributed表負(fù)責(zé)所有分片的寫入工作。本著誰執(zhí)行誰負(fù)責(zé)的原則,在這個(gè)示例中,由Linux121節(jié)點(diǎn)的分布式表負(fù)責(zé)切分?jǐn)?shù)據(jù),并向所有其他分片節(jié)點(diǎn)發(fā)送數(shù)據(jù)。

在由Distributed表負(fù)責(zé)向遠(yuǎn)端分片發(fā)送數(shù)據(jù)時(shí),有異步寫入和同步寫入兩種模式:如果是異步寫,則在Distributed表寫完本地分片之后,INSERT查詢就會(huì)返回成功寫入的信息。如果是同步寫,則在執(zhí)行INSERT查詢之后,會(huì)等待所有分片完成寫入。

使用何種模式由參數(shù)insert_distributed_sync參數(shù)控制,默認(rèn)為false,即為異步寫。如果將其設(shè)置為true,則可以進(jìn)一步通過insert_distributed_timeout參數(shù)控制同步等待的超時(shí)時(shí)間。

分布式寫入時(shí)副本復(fù)制數(shù)據(jù)的核心流程

如果在集群的配置中包含了副本,那么除了剛才的分片寫入流程之外,還會(huì)觸發(fā)副本數(shù)據(jù)的復(fù)制流程。數(shù)據(jù)在多個(gè)副本之間,有兩種復(fù)制實(shí)現(xiàn)方式:一種是繼續(xù)借助Distributed表引擎,由它將數(shù)據(jù)寫入副本。另一種則是借助ReplicatedMergeTree表引擎實(shí)現(xiàn)副本數(shù)據(jù)的分發(fā)。

Clickhouse分布式表引擎(Distributed)寫入核心原理解析

(1)通過Distributed復(fù)制數(shù)據(jù)

在這種實(shí)現(xiàn)方式下,即使本地表不使用ReplicatedMergeTree表引擎,也能實(shí)現(xiàn)數(shù)據(jù)副本的功能。Distributed會(huì)同時(shí)負(fù)責(zé)分片和副本的數(shù)據(jù)寫入工作,而副本數(shù)據(jù)的寫入流程與分片邏輯相同。

比如對(duì)于下面的配置

<!-- 1個(gè)分片,1個(gè)副本 -->
<ch_cluster>
    <shard>
        <replica>
            <host>linux121</host>
            <port>9000</port>
        </replica>
        <replica>
            <host>linuxxxx</host>
            <port>9000</port>
        </replica>
    </shard>
</ch_cluster>

Linux121和linuxxxx互為副本,此時(shí),按照上面介紹分布式數(shù)據(jù)寫入的邏輯,Linux121的分布式表不僅負(fù)責(zé)將數(shù)據(jù)寫入本地,還需要負(fù)責(zé)將數(shù)據(jù)發(fā)往副本所在的節(jié)點(diǎn)。

總結(jié),用這種方式時(shí),向Distributed表寫入數(shù)據(jù),它會(huì)負(fù)責(zé)將數(shù)據(jù)寫入集群內(nèi)的每個(gè)replica

細(xì)心的朋友應(yīng)該能發(fā)現(xiàn),在這種實(shí)現(xiàn)方案下,Distributed節(jié)點(diǎn)需要同時(shí)負(fù)責(zé)分片和副本的數(shù)據(jù)寫入工作,它很可能會(huì)成為寫入的單點(diǎn)瓶頸, 所有就有了接下來將要說明的第二種方案。

(2)通過ReplicatedMergeTree復(fù)制數(shù)據(jù)

如果在集群的shard配置中增加internal_replication參數(shù)并將其設(shè)置為true(默認(rèn)為false),那么Distributed表在該shard中只會(huì)選擇一個(gè)合適的replica并對(duì)其寫入數(shù)據(jù)。此時(shí),如果使用ReplicatedMergeTree作為本地表的引擎,則在該shard內(nèi),多個(gè)replica副本之間的數(shù)據(jù)復(fù)制會(huì)交由ReplicatedMergeTree自己處理,不再由Distributed負(fù)責(zé),從而為其減負(fù)。

在shard中選擇replica的算法大致如下:首選,在Clickhouse的服務(wù)節(jié)點(diǎn)中,擁有一個(gè)全局及數(shù)據(jù)器errors_count。當(dāng)服務(wù)出現(xiàn)任何異常時(shí),該計(jì)數(shù)器累加1。接著,當(dāng)一個(gè)shard內(nèi)擁有多個(gè)replica時(shí),選擇errors_count錯(cuò)誤最少的那個(gè)。

至此,我們介紹了關(guān)于Clickhouse使用分布式表寫入的核心流程原理和副本復(fù)制原理。

但是在此還是需要注意,通過上面我們介紹可以知道,在使用Distributed表引擎寫入時(shí),由分布式表寫入的節(jié)點(diǎn)負(fù)責(zé)將數(shù)據(jù)分片,并發(fā)送到集群中的其他節(jié)點(diǎn)中,這種情況在數(shù)據(jù)量比較大時(shí),很有可能造成寫入的單點(diǎn)瓶頸。同時(shí)加重網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)量,容易造成網(wǎng)絡(luò)擁塞。因此,在實(shí)際生產(chǎn)中,更建議直接寫本地表。文章來源地址http://www.zghlxwxcb.cn/news/detail-426907.html

到了這里,關(guān)于Clickhouse分布式表引擎(Distributed)寫入核心原理解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Distributed】分布式ELK日志文件分析系統(tǒng)(一)

    【Distributed】分布式ELK日志文件分析系統(tǒng)(一)

    ??日志主要包括系統(tǒng)日志、應(yīng)用程序日志和安全日志。系統(tǒng)遠(yuǎn)維和開發(fā)人員可以通過日志了解服務(wù)器軟硬件信息、檢查配置過程中的錯(cuò)誤及錯(cuò)誤發(fā)生的原因。經(jīng)常分析日志可以了解服務(wù)器的負(fù)荷,性能安全性,從而及時(shí)采取措施糾正錯(cuò)誤。 ??往往單臺(tái)機(jī)器的日志我們使用

    2024年02月15日
    瀏覽(31)
  • GlusterFs 分布式復(fù)制卷(Distributed-Replicate)性能測(cè)試

    GlusterFs 分布式復(fù)制卷(Distributed-Replicate)性能測(cè)試

    目錄 fio工具參數(shù)解釋 Glusterfs 和NFS 性能測(cè)試 順序?qū)懀?隨機(jī)寫: 順序讀: 隨機(jī)讀: 隨機(jī)讀寫: 參數(shù)說明: 測(cè)試結(jié)論: 與NFS對(duì)比 壓測(cè)對(duì)比結(jié)果 NFS和GlusterFs的優(yōu)缺點(diǎn) NFS的優(yōu)點(diǎn) NFS的缺點(diǎn) GlusterFS的優(yōu)點(diǎn) GlusterFS的缺點(diǎn) NFS與GlusterFS對(duì)比 1. 功能對(duì)比 2. 吞吐量對(duì)比 3. 可靠性對(duì)比 4

    2024年02月12日
    瀏覽(26)
  • FPGA原理與結(jié)構(gòu)(6)——分布式RAM(Distributed RAM,DRAM)

    FPGA原理與結(jié)構(gòu)(6)——分布式RAM(Distributed RAM,DRAM)

    系列文章目錄:FPGA原理與結(jié)構(gòu)(0)——目錄與傳送門 目錄 一、RAM概述 1、RAM基本概念 2、FPGA中RAM的分類 二、DRAM詳解 1、FPGA資源? ? ? ?? 2、DRAM的配置形式 2.1?Single-Port(單端口) 2.2?Dual-Port(雙端口) 2.3?Quad-Port(四端口) 2.4?Simple Dual-Port(簡(jiǎn)單雙端口) 2.5 更大深度 ?

    2024年02月08日
    瀏覽(36)
  • pytorch 進(jìn)行分布式調(diào)試debug torch.distributed.launch 三種方式

    pytorch 進(jìn)行分布式調(diào)試debug torch.distributed.launch 三種方式

    一. pytorch 分布式調(diào)試debug torch.distributed.launch 三種方式 1. 方式1:ipdb調(diào)試(建議) 參考之前的博客:python調(diào)試器 ipdb 注意:pytorch 分布式調(diào)試只能使用侵入式調(diào)試,也即是在你需要打斷點(diǎn)的地方(或者在主程序的第一行)添加下面的代碼: 當(dāng)進(jìn)入pdb調(diào)試后,跟原先使用pdb調(diào)試

    2024年02月07日
    瀏覽(41)
  • 從底層結(jié)構(gòu)開始學(xué)習(xí)FPGA(6)----分布式RAM(DRAM,Distributed RAM)

    文章目錄 系列目錄與傳送門 一、什么是RAM?什么是ROM? 二、塊RAM和分布式RAM 2.1、BRAM

    2024年02月02日
    瀏覽(25)
  • 分布式鏈路追蹤——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

    分布式鏈路追蹤——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

    要解決的問題 如何記錄請(qǐng)求經(jīng)過多個(gè)分布式服務(wù)的信息,以便分析問題所在? 如何保證這些信息得到完整的追蹤? 如何盡可能不影響服務(wù)性能? 當(dāng)用戶請(qǐng)求到達(dá)前端A,將會(huì)發(fā)送rpc請(qǐng)求給中間層B、C;B可以立刻作出反應(yīng),但是C需要后端服務(wù)D、E的配合才能應(yīng)答 一個(gè)簡(jiǎn)單有用

    2024年02月12日
    瀏覽(30)
  • clickhouse分布式查詢降級(jí)為本地查詢

    在基于 clickhouse 做類數(shù)倉建模時(shí)通常的做法是在本地創(chuàng)建物化視圖,然后使用分布式表做代理對(duì)外提供服務(wù)。我們知道 clickhouse 對(duì)于 DQL 內(nèi)部實(shí)現(xiàn)了分布式,而對(duì)于 DDL 則需要我們自動(dòng)實(shí)現(xiàn)比如: 來實(shí)現(xiàn)分布式 DDL,但對(duì)于 此類分布式表的查詢會(huì)自動(dòng)執(zhí)行分布式查詢并在查詢?nèi)?/p>

    2024年02月14日
    瀏覽(23)
  • 分布式數(shù)據(jù)庫(DorisDB、Clickhouse、TiDB)調(diào)研

    分布式數(shù)據(jù)庫(DorisDB、Clickhouse、TiDB)調(diào)研

    B站視頻:DorisDB VS ClickHouse OLAP PK 1.1 DorisDB 場(chǎng)量:線上數(shù)據(jù)應(yīng)用 訪問官方網(wǎng)站 DorisDB企業(yè)版文檔 單表/多表查詢,DorisDB總體時(shí)間最短 單表查詢:DorisDB最快次數(shù)最多,ClickHouse次之 多表查詢:DorisDB所有執(zhí)行均最快 DorisDB多表關(guān)聯(lián)效率好 支持各種主流分布式Join,不僅支持大寬表模

    2024年02月06日
    瀏覽(31)
  • clickhouse(十四、分布式DDL阻塞及同步阻塞問題)

    clickhouse(十四、分布式DDL阻塞及同步阻塞問題)

    在clickhouse 集群的操作中,如果同時(shí)執(zhí)行一些重量級(jí)變更語句,往往會(huì)引起阻塞。 一般是由于節(jié)點(diǎn)堆積過多耗時(shí)的ddl。然后拋出如下異常 1.查詢zookeeper的隊(duì)列數(shù),節(jié)點(diǎn)完成情況。 2.查詢mutations表,改更較重操作一般會(huì)在這個(gè)表記錄。 先看能不能是kill MUTATION ,確定一下是不是

    2024年02月11日
    瀏覽(30)
  • 分布式核心知識(shí)

    分布式核心知識(shí)

    關(guān)于分布式核心知識(shí)詳解 在微服務(wù)架構(gòu)中,通常存在多個(gè)服務(wù)之間的遠(yuǎn)程調(diào)用的需求。遠(yuǎn)程調(diào)用通常包含兩個(gè)部分:序列化和通信協(xié)議。常見的序列化協(xié)議包括json、xml、 hession、 protobuf、thrift、text、 bytes等,目前主流的遠(yuǎn)程調(diào)用技術(shù)有基于HTTP的RESTful接口以及基于TCP的RPC協(xié)議

    2024年02月11日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包