【发布时间】:2020-02-21 13:21:17
【问题描述】:
我是 Cassandra 的新手。我在网络拓扑策略中的 Cassandra 中创建了一个密钥空间,在一个数据中心中有 2 个副本。是否有 cql 命令或其他方式来查看我在两个副本中的数据?
点赞SELECT * FROM tablename in replica1 / replica2
是否有另一种方法可以让我直观地看到两个副本中的数据?
提前致谢。
【问题讨论】:
我是 Cassandra 的新手。我在网络拓扑策略中的 Cassandra 中创建了一个密钥空间,在一个数据中心中有 2 个副本。是否有 cql 命令或其他方式来查看我在两个副本中的数据?
点赞SELECT * FROM tablename in replica1 / replica2
是否有另一种方法可以让我直观地看到两个副本中的数据?
提前致谢。
【问题讨论】:
所以你的问题不是很清楚“查看 2 个副本中的数据”。如果你想验证你的数据,你可以运行一些命令来直观地看到东西。
您要做的第一件事是登录您要调查的节点。进入感兴趣表的数据目录->DataDir/keyspace/table。在那里,您会看到一个或多个看起来像 *Data.db 的文件。这些是你的sstables。在某些情况下,内存中的数据会刷新到 sstables。如果您正在验证,您希望确保您的数据从内存刷新到磁盘(否则您可能找不到您要查找的内容)。为此,您发出“nodetool flush”命令(如果您只想刷新特定表,则可以使用键空间和表作为参数)。
就像我说的,在那之后,内存中的所有内容都会被刷新到磁盘。因此,您将能够看到您的 sstables(同样是 *Data.db)文件。拥有这些 sstable 后,您可以在每个 sstable 上运行“sstabledump”命令以查看驻留在其中的数据,从而验证您的数据。
如果您只有几行要验证并且有很多节点,您可以通过使用键空间、表和分区键运行“nodetool getendpoints”来找到这些行将驻留的节点。这将告诉您将拥有数据的每个节点。这样你就不会猜测行应该在哪个节点上。不幸的是,没有办法知道行应该存在于哪个 sstable 中(如果发生更新/删除等,它可能不止一个)。您必须遍历特定节点上的每个 sstable。
希望这有助于回答您的问题?
祝你好运。
-吉姆
【讨论】:
您可以针对特定分区。如果您确定host1 是一个副本(nodetool getendpoints 或来自查询跟踪),那么如果您使用 CL.ONE 进行查询并显式访问该主机,协调器将始终首先选择本地。所以
Statement q = new SimpleStatement("SELECT * FROM tablename WHERE key = X");
q.setHost("host1")
host1 拥有 X。
对于SELECT * FROM tablename,它有点困难,因为您正在查看整个数据集,并且协调器将为环的每个部分发送多个查询。如果您使用 CL.ONE 进行一些查询,它仍然只会针对该范围的每个部分转到一个节点,因此如果您设置 q.enableTracing(),您可以看到每个范围的响应节点。您无法控制选择哪个协调员,因此可能需要很少的查询。
如果您只想查看是否存在差异,您可以使用预览修复。 nodetool repair --preview --full.
【讨论】: