特別說明:此文章基於已安裝完成clickhouse(三節點)單副本集群的情況
一、集群情況
cdhserver2 1110.0.0.237 9006
cdhserver3 1110.0.0.238 9006
cdhserver4 1110.0.0.239 9006
1.1 安裝多實例是為了用三台服務器測試3分片2備份集群。最后的部署如下表:
備份1 備份2
分片1 1110.0.0.237:9006 1110.0.0.237:9007
分片2 1110.0.0.238:9006 1110.0.0.238:9007
分片3 1110.0.0.239:9006 1110.0.0.239:9007
二 配置多實例
2.1 將/etc/clickhouse-server/config.xml文件拷貝一份改名
cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config9007.xml
2.2 編輯/etc/clickhouse-server/config9007.xml更改以下內容將兩個服務區分開來
多實例修改的config9007.xml:原來內容
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<http_port>8123</http_port>
<tcp_port>9006</tcp_port>
<interserver_http_port>9009</interserver_http_port>
<path>/var/lib/clickhouse/</path>
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
<include_from>/etc/clickhouse-server/metrica.xml</include_from> #集群配置文件
多實例修改的config9007.xml:調整后內容
<log>/var/log/clickhouse-server/clickhouse-server-9007.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server-9007.err.log</errorlog>
<http_port>8124</http_port>
<tcp_port>9007</tcp_port>
<interserver_http_port>9011</interserver_http_port><path>/var/lib/clickhouse9007/</path><tmp_path>/var/lib/clickhouse9007/tmp/</tmp_path>
<user_files_path>/var/lib/clickhouse9007/user_files/</user_files_path>
<include_from>/etc/clickhouse-server/metrica9007.xml</include_from>
2.3 創建對應的目錄
[root@cdhserver4]# mkdir -p /data/clickhouse9007
[root@cdhserver4]# chown -R clickhouse:clickhouse /data/clickhouse9007
[root@cdhserver4]# mkdir -p /var/lib/clickhouse9007
[root@cdhserver4]# chown -R clickhouse:clickhouse /var/lib/clickhouse9007
2.4 增加實例對應的服務啟動腳本
[root@cdhserver4 init.d]# cp /etc/init.d/clickhouse-server /etc/init.d/clickhouse-server9007
[root@cdhserver4 init.d]# vim /etc/init.d/clickhouse-server9007
調整內容如下:
調整后內容:
CLICKHOUSE_CONFIG=$CLICKHOUSE_CONFDIR/config9007.xml
CLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM-9007.pid"
調整前內容:
CLICKHOUSE_CONFIG=$CLICKHOUSE_CONFDIR/config.xml
CLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM.pid"
三 集群配置(三分片兩備份)
3.1 六個metrica*.xml共同部分:
<?xml version="1.0"?> <yandex> <!--ck集群節點--> <clickhouse_remote_servers> <idc_cluster_data> <!--分片1--> <shard> <internal_replication>true</internal_replication> <weight>1</weight> <replica> <host>cdhserver2</host> <port>9006</port> <user>ck</user> <password>123456</password> <compression>true</compression> </replica> <replica> <host>cdhserver3</host> <port>9007</port> <user>ck</user> <password>123456</password> <compression>true</compression> </replica> </shard> <!--分片2--> <shard> <internal_replication>true</internal_replication> <weight>1</weight> <replica> <host>cdhserver3</host> <port>9006</port> <user>ck</user> <password>123456</password> <compression>true</compression> </replica> <replica> <host>cdhserver4</host> <port>9007</port> <user>ck</user> <password>123456</password> <compression>true</compression> </replica> </shard> <!--分片3--> <shard> <internal_replication>true</internal_replication> <weight>1</weight> <replica> <host>cdhserver4</host> <port>9006</port> <user>ck</user> <password>123456</password> <compression>true</compression> </replica> <replica> <host>cdhserver2</host> <port>9007</port> <user>ck</user> <password>123456</password> <compression>true</compression> </replica> </shard> </idc_cluster_data> </clickhouse_remote_servers> <!--zookeeper相關配置--> <zookeeper-servers> <node index="1"> <host>cdhserver2</host> <port>2181</port> </node> <node index="2"> <host>cdhserver3</host> <port>2181</port> </node> <node index="3"> <host>cdhserver4</host> <port>2181</port> </node> </zookeeper-servers> <!-- macros配置 --> <macros> <layer>01</layer> <shard>01</shard> <replica>cdhserver2</replica> </macros> <networks> <ip>::/0</ip> </networks> <!--壓縮相關配置--> <clickhouse_compression> <case> <min_part_size>10000000000</min_part_size> <min_part_size_ratio>0.01</min_part_size_ratio> <method>lz4</method> <!--壓縮算法lz4壓縮比zstd快, 更占磁盤--> </case> </clickhouse_compression> </yandex>
3.2 metrica*.xml不同部分修改如下:
cdhserver2實例1(端口:9006)對應metrica.xml調整: <macros> <!-- <replica>cdhserver2</replica> --> <layer>01</layer> <shard>01</shard> <replica>cdhserver2</replica> </macros> cdhserver2實例2(端口:9007)對應metrica9007.xml調整: <macros> <!-- <replica>cdhserver2</replica> --> <layer>01</layer> <shard>03</shard> <replica>cdhserver2-03-2</replica> </macros> cdhserver3實例1(端口:9006)對應metrica.xml調整: <macros> <!-- <replica>cdhserver3</replica> --> <layer>01</layer> <shard>02</shard> <replica>cdhserver3</replica> </macros> cdhserver3實例2(端口:9007)對應metrica9007.xml調整: <macros> <!-- <replica>cdhserver3</replica> --> <layer>01</layer> <shard>01</shard> <replica>cdhserver3-01-2</replica> </macros> cdhserver4實例1(端口:9006)對應metrica.xml調整: <macros> <!-- <replica>cdhserver4</replica> --> <layer>01</layer> <shard>03</shard> <replica>cdhserver4</replica> </macros> cdhserver4實例2(端口:9007)對應metrica9007.xml調整: <macros> <!-- <replica>cdhserver4</replica> --> <layer>01</layer> <shard>02</shard> <replica>cdhserver4-02-2</replica> </macros>
3.3 啟動高可用clickhouse集群
[root@cdhserver4 clickhouse-server]# /etc/init.d/clickhouse-server start
[root@cdhserver4 clickhouse-server]# /etc/init.d/clickhouse-server9007 start
3.4 登錄數據庫查看集群信息
clickhouse-client --host 110.0.0.237 --port 9006
clickhouse-client --host 110.0.0.237 --port 9007
clickhouse-client --host 110.0.0.238 --port 9006
clickhouse-client --host 110.0.0.238 --port 9007
clickhouse-client --host 110.0.0.239 --port 9006
clickhouse-client --host 110.0.0.239 --port 9007
四 集群高可用驗證
4.1 高可用原理
zookeeper+ReplicatedMergeTree(復制表)+Distributed(分布式表)
4.2 首先創建ReplicatedMergeTree引擎表(采用分布式DDL建表語句,不用到六個節點都去執行這個命令).
CREATE TABLE idc_ha.t_s2_r2 on cluster idc_cluster_data
(
dt Date,
path String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/t_s2_r2','{replica}',dt, dt, 8192);
解釋:
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test_clusters_ha','{replica}',dt, dt, 8192);
第一個參數為ZooKeeper中該表的路徑。
第二個參數為ZooKeeper中該表的副本名稱。
這里的{layer},{shard}和{replica}就是metrika*.xml中的macros標簽對應的值。
4.3 創建分布表
采用分布式DDL建表,這樣無論哪台服務器上的節點都掛了,集群還可以照常用
CREATE TABLE idc_ha.t_s2_r2_all on cluster idc_cluster_data
AS idc_ha.t_s2_r2 ENGINE = Distributed(idc_cluster_data, idc_ha, t_s2_r2, rand());
4.4 插入並查看數據
復制代碼
insert into t_s2_r2_all values('2019-07-21','path1');
insert into t_s2_r2_all values('2019-07-22','path1');
insert into t_s2_r2_all values('2019-07-23','path1');
insert into t_s2_r2_all values('2019-07-23','path1');
復制代碼
查看數據結果就不貼出來了。總數據4條,分布在三個9006實例的分片中。對應9007是三個分片的備份副本。
4.5 驗證某個節點宕機現有數據查詢一致性
a.將cdhserver3上的兩個實例服務全部停止,模擬cdhserver3節點宕機。
[root@cdhserver3 clickhouse-server]# service clickhouse-server stop
Stop clickhouse-server service: DONE
[root@cdhserver3 clickhouse-server]# service clickhouse-server9007 stop
Stop clickhouse-server service: DONE
結果是單節點宕機數據一致性得到保證。同理如果只是宕機cdhserver4也是一樣的結果。
b.如果cdhserver3和cdhserver4同時宕機會如何呢?
[root@cdhserver4 clickhouse-server]# service clickhouse-server stop
Stop clickhouse-server service: DONE
[root@cdhserver4 clickhouse-server]# service clickhouse-server9007 stop
Stop clickhouse-server service: DONE
[root@cdhserver3 clickhouse-server]# service clickhouse-server stop
Stop clickhouse-server service: DONE
[root@cdhserver3 clickhouse-server]# service clickhouse-server9007 stop
Stop clickhouse-server service: DONE
結果是: 如果兩台機器上的兩個實力都停掉,分布式表不可查詢,當其中某個節點雙實例都停掉,另外一台停掉分片實例(9006), 分布式表可用,若停掉副本實例(9007),數據不可查,原因是分布式表可查的條件是數據不能缺失,及不管是副本還是分片,
必須滿足能提供完全數據的副本(或分片),缺少一點數據分布式表都不可用
c. 如果停掉 cdhserver2:9007、cdhserver3:9007、cdhserver4:9007(9007全為副本)
[root@cdhserver2 clickhouse-server]# /etc/init.d/clickhouse-server9007 stop
[root@cdhserver3 clickhouse-server]# /etc/init.d/clickhouse-server9007 stop
[root@cdhserver4 ~]# /etc/init.d/clickhouse-server9007 stop
查詢表:cdhserver2、cdhserver3、cdhserver4 上9006 端口的數據一致性得到保證
d. 如果停掉 cdhserver2:9006、cdhserver3:9006、cdhserver4:9006(9006全為分片)
[root@cdhserver2 clickhouse-server]# /etc/init.d/clickhouse-server stop
[root@cdhserver3 clickhouse-server]# /etc/init.d/clickhouse-server stop
[root@cdhserver4 clickhouse-server]# /etc/init.d/clickhouse-server stop
查看9007端口數據一致性
cdhserver4 :) select * from t_s2_r2_all;
SELECT *
FROM t_s2_r2_all
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-22 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
└────────────┴───────┘
4 rows in set. Elapsed: 0.017 se
cdhserver3 :) select * from t_s2_r2_all;
SELECT *
FROM t_s2_r2_all
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-22 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
4 rows in set. Elapsed: 0.007 sec.
cdhserver2 :) select * from t_s2_r2_all;
SELECT *
FROM t_s2_r2_all
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-22 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
4 rows in set. Elapsed: 0.015 sec.
結論:當停掉三個分片(9006), 保留三個9007端口對應的節點時,數據一致性得到保證
e. 停掉一個9006、兩個9007端口對應的分片 或則停掉一個9007對應的副本、兩個9006對應的分片
結論:數據均勻的分布在三台機器的9006端口對應的分片上,及9007端口對應的副本上,
只要分片及對應該分片數據的副本不同時掛機,且總能滿足 分片總數 或 分片+副本數 或 副本總數 等於預設的值,
數據總能得到一致性保證