Cassandra sstableloader工具使用及原理解析

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: sstableloader是cassandra提供的bulkload工具,可以将sstable文件导入到集群中。本文详细介绍其用法和实现原理。 用法 sstableloader工具在cassandra的bin目录下面,用法如下: bin/sstableloader

sstableloader是cassandra提供的bulkload工具,可以将sstable文件导入到集群中。本文详细介绍其用法和实现原理。

用法

sstableloader工具在cassandra的bin目录下面,用法如下:

bin/sstableloader <options> <dir_path>
AI 代码解读

具体的选项可以参考官方文档的介绍,常见的选项有:
-d, –nodes 目标集群的nodes
-u, –username 用户名
-pw, –password 密码
-t, –throttle 限速,单位Mbits/s (默认不限制)
-cph, –connections-per-host 和每个节点建立多少连接

<dir_path>参数指定要导入的sstable文件所在的目录。需要注意的是sstableloader会把目录名作为表名,上一级目录名作为keyspace名称。例如sstableloader /whatever/path/test/t ...这个命令会把数据导入到test.t这个表里面。

sstableloader常见的使用场景包括:

  • bulkload批量写入数据
  • 跨集群数据迁移
  • 从备份的snapshot文件恢复数据

bulkload批量写入

cassandra中提供了SSTableWriter这个类来实现对sstable的写入,使用这个类用户可以不需要关心sstable的具体文件格式。需要注意的是使用这个类需要依赖cassandra-all而不是cassandra的java driver。如下代码示意了如何使用SSTableWriter在本地生成sstable文件:

        final String KS = "cql_keyspace7";
        final String TABLE = "table7";

        final String schema = "CREATE TABLE " + KS + "." + TABLE + " ("
                              + "  k int,"
                              + "  c1 int,"
                              + "  c2 int,"
                              + "  v blob,"
                              + "  PRIMARY KEY (k, c1, c2)"
                              + ")";

        File tempdir = Files.createTempDir();
        File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
        assert dataDir.mkdirs();

        CQLSSTableWriter writer = CQLSSTableWriter.builder()
                                                  .inDirectory(dataDir)
                                                  .forTable(schema)
                                                  .using("INSERT INTO " + KS + "." + TABLE + " (k, c1, c2, v) VALUES (?, ?, ?, textAsBlob(?))")
                                                  .build();

        writer.addRow(1, 2, 3, "abc");
        writer.addRow(4, 5, 6, "efg");

        writer.close();
AI 代码解读

生成文件之后,可以使用sstableloader将生成的文件导入到cassandra中。使用这种方式写入数据,减少了对服务器的请求量,而且写入本地文件会比向服务器写入数据要快,很适合大批量数据的离线导入。

集群间数据迁移

sstableloader也可以用来做集群间的数据迁移。具体步骤如下:
1 在目标集群创建要同步的表的schema。
2 停止源集群写入(针对停机迁移),或是开启增量数据的迁移(针对不停机迁移)。
3 在源集群的每个节点执行flushbin/nodetool flush
4 在源集群节点上执行sstableloader将数据文件导入到目标集群中。

原理

sstableloader会首先通过java客户端与服务器建立连接,并读取meta信息。之后在storage_port通过streaming协议将sstable文件发送到各个节点上。在这个过程中,sstableloader并不是简单的把数据文件拷贝到每个节点,而是根据meta中的相关信息,给每个节点发送他所管理的那一段数据。
下面简单介绍一下cassandra中的streaming协议协议。

streaming协议

在Cassandra中,streaming协议用来在两个节点之间同步sstable中的一段数据的过程,通常用于数据修复或移动的过程。除了sstableloader以外,如下场景中也可能会有streaming的过程:

  • repair
  • bootstrap过程
  • gossip收到和本节点有关的REMOVED_TOKEN状态变化
  • nodetool里面会触发数据移动或修复的命令,例如repair,rebuild,removenode,move
    Streaming过程中两个节点的网络交互如下图所示:

image
这个过程大致可以分为如下四个阶段:
1 建立连接
2 streaming准备阶段
3 streaming阶段
4 完成

