Debezium日常分享系列之:流式传输 Cassandra

news2024/12/27 4:03:16

Debezium日常分享系列之:流式传输 Cassandra

  • 一、批量 ETL 选项
  • 二、流媒体选项
  • 三、Kafka 作为事件源
  • 四、解析提交日志
  • 五、提交日志深入探讨
    • 1.延迟处理
    • 2.空间管理
    • 3.重复的事件
    • 4.无序事件
    • 5.带外架构更改
    • 6.行数据不完整
  • 六、最低限度可行的基础设施
    • 1.无状态流处理
    • 2.有状态流处理
    • 3.读取时处理
  • 七、Cassandra数据库对Gossip协议的应用

选择Cassandra 这个 NoSQL 数据库,主要是因为它的高可用性、水平可扩展性以及处理高写入吞吐量的能力。

一、批量 ETL 选项

将 Cassandra 引入我们的基础设施后,我们的下一个挑战是找到一种方法将 Cassandra 中的数据公开给我们的数据仓库 BigQuery,以进行分析和报告。我们快速构建了一个 Airflow hook 和操作符来执行满载。这显然无法扩展,因为它会在每次加载时重写整个数据库。为了扩展管道,我们评估了两种增量加载方法,但两者都有其缺点:

  • 范围查询。这是一种常见的 ETL 方法,其中通过范围查询定期(例如每小时或每天)提取数据。任何熟悉 Cassandra 数据建模的人都会很快意识到这种方法是多么不切实际。 Cassandra 表需要建模以优化生产中使用的查询模式。在大多数情况下,添加此查询模式进行分析意味着使用不同的集群键克隆表。 RDBMS 人员可能会建议二级索引来支持这种查询模式,但 Cassandra 中的二级索引是本地的,因此这种方法本身会带来性能和扩展问题。
  • 处理未合并的 SSTable。 SSTables 是 Cassandra 的不可变存储文件。 Cassandra 提供了 sstabledump CLI 命令,可将 SSTable 内容转换为人类可读的 JSON。然而,Cassandra 是建立在日志结构合并 (LSM) 树概念之上的,这意味着 SSTable 会定期合并到新的压缩文件中。根据压缩策略,在带外检测未合并的 SSTable 文件可能具有挑战性(我们后来了解了 Cassandra 中的增量备份功能,该功能仅备份未压缩的 SSTable;因此这种方法也能发挥作用。)

考虑到这些挑战,在为 MySQL 构建和运营流数据管道后,我们开始探索 Cassandra 的流选项。

二、流媒体选项

双写
在这里插入图片描述
这个想法是每次在 Cassandra 上执行写入操作时都会发布到 Kafka。这种双重写入可以通过内置触发器或客户端周围的自定义包装器来执行。这种方法存在性能问题。首先,由于我们现在需要写入两个系统而不是一个系统,因此写入延迟增加了。更重要的是,当对一个系统的写入由于超时而失败时,写入是否成功是不确定的。为了保证两个系统上的数据一致性,我们必须实现分布式事务,但多次往返共识会增加延迟并进一步降低吞吐量。这违背了高写入吞吐量数据库的目的。

三、Kafka 作为事件源

在这里插入图片描述
这个想法是写给 Kafka,而不是直接写给 Cassandra;然后通过消费来自 Kafka 的事件将写入应用到 Cassandra。事件溯源是当今非常流行的方法。但是,如果您已有直接写入 Cassandra 的现有服务,则需要更改应用程序代码并进行重要的迁移。这种方法还违反了读你所写的一致性:如果一个进程执行写入,那么执行后续读取的同一进程必须观察写入的效果。由于写入是通过 Kafka 路由的,因此发出写入和应用写入之间会存在延迟;在此期间,读取 Cassandra 将导致数据过时。这可能会导致不可预见的生产问题。

四、解析提交日志

在这里插入图片描述
Cassandra 在 3.0 中引入了变更数据捕获 (CDC) 功能来公开其提交日志。提交日志是 Cassandra 中的预写日志,旨在在机器崩溃时提供持久性。它们通常在冲洗时被丢弃。启用 CDC 后,它们会在刷新时传输到本地 CDC 目录,然后可由 Cassandra 节点上的其他进程读取。这允许我们使用与 MySQL 流管道中相同的 CDC 机制。它将生产运营与分析分离,因此不需要应用工程师进行额外的工作。

最终,在考虑了吞吐量、一致性和关注点分离之后,最后一个选项——解析提交日志——成为了最有力的竞争者。

五、提交日志深入探讨

