1)三个副本下,如果故障了两个副本,剩余一个副本连SELECT 都禁止了。这是处于什么考虑?放开读会有什么一致性问题吗?
2) 上述禁止读是在所有情况都禁止吗?还是根据具体情况而定的?
3) 针对问题2),如果查询数据的主副本是Paxos的leader节点,这时是不是还允许查询? 即禁止读是因为该数据在这台节点上不是主副本所以才禁止读,如果是主副本还是能读的?
请发到 “OceanBase 技术问题” 板块哈~
1)在 OceanBase 中,当三副本中有两个副本故障时,仅剩的最后一个副本无法提供只读服务,主要是出于数据一致性和可用性的考虑。OceanBase 采用 Paxos 协议来保证数据的强一致性,要求在多数派副本中达成共识。在三副本情况下,多数派为两个副本。当两个副本故障时,剩余的单个副本无法形成多数派,无法确定数据的一致性状态,因此禁止读操作是为了避免潜在的一致性问题,例如读取到过期或错误的数据。
2)上述禁止读并不是在所有情况下都禁止,而是取决于剩余副本的状态及其与其他副本的关系。具体来说,如果剩余的副本是 Paxos 组的 Leader 并且有足够的信息来保证数据的一致性,理论上是可以提供只读服务的。但在实际操作中,OceanBase 通常会更加保守,避免在这种极端情况下提供读服务,以防出现任何数据不一致的风险。
3)如果查询数据的主副本是 Paxos 的 Leader 节点,且该节点仍然存活,理论上可以提供只读服务。然而,OceanBase 在设计上更倾向于在极端故障情况下禁止读操作,以确保数据的一致性和可靠性。这种设计是为了避免在极端情况下出现数据不一致的问题,即使这可能会牺牲一些可用性。
检索到的文档如下:
只提供只读,那不就是说集群已经不能写入了吗?这不就是说集群不能正常工作了吗?