副本
副本的目的主要是保障數據的高可用性,即使一臺 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 的集羣是表級別的,實際企業中,大部分做了高可用,但是沒有用分
片,避免降低查詢性能以及操作集羣的複雜性。
- 查看集羣
show clusters;
- 在 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;
- 在 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()
- 在 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)分佈式表
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兩個節點上