概要

既存のアプローチの中でのHermesの位置づけ

  • Chain Replicationでは、ヘッドにWriteし、末尾でReadする
    • ヘッドでシリアライズ(順序付け)されている
    • 末尾に来た時点ですべてのノードに値が書き込まれていることが保証されている
  • Chain Replicationの進化系であるCRAQでは、Local readを達成しているが、依然としてWriteは遅い

システムモデル

仕組み

  • Coordinator replicaとFollower replicaがいる
    • あくまで各命令に、ということで、同時に異なる命令に異なるCoordinatorがいる

Write

  1. Coordinator replicaは、Timestamp(Lamport Clock)をつけたInvalidation messageを送る
    • Invalidationはロックに近いように思えるが、同じキーへの同時書き込みは失敗しない
    • タイムスタンプでTotal Orderが付けられる
      • Concurrentだったら、ノードIDで順序を付ける
    • Invalid状態の値は、Readerに更新される値が来るから待っててねーというメッセージになる
  2. Ackが得られたらコミットし、そのあとValidationを送る
    • ここでFollowerのタイムスタンプも来るので、Coordinatorのタイムスタンプが更新される(Lamport Clockなので)

Read

  • 読んだときに、Validだったら、値が返される
  • Invalidateなどその他の状態だったら、暫く待つ
  • 書き込みを開始するときに既存の値を無効化することで、Valid状態のキーが最新の値を保持することが保証される

Safety replayable writes

  • キーに値を書いている途中にネットワークの障害が起きたら、あるノードでは値が永遠にInvalidになってしまう?
  • それを防ぐために、Linearizabilityを犠牲にすること無く書き込みをreplayする仕組みを備えている
    • キの新しい値がまたInvでやってくるので、いつかは最新の値を知れる。Livenessの保証かな。
    • Logical clockにより各書き込みの正確なグローバル順序がわかる
    • 長い間Invalidだなーと思ったら、自分がCoordinatorになって、Invメッセージを他のノードに送る
      • そうするとValidになるかもしれない(し、みんなもっと新しい値を知ってるかもしれない)

参考

Hermes Reliable Replication Protocol - Poster from Antonios Katsarakis