Clickhouse副本及分片

副本

副本的目的主要是保障數據的高可用性,即使一臺 ClickHouse 節點宕機,那麼也可以從其他服務器獲得相同的數據

配置副本

1. zookeeper集羣準備

2. Clickhouse準備兩個節點

Node1, Node2
在 Node1 的/etc/clickhouse-server/config.d 目錄下創建一個名爲 metrika.xml
的配置文件,內容如下:
注:也可以不創建外部文件,直接在 config.xml 中指定

vim /etc/clickhouse-server/config.d/metrika.xml
<?xml version="1.0"?>
<yandex>
    <zookeeper-servers>
        <node index="1">
            <host>node2</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>xxx</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>xxx</host>
            <port>2181</port>
        </node>
        </zookeeper-servers>
</yandex>

3. 同步到Node2

scp /etc/clickhouse-server/config.d/metrika.xml root@Node2:/etc/clickhouse-server/config.d/

4. 在 Node1 的/etc/clickhouse-server/config.xml 中增加

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

同步到node2

重啓clickhouse:

sudo clickhouse restart

5. 在 Node1 和 Node2 上分別建表

create table t_order_rep7 (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep7','rep_fz_102')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
create table t_order_rep7 (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep7','rep_fz_103')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);

參數解釋:
ReplicatedMergeTree 中,
第一個參數是分片的 zk_path 一般按照:/clickhouse/table/{shard}/{table_name} 的格式寫,如果只有一個分片就寫 01 即可。
第二個參數是副本名稱,相同的分片副本名稱不能相同

7. 驗證

node1上插入數據,然後在node2上執行select 驗證,可以查詢出結果,說明副本配置正確

分片

副本雖然能夠提高數據的可用性,降低丟失風險,但是每臺服務器實際上必須容納全量數據,對數據的橫向擴容沒有解決。
要解決數據水平切分的問題,需要引入分片的概念。通過分片把一份完整的數據進行切分,不同的分片分佈到不同的節點上,再通過 Distributed 表引擎把數據拼接起來一同使用。

ClickHouse 的集羣是表級別的,實際企業中,大部分做了高可用,但是沒有用分
片,避免降低查詢性能以及操作集羣的複雜性。

  1. 查看集羣
show clusters;
  1. 在 Node01 上執行建表語句
    會自動同步到 Node02 和 Node03 上
    集羣名字要和配置文件中的一致
    分片和副本名稱從配置文件的宏定義中獲取
create table st_fz_order_mt_01 on cluster gmall_cluster (
               id UInt32,
               sku_id String,
               total_amount Decimal(16,2),
               create_time Datetime
               ) engine
               =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_fz_order_mt_01','{replica}')
               partition by toYYYYMMDD(create_time)
               primary key (id)
               order by (id,sku_id);

在Node02和Node03上查看錶是否創建成功

show tables;
  1. 在 Node02 上創建 Distribute 分佈式表
create table st_fz_order_mt_all2 on cluster gmall_cluster
            (
            id UInt32,
            sku_id String,
            total_amount Decimal(16,2),
            create_time Datetime
            )engine = Distributed(gmall_cluster,default, st_fz_order_mt_01,hiveHash(sku_id));
            

參數含義:
Distributed(集羣名稱,庫名,本地表名,分片鍵)
分片鍵必須是整型數字,所以用 hiveHash 函數轉換,也可以 rand()

  1. 在 Node01 上插入測試數據
insert into st_order_mt_all2 values
(201,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(202,'sku_002',2000.00,'2020-06-01 12:00:00'),
(203,'sku_004',2500.00,'2020-06-01 12:00:00'),
(204,'sku_002',2000.00,'2020-06-01 12:00:00'),
(205,'sku_003',600.00,'2020-06-02 12:00:00');
  1. 通過查詢分佈式表和本地表觀察輸出結果
    1)分佈式表
select * From st_fz_order_mt_all2;
SELECT *
FROM st_fz_order_mt_all2
Query id: d8b676e9-c119-4483-8ca2-f0b5cd150a61
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │         2500 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 205 │ sku_003 │          600 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 201 │ sku_001 │         1000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

(2)本地表

Node1:

 select * From st_fz_order_mt_01;
SELECT *
FROM st_fz_order_mt_01
Query id: ddcb5176-e443-4253-9877-57fec8f57311
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │         2500 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │         2000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
3 rows in set. Elapsed: 0.002 sec. 

Node2:

Node3:

date1001 :) select * From st_fz_order_mt_01;
SELECT *
FROM st_fz_order_mt_01
Query id: 7a336004-7040-4098-948e-1e7c5d983edb
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 205 │ sku_003 │          600 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 201 │ sku_001 │         1000 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
2 rows in set. Elapsed: 0.002 sec. 

數據分佈在Node1和Node3兩個節點上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章