ClickHouse學習系列之四【副本&分片部署說明】


背景

  以前介紹過ClickHouse相關的系列文章,現在繼續說明。本文開始說明ClickHouse的副本與分片,和其他數據庫一樣,ClickHouse也會出現單節點故障和單節點資源到達上限的情況。所以針對上面的2個問題,就出現了副本和分片。副本:能避免單節點故障的問題,類似於MySQL的Replicate和MongoDB的Replicate Set。分片:解決單節點瓶頸的問題,類似於MySQL的分庫分表和MongoDB的Sharding。

部署說明

一:副本

特點:

1. 依賴ZooKeeper,通過其來協調多個副本之間的同步。

2. 表級別的副本,副本是在表級別定義的。

3. 多主架構,可以在任意副本上執行語句。

環境:(版本:21.6.3.14)

  實例A  實例B 
IP

12.16.20.12

12.16.20.17

Port 9000 9000

測試: 

需要配置ZooKeeper的地址,並且需要保證2個實例的IP、Port可以通訊(<listen_host>0.0.0.0</listen_host>)。副本模式只需要修改2個實例的配置文件(config.xml)中的ZooKeeper的信息:

    <zookeeper>
        <node index="1">   -- 單節點,可以配置成集群模式(3節點)
            <host>12.16.20.17</host>
            <port>2181</port>
        </node>
    </zookeeper>

建表引擎格式:

ENGINE = ReplicatedMergeTree('zk_path', 'replica_name')

zk_path:指定在ZooKeeper中創建數據表的路徑,可以自定義。同一張表同一個分片的不同副本,定義相同路徑。為了方便記錄,可以約定為:

'/clickhouse/tables/{shard}/table_name'
  • shard:分片信息,如果只配置副本,分片信息保持一致即可。
  • replica_name:副本集名稱,唯一。同一張表同一個分片的不同副本,定義不同名稱。

實例A上執行:

CREATE TABLE repl_test
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/repl_test','dba06')
PARTITION BY toYYYYMM(create_time)
ORDER BY id

實例B上執行:

CREATE TABLE repl_test
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/repl_test','dba07')
PARTITION BY toYYYYMM(create_time)
ORDER BY id

2個實例上的副本表的zk_path一樣,replica_name不一樣。需要注意的是:和MySQL不一樣,副本表需要在2個實例上分別手動建立。

現在在實例A上執行插入:

insert into repl_test values('A001',123,'2021-05-01 09:09:00');
insert into repl_test values('A002',123,'2021-06-01 09:09:00');
insert into repl_test values('B001',321,'2021-05-01 09:09:00');
insert into repl_test values('B002',321,'2021-06-01 09:09:00');

分別在2個實例上查詢該表,都能顯示數據,並且在實例B上執行插入,也能同步到實例A上,達到了多主的要求。

上面的建表語句中,shard、replica使用了硬編碼的方式:01;dba06、dba07。這樣維護起來比較麻煩,可以通過動態變量來替換,也可以把各個實例公有的參數ZooKeeper拎出來一起放到metrika.xml中(/etc/clickhouse-server/config.d/metrika.xml):

<yandex>
    <zookeeper-server>
        <node index="1">
            <host>12.16.20.17</host>
            <port>2181</port>
        </node>
    </zookeeper-server>
    <macros>
        <replica>dba06</replica>  -- 另一個實例設置dba07
        <shard>1</shard>
    </macros>
</yandex>

每個實例的配置文件(config.xml)一致,只有<macros>參數里的不一樣。並且修改config.xml,把上面的配置文件include進去:

    <include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
    <zookeeper incl="zookeeper-server" optional="false" />
    <macros incl="macros" optional="true" />

incl標簽對應的值需要和metrika.xml文件中的選項組保持一致。配置完成之后,可以通過以下SQL查看各個實例的變量:

select * from system.macros;

完成之后,在新建副本表時只需要在2個實例上執行同樣的SQL:

CREATE TABLE repl_test123
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/repl_test123','{replica}')
PARTITION BY toYYYYMM(create_time)
ORDER BY id

這樣就保證了同一個語句不需要修改就在多個實例上執行,減少了手動修改導致的問題。

總結:

副本表的好處:增加了數據的可靠性,減少了單節點故障導致數據丟失的問題;副本表數據的同步是通過ZooKeeper進行協調的,不需要進行數據的傳輸;並且在各個副本表的各個實例上都可以執行SQL,提高了單點寫入的性能問題,也分攤了查詢,讀寫分離。

副本表的不足:需要在多個副本實例上建表,運維不方便;也無法解決單節點達到瓶頸的問題。

二:分片

 ClickHouse每個實例都可以成為一個分片(shard),在集群配置中用shard代表分片,用replica代表副本。分片是指將數據拆分,將其分散在不同的實例上的過程。將數據分散到不同的機器上,不需要功能強大的服務器就可以存儲更多的數據和處理更大的負載。每個分片只負責總數據的一部分,通過一個名為Distributed的引擎進行操作。類似於MongoDB的Sharding。

分片表的引擎可以用任意引擎,但是如果使用非ReplicatedMergeTree引擎的話,副本的數據同步需要Distributed來負責(寫分片和副本),加大了其壓力。所以如果使用分片,並且需要副本,推薦使用ReplicatedMergeTree引擎,數據同步交由其處理,減輕Distributed壓力(需要增加internal_replication參數:<internal_replication>true</internal_replication>)。

環境:

  實例A  實例B  實例C  實例D 
IP 12.16.20.12 12.16.20.17 12.16.20.12 12.16.20.17
Port 9000 9000 9010 9010


測試:

和副本一樣,也一樣需要配置ZooKeeper,也要保證2個實例的IP、Port可以通訊(<listen_host>0.0.0.0</listen_host>),因為ZooKeeper在各個節點上配置一致,便於維護,獨立到/etc/clickhouse-server/config.d/metrika.xml 文件里。現在測試2種場景:2分片0副本、2分片1副本

因為各個副本配置的集群信息一致(同一個集群),所以集群配置信息也放到metrika.xml 文件里。

場景一:2分片0副本

config.xml 配置文件各個實例一樣(默認即可),只需要修改include:

    <include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
    <zookeeper incl="zookeeper-server" optional="false" />
    <macros incl="macros" optional="false" />
    <remote_servers incl="ck_remote_servers" />

metrika.xml信息:

<?xml version="1.0"?>
<yandex>

    <zookeeper-server>
        <node index="1">
            <host>12.16.20.17</host>
            <port>2181</port>
        </node>
    </zookeeper-server>

    <macros>
        <replica>dba06</replica>
        <shard>1</shard>
    </macros>

    <ck_remote_servers>
        <test_cluster_0_repl>
            <shard>
                <weight>1</weight>
                <replica>
                    <host>12.16.20.12</host>
                    <port>9000</port>
                    <priority>1</priority>
                </replica>
            </shard>
            <shard>
                <weight>1</weight>
                <replica>
                    <host>12.16.20.17</host>
                    <port>9000</port>
                    <priority>1</priority>
                </replica>
            </shard>
        </test_cluster_0_repl>
    </ck_remote_servers>

</yandex>

各個實例的配置都一樣,除了標簽<macros>各個實例不一樣,區別是:

    <macros>
        <replica>dba07</replica> -- 可以配置各個節點的本地ip
        <shard>2</shard>
    </macros>

2分片[1、2]0副本的集群為[test_cluster_0_repl]已經配置完成,可以通過以下語句查看:

-- 查看集群
select * from system.clusters

-- 查看macros
select * from system.macros

注意,基於集群可以使用 on cluster cluster_name 語法,只需要在一個節點上執行SQL就可同步到所有節點。如新增表:

CREATE TABLE test_clsuter_a on cluster test_cluster_0_repl
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(create_time)
ORDER BY id

表引擎可以為任意引擎,該集群下的所有節點都會創建該表(本地表)接着建立Distributed分布式表,語法:

