更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群

相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻。但在字节大量生产使用中,发现了ClickHouse依然存在了一定的限制。本篇将详细介绍我们是如何为ClickHouse增强高可用能力的。

字节遇到的ClickHouse可用性问题

随着字节业务的快速发展,产品快速扩张,承载业务的ClickHouse集群节点数也快速增加。另一方面,按照天进行的数据分区也快速增加,一个集群管理的库表特别多,开始出现元数据不一致的情况。两方面结合,导致集群的可用性极速下降,以至于到了业务难以接受的程度。直观的问题有三类:

1、故障变多

典型的例子如硬件故障,几乎每天都会出现。另外,当集群达到一定的规模,Zookeeper会成为瓶颈,增加故障发生频率。

2、故障恢复时间长

因为数据分区变多,导致一旦发生故障,恢复时间经常会需要1个小时以上,这是业务方完全不能接受的。

3、运维复杂度提升

以往只需要一个人负责运维的集群,由于节点增加和分区变多,运维复杂度和难度成倍的增加,目前运维人数增加了几人也依然拙荆见肘,依然难保证集群的稳定运行。

可用性问题已经成为制约业务发展的重要问题,因此我们决定将影响高可用的问题一一拆解,并逐个解决。

提升高可用能力的方案

一、降低Zookeeper压力

问题所在:

原生ClickHouse 使用 ReplicatedMergeTree 引擎来实现数据同步。原理上,ReplicatedMergeTree 基于 ZooKeeper 完成多副本的选主、数据同步、故障恢复等功能。由于 ReplicatedMergeTree 对 ZooKeeper 的使用比较重,除了每组副本一些表级别的元信息,还存储了逻辑日志、part 信息等潜在数量级较大的信息。Zookeeper并不是一个能做到良好线性扩展的系统,当ZooKeeper 在相对较高的负载情况下运行时,往往性能表现并不佳,甚至会出现副本无法写入,数据也无法同步的情况。在字节内部实际使用和运维 ClickHouse 的过程中,ZooKeeper 也是非常容易成为一个瓶颈的组件。

改造思路:

ReplicatedMergeTree 支持 insert_quorum,insert_quorum 是指如果副本数为3,insert_quorum=2,要成功写入至少两个副本才会返回写入成功。

新分区在副本之间复制的流程如下:

可以看到,反复在 zookeeper 中进行分发日志、数据交换等步骤,这正是引起瓶颈的原因之一。

为了降低对 ZooKeeper 的负载,在ByteHouse中重新实现了一套 HaMergeTree 引擎。通过HaMergeTree降低对 ZooKeeper 的请求次数,减少在 ZooKeeper 上存储的数据量,新的 HaMergeTree 同步引擎:

1)保留ZooKeeper上表级别的元信息;

2)简化逻辑日志的分配;

3)将 part 信息从 ZooKeeper 日志移除。

HaMergeTree 减少了操作日志等信息在zookeeper里面的存放,来减少zookeeper的负载,zookeeper里面只是存放log LSN, 具体日志在副本之间通过gossip协议同步回放。

在保持和ReplicatedMergeTree完全兼容的前提下,新的 HaMergeTree 极大减轻了对 ZooKeeper 的负载,实现了 ZooKeeper 集群的压力与数据量不相关。上线后,因Zookeeper导致的异常大量减少。无论是单集群几百甚至上千节点,还是单节点上万张表,都能保障良好的稳定性。

二、提升故障恢复能力

问题所在:

虽然所有数据从业者都在做各种努力,想要保证线上生产环境不出故障,但是现实中还是难以避免会遇到各式各样的问题。主要是由下面这几种因素引起的:

软件缺陷:软件设计本身的Bug引起的系统非正常终止,或依赖的组件兼容引发的问题。

硬件故障:常见的有磁盘损坏、内容故障、CPU故障等,当集群规模扩大后发生的频率也线性增加。

内存溢出导致进程被停止:在OLAP数据库中经常发生。

意外因素:如断电、误操作等引发的问题。

由于原生ClickHouse希望达到极致性能的初衷,所以在ClickHouse系统中元数据常驻于内存中,这导致了ClickHouse server重启时间非常长。因而当故障发生后,恢复的时间也很长,动辄一到两个小时,相当于业务也要中断一到两个小时。当故障频繁出现,造成的业务损失是无法估量的。

改造思路:

为了解决上述问题,在ByteHouse中采用了元数据持久化的方案,将元数据持久化到RocksDB, Server启动时直接从RocksDB加载元数据,内存中也仅仅存放必要的Part信息。因此可以减少元数据对内存的占用,以及加速集群的启动以及故障恢复时间。

如下图所示,元数据持久化整体上采用了RocksDB+Meta in Memory的方式,每个Table都会对应一个RocksDB数据库存放该表所有Part的元信息。Table首次启动时,从文件系统中加载的Part元数据将被持久化到RocksDB中;之后重启时就可以直接从RocksDB中加载Part。每个表从RocksDB或者文件系统加载的Part将只在内存中存放必要的Part信息。在实际使用Part时,将通过内存中存放的Part元信息去RocksDB中读取并加载对应Part。

完成元数据持久化后,在性能基本无损失的情况下,单机支持的part不再受内存容量的限制,可以达到100万以上。最重要的是,故障恢复的时间显著缩短,只需要此前的几十分之一的时间就可以完成。例如在原生ClickHouse中需要一到两个小时的恢复时间,在ByteHouse中只需要3分钟,大大提高的系统的高可用能力,为业务提供了坚实保障。

三、其他方面

