- Redis Cluster の Python クライアントに READONLY モードを実装する
- http://redis.io/topics/cluster-spec#scaling-reads-using-slave-nodes
- デフォルトでは、Redis Cluster の Slave には直接アクセスできない
- リダイレクトされるだけ
- それを、READONLY な接続であると宣言することで、アクセスできるようにする
- READONLY mode で MOVE となるコマンドとそうでないコマンドを区別する必要があるか?
- どういうコマンドを送ろうと、リダイレクトするなり応答を返すかについてはサーバが適切な振る舞いをしてくれると考えられる
- READONLY モードでは Read系のコマンドでない場合はリダイレクトの対象
- https://github.com/antirez/redis/blob/01888d1e587c681e80117d7457b0c643a0719a21/src/cluster.c#L4925
- 区別する必要があるとすると、その区別は Redis のソースコードを読んだ方が早い
- https://github.com/antirez/redis/blob/01888d1e587c681e80117d7457b0c643a0719a21/src/redis.c#L123
- READONLY mode のとき、redis-py-cluster 自体はどう振る舞うべきか?
- GET 系であろうとSET系であろうと、選ばれたnodeで既存のimplを実行するだけ。
- なので、node をどう選ぶかだけに集中すればよいと思われる
- READONLY mode の時、ノードをどう選べばよいか?
- 該当する master と slave をランダムに選べばよい
- できれば同確率で
- StrictRedisCluster のコンストラクタに readonly=False をつける
- **kwargs に含めてしまっても問題なさそうに見えるが、明示的に引数にした方がわかりやすい
- ConnectionPool まわりの実装が問題ないかも確認する
- connection_pool.get_connection_by_nodeしか使っていない。
- pubsub は別
- NodeManager がメインの変更箇所
- https://github.com/Grokzen/redis-py-cluster/blob/unstable/rediscluster/nodemanager.py#L70
- ノードから接続を返す部分も修正する必要がある
- https://github.com/Grokzen/redis-py-cluster/blob/unstable/rediscluster/connection.py#L180
Grokzen/redis-py-cluster#76
この gist の内容は上のPRとして結実し、取り込まれました(*´~`)