【问题标题】:What node does Cassandra store data on?Cassandra 将数据存储在哪个节点上?
【发布时间】:2015-08-11 09:56:57
【问题描述】:

是否有命令或任何方法可以知道哪些数据存储在 Cassandra 的哪些节点上?

我对 Cassandra 还很陌生,在谷歌上搜索这个问题时运气不佳。

谢谢!

【问题讨论】:

    标签: cassandra distributed-database


    【解决方案1】:

    您可以通过 nodetool getendpoints 让 Cassandra 告诉您特定密钥在哪个节点上。

    $ nodetool getendpoints mykeyspace tbl '8546200'
    192.168.73.188
    192.168.73.190
    

    我不知道这是否是您正在寻找的东西。 AFAIK 没有办法全面查询表或键空间中所有行的负责节点。但正如 Blake 指出的那样,您的应用程序并不真正需要担心这一点。

    如果您真的想知道,您可以使用分区键上的token 函数查询您的表。这是一个使用 Blake 架构的示例:

    SELECT token(partition_key),partition_key FROM tbl;
    

    这将列出带有分区键的散列令牌。然后您可以运行nodetool ring 列出每个节点的令牌范围,并查看哪些节点负责该范围。请注意,如果您使用 vNode,您的输出将非常大(默认情况下,每个 256 行)。

    【讨论】:

    • 谢谢!!这正是我想要的
    【解决方案2】:

    Cassandra 在行的分区键上使用一致的散列来确定数据的存储位置。令牌被分配给节点,分区键的一致哈希决定了哪个节点将存储该行。

    分区键是表定义或嵌套括号中主键的第一部分

    CREATE TABLE tbl (
    partition_key INT,
    clus_key TEXT,
    ...,
    PRIMARY KEY((partition_key), clus_key);
    

    一些阅读here 的环和一致的散列。您可能正在使用vNodes,所以我也会在这里阅读一些内容。

    在查询时,您不必担心哪个节点有什么。您的 C* 驱动程序将从提供的列表中选择一个协调器节点,该节点将根据您的查询查找行。

    如果您想查看有关 CQLSH 中查询的详细信息,请尝试打开跟踪:

    > TRACING ON;
    > SELECT * FROM table; 
    
    > Tracing session: 1f6b4440-050f-11e5-ba41-672ef88f159d
    > ....
    > <Details about the query>
    > ....
    

    【讨论】:

    • 感谢您的快速回复!环和一致的散列是有道理的,但有没有办法在幕后看到所有这些。具体来说,有没有办法知道分配给每个节点的哈希范围以及分区键产生的哈希值(然后知道哪些数据存储在哪个节点)?
    • Bryce 给出的答案有一些答案:nodetool getendpoints 和 CQL 中的“token()”函数。
    猜你喜欢
    • 2017-03-15
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多