当前位置: 首页 > news >正文

clickhouse分布式之弹性扩缩容的故事

现状

社区不支持喔,以后也不会有了。曾经尝试过,难道是是太难了,无法实现吗?因为他们企业版支持了,可能是利益相关吧,谁知道呢,毕竟开源也要赚钱,谁乐意一直付出没有回报呢。

社区之前有个"残废"的 Zero-copy replication特性,本质就是为了做弹性扩缩容的。该特性一直半推半就,直到现在官方都说不稳定,bug多,不推荐使用。推荐使用云原生企业版SharedMergeTree,建议你花钱。

Zero-copy replication

从名字看,是个零拷贝复制。原理如图:

原理图

  1. server-1收到插入业务数据请求
  2. server-1把业务数据写入到远端的对象存储中
  3. server-1在本地磁盘记录业务数据的元数据(例如,业务数据存储在对象存储中的位置)
  4. server-1通过clickhouse-keeper (zoo-keeper) 通知server-2和server-3,自己有新的元数据
  5. server-2和server-3从server-1下载对应的元数据,写入到本地磁盘

这种改变,对于clickhouse来说,数据不需要“再均衡”,弹性扩缩容变得很容易。同时也带来了如下几个问题:

  • 需要分布式引用计数。当删除数据时,首先要确保所有节点上,关于该数据的元数据都被删除后,才能真的删除该数据。
  • 需要分布式锁。合并和变更同时只能一个节点去做。
  • 元数据仍然与计算节点耦合,本地磁盘是附加的故障点。
  • 很难用于大规模集群。大量节点之间的元数据同步和锁的竞争,会拖垮整个集群。

SharedMergeTree

这个就是企业版中弹性扩缩容的依仗。既然是企业版,那么就意味着代码没有开源。

从名字看,
首先是共享,也必然是shared storage架构,只有这样才能做到快速的弹性扩缩容,而不影响集群数据的完整性。

然后是MergeTree,依然是MergeTree家族系列。意味着你也可以继承MergeTree从而实现自己的SharedMergeTree。

原理如图:

在这里插入图片描述

  1. server-1收到插入业务数据请求
  2. server-1把业务数据写入到远端的对象存储中
  3. server-1在本地磁盘和keeper中记录业务数据的元数据(例如,业务数据存储在对象存储中的位置)
  4. server-1向查询者确认插入
  5. server-2和server-3从keeper中收到元数据变更通知,更新元数据到本地磁盘

这种改动使得集群间的节点之间不需要再同步元数据,keeper充当集群的协调者。
新增一个节点,该节点只需要从keeper中同步完元数据后,即可参与数据处理。
移除一个节点,该节点从keeper中注销自己,即可优雅下线。

其实很多细节官方都没有描述出来,
比如数据的merge和update问题,节点越多,速度越快。节点间的merge和update协调如何做的?
再比如对一个单一查询,节点越多,速度越快。怎么做的任务切分和最终聚合?

如何既要又要

那么如何做到既要分布式弹性伸缩,又要不花钱?

自己二次开发

就像上面说的,自己继承MergeTree,实现自己的SharedMergeTree。比较考验技术水平,同时需要的时间和精力比较多。

参考 redis cluster

redis3.0官方出的cluster方案,仔细分析就会发现,服务端其实没多少复杂改动,工作量基本都push到了客户端。但是并不妨碍这种集群方案的流行。
回归到clickhouse呢?相比较redis的客户端,clickhouse的客户端工作量要少一半,对于读取,分布式查询clickhouse天然支持的很完美,那么关注点只需要在写入上就可以了。

实现方案

下图演示如何针对clickhous集群做节点的扩缩容。此处写入用的是本地表,这也是官方建议的。写分布式表意味着集群越大,性能越差。

在这里插入图片描述

  1. 由于加入/移除分片shard3,需要在clickhouse管理平台上添加节点的信息,生成新的配置文件后,由管理平台分发到集群的6个节点上(如果是移除,则是4个节点)覆盖老的配置文件。无需重启服务,配置文件会被热加载。
  2. 把集群信息 全量/增量写入keeper中(此处复用集群的keeper)
  3. 业务系统收到集群信息变更后
  4. 如果是移除节点,则需要针对分片3的数据做再平衡。从节点3读取数据,均衡写入到分片1和2,完成此操作后,通知clickhouse管理平台,节点缩容成功。虽然缩容过程可能较为耗时,但是在非云服务环境下,缩容场景本身就不常见,此处只是给出一个可行方案。
    此时,数据写入因为分片3被移除,所以需要动态调整写入。数据读取因为分布式查询无需做任何改动。
    如果是添加节点,业务系统则需要对分片3的2个节点创建分布式表。此时数据写入因为分片3的新增,所以需要动态调整写入。数据读取因为分布式查询无需做任何改动。

总结

集群的变动带来的工作量基本都push到了客户端。缩容时,读取数据再平衡写入到其他分片。扩容时候,写入数据动态平衡。

这种replicateMergeTree+分片的架构,和sharedMergeTree在某些方面比较相似:

  1. 单个查询加速,节点越多速度越快,因为数据是分片的,每个分片都计算处理自己的数据,相互不干扰,最终聚合。
  2. merge和update也都是分片独立处理自己的数据

与sharedMergeTree在某些方面也有不同之处:

  1. 节点移除时,数据需要再均衡,需要时间
  2. 分片之间的副本需要同步数据,也会降低一些性能

相关文章:

clickhouse分布式之弹性扩缩容的故事

现状 社区不支持喔,以后也不会有了。曾经尝试过,难道是是太难了,无法实现吗?因为他们企业版支持了,可能是利益相关吧,谁知道呢,毕竟开源也要赚钱,谁乐意一直付出没有回报呢。 社区…...

数据结构--串的基本概念

目录 串的基本概念 串的定义 串与线性表对比 ​串的基本操作​ 串的比较 字符集编码 乱码问题​编辑 总结 ​串的存储结构 ​串的顺序存储​编辑 串的链式存储 串的基本操作 1、求字串 2、比较 3、定位操作 总结 串的基本概念 串的定义 串与线性表对比 串的…...

音视频流媒体之 IJKPlayer FFmpeg Android 编译

FIJK dockerfile 编译环境 FROM --platformlinux/amd64 ubuntu:18.04RUN apt-get update && apt-get install -y \wget \unzip \git \gcc \g \make \python \yasm \pkg-config \protobuf-compiler \sudoRUN apt-get install -y openjdk-8-jdkENV ANDROID_HOME…...

记录一次较为完整的Jenkins发布流程

文章目录 1. Jenkins安装1.1 Jenkins Docker安装1.2 Jenkins apt-get install安装 2. 关联github/gitee服务与webhook2.1 配置ssh2.2 Jenkins关联2.3 WebHook 3. 前后端关联发布 1. Jenkins安装 1.1 Jenkins Docker安装 Docker很好,但是我没有玩明白如何使用Docke…...

Virtual安装centos后,xshell连接centos 测试及遇到的坑

首先来一张官方的图--各种网络模式对应的连接状况: 1. 网络使用Host-Only模式动态分配IP,点确定后,centos 上运行 system restart network ,使用ifconfig查看新的ip,XShell可以直接连上centos, 但是由于使用…...

【算法】最优乘车——bfs(stringsteam的实际应用,getline实际应用)

题目 H 城是一个旅游胜地,每年都有成千上万的人前来观光。 为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路。 每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,…...

『亚马逊云科技产品测评』活动征文|通过lightsail一键搭建Drupal VS 手动部署

『亚马逊云科技产品测评』活动征文|通过lightsail一键搭建Drupal 提示:授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚…...

使用 VuePress 和 Vercel 打造个人技术博客:实现自动化部署

什么是VuePress? 以下是VuePress官方文档的介绍:VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。VuePress 诞生的初…...

Re50:读论文 Large Language Models Struggle to Learn Long-Tail Knowledge

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:Large Language Models Struggle to Learn Long-Tail Knowledge ArXiv网址:https://arxiv.org/abs/2211.08411 官方GitHub项目(代码和实体)&#xf…...

Spring IOC - Bean的生命周期之依赖注入

在Spring启动流程中,创建的factoryBean是DefaultListableBeanFactory,其类图如下所示: 可以看到其直接父类是AbstractAutoireCapableBeanFactory,他主要负责完成Bean的自动装配和创建工作。 具体来说,AbstractAutowire…...

Android Termux安装MySQL,内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将Android配置为生产力工具,变成一个随身…...

OpenCV快速入门:像素操作和图像变换

文章目录 前言1. 像素操作1.1 像素统计1.2 两个图像之间的操作1.2.1 图像加法操作1.2.3 图像加权混合 1.3 二值化1.4 LUT(查找表)1.4.1 查找表原理1.4.2 代码演示 2 图像变换2.1 旋转操作2.1.1 旋转的基本原理2.1.2 代码实现 2.2 缩放操作2.3 平移操作2.…...

Django 路由配置(二)

一、路由 就是根据用户请求的URL链接来判断对应的出来程序,并返回处理结果,也是就是URL和django的视图建立映射关系. 二、Django请求页面的步骤 1、首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,在settings.py配置…...

电子学会C/C++编程等级考试2022年06月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:倒序输出 依次输入4个整数a、b、c、d,将他们倒序输出,即依次输出d、c、b、a这4个数。 时间限制:1000 内存限制:65536输入 一行4个整数a、b、c、d,以空格分隔。 0 < a,b,c,d < 108输出 一行4个整数d、c、b、a,整数之…...

【C++】使用std::vector()函数实现矩阵的加、减、点乘、点除等运算

本文通过vector&#xff08;&#xff09;函数表示矩阵的形式&#xff0c;对 加、减、点乘、点除等运算进行编码和运行&#xff0c;相应结果如下文所述。 #include <iostream> #include <vector>using namespace std;// 矩阵加法 vector<vector<int>> …...

【python】直方图正则化详解和示例

直方图正则化&#xff08;Histogram Normalization&#xff09;是一种图像增强技术&#xff0c;目的是改变图像的直方图以改善图像的质量。具体来说&#xff0c;它通过将图像的直方图调整为指定的形状&#xff0c;以增强图像的对比度和亮度。 直方图正则化的基本步骤如下&…...

c语言:矩阵交换

题目&#xff1a; 代码和思路&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {int n 0;int m 0;int arr[10][10] { 0 }; // 输入行和列scanf("%d%d", &n, &m);int i 0;int j 0;//读取数组for (i 0; i < n; i)…...

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(一)

文章目录 Abstract第一章 引言1.1 问题陈述1.2 研究假设1.3 贡献1.4 大纲 第二章 背景和相关工作2.1 CAN安全威胁2.1.1 CAN协议设计2.1.2 CAN网络攻击2.1.3 CAN应用攻击 2.2 可信执行2.2.1 软件认证2.2.2 消息身份认证2.2.3 可信执行环境2.2.4 Sancus2.2.5 VulCAN 2.3 侧信道攻…...

暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

RPA暖阳脚本 近日&#xff0c;来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation&#xff08;APA&#xff09;&#xff0c;结合大模型智能体帮助人类进行工作流构建&#x…...

JUnit 单元自动化

一、Junit 是什么&#xff1f; Junit 是 Java 中用于单元测试的框架。使用 Junit 能让我们快速高效的完成单元测试。 自动化测试&#xff1a;JUnit提供了自动化测试的能力&#xff0c;开发人员可以编写一次测试用例&#xff0c;然后通过简单的命令或集成到持续集成工具中进行…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...