如果写入数据时,部分节点写入成功,但是不符合一致性级别。Cassandra会自动对写入成功的节点采取补偿措施吗?
如果写入数据时,部分节点写入成功,但是不符合一致性级别。Cassandra会自动对写入成功的节点采取补偿措施吗?
Cassandra 写入时可能会出现一下几种情况:
Cassandra的写是没有回滚(rollback)机制的。如果发生了Timeout Exception,导致客户端写入失败,一般情况下客户端(或者下层的driver)会采用Retry重传的机制,来保证这笔写入最终是会成功的。
Cassandra表里存放的数据(除了Counter计数器类型的数据)都是幂等的(idempotent),写入多次同样的数据不会影响读取数据的准确性。理解幂等这个在分布式数据库领域里关键的概念,并且知道怎样使用幂等的数据模型,对用好Cassandra很重要。
谢谢,讲的很有道理。请问对于Counter这种非幂等的操作,如果失败报错后,应该怎么处理呢?不能直接重试吧。
这里面的无法得到响应的节点,存在一种情况:比如gossip检测正常,写请求刚刚发过去就宕机,这时候不会在coordinator上写入给这个宕机节点的hint数据吧,只能等节点拉起进行repair手动修复,我的理解对吗?
这里面的无法得到响应的节点,存在一种情况:比如gossip检测正常,写请求刚刚发过去就宕机,这时候不会在coordinator上写入给这个宕机节点的hint数据吧,只能等节点拉起进行repair手动修复,我的理解对吗?
这个理解不正确。Coordinator决定要不要存储hint,有两个触发原因:
1. (通过Gossip的信息Coordinator已经知道了)所有的副本节点中有没有离线节点,如果有,但是一致性级别仍然能够满足,那么写操作会继续,但是对应于每个离线节点,都会有一份hint保存在Coordinator上;当然,如果一致性级别已经没法满足了,那这个写操作会由Coordinator直接向客户端报错,没有hint产生。
2. 如果Coordinator没有发现离线节点,决定继续写入,但是因为种种原因(可能是因为Coordinator刚刚决定写入,就有副本节点宕机了;也有可能是因为某些副本节点出现临时的GC导致响应超时)副本节点不能在timeout发生之前确认写入成功,那对于每一个不能成功在timeout之前ACK(确认写入成功)的副本,Coordinator都会存储一份hint。
okok.找到代码了,应该是下面这个逻辑做的你说的第2种情况了(也就是只要coordinator把请求发出去,只要没有在timeout之前收到写入成功的响应<包含失败>,他都会存储一份hint了),非常感谢
8 People are following this question.
DataStax Enterprise is powered by the best distribution of Apache Cassandra ™
© 2023 DataStax, Titan, and TitanDB are registered trademarks of DataStax, Inc. and its subsidiaries in the United States and/or other countries.
Apache, Apache Cassandra, Cassandra, Apache Tomcat, Tomcat, Apache Lucene, Lucene, Apache Solr, Apache Hadoop, Hadoop, Apache Spark, Spark, Apache TinkerPop, TinkerPop, Apache Kafka and Kafka are either registered trademarks or trademarks of the Apache Software Foundation or its subsidiaries in Canada, the United States and/or other countries.
Privacy Policy Terms of Use