除了公开提交日志之外,Cassandra 还提供 CommitLogReader 和 CommitLogReadHandler 类来帮助进行日志的反序列化。看来艰苦的工作已经完成,剩下的就是应用转换——将反序列化表示转换为 Avro 记录并将其发布到 Kafka。然而,当我们进一步深入研究 CDC 功能和 Cassandra 本身的实现时,我们意识到存在许多新的挑战。

1.延迟处理

提交日志仅在 CDC 目录已满时到达,在这种情况下,它将被刷新/丢弃。这意味着记录事件和捕获事件之间存在延迟。如果执行很少或不执行写入,则事件捕获的延迟可能会任意长。

2.空间管理

在MySQL中,您可以设置binlog保留,以便在配置的保留期限后自动删除日志。然而在 Cassandra 中没有这样的选项。一旦提交日志传输到CDC目录,处理后必须进行消费以清理提交日志。如果 CDC 目录的可用磁盘空间超过给定阈值,则对数据库的进一步写入将被拒绝。

3.重复的事件

单个 Cassandra 节点上的提交日志并不反映对集群的所有写入;它们仅反映对节点的写入。这使得有必要在所有节点上处理提交日志。但如果复制因子为 N,则每个事件的 N 个副本会发送到下游。

4.无序事件

对单个 Cassandra 节点的写入在到达时会被连续记录。但是,这些事件从发出时起可能会无序到达。这些事件的下游消费者必须了解事件时间并实现与 Cassandra 的读取路径类似的最后写入获胜逻辑,以获得正确的结果。

5.带外架构更改

表的架构更改通过gossip protocol进行通信,并且不会记录在提交日志中。因此,只能尽力检测架构中的更改。

6.行数据不完整

Cassandra 不会执行先读后写的操作,因此更改事件不会捕获每个列的状态,它们仅捕获已修改列的状态。这使得更改事件不如整行可用时有用。

一旦我们深入了解 Cassandra 提交日志,我们就会根据给定的约束重新评估我们的要求,以设计最小可行的基础设施。

六、最低限度可行的基础设施

借鉴最小可行产品理念,我们希望设计一个具有最少功能和要求的数据管道,以满足我们的直接客户的需求。对于 Cassandra CDC,这意味着:

引入 CDC 不应对生产数据库的健康状况和性能产生负面影响;运营放缓和系统停机比分析管道延迟的成本要高得多

查询数据仓库中的 Cassandra 表应该与查询生产数据库的结果相匹配(排除延迟);具有重复和/或不完整的行会增加每个最终用户的后处理工作量有了这些标准,我们开始集思广益寻找解决方案,并最终提出了三种方法:

1.无状态流处理

  • 该解决方案的灵感来自 Datastax 的高级复制博客文章。
  • 这个想法是在每个 Cassandra 节点上部署一个代理来处理本地提交日志。每个代理都被视为基于分区键的写入子集的“主要”,这样每个事件都只有一个主要代理。
  • 然后在CDC期间,为了避免重复事件,每个代理仅将事件发送到Kafka(如果它是该事件的主代理)。
  • 为了处理最终的一致性,每个代理都会在事件到达时将其分类到每个表的时间切片窗口中(但不会立即发布它们);
  • 当窗口到期时,该窗口中的事件将被散列,并将散列与其他节点进行比较。如果它们不匹配,则从不一致的节点获取数据,以便最后一次写入获胜可以解析正确的值。
  • 最后,该窗口中更正的事件将被发送到 Kafka。
  • 任何超出时间切片窗口的无序事件都必须记录到无序文件中并单独处理。
  • 由于重复数据删除和排序是在内存中完成的,因此对代理故障转移导致数据丢失、影响生产数据库的 OOM 问题以及此实现的整体复杂性的担忧阻止了我们进一步探索它。

2.有状态流处理

  • 该解决方案功能最丰富。
  • 这个想法是,每个 Cassandra 节点上的代理将处理提交日志并将事件发布到 Kafka,而无需重复数据删除和排序。
  • 然后,流处理引擎将消耗这些原始事件并完成繁重的工作(例如使用缓存过滤掉重复事件,使用事件时间窗口管理事件顺序,以及通过在状态存储上执行先读后写来捕获未修改列的状态) ),然后将这些派生事件发布到单独的 Kafka 主题。
  • 最后,KCBQ 将用于消费该主题中的事件并将其上传到 BigQuery。这种方法很有吸引力,因为它一般性地解决了问题——任何人都可以订阅后一个 Kafka 主题,而无需自己处理重复数据删除和排序。
  • 然而,这种方法会带来大量的运营开销;我们必须维护一个流处理引擎、一个数据库和一个缓存。

