Tencent / phxpaxos

The Paxos library implemented in C++ that has been used in the WeChat production environment.
Other
3.36k stars 863 forks source link

如果发生master切换,如何保证新 master 的数据是最新的? #193

Open kong123456 opened 3 years ago

kong123456 commented 3 years ago

看phxkv的Get逻辑实现,直接从 master 的 db 里读取数据,请问如何保证 master 的数据是最新的?

如果master发生切换,新 master 是一个数据比较落后的机器,这台机器不一定有最新的数据。 选举过程没有考虑各机器的数据新旧情况,采用basic paxos 实现选主,选举后也没马上同步最新数据才开始服务的逻辑。 请问这里是怎么保证新 master 的数据是最新的?谢谢

kong123456 commented 3 years ago

比如初始状态: A, B, C 三台机器,A 是 master,都有数据 val = null

  1. 客户端请求 val = 123
  2. A,B 两台机都成功 accept/写入数据成功, C 机异常
  3. 此时 A, B 两机的数据是 val = 123,C 机 val = null
  4. A 机发生异常离线,重新选主后新 master 是 C 机
  5. 客户端马上请求读取 val 的值,读取到 C 机存储的 val = null

实际上 val 应该读到是 123,这种情况下会得到 val = null,一个比较旧的值?

lynncui00 commented 2 years ago

选主也是一个 basic paxos 的过程,当一台机能完成一次 basic paxos,那说明这台机的数据已经是最新的了。