1 建立连接

这个阶段主要是建立连接并把连接和StreamSession关联起来。
stream的发起节点创建一个StreamSession对象,并建立两个到远端节点的连接,一个用于后续的发送消息, 一个用于接收消息。之后会通过这两个连接向远端发送StreamInit消息,通知远端节点开启一次streaming,并标明每个连接的用途。
远端收到StreamInit消息后,也会创建自己的StreamSession对象,并将收到StreamInit消息的两个连接和StreamSession关联起来。
连接建立完成后,进入准备阶段。

2 准备阶段

这个阶段主要用于协商节点之间需要传输的文件片段。
发起节点首先发送一个PrepareMessage,其中包含当前节点会向远端节点发送哪些文件或片段,以及需要对方提供哪些表的哪些range的数据。
远端节点收到请求后,会根据请求的range查找对应的sstable,然后向发起节点返回一个PrepareMessage,其中包含要发送哪些sstable的哪些片段,之后远端节点进入streaming阶段。
发起节点收到PrepareMessage后,记录要接收的sstable片段,然后进入streaming阶段。

3 streaming阶段

这个阶段就开始进行文件传输了。发送端和接收端会分别建立相应的任务。
发送端会针对要进行streaming的文件,按顺序发送FileMessage。FileMessage由消息头FileMessageHeader和文件内容的流组成。当所有文件发送完成后,StreamTransferTask标记为完成。
接收端将收到的文件内容写入sstable。当一个StreamReceiveTask中的所有文件都接收完成后,将sstable加入到ColumnFamilyStore中。
如果接收过程中发生错误,接收端会发送一个SessionFailedMessage给发送端,并关闭StreamSession。
当所有发送和接收任务都完成后,进入完成阶段。

4 完成阶段

当一个节点完成所有的发送和接收任务后,如果该节点已经收到了CompleteMessage,则会向对方发送CompleteMessage并关闭session;如果还没有收到CompleteMessage,则会向对方发送CompleteMessage并等待对方返回。

入群邀约

为了营造一个开放的 Cassandra 技术交流,我们建立了微信群公众号和钉钉群,为广大用户提供专业的技术分享及问答,定期开展专家技术直播,欢迎大家加入

8c677711345d2450b80800d50aab3fa0b5a95ded

钉钉群入群链接:https://c.tb.cn/F3.ZRTY0o

微信群公众号:
2a9d5b6c3b9030d06ddb59131aab7287945ead53

目录
打赏
0
1
0
0
10368
分享
相关文章
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
122 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
197 7
深入解析图神经网络注意力机制:数学原理与可视化实现
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
78 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
39 1
解析静态代理IP改善游戏体验的原理
静态代理IP通过提高网络稳定性和降低延迟,优化游戏体验。具体表现在加快游戏网络速度、实时玩家数据分析、优化游戏设计、简化更新流程、维护网络稳定性、提高连接可靠性、支持地区特性及提升访问速度等方面,确保更流畅、高效的游戏体验。
85 22
解析静态代理IP改善游戏体验的原理
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
138 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
WebSocket 调试全攻略:核心解析、工具选择与对比!
WebSocket 是一种全双工、实时交互的网络通信协议,适用于即时通信、实时数据流、多人协作、IoT 等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小告警、分组管理、多连接支持和断线重现等功能。主流调试工具如 Postman、ApiPost 和 ApiFox 各有优劣:Postman 界面友好适合基础调试;ApiPost 支持高级功能如消息分组和自动重连;ApiFox 则强化了多连接支持。选择工具时需根据具体需求和团队熟悉度决定。
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离的开发模式中,API 调试的效率直接影响项目的质量和交付速度。通过本文的对比分析,我们可以看到无工具调试模式虽具备灵活性和代码复用能力,但在操作便利性和团队协作上稍显不足。而传统的外部调试工具带来了可视化、高效协作与扩展性,却可能存在工具切换带来的开发链路断层问题。Apipost-Hepler 融合了两者的优势,让开发者无需离开熟悉的 IDEA 环境,就能享受可视化调试工具的强大功能。
47 5

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等