除了以上两点,在ByteHouse中在其他很多方面都为高可用能力做了增强,如通过HaKafka引擎提升了数据写入的高可用性,提升实时数据写入的容错率,可自动切换主备写入;增加了监控运维平台,实现对关键指标的监控、告警;增加多种问题诊断工具,能实现故障的快速定位。

对于数据分析平台来说,稳定性是重中之重。我们对ByteHouse的高可用能力的提升是不会停止的,在极致性能的背后,力图为用户提供最强有力的稳定性保障。

立即跳转火山引擎ByteHouse官网了解详情

字节跳动基于ClickHouse优化实践之“高可用”相关推荐

  1. Spark SQL 在字节跳动的核心优化实践

    10月26日,字节跳动技术沙龙 | 大数据架构专场 在上海字节跳动总部圆满结束.我们邀请到字节跳动数据仓库架构负责人郭俊,Kyligence 大数据研发工程师陶加涛,字节跳动存储工程师徐明敏,阿里云高 ...

  2. 火山引擎项亮揭秘字节跳动基于 HPC 的大规模机器学习技术|直播分享报名

    机器学习是当前领先的 AI 范式,到目前为止取得了非常可观的成就,当前机器学习也是一个非常时髦的话题. 2021 年 12 月火山引擎云产品发布会上正式发布了 AI 全系产品,其中的 AI 开发平台就 ...

  3. GMTC 2021 演讲 《字节跳动基于 Serverless 的前端研发模式升级》

    点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 大家好,我叫王磊,来自于字节跳动 Web Infra,今天由我给大家分享<字节跳动基于 Serverless 的前端研发模式 ...

  4. 深度召回算法在字节跳动推荐系统的应用实践

    今天给大家带来字节跳动高伟豪所做的分享<深度召回算法在字节跳动推荐系统的应用实践.pdf>.关注推荐算法.深度召回.召回算法等的伙伴别错过了(到小程序中省时查报告中搜索"推荐&q ...

  5. 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计

    设计高可用的应用是架构师的一个重要目标,可是基于云计算平台设计高可用应用与基于传统平台的设计有很多不同.云计算在给架构师带来了很多新的设计挑战的时候,也给带来了很多新的设计理念和可用的服务.怎样在设计 ...

  6. 基于rhcs套件实现的高可用集群

    1.基于rhcs套件实现nginx平台的高可用集群 实验环境: 1> server1 server5 集群节点为了节省节点我们还用了server1作为管理节点安装了luci图形管理: 2> ...

  7. 基于故障转移群集的高可用虚拟机解决方案

    基于故障转移群集的高可用虚拟机解决方案 推荐 某医药公司现有1台服务器,安装Windows Server 2008 R2,运行专用管理软件,计算机上有USB加密狗.网络中有100个左右的工作站,安装专 ...

  8. 字节跳动 EB 级 HDFS 实践

    本文选自"字节跳动基础架构实践"系列文章. "字节跳动基础架构实践"系列文章是由字节跳动基础架构部门各技术团队及专家倾力打造的技术干货内容,和大家分享团队在基础 ...

  9. keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践

    MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段.本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求.各高可用技术特点对比.实施.测试等过程进行整理,完善Mysql ...

  10. 轻松构建基于 Serverless 架构的弹性高可用音视频处理系统

    作者 | 罗松(西流) 阿里巴巴技术专家 本文整理自架构师成长系列 2 月 12 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "212",即可获取对应直播 ...

最新文章

  1. ArrayList和Vector有什么区别?
  2. linux下通过yum安装svn及实现SVN与WEB同步解决方案[阿里云]
  3. Shiro集成Web时的Shiro JSP标签
  4. ws.v6p.coindex.php,php_168_v6目录
  5. python windows和linux路径_python复制文件,路径不存在问题(Windows和linux路径分隔符不统一)...
  6. python threading_Python threading的使用方法解析
  7. 【免费毕设】ASP.NET基于.NET的城市公交查询系统的实现与设计(源代码+lunwen)
  8. 端午节,我们好好聊聊程序员这个群体
  9. Rust : Tonic 基于Rust的gRPC实现
  10. 音频放大电路设计与制作
  11. 基于python的漏洞扫描器_基于Python的Web漏洞扫描器
  12. 积分商城系统架构图_积分商城系统设计_OctShop
  13. 万用表的灵活使用,不仅只有基本使用方法!
  14. HDU - 3966(树链剖分)
  15. Android通知不显示横幅的一个坑
  16. 直播的下个关键词会是“美好”吗?
  17. python :脚本运行出现语法错误:IndentationError:unexpected indent(缩进问题)
  18. 蚂蚁海图tms切片工具
  19. mysql实现级联操作(级联更新、级联删除)
  20. C++ map / multimap容器

热门文章

  1. [转帖]一些不该被埋没的好歌【全版】【2】
  2. cad缩放_CAD常见问题详解,解决你当前的烦恼
  3. 有什么软件可以测试游戏视频数据,免费录制游戏视频软件有哪些?看完你就知道了...
  4. 山东计算机科学自考科目,山东自考本科专业考试科目(动画设计、电脑艺术、计算机、电子工程、)...
  5. 米家扫地机器人静音模式在哪_米家扫地机器人2代发布日期确定:带拖地功能...
  6. Flowable工作流(flowable 数据库表结构)
  7. 接近开关NPN和PNP区别
  8. 自组织特征映射神经网络(SOM)
  9. 3种常用的图片压缩方法
  10. 如何在阿里云服务器部署程序并用域名直接访问