ClickHouse高可用集群方案

概述

在ClickHouse集群中使用复制表引擎ReplicatedMerge*Tree建立本地表,插入的数据会在ClickHouse的副本间进行自动复制,实现数据的高可用效果

安装配置

RPM安装

从官网直接下载安装包 https://repo.clickhouse.tech/deb/stable/main/
直接使用 rpm -ivh命令安装就OK
建议新建用户clickhouse并加入sudoers
注意所有安装包的版本要相同

clickhouse-common-static — ClickHouse编译的二进制文件
clickhouse-server — 创建clickhouse-server软连接,并安装默认配置服务
clickhouse-client — 创建clickhouse-client客户端工具软连接,并安装客户端配置文件
clickhouse-common-static-dbg — 带有调试信息的ClickHouse二进制文件(非必要)

基础配置

/etc/clickhouse-server目录为clickhouse的主配置目录

启动时默认加载config.xmlusers.xml
config.dusers.d目录下的所有附加xml文件也会被加载(需要满足clickhouse的配置文件语法)

config.xml常用配置如下:



  trace
  /var/log/clickhouse-server/clickhouse-server.log
  /var/log/clickhouse-server/clickhouse-server.err.log
  1000M
  10



8123

9000

9009

这里需要用域名,如果后续用到复制的话


0.0.0.0


64

16


/var/lib/clickhouse/
/var/lib/clickhouse/tmp/







/etc/clickhouse-server/metrika.xml
启动&连接

启动命令 sudo systemctl start clickhouse-server
命令行连接 clickhouse-client -u root --password --port 9000 (默认9000端口可以不加port参数)
JDBC连接 jdbc:clickhouse://10.10.10.10:8123

集群配置

ClickHouse集群信息基于手工编写配置文件metrika.xml,默认加载/etc/metrika.xml,为了方便管理我们在主配置文件中引用/etc/clickhouse-server/metrika.xml,集群搭建完毕后可查询系统表system.clusters,查看集群配置信息

ClickHouse的集群层级,对应metrika.xml配置中的macros节点:

  • 集群《layer》 => 分片《shard》 => 副本《replica》 (每个ClickHouse实例都可以看做一个副本)

具体集群部署方案放在后续详细介绍

metrika.xml 配置如下:


  
    
    
      
      
        
        true
        
        
          VM_102_21_centos
          9000
          xxx
          xxx
        
        
          VM_102_22_centos
          9001
          xxx
          xxx
        
      
    
  

  
  
    
      vm162centos31
      2181
    
    
      vm162centos32
      2181
    
    
      vm162centos33
      2181
    
  

  
  
    ck_cluster
    shard01
    replica01
  

  ……



常用的表引擎

分布式表 Distributed

分布式引擎本身不存储数据, 但可以在多个服务器上进行分布式查询。
读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。
我们可以引申理解它就相当于关系型数据库中的视图概念。

示例:ENGINE = Distributed(<集群名称>, <库名>, <表名>[, sharding_key])

与分布式表对应的是本地表,也就是上面的<表名>参数,查询分布式表的时候,ClickHouse会自动查询所有分片,然后将结果汇总后返回

向分布式表插入数据

ClickHouse会根据分片权重将数据分散插入到各个分片中
默认情况下,每个分片中所有副本都会写入数据
或者通过参数internal_replication配置每个分片只写入其中一个副本,使用复制表(Replicated*MergeTree)管理数据的副本

数据副本 Replicated*MergeTree

ReplicatedMergeTree
ReplicatedSummingMergeTree
ReplicatedReplacingMergeTree
ReplicatedAggregatingMergeTree
ReplicatedCollapsingMergeTree
ReplicatedVersionedCollapsingMergetree
ReplicatedGraphiteMergeTree

  • 只有MergeTree系列引擎支持Replicated前缀
  • 副本是表级别的,不是整个服务器级的。所以,服务器里可以同时有复制表和非复制表
  • 副本不依赖分片。每个分片有它自己的独立副本
  • 数据副本使用到Zookeeper,需要在metrika.xml中配置zk的集群信息
  • SELECT 查询并不需要借助 ZooKeeper ,副本并不影响 SELECT 的性能,查询复制表与非复制表速度是一样的
  • 默认情况下,INSERT 语句仅等待一个副本写入成功后返回。如果数据只成功写入一个副本后该副本所在的服务器不再存在,则存储的数据会丢失。要启用数据写入多个副本才确认返回,使用 insert_quorum选项
  • 数据块会去重。对于被多次写的相同数据块(大小相同且具有相同顺序的相同行的数据块),该块仅会写入一次

示例: ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')

大括号中的参数是metrika.xmlmacros配置的,每个节点读取自己的配置信息,统一了建表语句
第一个参数用于zk中的目录结构,用了layer-shard名称分层
第二个参数是副本名,用于标识同一个表分片的不同副本,同个分片中不同副本的副本名称要唯一

分布式集群方案

方案1.0:MergeTree + Distributed

每个分片中只有一个副本,数据存储在本地表(MergeTree),查询分布式表,引擎自动向所有分片查询数据并计算后返回


方案1.0.jpg
优势

架构简单,单机和分布式都可以用

劣势

单点问题,数据丢失风险大

方案2.0:MergeTree + Distributed + 多副本

在方案一的基础上为每个节点增加副本


方案2.0.jpg
优势

在1.0的基础上,数据安全有了保障,任何一个实例或者服务器挂掉了,不影响集群查询服务

劣势

如果某个节点挂了,恢复以后可以将丢失的增量数据补全,但是如果硬盘彻底损坏,存量数据基本无法恢复,且这种方案不能用两个节点互为主备,会造成数据错乱

方案3.0:ReplicatedMergeTree + Distributed + 多副本

把2.0方案中的数据表引擎替换成ReplicatedMergeTree,并设置分布式写入时只写入分片的一个节点:internal_replication设置为true
实现同一个分片中,写入一个节点的数据后,自动同步到其他的副本中
下图实现的是一个节点启动多个ClickHouse实例

方案3.0.jpg

优势

ReplicatedMergeTree表引擎管理数据副本(依赖Zookeeper),无须担心节点挂掉后数据的同步和丢失问题

劣势

集群配置比较复杂, macros配置分片和副本需要仔细

metrika.xml配置

2分片2副本配置.jpg

节点扩展
方案3.0节点扩展.jpg

单节点多实例部署

多套配置文件

/etc/clickhouse-server/目录下的config.xmlusers.xmlmetrika.xml复制到/etc/clickhouse-server/replica02/目录下
并对config.xml中配置的目录和端口做如下修改:



    /var/log/clickhouse-server/replica02/clickhouse-server.log
    /var/log/clickhouse-server/replica02/clickhouse-server.err.log



8124
9001
9005
9010


/var/lib/clickhouse/replica02/
/var/lib/clickhouse/replica02/tmp/
/var/lib/clickhouse/replica02/user_files/



    
        
        /var/lib/clickhouse/replica02/access/
    


/etc/clickhouse-server/replica02/metrika.xml

/var/lib/clickhouse/replica02/format_schemas/

多套服务启动文件

复制 /etc/systemd/system/clickhouse-server.service 重命名为 clickhouse-server-replica02.serviced
修改启动时加载的配置指向新的文件上,同时pid-file需要跟服务名称保持一直,否则启动不起来

ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/replica02/config.xml --pid-file=/run/clickhouse-server/clickhouse-server-replica02.pid

修改完毕后,重新加载systemd服务 system daemon-reload
然后使用命令启动多实例 sudo systemctl start clickhouse-server-replica02

集群验证

通过客户端登录任意节点,查询集群配置信息

select * from system.clusters; 
集群信息.jpg

集群数据写入

写入分布式表

分布式表会跨服务器分发插入数据,仅仅是简单的请求转发,同时写入多个副本无法保证副本数据的一致性,长时间可能会造成副本数据有些不一样
所以不推荐直接写入分布式表

利用ReplicatedMergeTree引擎写入本地表

将数据副本的同步过程交给ClickHouse的复制表引擎管理
可以自已指定要将哪些数据写入哪些服务器,并直接在每个分片上执行写入,并且你可以使用任何分片方案。对于复杂业务特性的需求,这可能是非常重要的
官方推荐这种方案

你可能感兴趣的:(ClickHouse高可用集群方案)