🔒

redisを用いた分散ロック(Redlock)のメモ

1 min read

この記事は2019/05/13に某所で限定公開したものを転載した記事です。

前提

  • 分散ロックしたい
    • 別のマシンで動いてる複数プロセス間で手軽にロック
  • Redisで
    • PostgreSQLとかSQSとかいろいろ考えたけど、Redisくらいがちょうどよい

Redisでの分散ロックの実装方法

  • Redisでの分散ロックの実装にはRedlockっていうアルゴリズムがある
  • Redisの1インスタンスに対する基本的なロックを束ねてRedlockが実装される
    • 基本はSETNX(キーが存在しなかったら値を保存するコマンド)で、制限時間付きのキーを作ることでロックをする。値は乱数で確率的に一意な値になるようにする。
    • アンロックはEVAL(=Luaスクリプトを実行するコマンド)で、特定の値を持っていたら消す。間違ってアンロックするのを防いでる。
  • 上記のロックアルゴリズムを複数のRedisマスターに投げて、n/2+1以上のロックが取れたらロック成立とする
    • とれなかったら一旦全部アンロックしてランダムな時間待って規定回数リトライする
  • クラスター使えば複数のRedisマスターを対象にする必要はなさそうだが…
    • Redisクラスターは非同期なのでマスターが死ぬ場合にスレーブにデータが行き渡っていない可能性があり、そのケースでロックが外れちゃう
    • そこでマスターを複数とすることでロバストにしてる

Redlockへの評価とその反論

  • 批判的な評価が出た: http://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html
  • その評価への反論が出た: http://antirez.com/news/101
  • どちらもちゃんと読めてないが…
    • 批判ポイント
      • キーには制限時間が付いてて勝手に消えちゃうので、ロックをした側がロックが外れてることに気が付かない可能性があり、話になんねぇ
      • そもそもシステムモデルにある種の前提が強いから実用はできねぇ
    • 反論ポイント
      • ちゃんと読んでないのでわかんにゃい
  • その後の応酬が無いように見えるので、あんま盛り上がってないのかな?

分散ロックそのものに対する注意

Discussion

ログインするとコメントできます