您好,登录后才能下订单哦!
# ClickHouse集群搭建的方法
## 1. ClickHouse简介
ClickHouse是俄罗斯Yandex公司开发的一个开源的列式数据库管理系统(DBMS),主要用于在线分析处理(OLAP)。它能够以极高的速度进行实时数据分析,支持线性扩展,非常适合大规模数据分析场景。
### 1.1 核心特性
- **列式存储**:数据按列存储,压缩效率高
- **向量化执行引擎**:利用CPU SIMD指令加速查询
- **分布式查询处理**:支持多服务器并行处理
- **实时数据摄入**:支持高吞吐量的数据插入
- **高可用性**:支持数据复制和故障转移
## 2. 集群架构设计
### 2.1 基本概念
ClickHouse集群由多个分片(Shard)组成,每个分片可以包含多个副本(Replica)。数据在不同分片间分布,在副本间复制。
### 2.2 典型架构
[Client]
|
+----------------+----------------+
| | |
[Shard1] [Shard2] [Shard3]
/ \ / \ / \
[Replica1] [Replica2] [Replica1] [Replica2] [Replica1] [Replica2]
### 2.3 硬件要求
| 组件 | 推荐配置 |
|---------------|-----------------------------------|
| CPU | 16核以上,支持AVX指令集 |
| 内存 | 64GB以上 |
| 存储 | SSD或NVMe,建议RD10配置 |
| 网络 | 10Gbps以上网络连接 |
## 3. 环境准备
### 3.1 操作系统要求
- Linux (推荐CentOS 7+/Ubuntu 18.04+)
- 内核版本3.10+
- 关闭swap: `swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab`
- 调整文件描述符限制:
```bash
echo "fs.file-max = 500000" >> /etc/sysctl.conf
echo "* soft nofile 262144" >> /etc/security/limits.conf
echo "* hard nofile 262144" >> /etc/security/limits.conf
# CentOS
yum install -y epel-release
yum install -y clickhouse-server clickhouse-client
# Ubuntu
apt-get install -y apt-transport-https ca-certificates dirmngr
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
echo "deb https://repo.clickhouse.com/deb/stable/ main/" | tee /etc/apt/sources.list.d/clickhouse.list
apt-get update
apt-get install -y clickhouse-server clickhouse-client
ClickHouse主要配置文件位于/etc/clickhouse-server/
目录:
config.xml
:主配置文件users.xml
:用户权限配置metrika.xml
:集群配置(通常通过include引入)创建/etc/clickhouse-server/config.d/metrika.xml
:
<yandex>
<clickhouse_remote_servers>
<cluster_3shards_2replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>shard1-replica1</host>
<port>9000</port>
</replica>
<replica>
<host>shard1-replica2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>shard2-replica1</host>
<port>9000</port>
</replica>
<replica>
<host>shard2-replica2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>shard3-replica1</host>
<port>9000</port>
</replica>
<replica>
<host>shard3-replica2</host>
<port>9000</port>
</replica>
</shard>
</cluster_3shards_2replicas>
</clickhouse_remote_servers>
<zookeeper>
<node index="1">
<host>zk1</host>
<port>2181</port>
</node>
<node index="2">
<host>zk2</host>
<port>2181</port>
</node>
<node index="3">
<host>zk3</host>
<port>2181</port>
</node>
</zookeeper>
<macros>
<shard>01</shard>
<replica>shard1-replica1</replica>
</macros>
</yandex>
注意:每个节点需要修改<macros>
部分以匹配自身角色。
在config.xml
中启用复制:
<distributed_ddl>
<path>/clickhouse/task_queue/ddl</path>
</distributed_ddl>
编辑users.xml
设置管理员账户:
<users>
<admin>
<password>secure_password</password>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<access_management>1</access_management>
</admin>
</users>
ClickHouse使用ZooKeeper协调分布式操作和复制。
# 在所有ZK节点上执行
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar -xzf apache-zookeeper-3.6.3-bin.tar.gz
mv apache-zookeeper-3.6.3-bin /opt/zookeeper
创建/opt/zookeeper/conf/zoo.cfg
:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
在每个节点创建myid
文件:
# 在zk1上
echo "1" > /var/lib/zookeeper/myid
# 在zk2上
echo "2" > /var/lib/zookeeper/myid
# 在zk3上
echo "3" > /var/lib/zookeeper/myid
/opt/zookeeper/bin/zkServer.sh start
systemctl enable clickhouse-server
systemctl start clickhouse-server
-- 在任意节点执行
SELECT * FROM system.clusters;
-- 检查ZooKeeper连接
SELECT * FROM system.zookeeper WHERE path = '/';
在每个节点上创建相同的本地表结构:
CREATE TABLE default.test_local ON CLUSTER cluster_3shards_2replicas (
id UInt64,
event_time DateTime,
data String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
PARTITION BY toYYYYMM(event_time)
ORDER BY (id, event_time);
在任意节点创建分布式表:
CREATE TABLE default.test_distributed ON CLUSTER cluster_3shards_2replicas AS default.test_local
ENGINE = Distributed(cluster_3shards_2replicas, default, test_local, rand());
-- 插入到分布式表,数据会自动分配到各分片
INSERT INTO test_distributed VALUES
(1, now(), 'data1'),
(2, now(), 'data2');
-- 直接插入到本地表
INSERT INTO test_local VALUES
(3, now(), 'local data');
-- 从分布式表查询(聚合所有分片数据)
SELECT * FROM test_distributed;
-- 从本地表查询
SELECT * FROM test_local;
-- 查看查询日志
SELECT * FROM system.query_log;
-- 查看正在运行的查询
SELECT * FROM system.processes;
-- 查看副本状态
SELECT * FROM system.replicas;
配置config.xml
:
<prometheus>
<endpoint>/metrics</endpoint>
<port>9363</port>
<metrics>true</metrics>
<events>true</events>
<asynchronous_metrics>true</asynchronous_metrics>
</prometheus>
-- 优化表
OPTIMIZE TABLE test_local FINAL;
-- 查看表大小
SELECT
table,
formatReadableSize(sum(bytes)) as size
FROM system.parts
WHERE active
GROUP BY table;
症状:副本表无法同步,报ZooKeeper错误
解决:
1. 检查ZooKeeper服务状态
2. 验证网络连接
3. 检查/etc/hosts
中的主机名解析
症状:副本间数据不一致
解决:
1. 检查system.replicas
表
2. 尝试SYSTEM RESTART REPLICA
命令
3. 必要时从其他副本重新同步
症状:查询响应变慢
解决:
1. 检查系统资源使用情况
2. 分析慢查询system.query_log
3. 考虑添加索引或优化表结构
metrika.xml
ClickHouse集群搭建需要仔细规划分片和副本策略,正确配置ZooKeeper协调服务,并通过分布式表实现透明的数据访问。本文详细介绍了从环境准备到集群配置、表创建、数据操作和维护的全过程,遵循这些步骤可以建立一个高性能、高可用的ClickHouse分析集群。
实际生产环境中,还需要根据具体业务需求调整配置参数,并建立完善的监控告警系统,确保集群长期稳定运行。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。