首页 文章

Cassandra - 删除不工作

提问于
浏览
7

有时;当我执行DELETE时;它不起作用 .

我的配置:[cqlsh 5.0.1 | Cassandra 3.0.3 | CQL规范3.4.0 |原生协议v4]

cqlsh:my_db> SELECT * FROM conversations  WHERE user_id=120 AND conversation_id=2 AND peer_type=1;

user_id | conversation_id | peer_type | message_map
---------+-----------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 120 |               2 |         1 | {0: {real_id: 68438, date: 1455453523, sent: True}, 1: {real_id: 68437, date: 1455453520, sent: True}, 2: {real_id: 68436, date: 1455453517, sent: True}, 3: {real_id: 68435, date: 1455453501, sent: True}, 4: {real_id: 68434, date: 1455453500, sent: True}, 5: {real_id: 68433, date: 1455453499, sent: True}, 6: {real_id: 68432, date: 1455453498, sent: True}, 7: {real_id: 68431, date: 1455453494, sent: True}, 8: {real_id: 68430, date: 1455453480, sent: True}}

(1 rows)
cqlsh:my_db> DELETE message_map FROM conversations WHERE user_id=120 AND conversation_id=2 AND peer_type=1;
cqlsh:my_db> SELECT * FROM conversations  WHERE user_id=120 AND conversation_id=2 AND peer_type=1;

user_id | conversation_id | peer_type | message_map
---------+-----------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 120 |               2 |         1 | {0: {real_id: 68438, date: 1455453523, sent: True}, 1: {real_id: 68437, date: 1455453520, sent: True}, 2: {real_id: 68436, date: 1455453517, sent: True}, 3: {real_id: 68435, date: 1455453501, sent: True}, 4: {real_id: 68434, date: 1455453500, sent: True}, 5: {real_id: 68433, date: 1455453499, sent: True}, 6: {real_id: 68432, date: 1455453498, sent: True}, 7: {real_id: 68431, date: 1455453494, sent: True}, 8: {real_id: 68430, date: 1455453480, sent: True}}

(1 rows)

CQLSH不会在DELETE指令上返回任何错误,但是如果它没有被考虑在内 .

你知道为什么吗 ?

注意:这是我的表定义:

CREATE TABLE be_telegram.conversations (
user_id bigint,
conversation_id int,
peer_type int,
message_map map<int, frozen<message>>,
PRIMARY KEY (user_id, conversation_id, peer_type)
) WITH CLUSTERING ORDER BY (conversation_id ASC, peer_type ASC)
AND 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', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
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 = '99PERCENTILE';

1 回答

  • 10

    DELETE 语句从表中的一行或多行中删除一个或多个列,如果未指定列,则删除整行 . Cassandra在原子上和孤立地应用选择 partition key .

    删除列时,不会立即从磁盘中删除该列 . 已删除的列标有 tombstone ,然后在配置的宽限期到期后删除 . 可选的 timestamp 定义了新的 tombstone 记录 .

    关于Cassandra中的删除

    Cassandra删除数据的方式与关系数据库删除数据的方式不同 . 关系数据库可能会花时间扫描数据以查找过期数据并将其丢弃,或者管理员可能必须按月对过期数据进行分区,例如,以便更快地清除它 . Cassandra列中的数据可以具有可选的到期日期,称为TTL(生存时间) .

    要记住删除数据的事实是:

    为什么删除的数据可以重新出现

    使用逻辑删除标记数据会向Cassandra发送信号,以便重新向删除时丢失的副本发送删除请求 . 如果副本在宽限期内恢复,它最终会收到删除请求 . 但是,如果节点的下降时间超过宽限期,则节点可能会错过删除,因为墓碑在gc_grace_seconds之后消失 . 当节点再次恢复时,Cassandra总是尝试重播错过的更新 . 发生故障后,最佳做法是在将节点重新引入群集时运行节点修复以修复所有副本中的不一致 . 如果节点未在gc_grace,_seconds内返回,请删除该节点,擦除它并再次引导它 .

    在您的情况下, compactionsized-tiered . 所以请尝试压实过程 .

    压缩周期性压缩对于 Health 的Cassandra数据库至关重要,因为Cassandra不会在适当的位置插入/更新 . 当发生插入/更新时,Cassandra会在另一个SSTable中写入已插入或更新的数据的新时间戳版本,而不是覆盖行 . Cassandra使用压缩来管理SSTable在磁盘上的累积 . Cassandra也不会删除,因为SSTable是不可变的 . 相反,Cassandra使用墓碑标记要删除的数据 . 逻辑删除存在于由表上设置的gc_grace_seconds值定义的已配置时间段 . 在压缩过程中,磁盘空间使用和磁盘I / O会出现临时峰值,因为旧的和新的SSTable共存 . 此图描绘了压缩过程:

    enter image description here

    Compaction通过分区键合并每个SSTable数据中的数据,根据其时间戳选择最新的存储数据 . Cassandra可以在没有随机IO的情况下按性能合并数据,因为行在每个SSTable中按分区键排序 . 在驱逐逻辑删除并删除已删除的数据,列和行之后,压缩过程将SSTable整合到一个文件中 . 只要任何挂起的读取使用文件完成,就会删除旧的SSTable文件 . 旧SSTable占用的磁盘空间可供重用 . 对SSTables的数据输入进行排序,以防止在SSTable合并期间进行随机I / O.压缩后,Cassandra使用新的统一SSTable而不是多个旧SSTable,比压缩前更有效地完成读取请求 . 只要任何挂起的读取使用文件完成,就会删除旧的SSTable文件 . 旧SSTable占用的磁盘空间可供重用 .

    试试吧

    nodetool <options> repair
    
    options are:
    ( -h | --host ) <host name> | <ip address>
    ( -p | --port ) <port number>
    ( -pw | --password ) <password >
    ( -u | --username ) <user name>
    -- Separates an option and argument that could be mistaken for a option.
    keyspace is the name of a keyspace.
    table is one or more table names, separated by a space.
    

    此命令在使用 SizeTieredCompactionStrategyDateTieredCompactionStrategy 的表上启动压缩过程 . 您可以指定用于压缩的键空间 . 如果未指定 keyspace ,则为 nodetool 命令使用 current keyspace . 您可以为 compaction 指定一个或多个表 . 如果未指定表,则会对键空间中的所有表进行压缩 . 这被称为 major compaction . 如果确实指定了表,则会发生指定表的压缩 . 这被称为 minor compaction . 主要压缩将所有现有SSTable合并为单个SSTable . 在压缩过程中,磁盘空间使用和磁盘I / O会出现临时峰值,因为旧的和新的SSTable共存 . 主要压缩可能会导致相当大的磁盘I / O.

相关问题