ClickHouse高可用及副本测试
1 概述
? 對于默認的分布式表的配置,每個分片只有一份,這種多分片單副本集群,掛掉一個節(jié)點的話查詢分布式表會報錯。為了解決這個問題的話可以使用ClickHouse高可用集群,對于每個分片具有2個或2個以上的副本,當某個節(jié)點掛掉時,該節(jié)點分片由其他節(jié)點的副本代替工作,這就避免了單點故障的問題。下面測試節(jié)點分別為:ambari01,ambari02,ambari03,ambari04
? 說明:下面的測試都是以internal_replication=true進行的。internal_replication參數(shù),為true代表了只寫入shard內(nèi)的一臺,與ZooKeeper配合進行復制;為false代表了寫入shard內(nèi)所有的replica,與分布式表配合進行復制。使用寫分布式表的缺點:①使用寫分布式表進行復制,則可能出現(xiàn)多寫一邊成功一邊失敗的情況,數(shù)據(jù)的一致性不可控,②在一臺服務器宕機一陣子以后,再恢復過來則這個時間段里面的數(shù)據(jù)不能自動恢復從另外的replica恢復過來。
2 高可用配置
2.1 單副本集群配置
? 配置文件配置如下,由4個節(jié)點每個節(jié)點作為一個分片:
<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)在每個節(jié)點創(chuàng)建havail庫,并使用這個庫
create database havail; use havail;? (2)在每個節(jié)點創(chuàng)建一個avail表,表引擎為MergeTree ,再創(chuàng)建一個分布式表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)在每個節(jié)點上查詢avail表,看寫入分布表的數(shù)據(jù)存儲在哪個節(jié)點的avail表上,插入分布表的數(shù)據(jù)只會存儲在一個avail表上
select * from avail;? (5)發(fā)現(xiàn)數(shù)據(jù)存儲在ambari02節(jié)點,手動停止ambari02的ClickHouse進程。在ambari01節(jié)點執(zhí)行查詢語句,報錯
2.2 高可用集群
? 配置文件配置如下,有4個節(jié)點2個shard,ambari01和ambari02為一個shard,ambari03和ambari04為2個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)同步上面配置到每個節(jié)點,并重啟每個節(jié)點的ClickHouse
? (2)使用前面建好的havail庫
use havail;? (3)在每個節(jié)點創(chuàng)建一個havail表,表引擎為MergeTree ,再創(chuàng)建一個分布式表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)在每個節(jié)點上查詢havail表,看寫入分布表的數(shù)據(jù)存儲在哪個節(jié)點的havail表上
select * from havail;
? 可以發(fā)現(xiàn)雖然做了副本,但是MergeTree 引擎的表并不會自動復制數(shù)據(jù),所有數(shù)據(jù)還是只在一個節(jié)點上
? (6)發(fā)現(xiàn)數(shù)據(jù)存儲在ambari01節(jié)點,手動停止ambari01的ClickHouse進程。在ambari02節(jié)點執(zhí)行查詢語句,發(fā)現(xiàn)不報錯,但是沒有數(shù)據(jù)。
2.3 高可用加復制表
? 高可用加復制表是使用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)不推薦上述建表語句,但是重點是測試,所以還是使用如上建表語句,官網(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個節(jié)點2個shard,ambari01和ambari02為一個shard,ambari03和ambari04為2個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)同步上面配置到每個節(jié)點,并重啟每個節(jié)點的ClickHouse
? (2)使用前面建好的havail庫
use havail;? (3)在每個節(jié)點創(chuàng)建一個havail表,表引擎為MergeTree ,再創(chuàng)建一個分布式表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個副本,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個副本,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個副本,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個副本,ambari04執(zhí)行CREATE TABLE havail_re_all (Name String,StartDate Date,Year UInt16) ENGINE= Distributed(ck_cluster, havail, havail_re, rand());? 注意:ReplicatedMergeTree的參數(shù):第一個:‘zk路徑,如果要相互復制,這里必須一樣’, 第二哥:‘副本名稱, 必須不一樣’, 剩下的就是分區(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)在每個節(jié)點上查詢havail_re表,看寫入分布表的數(shù)據(jù)存儲在哪個節(jié)點的havail_re表上
select * from havail_re;
? 可以發(fā)現(xiàn)我們在ambari01和ambari02這兩個節(jié)點的本地表havail_re都可以查到數(shù)據(jù),說明插入數(shù)據(jù)到分布表能復制。
? (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的本地表是否相互復制了
? 說明往本地表插入數(shù)據(jù)也會進行復制
? (9)停掉ambari03的ClickHouse進程查看分布表havail_re_all是否能正常工作
? 在ambari01上查看分布表havail_re_all能正常查詢,并且不會丟數(shù)據(jù)
總結(jié)
? (1)沒有配置副本,非復制表,每個節(jié)點為一個shard的情況:數(shù)據(jù)只被插入到一個本地表中,但沒有任何機制可以將它轉(zhuǎn)移到另一個表中。當一個節(jié)點掛了之后查詢分布表會報錯
? (2)配置副本,非復制表的情況:據(jù)只被插入到一個本地表中,但沒有任何機制可以將它轉(zhuǎn)移到另一個表中。當一個節(jié)點掛了之后查詢分布表不會報錯,但是掛了的節(jié)點的數(shù)據(jù)會丟失
? (3)配置副本,復制表的情況:插入到分布式表中的數(shù)據(jù)僅插入到其中一個本地表中,但通過復制機制傳輸?shù)搅硪粋€節(jié)點的表中,因此兩個本地表上的數(shù)據(jù)保持同步。推薦使用這種配置。
總結(jié)
以上是生活随笔為你收集整理的ClickHouse高可用及副本测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础(九)--异常
- 下一篇: php mysqliquery 返回值,