clickhouse高可用(三節點)


特別說明:此文章基於已安裝完成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端口對應的副本上,
只要分片及對應該分片數據的副本不同時掛機,且總能滿足 分片總數 或 分片+副本數 或 副本總數 等於預設的值,
數據總能得到一致性保證

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM