🔒
redisを用いた分散ロック(Redlock)のメモ
前提
- 分散ロックしたい
- 別のマシンで動いてる複数プロセス間で手軽にロック
- 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