質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

Redis Sentinelの自動フェールオーバーしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,948

soich

score 153

何か必要な情報があれば追記します。
正解でなくてもいいので何かアドバイスをいただけると幸いです。

環境

Redis 3.2.5
CentOS 6.8(Red Hat64bit)

○6台構成
server001 192.168.56.111 Master
server002 192.168.56.112 Slave
server003 192.168.56.113 Slave
server004 192.168.56.114 Sentinel
server005 192.168.56.115 Sentinel
server006 192.168.56.116 Sentinel

やりたいこと

Redis Sentinelを使用してフェイルオーバーを自動で行いたいのですが、
自動でフェイルオーバーがされません。

server001をMasterにしてMasterが落ちた場合に、
監視サーバのSentinel3台がそれを検知して、SlaveをMasterに自動で昇格する仕組みを作りたいです。

英語で対処方法が理解できないのですが、
以下のURLの質問と似たような現象が起きています。
http://serverfault.com/questions/655260/redis-sentinel-cluster-failover-results-in-failover-abort-not-elected-master

設定

各サーバのredis.conf/redis-sentinel.confは下記になります。

server1(redis.conf)
$ vim /etc/redis/6379.conf #redis.confを改名
bind 192.168.56.111 127.0.0.1
port 6379
daemonize yes
slave-serve-stale-data yes
slave-read-only yes
slave-priority 100
server002-3(redis.conf)
$ vim /etc/redis/6379.conf
bind 192.168.56.112 127.0.0.1 #server003の場合は192.168.56.113
port 6379
daemonize yes
slave-serve-stale-data yes
slave-read-only yes
slave-priority 100
slaveof 192.168.56.111 6379
server004-6(sentinel.conf)
$ vim /etc/redis/26379.conf
daemonize yes
port 26379
sentinel monitor mymaster 192.168.56.111 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 90000
sentinel parallel-syncs mymaster 1

試したこと

1.server001-3のredis起動
$ service redis start

2.server004-6のredis-sentinel起動
$ service redis-sentinel start
※redis-sentinelの自動スクリプト化は以下を参考にしました
http://qiita.com/KurosawaTsuyoshi/items/e6a4def57c9a12f1d752

3.各サーバの情報確認
○info replication情報
・server001

192.168.56.111:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.112,port=6379,state=online,offset=366275,lag=0
slave1:ip=192.168.56.113,port=6379,state=online,offset=366275,lag=0
master_repl_offset:366418
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:366417


.server002

192.168.56.112:6379> info replication
# Replication
role:slave
master_host:192.168.56.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:390596
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

・server003

192.168.56.113:6379> info replication
# Replication
role:slave
master_host:192.168.56.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:399389
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

・server004-6

127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.56.111"
   ・・・


自分で見る限り問題なさそうでした。

4.Master(server001)を落とす
$ service redis stop

5.sentinelサーバのログを見る
$ tail -f /var/log/redis/sentinel_26379.log  1693:X 19 Dec 16:02:27.795 # +sdown master mymaster 192.168.56.111 6379

上記の一文が出るが特に何も起きない

6.MasterかSlaveか確認(server002-3にて)
$ redis-cli -p 6379 info | grep role role:slave
両方SlaveのままMasterに昇格していない
→自動で昇格されていない

7.手動で昇格させてみる(server4-6のいずれか)
redis 127.0.0.1:26379> SENTINEL failover mymaster OK

8.server002-3のどちらかがSlaveに昇格している
$ redis-cli -p 6379 info | grep role
role:Master

といった流れを行いました。
手動でMasterに昇格させることができるので、各サーバ間で接続はうまくいっていると思います。
自動フェイルオーバーが行われない設定にしているのでは、と思いながらどこなのかわからず詰まっている次第です。

その後試したこと

Masterが落ちたと検知したことがSentinel間で行われていないのではと思い、
redis-sentinel.confの設定を下記のように修正しました

#sentinel monitor mymaster 192.168.56.111 6379 2 変更前
sentinel monitor mymaster 192.168.56.111 6379 1


上記はMasterが落ちたと検知したらフェールオーバーをする、という設定を2台から1台に変更しました。

それからMasterを落としてみたのですが、
下記のようなログが出てフェールオーバーの処理が行われません(ログファイルは下記のsentinel.confで設定したもの)

2075:X 19 Dec 23:32:55.543 # +new-epoch 206
2075:X 19 Dec 23:32:56.146 # +new-epoch 207
2075:X 19 Dec 23:32:56.146 # +try-failover master mymaster 192.168.56.111 6379
2075:X 19 Dec 23:32:56.150 # +vote-for-leader 2285be61d950719ca45eeffc7d218f98887703ef 207
2075:X 19 Dec 23:33:06.261 # -failover-abort-not-elected master mymaster 192.168.56.111 6379
2075:X 19 Dec 23:33:06.320 # Next failover delay: I will not start a failover before Mon Dec 19 23:35:56 2016

自動でフェールオーバーするために足りない設定などありますでしょうか。
お手数ですがご教授の程、よろしくお願いいたします。

参考URLにした

http://qiita.com/KurosawaTsuyoshi/items/e6a4def57c9a12f1d752
http://qiita.com/KurosawaTsuyoshi/items/e6a4def57c9a12f1d752
https://redis.io/topics/sentinel

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

いろいろ試したのですが、今の所下記の2つで自動フェールオーバーはされるようになりました。

1.protected-modeを設定する
Redis3.2.0以上はprotected-modeが有効でデフォルト設定されているようです。

$ vim /etc/redis/26379.conf(sentinel.conf)
protected-mode no


この設定があるとsentinelで自動フェールオーバーされないとのこと。
http://kenken0807.hatenablog.com/entry/2016/06/10/103656

2.bindの設定

$ vim /etc/redis/26379.conf(sentinel.conf)
bind 0.0.0.0


bindでどのIPからの接続も許可したところ自動フェールオーバーされるようになりました。

上記2つの方法だとセキュリティ上の課題がありそうです。
①パスワードを設定する
②bindを使用するRedisサーバのみの設定にする
③ポート番号を特定のものしか開かない
などで対策していこうと思います。(②がうまくいっていなくて悩み中)

一応参考までに、もしもっといい解決方法があればコメントお願いします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる