在Cassandra转移餐桌的最佳方式?

时间:2014-05-12 05:34:32

标签: cassandra

假设我们在两台服务器上都有相同的Cassandra版本,以及Ubuntu 13.04和14.04操作系统(都是x64)。 Cassandra版本是2.0.6。

我们有1个单节点服务器,其中存储了所有生产数据。是的,它是一个单节点集群,由于某些原因,我们不会在最近的将来使其成为多节点。让我们称之为服务器生产。还有另一台服务器,其中准备了新的数据。我们称之为工人。有一个数据库和一个表。

我们无法直接在Production服务器上执行数据处理,因为它占用了大量的CPU和内存。所以我们使用另一个工作服务器 - 即使它冻结或失败也不是灾难。

基本上,我想交换表格文件 - 获取新数据,将其推入具有不同名称的生产服务器,删除旧表格并重新命名该新数据。

更多信息:

1)在Worker上:运行执行数据处理的脚本,这样我就可以将表存储在Worker服务器的HDD上

2)将Worker服务器上的表重命名为Table_new

3)将Table_new文件rsync到生产服务器

4)以某种方式安装那里的文件,以便我们的生产Cassandra将了解新表

5)在Production服务器上,如果一切正常,请检查Table_new

6)删除Production服务器上的Table(旧表),并将Table_new重命名为Table

因此,最后,生产服务器上应该有一个更新的表,但是工作服务器实际生成的数据会以最少的工作量和停机时间传输到生产服务器。

我不打算转移整个数据库,它应该保持不变 - 但只有表格。我担心的是可能存在与数据库表不一致有关的问题。或者某些表数据被缓存\存储在某处,在我删除旧数据并推送新数据后,它可能会抛出异常。

这可能吗?我不想执行经典的导出\导入操作,它们相对较慢并且可能导致更长的停机时间。

谢谢!

1 个答案:

答案 0 :(得分:3)

所以,如果你真的想丢失当前的数据。并且您生成了sstable文件以放入系统。最简单的方法是:

  1. 将新文件复制到服务器,并将其复制到与数据目录相同的挂载点上的文件夹中,但在数据目录之外。
  2. 从cqlsh发出对现有表的truncate命令。
  3. 将新数据硬链接到表的正确数据目录(现在为空)
  4. 运行nodetool refresh <keyspace> <cf-name>以加载新的sstables。
  5. 如果您不想丢失现有数据,可以跳过第2步。

    当你移动到一个以上的节点集群时,你需要使用&#34; sstableloader&#34;命令将新文件发送到系统,因此它们被分发到正确的节点。