redisの冗長化を行うためには、
- master <-> slave構成
- master <-> slave構成 + sentinel
- cluster
がある。
clusterはredis3より正式サポートされた機能である。
特徴としては、以下の通り。
master <-> slave構成だと、
masterが倒れたときのフェイルオーバが皆無である。
master <-> slave構成 + sentinelだと、
masterが倒れたときに、slaveが自動昇格できる。
ただ、slave x 2以上、sentinel x 3以上が望ましい感じがする。
cluster構成だと、
分散でデータを保持しているため、
slaveも同時に使い、自動昇格させる必要がある。(slaveがあれば自動昇格する)
master x 3以上、slave x 3以上にする必要がある。
と考えると、clusterが一番な気がするが、
clusterの欠点は以下の通り。
- selectはない
- multi – execができない?
- 対応しているクライアントライブラリが少ない
- リダイレクトが発生するため、速度が遅くなる?
- クラスター再構築が難しめ
などなど。
とくに、クライアントライブラリが少ないのは気がかりである。
python, rubyではあるらしい。
javaでもlettuceが対応している。
javaのコードは以下の通り。
List<RedisURI> list = new ArrayList<>(); list.add(new RedisURI("192.168.1.45", 16381, 1, TimeUnit.SECONDS)); list.add(new RedisURI("192.168.1.45", 16382, 1, TimeUnit.SECONDS)); list.add(new RedisURI("192.168.1.45", 16383, 1, TimeUnit.SECONDS)); list.add(new RedisURI("192.168.1.45", 16384, 1, TimeUnit.SECONDS)); list.add(new RedisURI("192.168.1.45", 16385, 1, TimeUnit.SECONDS)); list.add(new RedisURI("192.168.1.45", 16386, 1, TimeUnit.SECONDS)); RedisClusterClient client = RedisClusterClient.create(new Iterable<RedisURI>() { @Override public Iterator<RedisURI> iterator() { return list.iterator(); } }); AsyncExecutions<String> excutions = null; RedisAdvancedClusterAsyncCommands<String, String> con = client.connect().async(); AsyncNodeSelection<String, String> masters = con.masters(); excutions = masters.commands().set("hoge", "fuga"); excutions.forEach(result -> result.thenAccept(ret -> System.out.println(ret))); excutions = masters.commands().get("hoge"); excutions.forEach(result -> result.thenAccept(ret -> System.out.println(ret))); con.close(); client.shutdown();
しかし、multi – execができないのは結構痛い。。。
うまいことやればできるのかな。。
ただ、分散してしまうから、無理なきがする。
このlettuceっていうライブラリは良さげ。
nettyをベースに使っていて、
ノンブロッキングをサポートしているしね。
コメントがあればどうぞ