面试题答案
一键面试读写操作中的数据一致性机制
- 多副本场景下的数据复制:Cassandra 使用一致性哈希来将数据分布到多个节点上,每个数据项会有多个副本存储在不同节点。例如,当写入数据时,数据会根据一致性级别要求被复制到相应数量的副本节点上。
- 读写一致性级别设定:
- 读一致性级别:
ONE
:客户端只要从一个副本读取到数据就认为成功。这种级别性能高,但可能读到旧数据,适用于对一致性要求不高的场景。QUORUM
:客户端需要从超过一半的副本节点读取到相同数据才认为成功。例如,如果有3个副本,需要从2个副本读取到相同数据。它在一致性和性能之间有较好平衡。ALL
:客户端必须从所有副本节点读取到相同数据才认为成功。这提供了最高的一致性,但性能较差,因为需要等待所有副本响应。
- 写一致性级别:
ONE
:只要有一个副本写入成功,写操作就认为成功。这提供了高可用性,但可能出现数据丢失或不一致。QUORUM
:需要超过一半的副本写入成功,写操作才成功。例如3个副本时,需要2个副本写入成功。能较好保证数据一致性。ALL
:所有副本都写入成功,写操作才成功。这保证了最强的数据一致性,但可用性较低。
- 读一致性级别:
- 读写一致性级别配合:
- 例如,当写一致性级别为
QUORUM
,读一致性级别也为QUORUM
时,能保证读取到的数据是最新写入的。因为写操作需要超过一半副本写入成功,读操作也需要从超过一半副本读取到相同数据,这样必然会读取到已成功写入的数据。 - 若写一致性级别为
ONE
,读一致性级别为ALL
,可能出现读操作等待所有副本响应,但其中部分副本可能还未收到最新写入,导致读操作失败或读到旧数据。所以合适的读写一致性级别配合对于保证数据一致性很关键。
- 例如,当写一致性级别为
- 管理器协调服务保证一致性:
- 协调写入:管理器会根据写一致性级别要求,协调各个服务节点进行数据写入。例如,当写一致性级别为
QUORUM
时,管理器会等待超过一半的服务节点确认写入成功,才向客户端返回写成功的响应。如果某些节点写入失败,管理器会进行重试或标记该节点异常。 - 协调读取:在读操作时,管理器根据读一致性级别,向多个服务节点发起读请求。当收到足够数量(符合读一致性级别要求)的节点响应后,管理器会检查这些响应数据是否一致。如果不一致,管理器可能会进一步请求更多节点,或者标记某些节点数据异常,以确保返回给客户端的数据是一致的。同时,管理器还会处理节点故障等异常情况,保证读写操作尽可能满足一致性要求。
- 协调写入:管理器会根据写一致性级别要求,协调各个服务节点进行数据写入。例如,当写一致性级别为