Cassandra - 删除不工作

时间:2016-02-14 13:37:35

标签: cassandra cqlsh

有时;当我执行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';

2 个答案:

答案 0 :(得分:11)

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

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

关于 Cassandra

中的删除

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

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

  1. Cassandra不会立即删除标记为删除的数据 磁盘。在压缩过程中发生删除。
  2. 如果您使用sized-tiereddate-tiered压缩策略,则为您 可以通过manually starting the compaction process立即删除数据。在此之前,要了解所记录的缺点 这个过程。
  3. 如果您未运行node repair,则会重新显示已删除的列 常规。
  4. 为什么删除的数据可以重新出现

      

    用墓碑标记数据表示Cassandra重试发送一个   删除对删除时关闭的副本的请求。如果   复制品在宽限期内恢复,它   最终收到删除请求。但是,如果节点已关闭   如果长于宽限期,节点可能会错过删除,因为   墓碑在gc_grace_seconds后消失。卡桑德拉总是尝试   在节点重新启动时重播错过的更新。之后   失败,最佳做法是在重新启动节点时在所有副本上运行节点修复到repair inconsistencies   进入集群。如果节点没有回来   gc_grace,_seconds,删除节点,擦除它,再次引导它。

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

      

    压实

         

    定期压缩对健康的Cassandra数据库至关重要   因为Cassandra没有插入/更新到位。作为插入/更新   发生了,而不是覆盖行,Cassandra写了一个新的   另一个插入或更新的数据的加时间戳版本   的SSTable。 Cassandra使用管理SSTables在磁盘上的累积   压实。

         

    Cassandra也没有因为SSTable而删除   不可改变的。相反,Cassandra使用a标记要删除的数据   墓碑。逻辑删除存在由定义的配置时间段   表上设置的gc_grace_seconds值。在压实过程中,那里   是磁盘空间使用和磁盘I / O的临时峰值,因为旧的   和新的SSTables共存。该图描绘了压实   过程:

    enter image description here

      

    Compaction通过分区键合并每个SSTable数据中的数据,   根据时间戳选择最新的存储数据。   Cassandra可以在没有随机IO的情况下合法地合并数据,因为   行按每个SSTable中的分区键排序。驱逐后   墓碑和删除已删除的数据,列和行,   压缩过程将SSTable整合到一个文件中。老人   只要有任何挂起的读取完成使用,就会删除SSTable文件   文件。旧SSTables占用的磁盘空间可用   重用。

         

    对SSTables的数据输入进行排序,以防止SSTable期间的随机I / O.   合并。压缩后,Cassandra使用新的合并   SSTable而不是多个旧SSTable,满足读取请求   比压实前更有效率。旧的SSTable文件是   使用这些文件完成任何挂起的读取后立即删除。磁盘   旧SSTables占用的空间可以重复使用。

    所以试试这个

    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指定一个或多个表。如果未指定表,则会对键空间中的所有表进行压缩。这称为主要压缩。如果确实指定了表,则会发生指定表的压缩。这称为次要压缩。主要压缩将所有现有SSTable合并为单个SSTable。在压缩过程中,磁盘空间使用和磁盘I / O会出现临时峰值,因为旧的和新的SSTable共存。主要的压缩会导致相当大的磁盘I / O.

答案 1 :(得分:0)

如果几秒钟或一分钟后恢复正常,请检查服务器时间是否已同步。