面试题答案
一键面试一致性级别对数据读写操作的影响
- 读操作:
- ALL:Cassandra会等待集群中所有副本确认读取操作。这确保了读取到的是最新的数据,但代价是性能较低,因为要等待所有副本响应。例如,在一个有3个副本的集群中,即使其中1个副本出现故障,读操作也会等待,直到该副本恢复或被排除(通过调整相关配置),否则读操作将失败。
- QUORUM:Cassandra会等待超过一半的副本(N/2 + 1,N为副本数)确认读取操作。在一个3副本的集群中,只要2个副本确认即可返回数据。这种情况下,能在一定程度上保证数据的一致性,但可能会读到较旧的数据版本,因为有可能一个较新写入的副本未包含在响应的副本集中。
- ONE:Cassandra只需要等待任意一个副本确认读取操作。这是最快的读操作级别,但一致性最弱,可能读到非常旧的数据版本,因为可能读取的副本是未及时更新的。比如,某个副本由于网络问题长时间未同步新数据,而恰好读取到了这个副本的数据。
- 写操作:
- ALL:Cassandra会等待所有副本确认写入操作完成。这提供了最高级别的数据一致性,所有副本数据保持一致,但写入性能最差。例如,在3副本集群中,若有1个副本写入失败,整个写入操作将失败,直到该副本恢复正常并重新写入成功。
- QUORUM:Cassandra会等待超过一半的副本确认写入操作。在3副本集群中,2个副本写入成功,写入操作就被认为成功。但可能存在部分副本未及时写入的情况,导致短时间内数据不一致。
- ONE:Cassandra只需要等待一个副本确认写入操作。这是最快的写入级别,但一致性最差,可能存在大量副本数据未更新的情况。比如,写入操作只成功到一个副本,其他副本由于网络等原因未同步,就会造成数据不一致。
不同一致性级别下可能出现的情况举例
- 读操作:
- 场景:假设有一个3副本的Cassandra集群,数据A被写入。
- 一致性级别为ALL:读操作会等待所有3个副本确认,若其中1个副本故障,读操作等待直到副本恢复或采取其他措施(如调整副本策略),否则失败,确保读到最新数据。
- 一致性级别为QUORUM:读操作等待2个副本确认即可返回数据。若一个副本写入延迟,而另外2个副本响应,读操作可能读到未包含最新写入的旧版本数据。
- 一致性级别为ONE:读操作只要有1个副本响应就返回数据,可能读到很久以前的旧版本数据,若恰好读取到未及时更新的副本。
- 写操作:
- 场景:向3副本集群写入数据B。
- 一致性级别为ALL:所有3个副本都写入成功,写入操作才成功。若有1个副本故障,写入操作失败,直到副本恢复并成功写入。
- 一致性级别为QUORUM:只要2个副本写入成功,写入操作成功。但可能存在1个副本未及时写入,导致短时间数据不一致。
- 一致性级别为ONE:只要1个副本写入成功,写入操作成功。可能存在2个副本未及时更新,造成数据严重不一致。