Distributed('集群名','數據庫名','表名', '分片鍵')

Distributed引擎表,其自身不存儲數據,而是作為數據分片的代理,自動路由數據到集群中的各個節點,其中<分片鍵>參數要求返回整型類型的取值,即按照分片鍵的規則將數據分布到各個節點,如:

  • userid:按照用戶id余數拆分
  • rand():按照隨機數拆分
  • intHash64(userid):按照用戶id散列值划分
CREATE TABLE test_clsuter_all on cluster test_cluster_0_repl
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = Distributed('test_cluster_0_repl','default','test_clsuter_a', rand())

向分布式表test_clsuter_all寫入數據: 

insert into test_clsuter_all values('X001',123,'2021-05-01 09:09:00');
insert into test_clsuter_all values('X002',123,'2021-06-01 09:09:00');
insert into test_clsuter_all values('W001',321,'2021-05-01 09:09:00');
insert into test_clsuter_all values('W002',321,'2021-06-01 09:09:00');
insert into test_clsuter_all values('K001',123,'2021-05-01 09:09:00');
insert into test_clsuter_all values('K002',123,'2021-06-01 09:09:00');
insert into test_clsuter_all values('M001',321,'2021-05-01 09:09:00');
insert into test_clsuter_all values('M002',321,'2021-06-01 09:09:00');
insert into test_clsuter_all values('S001',123,'2021-05-01 09:09:00');
insert into test_clsuter_all values('S002',123,'2021-06-01 09:09:00');
insert into test_clsuter_all values('G001',321,'2021-05-01 09:09:00');
insert into test_clsuter_all values('G002',321,'2021-06-01 09:09:00');
View Code

最后在集群中的任意節點查詢該表,都能看到全量數據。本地表則可以看到節點自身的數據。

場景二:2分片1副本

場景一配置一樣,唯一的差別就是,在metrika.xml中再添加一個副本:

<?xml version="1.0"?>
<yandex>

    <zookeeper-server>
        <node index="1">
            <host>12.16.20.17</host>
            <port>2181</port>
        </node>
    </zookeeper-server>

    <macros>
        <replica>dba06</replica>
        <shard>1</shard>
    </macros>

    <ck_remote_servers>
        <test_cluster_1_repl>
            <shard>
                <internal_replication>true</internal_replication>  -- 有復制表引擎自己分發同步數據,減少Distributed壓力。
                <weight>1</weight>
                <replica>
                    <host>12.16.20.12</host>
                    <port>9000</port>
                    <priority>1</priority>
                </replica>
                <replica>
                    <host>12.16.20.12</host>
                    <port>9010</port>
                    <priority>1</priority>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <weight>1</weight>
                <replica>
                    <host>12.16.20.17</host>
                    <port>9000</port>
                    <priority>1</priority>
                </replica>
                <replica>
                    <host>12.16.20.17</host>
                    <port>9010</port>
                    <priority>1</priority>
                </replica>
            </shard>
        </test_cluster_1_repl>
    </ck_remote_servers>

</yandex>

各個節點的區別也是macros:

    <macros>
        <replica>dba06</replica> --可以寫本機ip
        <shard>1</shard>    --分片1,分片2
    </macros>

完成之后,可以通過查詢clusters表來了解各個節點的信息:

select * from system.clusters;
┌─cluster─────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──────┬─host_address───┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─slowdowns_count─┬─estimated_recovery_time─┐
│ test_cluster_1_repl │         111 │ 12.16.20.12 │ 12.16.20.12 │ 90001default │                  │            000 │
│ test_cluster_1_repl │         112 │ 12.16.20.12 │ 12.16.20.12 │ 90100default │                  │            000 │
│ test_cluster_1_repl │         211 │ 12.16.20.17   │ 12.16.20.17   │ 90000default │                  │            000 │
│ test_cluster_1_repl │         212 │ 12.16.20.17   │ 12.16.20.17   │ 90100default │                  │            000 │
└─────────────────────┴───────────┴──────────────┴─────────────┴────────────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────┴─────────────────────────┘

