一、简介
分片功能依赖于 Distributed 表引擎,Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据
ClickHouse 进行分片集群的目的是解决数据的横向扩容,通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。
二、集群规划
3 分片 2 副本共 6 个节点,s 表示分片数,r 表示副本数
hadoop1 | hadoop2 | hadoop3 | hadoop4 | hadoop5 | hadoop6 |
---|---|---|---|---|---|
s1r1 | s1r2 | s2r1 | s2r2 | s3r1 | s3r2 |
1. 写入流程
实际生产中会设置 internal_replication=true,开启副本内部同步
2. 读取流程
- 优先选择 error_count 值小的副本进行读取
- 当同一分片的 error_count 值相同时选择方式有随机、顺序、优先第一顺位和主机名称近似等四种
3. 集群配置
shell
su root
cd /etc/clickhouse-server/config.d
vim metrika.xml
#添加配置
<yandex>
<remote_servers>
<gmall_cluster> <!-- 自定义集群名称-->
<shard> <!--集群的第一个分片-->
<internal_replication>true</internal_replication>
<!--该分片的第一个副本-->
<replica>
<host>hadoop101</host>
<port>9000</port>
</replica>
<!--该分片的第二个副本-->
<replica>
<host>hadoop102</host>
<port>9000</port>
</replica>
</shard>
<shard> <!--集群的第二个分片-->
<internal_replication>true</internal_replication>
<replica> <!--该分片的第一个副本-->
<host>hadoop103</host>
<port>9000</port>
</replica>
<replica> <!--该分片的第二个副本-->
<host>hadoop104</host>
<port>9000</port>
</replica>
</shard>
<shard> <!--集群的第三个分片-->
<internal_replication>true</internal_replication>
<replica> <!--该分片的第一个副本-->
<host>hadoop105</host>
<port>9000</port>
</replica>
<replica> <!--该分片的第二个副本-->
<host>hadoop106</host>
<port>9000</port>
</replica>
</shard>
</gmall_cluster>
</remote_servers>
</yandex>
#也可以直接在 config.xml 的<remote_servers>中指定
三、三节点版本集群配置操作
生产上 ClickHouse 建议独立部署在服务器上,建议资源:100G内存,CPU为32线程
1. 分片及副本规划
hadoop102 | hadoop103 | hadoop104 |
---|---|---|
s1r1 | s1r2 | s2r1 |
2. 实操步骤
-
在 hadoop102 节点的
/etc/clickhouse-server/config.d
目录下创建metrika-shard.xml
文件shellsu root cd /etc/clickhouse-server/config.d vim metrika-shard.xml #添加配置 <?xml version="1.0"?> <yandex> <remote_servers> <gmall_cluster> <!-- 自定义集群名称--> <shard> <!--集群的第一个分片--> <internal_replication>true</internal_replication> <replica> <!--该分片的第一个副本--> <host>hadoop102</host> <port>9000</port> </replica> <replica> <!--该分片的第二个副本--> <host>hadoop103</host> <port>9000</port> </replica> </shard> <shard> <!--集群的第二个分片--> <internal_replication>true</internal_replication> <replica> <!--该分片的第一个副本--> <host>hadoop104</host> <port>9000</port> </replica> </shard> </gmall_cluster> </remote_servers> <zookeeper-servers> <node index="1"> <host>hadoop102</host> <port>2181</port> </node> <node index="2"> <host>hadoop103</host> <port>2181</port> </node> <node index="3"> <host>hadoop104</host> <port>2181</port> </node> </zookeeper-servers> <macros> <shard>01</shard> <!--不同机器放的分片数不一样--> <replica>rep_1_1</replica> <!--不同机器放的副本数不一样--> </macros> </yandex> chown clickhouse:clickhouse metrika-shard.xml #也可以直接在 config.xml 的<remote_servers>中指定
-
在 hadoop102 上修改
/etc/clickhouse-server/config.xml
shellcd /etc/clickhouse-server vim config.xml #添加外部文件路径 <zookeeper incl="zookeeper-servers" optional="true" /> <include_from>/etc/clickhouse-server/config.d/metrika-shard.xml</include_from>
-
分发配置到 hadoop103 和 hadoop104
shell/etc/clickhouse-server/config.d/metrika-shard.xml /etc/clickhouse-server/config.xml
-
分别修改 hadoop103 和 hadoop104 中
metrika-shard.xml
的<macros>
的配置shell#hadoop103 sudo vim /etc/clickhouse-server/config.d/metrika-shard.xml <macros> <shard>01</shard> <!--不同机器放的分片数不一样--> <replica>rep_1_2</replica> <!--不同机器放的副本数不一样--> </macros> #hadoop104 sudo vim /etc/clickhouse-server/config.d/metrika-shard.xml <macros> <shard>02</shard> <!--不同机器放的分片数不一样--> <replica>rep_2_1</replica> <!--不同机器放的副本数不一样--> </macros>
-
分别在三台节点上启动 clickhouse 服务
shellsudo clickhouse start
-
在 hadoop102 上创建一张本地表
sqlcreate table st_order_mt on cluster gmall_cluster ( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine=ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt','{replica}') partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id); --on cluster 的集群名字要和配置文件中自定义的集群名一致 --分片和副本名称从配置文件的宏定义中获取 --hadoop103 和 hadoop104 上会自动同步创建这张表
-
在 hadoop102 上创建 Distribute 分布式表
sqlcreate table st_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_order_mt, hiveHash(sku_id)); --on cluster 的集群名字要和配置文件中自定义的集群名一致 --hadoop103 和 hadoop104 上会自动同步创建这张表 --表引擎为 Distributed,其中的参数分别为:集群名称,数据库名,本地表名,分片键 --分片键必须是整型数字,所以用 hiveHash 函数转换,也可以 rand()
-
向 hadoop102 上的分布式表插入数据
sqlinsert 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');
-
分别在 hadoop102、hadoop103 和 hadoop104 上查询本地表和分布式表的数据进行对比
sql--hadoop102 select * from st_order_mt; select * from st_order_mt_all2; --hadoop103 select * from st_order_mt; select * from st_order_mt_all2; --hadoop104 select * from st_order_mt; select * from st_order_mt_all2;