前言

对于分析型数据库产品,通过增加服务节点实现集群水平扩容,并提升集群性能和容量,是运维的必要手段。
但是对于熟悉 ClickHouse 的工程师而言,听到“扩容”二字一定会头疼不已。开源 ClickHouse 的 MPP 架构导致扩容成本高,已是 ClickHouse 运维的核心痛点。
主要体现在:
  • 流程全手动,无数据可靠性保证。
  • 扩容期间性能开销大,通常需要暂停服务。
基于字节跳动内广泛的使用场景,ByteHouse 企业版基于开源社区 ClickHouse 进行了诸多优化,现已正式公测“水平扩容”功能。
如果将“ClickHouse”比作一辆汽车,那么此次ByteHouse升级则实现了扩容“手动挡”变“自动挡”,同时“自动档"过程中还能省油加速,使得扩容整体操作更顺滑流畅。

开源社区的实现方案

开源社区文档 中,社区工程师通常推荐使用“数据重分布”思路来解决扩容问题,但存在以下问题:
  • 新增节点后,手动提升新节点的导入权重,或暂时停止旧节点的数据导入,直至数据均衡。这种配置要求 Distributed 表的分片键(Sharding-key)设置为 random,对于设定了指定的 sharding-key 的表,无法采用这种模式。此外,如果存量数据很大,通过该方式实现均衡非常缓慢,可能花费数天乃至数个月才能追平。
  • 手动在节点之间移动分区,使节点间均衡。该方式需要大表均已设置比较合理的分区键(Partition Key),并且分片键也只能为 Random,并且需要手动计算分区的移动目标节点。
  • 使用 ClickHouse Copier或 Insert Into Select 方式,将现存表全部重新插入实现均衡。该方式开销非常高,将占用大量的 CPU / 存储 IO / 网络 IO 资源。
此外,不管是哪种方式,都需要用户手动在新节点复制元数据、校验数据,拼装各环节流程,因此被称为“手动挡”。

ByteHouse 的优化方案

在字节跳动内部,业务的快速增长带来集群规划性能不足、亟需扩容的问题。ByteHouse 对内主要支撑数据看板、用户行为分析性等业务模块,因此对服务持续在线、性能迅速提升要求高,并且用户表的表结构也异常丰富。因此,社区提供的方案均不能满足字节内部业务诉求。
基于以上背景,ByteHouse 自研集群扩容能力,解决自动化流程的问题,也为用户提供了性能开销更低的扩容方式。
具体我们通过数据库引擎优化和操作界面优化两方面来实现。

数据库引擎优化

ByteHouse 的数据库引擎自研 Alter Table...Resharding命令,将一张表以分区的粒度进行重分布到另一张表。该命令支持两种方式:
  • 重分布到其他集群的另一张表
  • 重分布到本集群的另一张表
命令格式如下:
alter table <db>.<table> resharding partition <partition_expr> with <sharding_expr> to shard [shard_list]
通过该命令,可以实现提交从源表扩容到目标表的任务,该任务将实现 Split - Fetch,在原表拆分 Part,目标表拉取 Part,实现扩容。

具体操作步骤如下:
  1. 对于要扩容的表 table,新建目标表,如 table1_new;
  2. 提交 Alter Table table1 Resharding Partition <partition_expr> with <sharding_expr> to table [table1_new_list];提交的任务会被存储到 ZooKeeper 上,后台线程负责调度执行;
  3. 所有提交的任务逐个开始执行。每个任务首先执行 Part 拆分,将一个 Part 根据 Sharding-key 拆分为 N 份(N 为扩容后的分片数);
  4. Part 拆分结束后,将 Part 信息发布到对应的分片上,对应不同分片上的目标表 table1_new 会进入 FETCHING 状态,开始拉取 Part;
  5. 等待这些 Part 被拉取完成,然后开始执行下一个任务,直至一张表的所有 Part 都被重分布完成