注意,基於集群可以使用 on cluster cluster_name 語法,只需要在一個節點上執行SQL即可同步到所有節點。如新增表:

CREATE TABLE repl_abc on cluster test_cluster_1_repl
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/repl_abc','{replica}')
PARTITION BY toYYYYMM(create_time)
ORDER BY id

這樣各個節點(分配和副本)都會新建該表(本地表),接着建立Distributed分布式表:

CREATE TABLE repl_abc_all on cluster test_cluster_1_repl
(
    `id` String,
    `price` Float64,
    `create_time` DateTime
)
ENGINE = Distributed('test_cluster_1_repl','testdb','repl_abc', rand())
insert into repl_abc_all values('X001',123,'2021-05-01 09:09:00');
insert into repl_abc_all values('X002',123,'2021-06-01 09:09:00');
insert into repl_abc_all values('W001',321,'2021-05-01 09:09:00');
insert into repl_abc_all values('W002',321,'2021-06-01 09:09:00');
insert into repl_abc_all values('K001',123,'2021-05-01 09:09:00');
insert into repl_abc_all values('K002',123,'2021-06-01 09:09:00');
insert into repl_abc_all values('M001',321,'2021-05-01 09:09:00');
insert into repl_abc_all values('M002',321,'2021-06-01 09:09:00');
insert into repl_abc_all values('S001',123,'2021-05-01 09:09:00');
insert into repl_abc_all values('S002',123,'2021-06-01 09:09:00');
insert into repl_abc_all values('G001',321,'2021-05-01 09:09:00');
insert into repl_abc_all values('G002',321,'2021-06-01 09:09:00');
View Code

場景一類似,在任意一節點向分布式表寫入數據,最后在集群中的任意節點查詢該表,都能看到全量數據。本地表則可以看到節點自身的數據。

注意:建立副本表(ReplicatedMergeTree)的時候,如果數據庫的引擎是Atomic,則在刪除表之后馬上重建會遇到:

Code: 253. DB::Exception: Received from localhost:9000. DB::Exception: There was an error on [12.16.20.17:9000]: Code: 253, e.displayText() = DB::Exception: Replica /clickhouse/tables/2/repl_test123/replicas/dba07 already exists. (version 21.6.3.14 (official build)).

避免該問題的方法有2種:

  • 使用普通數據庫而不是Atomic數據庫(ENGINE = Atomic): CREATE DATABASE … Engine=Ordinary。
  • 修改參數 database_atomic_delay_before_drop_table_sec = 0 
    <database_atomic_delay_before_drop_table_sec>0</database_atomic_delay_before_drop_table_sec>

這樣,在建立副本表(ReplicatedMergeTree)再刪除馬上重建,不會報錯。

以上是沒有用戶認證的部署,線上環境如果有認證(user:default;password:123456)的話,需要在各個shard中添加參數(metrika.xml),各個參數的意義:

    <ck_remote_servers>
        <test_cluster_1_repl>
        <!-- 分片1 -->
            <shard>
                <!-- 有復制表直接負責數據分發同步 -->
                <internal_replication>true</internal_replication>
                <!-- 影響數據分布的傾斜,權重越大數據寫入越多 -->
                <weight>1</weight>
                <!-- 分片、副本配置 -->
                <replica>
                    <host>12.16.20.12</host>
                    <port>9000</port>
                    <!-- 節點認證用戶 -->
                    <user>default</user>
                    <!-- 節點用戶密碼 -->
                    <password>123456</password>
                    <!-- 節點權重,值越小優先級越高 -->
<priority>1</priority> </replica> <replica> <host>12.16.20.12</host> <port>9010</port> <user>default</user> <password>123456</password>
            <priority>1</priority> </replica> </shard> <!-- 分片2 --> <shard> <internal_replication>true</internal_replication> <weight>1</weight> <replica> <host>12.16.20.17</host> <port>9000</port> <user>default</user> <password>123456</password>
            <priority>1</priority>  </replica> <replica> <host>12.16.20.17</host> <port>9010</port> <user>default</user> <password>123456</password>
            <priority>1</priority> </replica> </shard> </test_cluster_1_repl> </ck_remote_servers>

