【问题标题】:How to getendpoints of a composite partition key which has blob datatype in it如何获取其中具有 blob 数据类型的复合分区键的端点
【发布时间】:2017-12-01 05:57:51
【问题描述】:

我有一个超时的选择查询,所以我尝试在启用跟踪的情况下使用一致性来查询它,以便 read_repair 将修复它,但这并没有太大帮助,而且在一致性上,我得到了 9 个响应中的 3 个;所以我决定识别分区并对其进行修复,但是当我在具有 blob 数据类型的复合分区键上运行 getendpoints 时,它抛出异常“java.lang.NumberFormatException:非十六进制字符”我也尝试使用来自 cql 的令牌select 语句也超时。如何识别分区并修复它??

【问题讨论】:

    标签: cassandra datastax datastax-enterprise cassandra-2.1


    【解决方案1】:

    如果您只是运行修复,所有分区都将得到修复。要修复单个分区,只需使用CL.ALL 读取它,读取修复将修复任何差异。

    说了算。

    nodetool getendpoints 采用 token 而不是分区键。 murmur3 分区器需要一个长标记,因此大的 blob 不会工作。你可以用 CQL 来获得它,比如一个

    select token(k1, k2 ...) from table where ...
    

    它会给你令牌。或者,您可以从大多数驱动程序(java 驱动程序:cluster.getMetadata().newToken(string))或 Cassandra 的 java api 本身(new Murmur3Partitioner().getToken(bytebuffer))获取令牌

    【讨论】:

    • 我尝试了问题陈述中提到的 cql,但查询超时。看起来唯一的方法是通过驱动程序,但驱动程序本身在查询该分区的 select 语句时看到超时,将尝试看看是否有帮助。
    • 它超时更有可能是由于分区太宽或墓碑太多,修复它不太可能有帮助。尝试使用TRACING ON进行查询
    • 是的,我怀疑是一样的,但问题是因为查询超时,即使启用跟踪也没有多大帮助。
    • 要检查最可能的问题,请检查 gc 日志和系统日志。 nodetool cfstats 并检查表的最大分区大小。如果它很大,你可能需要增加你的堆才能读取它,但即使这样也有限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多