3.读取时处理

  • 与之前的方法类似,其想法是处理每个 Cassandra 节点上的提交日志并将事件发送到 Kafka,无需重复数据删除和排序。
  • 与之前的方法不同,流处理部分被完全消除。相反,原始事件将通过 KCBQ 直接上传到 BigQuery。视图是在原始表之上创建的,用于处理重复数据删除、排序和合并列以形成完整的行。由于 BigQuery 视图是虚拟表,因此每次查询视图时都会延迟处理。为了防止视图查询变得过于昂贵,视图将定期具体化。这种方法利用 BigQuery 的大规模并行查询引擎,消除了操作复杂性和代码复杂性。然而,缺点是非 KCBQ 下游消费者必须自己完成所有工作。
  • 鉴于我们流式 Cassandra 的主要目的是数据仓库,我们最终决定实现读时处理。它为我们现有的用例提供了基本功能,并提供了将来扩展到上述其他两个更通用的解决方案的灵活性。

七、Cassandra数据库对Gossip协议的应用

Cassandra数据库使用Gossip协议主要有以下几个用处:

节点发现和自动加入:Cassandra集群中的节点使用Gossip协议进行相互通信,通过定期交换消息来发现新加入的节点并自动将其加入到集群中。这使得节点的动态加入和离开成为可能,而无需依赖于集中式的节点发现服务。

全局状态信息的传播:Cassandra使用Gossip协议来传播集群中节点的状态信息,如节点的健康状态、数据分布信息等。通过收集和传播这些信息,集群中的节点可以更好地了解整个系统的状态,并做出相应的调整和决策。

数据一致性的维护:Cassandra使用Gossip协议来传播和更新副本之间的数据变更信息。节点会将数据变更信息传播给其他节点,以保持副本之间的数据一致性。这种基于Gossip协议的数据传播方式可以在分布式环境下有效地维护数据的一致性。

故障检测和恢复:通过Gossip协议,节点可以检测到其他节点的故障,并将故障信息传播给其他节点。这使得集群可以快速地检测到故障节点并采取相应的恢复措施。

总的来说,Cassandra使用Gossip协议来实现分布式环境下的节点发现、全局状态信息传播、数据一致性维护和故障检测恢复等功能,确保集群的可靠性、容错性和一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

45. 跳跃游戏 II (贪心)

题目链接:力扣 解题思路:贪心,尽可能地找到下一跳能够跳到的最远距离,这样到达终点时,所需跳跃次数最少 以nums [2,3,1,1,4,2]为例: 以当前位置begin作为起跳点,能够跳跃的最远距离为m&#…

影视剧配音软件哪个好?几款好用的影视剧配音软件推荐

影视剧配音软件哪个好?几款好用的影视剧配音软件推荐 我们日常刷短视频的时候,经常会刷到一些影视剧相关的作品,特别是一些大热剧及经典剧,很多创作者都喜欢融入自己的解读,进行一些加工,形成一部的独一无…

STM32 Mac开发环境Clion+STM32CubeMX+ST-Link-V2

STM32 Mac开发环境ClionSTM32CubeMXST-Link-V2 也不知道什么时候买的stm32板吃灰太久,不会玩,环境之前都没搞定,今天又折腾一天终于可以点灯了。 安装编译器gcc brew tap ArmMbed/homebrew-formulae brew install arm-none-eabi-gccOPEN-O…

Qt提取excel表单中数据

这是一个excel表单,目标是把其中的数据提取出来。 文章学习自:QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中_qt将excel表格中指定范围内容显示在界面中_Jessica_1409573408的博客-CSDN博客 程序如下&…

前端CSS

基础语法 /*CSS注释 */ CSS样式 CSS应用方式 内联式 在标签上写样式 <img src"..." style"height:100px" /><div style"color:red;">中国联通</div> 嵌入式 在head标签中写style标签 外联式 样式写到文件中&#xff0…

网页链接投票链接步骤公众号投票链接制作制作投票

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…

语言模型BERT理解

一、BERT概述 BERT是由Google在2018年提出的一种预训练语言模型。BERT的创新之处在于采用了双向Transformer编码器来生成上下文相关的词向量表示。 传统的单向语言模型只考虑了左侧或右侧的上下文信息&#xff0c;而BERT则同时考虑了左侧和右侧的上下文信息&#xff0c;使得生…

YOLOv5改进系列(15)——增加小目标检测层

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

手把手教您kaiber,吊炸天的AI视频生成工具

什么是Kaiber AI&#xff1f; 一种人工智能视频生成器&#xff0c;可以将图像和文字生成视频。 如何使用Kaiber AI&#xff1f; 请按照以下步骤使用 Kaiber AI&#xff1a; 前往kaiber ai注册或登录。点击右上角“创建视频”。 如果订阅的时候提示要绑定银行卡&#xff0c;则找…

Basics——指针和引用(详解)

指针和引用 1.初始化规则2.面试题 &#xff1a;引用和指针的区别是什么3.引用使用场景4.拓展 为什么C支持引用而C没有 1.初始化规则 指针和引用在初始化方面有不同的规则&#xff1a; 指针的初始化规则&#xff1a; 直接初始化&#xff1a;可以将指针初始化为指向特定变量或…

Linux系统运行时参数命令(性能监控、测试)(3)网络IO性能监控

目录 5. 网络IO性能监控5.1 性能指标5.2 网络信息5.2.1 网络配置5.2.2 套接字信息5.2.3 网络吞吐-sar命令5.2.4 连通性和延时 5.3 其他常用的网络相关命令5.3.1 telnet5.3.2 nc5.3.3 tcpdump5.3.4 lsof5.3.5 nmap 6.其他工具6.1 nmon性能监控6.2 glances系统监控 5. 网络IO性能…

Js提升:如何实现图片懒加载

知其然&#xff0c;更要知其所有然&#xff0c;在不同场景下该用什么方法&#xff0c;如何做到最优。 为什么要出现图片懒加载&#xff0c;解决了什么问题&#xff1f;除了懒加载&#xff0c;还有预加载呢&#xff1f;什么是预加载&#xff0c;怎么实现&#xff0c;相比于懒加载…

软件设计模式与体系结构-软件体系-层次软件体系结构

目录 四、层次软件体系结构简介代码两种方式的区别双向分层分层风格 VS 主程序-子过程风格&#xff1a;二者的不同层次软件体系结构的优点层次软件体系结构的缺点 课程作业 四、层次软件体系结构 层次之间存在接口&#xff0c;通过接口形成call/return的关系&#xff0c;上层是…

【内存优化】内存优化以及oom排查整体思路

linux疑难问题排查实战专栏&#xff0c;分享了作为公司专家&#xff0c;在解决内存、性能、各类死机等疑难问题的排查经验&#xff0c;认真学习可以让你在日后工作中大放光彩。 本文总结介绍了项目开发过程中oom排查和内存优化的一些方法&#xff0c;主要是从内存问题查看到堆内…

阿里云轻量服务器和ecs区别(最新更新)

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…

组合模式:如何设计实现支持递归遍历的文件系统目录树结构?

组合模式跟我们之前讲的面向对象设计中的“组合关系&#xff08;通过组合来组装两个类&#xff09;”&#xff0c;完全是两码事。这里讲的“组合模式”&#xff0c;主要是用来处理树形结构数据。这里的“数据”&#xff0c;你可以简单理解为一组对象集合&#xff0c;待会我们会…

使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

文章目录 前言1. 安装所需库2. 读取 Shapefile 文件3. 可视化地图4. 用户输入坐标和清除指定区域内的图形5. 可视化删除指定区域内的图形之后的地图6. 保存为新的 Shapefile (.shp)文件完整代码及解析分析说明 测试文件地址特别说明完结 前言 在地理信息系统&#xff08;Geogra…

力扣竞赛勋章 | 排名分数计算脚本

文章目录 力扣竞赛勋章介绍竞赛评分算法脚本&#xff08;本文的重点内容&#xff09;运行结果 代码修改自&#xff1a;https://leetcode.cn/circle/discuss/6gnvEj/ 原帖子的代码无法正常运行。 力扣竞赛勋章介绍 https://leetcode.cn/circle/discuss/0fKGDu/ 如果你想知道自…

【Elasticsearch】初识elasticsearch

目录 初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4.为什么不是其他搜索技术&#xff1f; 1.1.5.总结 1.2.倒排索引 1.2.1.正向索引 1.2.2.倒排索引 1.2.3.正向和倒排 1.3.es的一些概念 1.3.1.文档…

前端各种方法自我整理

Javascript方法 slice [slaɪs]切片 slice (-2)取出数组中倒数两个植变生成一个新数组 slice(0&#xff0c;3)取出数组下标0到下标3的值&#xff0c;生成新数组 includes [ɪnˈkluːdz]包含 查看数组或字符串内是否有该值&#xff0c;有返回true,无返回false 例子&#…