這樣,在設置好認證的數據庫上也能正常的進行分片、復制的功能。

總結:

分片的好處:解決了單節點達到瓶頸的問題,和通過分布式表Distributed引擎能本身實現數據的路由和聚合。

分片分布式表的不足:Distributed表在寫入時會在本地節點生成臨時數據,會產生寫放大,所以會對CPU及內存造成一些額外消耗,也會增加merge負擔。

使用說明

一:ZooKeeper離線

不管是ClickHouse的副本還是分片都是通過ZooKeeper來進行協調的,如果ZooKeeper節點異常了,則會出現:

Code: 242. DB::Exception: Received from xxxx DB::Exception: Table is in readonly mode (zookeeper path: /xxx/xxx/xxx). 

表不能進行修改,能查詢,變成了只讀表。所以ZooKeeper線上也必須要開啟集群模式。

二:副本離線

①:如果一個分片的節點出現異常宕機,如果有副本節點,則數據寫入分布式表會直接寫入到其副本節點,不影響數據庫的可用性。當節點起來之后該節點會自動同步該數據。

②:如果一個分片的節點出現異常宕機,包括副本節點,則數據讀取和寫入分布式表只會對未異常的節點進行正常操作,異常節點報錯。如果異常節點起來之后,會把報錯期間的數據重新寫入,保證數據的最終寫入成功。

擴容&縮容

一:縮容

1:副本縮容

副本節點作為一個獨立的節點,直接下線縮容即可。

2:分片縮容

按照上面的部署,把2分片縮容到1分片。具體的操作如下:

①:准備數據

-- 首先看看分片2上有多少個分區:
> select table,active,partition_id,name,database from system.parts where table='repl_abc';
確認有2個分區:202105202106

-- 查看分片1的本地表數據,保證縮容之后,數據寫入的准確性
> select count(*) from repl_abc;
結果是17
-- 查看分片1的分布式表數據
>select count(*) from repl_abc_all; 結果是40

即需要把分片2的數據(23條)寫入到分片1,再下線分片2。

②:導出數據,在分片1上執行:FETCH PARTITION

-- 備份分片2上的分區202105
clickhouse-client --port=9000 --password=123456 -m  --query  "ALTER TABLE testdb.repl_abc FETCH PARTITION 202105 FROM '/clickhouse/tables/2/repl_abc'"

-- 備份分片2上的分區202106
clickhouse-client --port=9000 --password=123456 -m  --query  "ALTER TABLE testdb.repl_abc FETCH PARTITION 202106 FROM '/clickhouse/tables/2/repl_abc'"

上面的導出文件會保存在data目錄下的detached目錄中,其中的FROM是zk_path的地址:即shard分區為2,表為repl_abc的數據。

③:導入數據,在分片1上執行:

-- 導入分區202105到表中
clickhouse-client --port=9000 --password=123456 -m  --query  "ALTER TABLE testdb.repl_abc ATTACH PARTITION 202105"

-- 導入分區202106到表中
clickhouse-client --port=9000 --password=123456 -m  --query  "ALTER TABLE testdb.repl_abc ATTACH PARTITION 202106"

④:驗證數據

-- 查詢分片1的本地表
select count(*) from repl_abc;
結果為40,說明數據遷移成功

⑤:刪除源表&修改配置

驗證沒問題之后,刪除分片2上的本地表,然后修改metrika.xml文件,刪除分片2的信息,縮容配置持久化。最后通過下面SQL查詢集群信息:

select * from system.clusters;

二:擴容

1. 副本擴容

 副本擴容比較簡單,只需要在新實例上創建表,修改表結構中的{replica_name}{zk_path}不需要改變。數據會自動通過ZooKeeper來協調獲取主信息,從主上下載數據到本地。

