日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ClickHouse高可用及副本测试

發(fā)布時(shí)間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ClickHouse高可用及副本测试 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 概述

? 對(duì)于默認(rèn)的分布式表的配置,每個(gè)分片只有一份,這種多分片單副本集群,掛掉一個(gè)節(jié)點(diǎn)的話查詢分布式表會(huì)報(bào)錯(cuò)。為了解決這個(gè)問(wèn)題的話可以使用ClickHouse高可用集群,對(duì)于每個(gè)分片具有2個(gè)或2個(gè)以上的副本,當(dāng)某個(gè)節(jié)點(diǎn)掛掉時(shí),該節(jié)點(diǎn)分片由其他節(jié)點(diǎn)的副本代替工作,這就避免了單點(diǎn)故障的問(wèn)題。下面測(cè)試節(jié)點(diǎn)分別為:ambari01,ambari02,ambari03,ambari04

? 說(shuō)明:下面的測(cè)試都是以internal_replication=true進(jìn)行的。internal_replication參數(shù),為true代表了只寫入shard內(nèi)的一臺(tái),與ZooKeeper配合進(jìn)行復(fù)制;為false代表了寫入shard內(nèi)所有的replica,與分布式表配合進(jìn)行復(fù)制。使用寫分布式表的缺點(diǎn):①使用寫分布式表進(jìn)行復(fù)制,則可能出現(xiàn)多寫一邊成功一邊失敗的情況,數(shù)據(jù)的一致性不可控,②在一臺(tái)服務(wù)器宕機(jī)一陣子以后,再恢復(fù)過(guò)來(lái)則這個(gè)時(shí)間段里面的數(shù)據(jù)不能自動(dòng)恢復(fù)從另外的replica恢復(fù)過(guò)來(lái)。

2 高可用配置

2.1 單副本集群配置

? 配置文件配置如下,由4個(gè)節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)作為一個(gè)分片:

<clickhouse_remote_servers><ck_cluster><shard><internal_replication>true</internal_replication><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers>

? (1)在每個(gè)節(jié)點(diǎn)創(chuàng)建havail庫(kù),并使用這個(gè)庫(kù)

create database havail; use havail;

? (2)在每個(gè)節(jié)點(diǎn)創(chuàng)建一個(gè)avail表,表引擎為MergeTree ,再創(chuàng)建一個(gè)分布式表avail_all,表引擎為Distributed

CREATE TABLE avail (Name String,StartDate Date,Year UInt16) ENGINE = MergeTree(StartDate,(Year, StartDate),8192); CREATE TABLE avail_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, avail, rand());

? (3)在ambari01往avail_all表中插入一條數(shù)據(jù)并查詢

insert into avail_all (Name,StartDate,Year)values('zs','2019-01-01',2019); select * from avail_all;

? (4)在每個(gè)節(jié)點(diǎn)上查詢avail表,看寫入分布表的數(shù)據(jù)存儲(chǔ)在哪個(gè)節(jié)點(diǎn)的avail表上,插入分布表的數(shù)據(jù)只會(huì)存儲(chǔ)在一個(gè)avail表上

select * from avail;

? (5)發(fā)現(xiàn)數(shù)據(jù)存儲(chǔ)在ambari02節(jié)點(diǎn),手動(dòng)停止ambari02的ClickHouse進(jìn)程。在ambari01節(jié)點(diǎn)執(zhí)行查詢語(yǔ)句,報(bào)錯(cuò)

2.2 高可用集群

? 配置文件配置如下,有4個(gè)節(jié)點(diǎn)2個(gè)shard,ambari01和ambari02為一個(gè)shard,ambari03和ambari04為2個(gè)shard:

<clickhouse_remote_servers><ck_cluster><shard><internal_replication>true</internal_replication><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers>

? (1)同步上面配置到每個(gè)節(jié)點(diǎn),并重啟每個(gè)節(jié)點(diǎn)的ClickHouse

? (2)使用前面建好的havail庫(kù)

use havail;

? (3)在每個(gè)節(jié)點(diǎn)創(chuàng)建一個(gè)havail表,表引擎為MergeTree ,再創(chuàng)建一個(gè)分布式表havail_all,表引擎為Distributed

CREATE TABLE havail (Name String,StartDate Date,Year UInt16) ENGINE = MergeTree(StartDate,(Year, StartDate),8192); CREATE TABLE havail_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, havail, rand());

? (4)在ambari01往havail_all表中插入1條數(shù)據(jù)并查詢

insert into havail_all (Name,StartDate,Year)values('zs','2019-01-01',2019); select * from havail_all;

? (5)在每個(gè)節(jié)點(diǎn)上查詢havail表,看寫入分布表的數(shù)據(jù)存儲(chǔ)在哪個(gè)節(jié)點(diǎn)的havail表上

select * from havail;


? 可以發(fā)現(xiàn)雖然做了副本,但是MergeTree 引擎的表并不會(huì)自動(dòng)復(fù)制數(shù)據(jù),所有數(shù)據(jù)還是只在一個(gè)節(jié)點(diǎn)上

? (6)發(fā)現(xiàn)數(shù)據(jù)存儲(chǔ)在ambari01節(jié)點(diǎn),手動(dòng)停止ambari01的ClickHouse進(jìn)程。在ambari02節(jié)點(diǎn)執(zhí)行查詢語(yǔ)句,發(fā)現(xiàn)不報(bào)錯(cuò),但是沒(méi)有數(shù)據(jù)。