在一张表完成后,可以进行校验数据,删除旧表(table1),重命名新表(table1_new -> table1)。实现了一张表的扩容。
扩容全程可以通过系统表 system.reshard_partition追踪进度,取得状态。
这种扩容方式相比社区推荐的方式,有以下优势:
  1. 扩容的适应性好,对于是否设置分片键、分区键,均无硬性要求,都可以进行扩容。
  2. 性能损耗小。整个重分布过程为一个旁路计算任务,开销远低于insert into select 全局数据重新插入的方式。
  3. 执行过程中,数据保持可查询,下游数据看板、数据分析等服务不用暂停。目前在扩容过程中,ByteHouse暂时不支持写入。但就原理而言,扩容进度90%前都可写入,只需要最后阶段一次性 Resharding 在扩容任务执行过程中新写入的 Part 即可。因此,ByteHouse未来功能也有继续提升的空间。

操作界面优化

ByteHouse 数据库实现了 SQL 的底层能力进行数据重分布,实现了开销更低、适应性更强的重分布能力,但对于普通用户而言仍有使用门槛。
因此 ByteHouse 在控制台也支持水平扩容功能,组装底层能力,实现产品化。
通过 ByteHouse 控制台,可通过以下步骤完成集群的水平扩容:
  1. 在集群列表/详情页选择“更改配置”,选择“水平更配”。
  1. 用户选择集群更配后节点数,支持增加节点(水平扩容),也支持减少节点(水平缩容);
  2. 可在扩容前勾选“完成后自动重分布”,也可不勾选,在扩容后再手动重分布;如果勾选“自动重分布”,则需要选择需要在扩容后立即重分布的表。
  3. 界面会给出预估扩容时间。用户可以根据实际情况,对下游业务发出扩容公告。
  4. 提交扩容任务,集群进入“运维任务中”状态。后台执行两阶段任务:
    1. 阶段1,新增节点。实际在进行新节点的初始化,并在新节点上新建元数据;
    2. 阶段2,集群节点完成增加后,则开始重分布,可以查看每张表的重分布进度。
  5. 上述步骤完成,集群恢复“运行中”状态。
通过界面化操作,ByteHouse 给用户的扩容流程带来了全新的便利:
  • 全流程自动化,不再需要自行编写脚本。
  • 也开放一小部分手动空间。例如,在扩容前可选立即重分布的表,对于剩余的表,可在扩容后再选择时间重分布任务,适应一些希望在业务低峰时扩容大表,进一步降低大表只读带来的影响。
  • 包含容错处理,自动校验数据,流程便利可靠。

总结

ByteHouse 团队通过自研“水平扩容”能力,实现了数据库底层与界面支持数据重分布。相比于开源社区的方式,ByteHouse 的数据重分布有以下优势:
  • 低 CPU / IO 开销,数据重分布期间可读;
  • 全程自动化,界面化;
  • 不依赖其他外置工具,在 ByteHouse 产品内闭环;
目前,水平扩容功能现已在 ByteHouse 企业版公测上线,同时支持私有化部署与火山引擎版本,欢迎体验。
 
点击跳转

了解更多