2. 分片擴容

增加分片節點,集群的分片數將增加,這樣會讓新的分片表和老的分片表的分片數量不一致。因為擴容需要用到新分片,所以需要先新增一個集群,讓擴容的分片表可以使用到新的分片節點,然后將舊集群中的數據遷移至新集群,最后刪除舊集群的數據與集群配置信息。具體的分片配置可以看上面的部署。大致的操作步驟:

-- 1. 修改配置,在原有的配置上,新增集群。
2. 讓配置生效,重啟所有節點。
3. 在新集群中新增分片表。
4. 使用分布式表遷移數據:
-- INSERT INTO TABLE db.tb_all SELECT * FROM db_1.tb_1_all
5. 遷移完成之后,刪除舊的分片表。

三:配置模板 

1)實例:

  實例A  實例B  實例C  實例D 
IP 192.168.11.1 192.168.11.1 192.168.11.2 192.168.11.2
Port 9000 9000 9010 9010

2)配置:

config.xml 配置文件不需要修改,新增2個參數即可(參數優化暫時不考慮):

    <listen_host>0.0.0.0</listen_host>
...
...
    <include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
    <zookeeper incl="zookeeper-server" optional="false" />
    <macros incl="macros" optional="true" />
    <remote_servers incl="ck_remote_servers" />

因為include了metrika.xml文件,所以只需要修改該文件即可。該文件包含了:ZooKeeper地址、集群信息、以及macros變量。

1分片1副本:類似一個主從

  • 主節點配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>A</replica>
            <shard>1</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_1shard_1repl>
                <shard>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_1shard_1repl>
        </ck_remote_servers>
     
     
    </yandex>
    View Code
  • 副本點配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>B</replica>
            <shard>1</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_1shard_1repl>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_1shard_1repl>
        </ck_remote_servers>
     
    </yandex>
    View Code

2分片0副本

  • 分片1配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>A</replica>
            <shard>1</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_2shard_0repl>
                <shard>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
                <shard>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_2shard_0repl>
        </ck_remote_servers>
     
    </yandex>
    View Code
  • 分片1配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>B</replica>
            <shard>2</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_2shard_0repl>
                <shard>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
                <shard>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_2shard_0repl>
        </ck_remote_servers>
     
    </yandex>
    View Code

2分片1副本

  • 分片1配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>A</replica>
            <shard>1</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_2shard_1repl>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_2shard_1repl>
        </ck_remote_servers>
     
    </yandex>
    View Code
  • 分片1副本配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>AA</replica>
            <shard>1</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_2shard_1repl>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_2shard_1repl>
        </ck_remote_servers>
     
    </yandex>
    View Code
  • 分片2配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>B</replica>
            <shard>2</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_2shard_1repl>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_2shard_1repl>
        </ck_remote_servers>
     
    </yandex>
    View Code
  • 分片2副本配置:
    <?xml version="1.0"?>
    <yandex>
     
        <zookeeper-server>
            <node index="1">
                <host>192.168.11.1</host>
                <port>2181</port>
            </node>
        </zookeeper-server>
     
        <macros>
            <replica>BB</replica>
            <shard>2</shard>
        </macros>
     
        <ck_remote_servers>
            <cluster_2shard_1repl>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.1</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
                <shard>
                    <internal_replication>true</internal_replication>
                    <weight>1</weight>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                    <replica>
                        <host>192.168.11.2</host>
                        <port>9010</port>
                        <user>default</user>
                        <password>123456</password>
                    </replica>
                </shard>
            </cluster_2shard_1repl>
        </ck_remote_servers>
     
    </yandex>
    View Code

以上的配置區別:macros 參數定義

總結

ClickHouse是一個快速開源的列式數據庫管理系統,在其高性能的前提下,通過副本表和分片來進一步保障了數據庫的可用性和可靠性,關於更多的該方面的說明,后續會進一步說明和更新。

 


免責聲明!

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



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