2.3 高可用加復(fù)制表

? 高可用加復(fù)制表是使用ReplicatedMergeTree 引擎+ Distributed引擎,作為集群結(jié)構(gòu)的引擎。

CREATE TABLE table_name (EventDate DateTime,CounterID UInt32,UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192)

? 官網(wǎng)已經(jīng)不推薦上述建表語(yǔ)句,但是重點(diǎn)是測(cè)試,所以還是使用如上建表語(yǔ)句,官網(wǎng)推薦的推薦如下:

CREATE TABLE table_name (EventDate DateTime,CounterID UInt32,UserID UInt32,ver UInt16 ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}', ver) PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID)

? 配置文件配置如下,有4個(gè)節(jié)點(diǎn)2個(gè)shard,ambari01和ambari02為一個(gè)shard,ambari03和ambari04為2個(gè)shard:

<clickhouse_remote_servers><ck_cluster><shard><internal_replication>true</internal_replication><replica><host>ambari01</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari02</host><user>admin</user><password>admin</password><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>ambari03</host><user>admin</user><password>admin</password><port>9000</port></replica><replica><host>ambari04</host><user>admin</user><password>admin</password><port>9000</port></replica></shard></ck_cluster></clickhouse_remote_servers>

? (1)同步上面配置到每個(gè)節(jié)點(diǎn),并重啟每個(gè)節(jié)點(diǎn)的ClickHouse

? (2)使用前面建好的havail庫(kù)

use havail;

? (3)在每個(gè)節(jié)點(diǎn)創(chuàng)建一個(gè)havail表,表引擎為MergeTree ,再創(chuàng)建一個(gè)分布式表havail_all,表引擎為Distributed

CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/havail_re','havail_re-01-1',StartDate,(Year, StartDate),8192); #分片1的第1個(gè)副本,ambari01執(zhí)行CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/havail_re','havail_re-01-2',StartDate,(Year, StartDate),8192); #分片1的第2個(gè)副本,ambari03執(zhí)行CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-02/havail_re','havail_re-02-1',StartDate,(Year, StartDate),8192); #分片2的第1個(gè)副本,ambari03執(zhí)行CREATE TABLE havail_re (Name String,StartDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-02/havail_re','havail_re-02-2',StartDate,(Year, StartDate),8192); #分片2的第2個(gè)副本,ambari04執(zhí)行CREATE TABLE havail_re_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, havail_re, rand());

? 注意:ReplicatedMergeTree的參數(shù):第一個(gè):‘zk路徑,如果要相互復(fù)制,這里必須一樣’, 第二哥:‘副本名稱, 必須不一樣’, 剩下的就是分區(qū)和主鍵,以及索引粒度

? (4)在ambari01往havail_re_all分布式表中插入1條數(shù)據(jù)并查詢

insert into havail_re_all (Name,StartDate,Year)values('zs','2019-01-01',2019); select * from havail_re_all;

? (5)在每個(gè)節(jié)點(diǎn)上查詢havail_re表,看寫入分布表的數(shù)據(jù)存儲(chǔ)在哪個(gè)節(jié)點(diǎn)的havail_re表上

select * from havail_re;


? 可以發(fā)現(xiàn)我們?cè)赼mbari01和ambari02這兩個(gè)節(jié)點(diǎn)的本地表havail_re都可以查到數(shù)據(jù),說(shuō)明插入數(shù)據(jù)到分布表能復(fù)制。

? (6)在ambari03往havail_re本地表中插入1條數(shù)據(jù)并查詢

insert into havail_re (Name,StartDate,Year)values('zs','2020-02-02',2020);

? (7)查看分布式表havail_re_all可以看到前面插入的2條記錄都能查詢

? (8)查看ambari03和ambari04的本地表是否相互復(fù)制了

? 說(shuō)明往本地表插入數(shù)據(jù)也會(huì)進(jìn)行復(fù)制

? (9)停掉ambari03的ClickHouse進(jìn)程查看分布表havail_re_all是否能正常工作

? 在ambari01上查看分布表havail_re_all能正常查詢,并且不會(huì)丟數(shù)據(jù)

總結(jié)

? (1)沒(méi)有配置副本,非復(fù)制表,每個(gè)節(jié)點(diǎn)為一個(gè)shard的情況:數(shù)據(jù)只被插入到一個(gè)本地表中,但沒(méi)有任何機(jī)制可以將它轉(zhuǎn)移到另一個(gè)表中。當(dāng)一個(gè)節(jié)點(diǎn)掛了之后查詢分布表會(huì)報(bào)錯(cuò)

? (2)配置副本,非復(fù)制表的情況:據(jù)只被插入到一個(gè)本地表中,但沒(méi)有任何機(jī)制可以將它轉(zhuǎn)移到另一個(gè)表中。當(dāng)一個(gè)節(jié)點(diǎn)掛了之后查詢分布表不會(huì)報(bào)錯(cuò),但是掛了的節(jié)點(diǎn)的數(shù)據(jù)會(huì)丟失

? (3)配置副本,復(fù)制表的情況:插入到分布式表中的數(shù)據(jù)僅插入到其中一個(gè)本地表中,但通過(guò)復(fù)制機(jī)制傳輸?shù)搅硪粋€(gè)節(jié)點(diǎn)的表中,因此兩個(gè)本地表上的數(shù)據(jù)保持同步。推薦使用這種配置。

總結(jié)

以上是生活随笔為你收集整理的ClickHouse高可用及副本测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。