ClickHouse集群搭建的方法

发布时间:2021-07-06 09:27:06 作者:chen
来源:亿速云 阅读:552
# 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

3.2 安装依赖

# 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

4. 集群配置

4.1 配置文件结构

ClickHouse主要配置文件位于/etc/clickhouse-server/目录:

4.2 配置分片和副本

创建/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>部分以匹配自身角色。

4.3 配置复制表

config.xml中启用复制:

<distributed_ddl>
    <path>/clickhouse/task_queue/ddl</path>
</distributed_ddl>

4.4 用户权限配置

编辑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>

5. ZooKeeper集群配置

ClickHouse使用ZooKeeper协调分布式操作和复制。

5.1 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

5.2 配置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

5.3 启动ZooKeeper

/opt/zookeeper/bin/zkServer.sh start

6. 启动ClickHouse集群

6.1 启动服务

systemctl enable clickhouse-server
systemctl start clickhouse-server

6.2 验证集群状态

-- 在任意节点执行
SELECT * FROM system.clusters;

-- 检查ZooKeeper连接
SELECT * FROM system.zookeeper WHERE path = '/';

7. 创建分布式表

7.1 创建本地表

在每个节点上创建相同的本地表结构:

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);

7.2 创建分布式表

在任意节点创建分布式表:

CREATE TABLE default.test_distributed ON CLUSTER cluster_3shards_2replicas AS default.test_local
ENGINE = Distributed(cluster_3shards_2replicas, default, test_local, rand());

8. 数据操作

8.1 插入数据

-- 插入到分布式表,数据会自动分配到各分片
INSERT INTO test_distributed VALUES 
(1, now(), 'data1'),
(2, now(), 'data2');

-- 直接插入到本地表
INSERT INTO test_local VALUES 
(3, now(), 'local data');

8.2 查询数据

-- 从分布式表查询(聚合所有分片数据)
SELECT * FROM test_distributed;

-- 从本地表查询
SELECT * FROM test_local;

9. 监控与维护

9.1 系统表监控

-- 查看查询日志
SELECT * FROM system.query_log;

-- 查看正在运行的查询
SELECT * FROM system.processes;

-- 查看副本状态
SELECT * FROM system.replicas;

9.2 使用Prometheus监控

配置config.xml

<prometheus>
    <endpoint>/metrics</endpoint>
    <port>9363</port>
    <metrics>true</metrics>
    <events>true</events>
    <asynchronous_metrics>true</asynchronous_metrics>
</prometheus>

9.3 日常维护

-- 优化表
OPTIMIZE TABLE test_local FINAL;

-- 查看表大小
SELECT 
    table, 
    formatReadableSize(sum(bytes)) as size
FROM system.parts
WHERE active
GROUP BY table;

10. 常见问题解决

10.1 ZooKeeper连接问题

症状:副本表无法同步,报ZooKeeper错误

解决: 1. 检查ZooKeeper服务状态 2. 验证网络连接 3. 检查/etc/hosts中的主机名解析

10.2 副本不同步

症状:副本间数据不一致

解决: 1. 检查system.replicas表 2. 尝试SYSTEM RESTART REPLICA命令 3. 必要时从其他副本重新同步

10.3 查询性能下降

症状:查询响应变慢

解决: 1. 检查系统资源使用情况 2. 分析慢查询system.query_log 3. 考虑添加索引或优化表结构

11. 扩展与升级

11.1 添加新节点

  1. 在新节点安装ClickHouse
  2. 修改配置文件加入集群配置
  3. 更新现有节点的metrika.xml
  4. 重新平衡数据

11.2 版本升级

  1. 在一个副本上停止服务
  2. 升级软件包
  3. 启动并验证
  4. 逐步升级其他节点

12. 最佳实践

  1. 合理设计分片键:选择分布均匀的列作为分片键
  2. 控制分片大小:建议每个分片不超过2TB原始数据
  3. 监控ZooKeeper:ZooKeeper性能直接影响集群稳定性
  4. 定期维护:定期执行OPTIMIZE和CHECK TABLE
  5. 备份策略:实现定期备份机制

13. 总结

ClickHouse集群搭建需要仔细规划分片和副本策略,正确配置ZooKeeper协调服务,并通过分布式表实现透明的数据访问。本文详细介绍了从环境准备到集群配置、表创建、数据操作和维护的全过程,遵循这些步骤可以建立一个高性能、高可用的ClickHouse分析集群。

实际生产环境中,还需要根据具体业务需求调整配置参数,并建立完善的监控告警系统,确保集群长期稳定运行。 “`

推荐阅读:
  1. ClickHouse 快速入门
  2. redis集群搭建的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

clickhouse

上一篇:Java中的二分查找是什么意思

下一篇:微信小程序如何实现支付及退款

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》