CentOS 7
 

Redis : Redis Sentinel の設定
2016/07/25
 
Redis Sentinel による Redis サーバーの監視設定です。
例として、マスターノード 1台と 2台のスレーブノードでレプリケーションを構成した環境へ Sentinel サーバーを 1台追加して設定します。
                                  |
+----------------------+          |          +----------------------+
|  [ Redis Sentinel ]  |10.0.0.40 | 10.0.0.30|   [ Redis Master ]   |
|    mon.srv.world     +----------+----------+    dlp.srv.world     |
|                      |          |          |                      |
+----------------------+          |          +----------------------+
                                  |
+----------------------+          |          +----------------------+
|  [ Redis Slave#1 ]   |10.0.0.51 | 10.0.0.52|   [ Redis Slave#2 ]  |
|   node01.srv.world   +----------+----------+    node02.srv.world  |
|                      |                     |                      |
+----------------------+                     +----------------------+

[1]
こちらを参考にマスター/スレーブ全ノードでレプリケーション構成を設定しておきます
注意点として Sentinel により自動フェイルオーバーした際は、スレーブがマスターに、マスターがスレーブに切り替わるため、接続/認証パスワードの設定は全ノードで合わせておく必要があります。 また SELinux を有効にしている場合は、マスター側もスレーブ側と同じポリシー許可の設定を実施しておく必要があります。
[2] Sentinel による監視設定は、障害発生時には Sentinel により各ノードの redis.conf の書き換えが実行されてマスター/スレーブが切り替わるため、基本的には事前にマスター/スレーブ上での手動設定変更は必要ありませんが、 SELinux を有効にしている場合は、redis.conf を変更するための許可ルールの追加が必要になります。 以下の許可ルールの追加をマスター/スレーブ全ノードで実施します。
[root@dlp ~]#
vi redis_ha.te
# 以下の内容で新規作成

module redis_ha 1.0;

require {
        type etc_t;
        type redis_t;
        class file write;
}

#============= redis_t ==============
allow redis_t etc_t:file write;

# 中間ファイル生成

[root@dlp ~]#
checkmodule -m -M -o redis_ha.mod redis_ha.te

checkmodule: loading policy configuration from redis_ha.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 17) to redis_ha.mod
# 中間ファイルからモジュール生成

[root@dlp ~]#
semodule_package --outfile redis_ha.pp --module redis_ha.mod

# モジュールインストール

[root@dlp ~]#
semodule -i redis_ha.pp

[3] Sentinel サーバーの設定です。
# EPELからインストール

[root@mon ~]#
yum --enablerepo=epel -y install redis
[root@mon ~]#
vi /etc/redis-sentinel.conf
# 53行目:変更 [sentinel monitor (任意の名称) (マスターのIP) (マスターのポート) (Quorum)]

# Quorum ⇒ 指定した数の Sentinel サーバーがマスターがダウンしたと判断した場合にフェイルオーバーする

sentinel monitor mymaster 10.0.0.30 6379 1
# 73行目:マスターサーバーの認証パスワードを追記

sentinel auth-pass mymaster password
# 82行目:マスターサーバーがダウンしたと判断する時間(デフォルトは30秒)

sentinel down-after-milliseconds mymaster 30000
# 90行目:フェイルオーバー中に設定変更するスレーブの数

sentinel parallel-syncs mymaster 1
[root@mon ~]#
systemctl start redis-sentinel

[root@mon ~]#
systemctl enable redis-sentinel

[4] Sentinel サーバーで SELinux を有効にしている場合は、許可ルールの追加が必要です。
[root@mon ~]#
semanage port -a -t redis_port_t -p tcp 26379

[root@mon ~]#
vi redis_sentinel.te
# 以下の内容で新規作成

module redis_sentinel 1.0;

require {
        type redis_port_t;
        type etc_t;
        type redis_t;
        class tcp_socket name_connect;
        class file write;
}

#============= redis_t ==============
allow redis_t redis_port_t:tcp_socket name_connect;
allow redis_t etc_t:file write;

# 中間ファイル生成

[root@mon ~]#
checkmodule -m -M -o redis_sentinel.mod redis_sentinel.te

checkmodule: loading policy configuration from redis_sentinel.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 17) to redis_sentinel.mod
# 中間ファイルからモジュール生成

[root@mon ~]#
semodule_package --outfile redis_sentinel.pp --module redis_sentinel.mod

# モジュールインストール

[root@mon ~]#
semodule -i redis_sentinel.pp

[5] 以上で設定完了です。Sentinel サーバーで状態の確認をします。
また、マスターノードの Redis を手動で停止させる等して、正常にフェイルオーバーするか等々も確認しておくよいでしょう。
[root@mon ~]#
redis-cli -p 26379

# 「mymaster」のマスターノード確認
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster 
1) "10.0.0.30"
2) "6379"

# 「mymaster」のマスターノードの詳細
127.0.0.1:26379> sentinel master mymaster 
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "10.0.0.30"
 5) "port"
 6) "6379"
.....
.....

# 「mymaster」のスレーブ確認
127.0.0.1:26379> sentinel slaves mymaster 
1)  1) "name"
    2) "10.0.0.52:6379"
    3) "ip"
    4) "10.0.0.52"
    5) "port"
    6) "6379"
.....
.....

2)  1) "name"
    2) "10.0.0.51:6379"
    3) "ip"
    4) "10.0.0.51"
    5) "port"
    6) "6379"
.....
.....
 
Tweet