卡桑德拉表墓碑不是0

时间:2016-09-30 17:08:44

标签: cassandra datastax datastax-enterprise spark-cassandra-connector

我遇到cassandra的问题:

如果我做nodetool -h 10.169.20.8 cfstats name.name -H

我得到的结果和统计数据是这样的:

    Read Count: 0
    Read Latency: NaN ms.
    Write Count: 739812
    Write Latency: 0.038670616318740435 ms.
    Pending Flushes: 0
        Table: name
        SSTable count: 10
        Space used (live): 1.48 GB
        Space used (total): 1.48 GB
        Space used by snapshots (total): 0 bytes
        Off heap memory used (total): 3.04 MB
        SSTable Compression Ratio: 0.5047407001982581
        Number of keys (estimate): 701190
        Memtable cell count: 22562
        Memtable data size: 14.12 MB
        Memtable off heap memory used: 0 bytes
        Memtable switch count: 7
        Local read count: 0
        Local read latency: NaN ms
        Local write count: 739812
        Local write latency: 0.043 ms
        Pending flushes: 0
        Bloom filter false positives: 0
        Bloom filter false ratio: 0.00000
        Bloom filter space used: 2.39 MB
        Bloom filter off heap memory used: 2.39 MB
        Index summary off heap memory used: 302.03 KB
        Compression metadata off heap memory used: 366.3 KB
        Compacted partition minimum bytes: 87 bytes
        Compacted partition maximum bytes: 3.22 MB
        Compacted partition mean bytes: 2.99 KB
        Average live cells per slice (last five minutes): 1101.2357892212697
        Maximum live cells per slice (last five minutes): 1109
        Average tombstones per slice (last five minutes): 271.6848030693603
        Maximum tombstones per slice (last five minutes): 1109
        Dropped Mutations: 0 bytes

为什么墓碑统计数据不为0?我们这里只写入Cassandra,没有人删除记录。我们不使用TTL,将其设置为默认设置。

第二个问题(可能与问题有关) - 表的行数随机变化,我们不明白发生了什么。

4 个答案:

答案 0 :(得分:0)

我不确定是否有办法解释墓碑 - 如果你没有做任何删除。

我可以为您提供两种方法来尝试和分析它 - 也许这将有助于更好地理解什么是hapenning以及如何。

有一个名为sstable2json的工具 - 它允许使用sstable并将其转储到json -

例如,对于以下架构

cqlsh> describe schema;

CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;

CREATE TABLE test.t1 (
    key text PRIMARY KEY,
    value text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

在sstable文件上运行sstable2json,并为完整分区提供逻辑删除提供了以下内容

[
{"key": "key",
 "metadata": {"deletionInfo": {"markedForDeleteAt":1475270192779047,"localDeletionTime":1475270192}},
 "cells": []}
]

在这种情况下,markjer用于使用“key”的分区

您可以使用的另一种方法(假设墓碑数增加)是使用tcpdump然后使用wireshark进行分析。来自ScyllaDB的Benoit Canet为wireshark提供了支持CQL的解剖器,该解析器现在处于最新的稳定版本2.2.0(https://www.wireshark.org/docs/relnotes/wireshark-2.2.0.html

请注意,cql删除实际上可以在两种类型QUERY和PREPARED中找到(如果删除是使用预准备语句完成的)。

如果它们是通过预准备语句完成的,则可能需要删除CQL连接以确保捕获具有预准备语句的特定数据包。

以下是wireshark从上面捕获delete语句的示例

enter image description here

答案 1 :(得分:0)

N.B。 :有时可以使用预准备语句中的空值绑定创建逻辑删除 - http://thelastpickle.com/blog/2016/09/15/Null-bindings-on-prepared-statements-and-undesired-tombstone-creation.html

答案 2 :(得分:0)

在列中写入值与删除相同并生成逻辑删除。 Wait... Say What.

答案 3 :(得分:0)

我知道问题和问题可以追溯到几年前,但如果有人对新的 cassandra 版本 3+ 有同样的问题并想删除已删除的数据,他/她可以运行 nodetool garbagecollect

https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/tools/nodetool/toolsGarbageCollect.html