我遇到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,将其设置为默认设置。
第二个问题(可能与问题有关) - 表的行数随机变化,我们不明白发生了什么。
答案 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语句的示例
答案 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