克服 ClickHouse 运维难题:ByteHouse 水平扩容功能上线的更多相关文章

  1. “网红架构师”解决你的Ceph 运维难题

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Tstack发表于云+社区专栏 本文为长篇连续剧,将分多个篇幅发表,主要介绍了从动手部署环境到后期运营故障处理过程中常见的问题,内容由 ...

  2. 数据库运维平台~inception回滚功能

    一 简介:inception的另一个激动人心的功能,很强大.二 功能简介: inception会针对已经执行sql语句进行1 记录 2 生成回滚语句三 备份:   1 启用远程备份机制(强烈建议一台单 ...

  3. 开发便于运维的Windows服务

    过去几个月,DevOps on Windows网站推出了一系列文章,详细讲解了开发者应怎样创建便于运维的Windows服务.这一系列文章详细分析了如何克服在运维部门看来最困难的部分:Windows服务 ...

  4. (转)ceph 常用 运维命令--查看信息 - 不错的文档

    下面是测试验证环节 1. 创建一个 pool rbd create foo --size 4 --image-format 2 --image-feature layering 2. 挂载和格式化 r ...

  5. Redis运维利器 -- RedisManager

    Redis作为一个基于内存的可持久化的日志型.Key-Value数据库,以其出色的性能表现以及高可用性在许多公司有着举足轻重的地位.伴随着业务量的增长,redis集群的规模不可避免的需要扩大,此时re ...

  6. 浅谈SDN架构下的运维工作

    导读 目前国内的网络运维还处于初级阶段,工作人员每天就像救火一样,天天疲于奔命.运维人员只能埋头查找系统运行的日志,耗时耗力,老眼昏花不说,有时候忙了半天还一无所获,作为运维工程师的你,有木有遇到过类 ...

  7. 自动化运维与Saltstack

    一.自动化运维介绍 1.自动化运维产生背景   传统的IT运维是将数据中心中的网络设备.服务器.数据库.中间件.存储.虚拟化.硬件等资源进行统一监控,当资源出现告警时,运维人员通过工具或者基于经验进行 ...

  8. Ansible自动化运维工具

    ansible软件介绍 python语言是运维人员必会的语言!  ansible是一个基于Python开发的自动化运维工具!(saltstack)  其功能实现基于SSH远程连接服务!  ans ...

  9. iNeuOS工业互联网操作系统,设备运维业务和“低代码”表单开发工具

    目       录 1.      概述... 2 2.      设备运维业务... 3 3.      "低代码"表单开发工具... 6 1.   概述 iNeuOS工业互联网 ...

  10. saltstack自动化运维系列11基于etcd的saltstack的自动化扩容

    saltstack自动化运维系列11基于etcd的saltstack的自动化扩容 自动化运维-基于etcd加saltstack的自动化扩容# tar -xf etcd-v2.2.1-linux-amd ...

随机推荐

  1. linux 使用crontab 创建定时任务

    转载请注明出处: 在服务器中需要创建一个定时任务,每天执行去清理很早之前备份的文件,所以想到在linux上创建一个shell脚本,通过linux的 crontab 命令定时去执行该shell脚本,从而 ...

  2. (Good topic)圆圈中最后剩下的数字(leetcode 3.30每日打卡)

    著名的约瑟夫问题: 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开 ...

  3. 重学Java(二):对象无处不在

    前言 本系列文章内容来自于<Thinking in Java>作者的最新续作<On Java>基础卷,作者根据最新 Java 8.11.17的内容,重讲了Java的编程思想,值 ...

  4. 【结对作业】第一周 | 学习体会day02

    今天我们想要实现线路的查询 发现了几个错误 1 <%-- 下拉表单的命名使用错误,导致无法接收前端数值--%> 首先我们很少使用下拉表单,之前用的也忘了,然后格式出现了错误 2 遇到typ ...

  5. 公司oa是什么?一般公司oa有什么样功能?

    公司OA(Office Automation)是指通过计算机和信息技术来实现办公自动化的系统. 它提供了一系列的功能和工具,用于协调.管理和处理公司内部的日常事务和流程.OA系统旨在提高工作效率.加强 ...

  6. MySQL中IN()按照指定列指定规则排序

    现在我有这么一个需求,我需要通过IN(id1,id2,......)查询id字段,并且id字段按照IN()中的顺序排序 例如:IN(5,1,2,4) ===> 查询出来的结果也应该为 5,1,2 ...

  7. .Net 8与硬件设备能碰撞出怎么样的火花(使用ImageSharp和Protobuf协议通过HidApi与设备通讯)

    前言 本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意 ...

  8. Tarjan 学习笔记

    萌新刚学Tarjan,啥也不会,肯定一堆错,请大佬指正谢谢 前置 强连通 强连通: 在不是强连通图的有向图\(G\)内,其顶点\(u\),\(v\)两个方向上都存在有向路径,则\(u\)和\(v\)强 ...

  9. 使用kubeadm在Centos8上部署kubernetes1.18

    // 查看系统版本 cat /etc/centos-release CentOS Linux release 8.1.1911 (Core) // 如果系统环境为8.0(云服务器默认最大安装环境为8. ...

  10. MinIO客户端之license

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc license mc license info mc license register mc license ...