青岛网站开发公司电话,购买软件平台,酒店网站建设方案策划书,网站页面布局图sstableloader是cassandra提供的bulkload工具#xff0c;可以将sstable文件导入到集群中。本文详细介绍其用法和实现原理。
用法
sstableloader工具在cassandra的bin目录下面#xff0c;用法如下#xff1a;
bin/sstableloader options dir_path
具体的…sstableloader是cassandra提供的bulkload工具可以将sstable文件导入到集群中。本文详细介绍其用法和实现原理。
用法
sstableloader工具在cassandra的bin目录下面用法如下
bin/sstableloader options dir_path
具体的选项可以参考官方文档的介绍常见的选项有 -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();
生成文件之后可以使用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的过程
repairbootstrap过程gossip收到和本节点有关的REMOVED_TOKEN状态变化nodetool里面会触发数据移动或修复的命令例如repair,rebuild,removenode,move Streaming过程中两个节点的网络交互如下图所示这个过程大致可以分为如下四个阶段 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并等待对方返回。
原文链接 本文为云栖社区原创内容未经允许不得转载。