ClickHouse集群环境部署

本文详细介绍了如何在6台虚拟机上搭建ClickHouse集群,版本为21.12.3.32。首先,配置每个节点的metrika.xml文件,包括设置内部复制、ZooKeeper节点信息和全局变量。接着,检查ClickHouse配置文件的包含路径,并启动服务。然后,创建数据库和复制表,最后建立分布式表并插入数据,确保数据在所有分片和副本上同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集群安装


本文使用的版本是21.12.3.32, 准备6台虚拟机作为集群

单机版-传送门
https://blog.youkuaiyun.com/xushijie89/article/details/122987121

集群依赖ZooKeeper服务, 请自行安装ZK集群

配置文件修改


(1)修改每台配置文件, 文件不存在可以新建一下

[root@172.16.131.56 /etc/clickhouse-server]$ vim /etc/clickhouse-server/config.d/metrika.xml
<clickhouse>
		<!--不同版本的节点名称不同, 注意修改-->
        <remote_servers>
                <!--集群名称, 可以自定义, 后面在新建库、表的时候需要用到集群名称-->
                <cluster_3shards_2replicas>
	                <shard>
	                	<!--内部复制(默认false), 开启后, 在分布式表引擎下, 数据写入时-->
	                	<!--每个分片只会去寻找一个节点写, 并不是每个都写-->
	                	<internal_replication>true</internal_replication>
		                <replica>
		                    <host>hadoop1</host>
		                    <port>9001</port>
		                </replica>
		                <replica>
		                    <host>hadoop2</host>
		                    <port>9001</port>
		                </replica>
	            	</shard>
		            <shard>
		            	<internal_replication>true</internal_replication>
		                <replica>
		                    <host>hadoop3</host>
		                    <port>9001</port>
		                </replica>
		                <replica>
		                    <host>hadoop4</host>
		                    <port>9001</port>
		                </replica>
		            </shard>
		            <shard>
		            	<internal_replication>true</internal_replication>
		                <replica>
		                    <host>hadoop5</host>
		                    <port>9001</port>
		                </replica>
		                <replica>
		                    <host>hadoop6</host>
		                    <port>9001</port>
		                </replica>
		            </shard>
                </cluster_3shards_2replicas>
        </remote_servers>
		
		<!--zookeeper配置-->
        <zookeeper>
	        <node>
	            <host>hadoop1</host>
	            <port>2181</port>
	        </node>
	        <node>
	            <host>hadoop2</host>
	            <port>2181</port>
	        </node>
	        <node>
	            <host>hadoop3</host>
	            <port>2181</port>
	        </node>
    	</zookeeper>
    
    <!--全局变量, 建复制表的时候可以使用${}灵活替换, 下文有例子-->
    <macros>
    	<!--01分片机器-->
        <shard>01</shard>
        <database>database_name</database>
        <replica>hadoop1</replica>
        <!--01分片副本机器-->
        <!--<shard>01</shard>-->
        <!--<database>database_name</database>-->
        <!--<replica>hadoop2</replica>-->
    </macros>
    <!--压缩相关配置-->
    <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>
    </compression>
</clickhouse>

(2)检查一下ClickHouse配置指向路径是否正确

[root@172.16.131.56 /etc/clickhouse-server]$ vim /etc/clickhouse-server/config.xml
检查这行配置
<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>

(3)启动服务

/etc/init.d/clickhouse-server start

(4)连接控制台, 创建数据库

[root@172.16.131.56 /etc/clickhouse-server/config.d]$ clickhouse-client -m
CREATE DATABASE db_name on cluster cluster_3shards_2replicas COMMENT '测试库'

(5)新建复制表(物理表), 真实保存数据的

create table table_name on cluster cluster_3shards_2replicas (
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2),
 create_time Datetime
) engine 
= ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name','{replica}')
 partition by toYYYYMMDD(create_time)
 primary key (id)
 order by (id,sku_id);

on cluster cluster_3shards_2replicas:
建表时加上这个参数, 可以在cluster_3shards_2replicas指定的分片中, 都执行一次命令

ReplicatedMergeTree()的参数:
zoo_path: ZooKeeper中表的路径
replica_name: ZooKeeper中副本的名字
other_parameters(可以不填): Parameters of an engine which is used for creating the replicated version, for example, version in ReplacingMergeTree.

(6)新建分布式表(逻辑表), 不保存数据

CREATE TABLE db_name.table_name_all on cluster cluster_3shards_2replicas(
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2),
    create_time Datetime
) ENGINE
= Distributed(cluster_3shards_2replicas, db_name, table_name, hiveHash(id));

Distributed()的参数:
cluster: 配置里的分片名
database: 数据库名
table: 表名
sharding_key(可选): 分片键
policy_name(可选): 策略名, 用于存储临时文件进行异步发送

(6)先在分布式表上插入数据
insert into table_name_all values (201, ‘sku_001’, 1000.00, ‘2020-06-01 12:00:00’);

逐台机器查看数据落在哪个分片的物理表上
select * from table_name;

最后看下分片的副本是否也有数据存在

### 验证ClickHouse集群成功的步骤 为了确保ClickHouse集群已经成功部并正常运行,可以采取多种方法来验证其状态和服务可用性。 #### 使用命令行检查服务状态 可以通过Linux命令`ps -ef | grep clickhouse`查看ClickHouse服务器进程是否正在运行[^3]。此命令能够显示所有与ClickHouse有关的活动进程,如果看到`clickhouse-server`的相关条目,则说明该服务已经在指定节点上启动。 #### 查询系统表获取集群信息 另外一种有效的方式是从内部查询ClickHouse数据库本身的状态。通过执行SQL语句访问系统表中的数据可以帮助了解整个集群的工作情况: ```sql SELECT * FROM system.clusters; ``` 这条指令返回的结果集应该包含所定义的所有分片及其对应的副本列表,这有助于确认各个节点之间的通信状况良好,并且都加入了预期的集群配置中[^4]。 #### 测试分布式表的功能 创建一个简单的分布式表并向其中插入一些测试记录也是一个不错的检验手段。当这些操作顺利完成而没有任何错误提示时,基本上就可以断定集群环境设置无误了。下面是一个具体的例子: ```sql CREATE TABLE test_dist AS default.test_local ENGINE = Distributed('cluster_name', 'default', 'test_local'); INSERT INTO test_dist VALUES ('example data'); SELECT * FROM test_dist; ``` 上述代码片段展示了如何基于已有的本地表结构建立一个新的分布式的表对象,接着向里面添加一条新纪录最后读取出来以证明跨节点的数据交换机制运作正常[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值