首页 > 解决方案 > Cassandra sstableloader 加载表快照“无法连接”失败

问题描述

使用 sstableloader 从不同集群上的键空间快照加载新表,出现错误

重建步骤:

  1. 创建此表
  2. cp 快照文件到临时目录 temp_dir。
  3. sstableloader 加载(错误输出)

有人知道问题是什么吗?我该如何解决?谢谢你。

细节如:

sstableloader --nodes vm_cdb01 -u dba -p xxx /xxx/temp_dir/snapshot_directory
WARN  21:21:42,124 Small cdc volume detected at /cdc_raw; setting cdc_total_space_in_mb to 1773.  You can override this in cassandra.yaml
WARN  21:21:42,302 Only 45.202GiB free across all data volumes. Consider adding more capacity to your cluster or removing obsolete snapshots
All host(s) tried for query failed (tried: vm-cdb01/10.28.60.76:9042 (com.datastax.driver.core.exceptions.TransportException: [vm-cdb01/xx.xxx.76] Cannot connect))
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: vm-cdb01/xx.xxx.76:9042 (com.datastax.driver.core.exceptions.TransportException: [vm-cdb01/xx.xxx.76] Cannot connect))
        at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:233)
        at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)
        at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1424)
        at com.datastax.driver.core.Cluster.init(Cluster.java:163)
        at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:334)
        at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:309)
        at com.datastax.driver.core.Cluster.connect(Cluster.java:251)
        at org.apache.cassandra.utils.NativeSSTableLoaderClient.init(NativeSSTableLoaderClient.java:73)
        at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:159)
        at org.apache.cassandra.tools.BulkLoader.load(BulkLoader.java:80)
        at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:48)
Exception in thread "main" org.apache.cassandra.tools.BulkLoadException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: vm-cdb01/xx.xxx.76:9042 (com.datastax.driver.core.exceptions.TransportException: [vm-cdb01/xx.xxx.76] Cannot connect))
        at org.apache.cassandra.tools.BulkLoader.load(BulkLoader.java:93)
        at org.apache.cassandra.tools.BulkLoader.main(BulkLoader.java:48)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: vm-cdb01/xx.xxx.76:9042 (com.datastax.driver.core.exceptions.TransportException: [vm-cdb01/xx.xxx.76] Cannot connect))
        at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:233)
        at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)
        at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1424)
        at com.datastax.driver.core.Cluster.init(Cluster.java:163)
        at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:334)
        at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:309)
        at com.datastax.driver.core.Cluster.connect(Cluster.java:251)
        at org.apache.cassandra.utils.NativeSSTableLoaderClient.init(NativeSSTableLoaderClient.java:73)
        at org.apache.cassandra.io.sstable.SSTableLoader.stream(SSTableLoader.java:159)
        at org.apache.cassandra.tools.BulkLoader.load(BulkLoader.java:80)
        ... 1 more

标签: cassandraconnection

解决方案


对我来说,任何人都认为 sstableloader 很容易运行,这似乎很荒谬。它做出了程序切换应涵盖的假设。自从我运行 sstableloader 以来已经有一段时间了,但是由于它的工作原理,我最终创建了一个 shell 脚本来完成这项工作 - 特别是如果你想将多个表从多个键空间复制到不同的位置。概括地说,这是我的脚本运行命令的方式:

sstableloader -u ${targetUser} -pw ${cassandraCopyTargetPassword} -d ${targetHost}pwd

你提供的一切都是为了目标。如果您在与默认端口不同的端口上运行,则需要指定“-p ####”。我注意到你的“-p”(端口)值有一些“关闭” - 比如目录路径。

现在至于它实际加载的内容,我认为这就是整个过程崩溃的地方——有人应该解决它,因为假设是荒谬的(再次,而不是开关)。

sstableloader 查找您所在的目录 - 它必须与您的目标表将驻留的键空间和表直接匹配。

例如,在源上,假设我想从 /opt/cassandra/data/sourceKeyspace/sourceTable 目录中复制所有 sstable,但这些 sstable 将映射到 TARGET 系统上的 targetKeyspace/targetTable。我需要在源主机上的某处创建与 targetKeyspace/targetTable 匹配的目录。例如,我可以将该目录创建为 /tmp/targetKeyspace/targetTable(它不必在 /tmp 中,但它与任何地方一样好)。然后,我会将目录更改为该位置,创建从该目录到 /opt/cassandra/data/sourceKeyspace/sourceTable 中所有 sstables 的软链接,并运行 sstableloader 提供上面创建的目标目录的名称(或 pwd,如果你坐在目标目录中,就像我对我的脚本所做的那样)。至少可以说令人困惑。

再一次,我认为这是一个关于如何使其发挥作用的好主意的想法超出了我的范围。无论如何,希望这可以帮助您使其正常工作。


推荐阅读