有时;当我执行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';
答案 0 :(得分:11)
DELETE
语句从表中的一行或多行中删除一个或多个列,如果未指定列,则删除整行。 Cassandra在原子和孤立的同一partition key
范围内应用选择。
删除列时,不会立即从磁盘中删除。已删除的列标有tombstone
,然后在配置的宽限期到期后删除。可选timestamp
定义新的tombstone
记录。
Cassandra删除数据的方式与关系数据库删除数据的方式不同。关系数据库可能会花时间扫描数据以查找过期数据并将其丢弃,或者管理员可能必须按月对过期数据进行分区,例如,以便更快地清除它。 Cassandra列中的数据可以有一个名为TTL(生存时间)的可选到期日期。
用墓碑标记数据表示Cassandra重试发送一个 删除对删除时关闭的副本的请求。如果 复制品在宽限期内恢复,它 最终收到删除请求。但是,如果节点已关闭 如果长于宽限期,节点可能会错过删除,因为 墓碑在gc_grace_seconds后消失。卡桑德拉总是尝试 在节点重新启动时重播错过的更新。之后 失败,最佳做法是在重新启动节点时在所有副本上运行节点修复到repair inconsistencies 进入集群。如果节点没有回来 gc_grace,_seconds,删除节点,擦除它,再次引导它。
在您的情况下,compaction
为sized-tiered
。所以请尝试压缩过程。
压实
定期压缩对健康的Cassandra数据库至关重要 因为Cassandra没有插入/更新到位。作为插入/更新 发生了,而不是覆盖行,Cassandra写了一个新的 另一个插入或更新的数据的加时间戳版本 的SSTable。 Cassandra使用管理SSTables在磁盘上的累积 压实。
Cassandra也没有因为SSTable而删除 不可改变的。相反,Cassandra使用a标记要删除的数据 墓碑。逻辑删除存在由定义的配置时间段 表上设置的gc_grace_seconds值。在压实过程中,那里 是磁盘空间使用和磁盘I / O的临时峰值,因为旧的 和新的SSTables共存。该图描绘了压实 过程:
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.
此命令在使用SizeTieredCompactionStrategy
或DateTieredCompactionStrategy
的表上启动压缩过程。您可以指定用于压缩的键空间。如果未指定keyspace
,则nodetool
命令将使用current keyspace
。您可以为compaction
指定一个或多个表。如果未指定表,则会对键空间中的所有表进行压缩。这称为主要压缩。如果确实指定了表,则会发生指定表的压缩。这称为次要压缩。主要压缩将所有现有SSTable合并为单个SSTable。在压缩过程中,磁盘空间使用和磁盘I / O会出现临时峰值,因为旧的和新的SSTable共存。主要的压缩会导致相当大的磁盘I / O.
答案 1 :(得分:0)
如果几秒钟或一分钟后恢复正常,请检查服务器时间是否已同步。