redis高可用性システムの構築

12323 ワード

一、単一のインスタンス
システムにRedisが1台しか稼働していない場合、redisが一時停止すると、システム全体が稼働できなくなります.
単一のインスタンス
二、バックアップ
単一のredisで単一の障害が発生すると、システム全体が使用できなくなるため、当然のことながらバックアップが考えられます( 3 ).1台のredisに問題が発生した場合、もう1台のredisはサービスを継続することができます.
バックアップ
三、自動故障移転
上のredisはバックアップをしていますが、完璧に見えます.しかし、redisは現在、プライマリ・セカンダリ・レプリケーション・バックアップ( )のみをサポートしているため、プライマリ・redisが停止すると、redisから読み取りサービスのみが提供され、書き込みサービスは提供されません.だから、主redisが切れたとき、redisから主redisにアップグレードさせる方法も考えなければなりません.
これには自動フェイルオーバが必要です.redis sentinelにはこの機能があり、プライマリredisがサービスを提供できない場合、redis sentinelはredisからプライマリredisにアップグレードし、新しいプライマリredisを使用してバックアップをコピーするように他のredisを構成できます.
じどうフェイルオーバ
四、実践に着手する
1.環境
ここでは3台のサーバを使用して、各サーバに1つのredis-serverとredis-sentinelサービスを開き、redis-serverポートは8000、redis-sentinelポートは6800で、デフォルトポートを変更するのは安全な第一歩です^^.
redis-server説明
192.168.56.101:8000主192.168.56.102:8000 から
192.168.56.103:8000 から
redis-sentinel説明
192.168.56.101:6800
192.168.56.102:6800
192.168.56.103:6800
2.redisシステムの構築
まずインストールredisをダウンロードします
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar zxvf redis-3.2.8.tar.gz
cd redis-3.2.8
make

cd src
#  redis     /usr/sbin   ,             ,      
sudo cp redis-cli  redis-server  redis-sentinel   /usr/sbin/

redisディレクトリの下にredisがあります.confとsentinel.confプロファイルの例では、sudo cp redis.conf sentinel.conf /etc/コマンドを使用して2つのプロファイルを/etcディレクトリにコピーし(もちろん/etc/ディレクトリにプロファイルを新規作成することもできます)、プロファイルを変更します.
プライマリredis-serverプロファイルの内容を変更するには、次の手順に従います.
port  8000           #           
daemonize  yes
bind  0.0.0.0
pidfile   /var/run/redis-8000.pid
logfile   /var/log/redis/redis-8000.log

変更内容は、redis-serverプロファイルから次のようになります.
port  8000           #           
daemonize  yes
bind  0.0.0.0
pidfile   /var/run/redis-8000.pid
logfile   /var/log/redis/redis-8000.log
slaveof  192.168.56.101  8000    # redis  redis    

redis-serverを起動します.
sudo redis-server /etc/redis.conf

3つのredisサービスが起動したら、コマンドラインに入り、info replicationを実行して現在のプライマリ・スレーブ構成を表示します.
プライマリ・ノードのプライマリ・スレーブ情報の表示
ノードからの情報がないことがわかりました.
3.主従間通信不可
ここでは、ファイアウォールが8000ポートを遮断しているため、ファイアウォールの設定を変更し、8000ポート(同じredis-sentinelの6800ポート)を開放する必要があります.
#          ,  8000  
sudo vim /etc/sysconfig/iptables

#    ,       
sudo service iptables restart

8000ポートと6800ポートを追加
次に、プライマリ・ノードに再アクセスし、プライマリ・スレーブ情報を表示すると、redis-serverプライマリ・スレーブが構成済みであることを示す2つのスレーブ・ノード情報が表示されます.
プライマリ・ノードのプライマリ・スレーブ情報の表示
4.redis-sentinelシステムの構築
redis-sentinelプログラムはすでにインストールされています.ここではプロファイルを変更するだけでいいです.変更/etc/sentinel.conf、作成しなければいいです.
sentinelを変更します.confプロファイルの内容は次のとおりです.
daemonize yes
port  6800
logfile  /var/log/redis/sentinel.log
pidfile  /var/run/sentinel.pid
sentinel monitor master8000 192.168.56.101 8000 2
#5  master6800    ,   SDOWN
sentinel down-after-milliseconds master8000 5000  
sentinel failover-timeout  master8000 15000

redis-sentinelを起動します.
redis-sentinel  /etc/sentinel.conf

3つのredis-sentinelサービスが開始されると、任意のsentinelサービスに接続して現在のプライマリredisサービス情報を知ることができます.
sentinelモニタ状態
五、テスト
1.redisを止める
redis-cli -h 192.168.56.101 -p 8000 shutdown

2.redis-sentinelのモニタリングステータスの表示
sentinelモニタ状態
102というredis-serverがメインライブラリに昇格していることがわかりました.
これでredisの高可用性スキームが構築されました.
六、クライアントプログラム
PHPプログラムなどのクライアントプログラムがredisに接続する場合はipとportが必要ですが、redis-serverがフェイルオーバする場合は主redisが変化するのでipアドレスも変化します.クライアントプログラムは、現在のプライマリredisのipアドレスとポートをどのように感知しますか?redis-sentinelはインタフェースを提供し、いずれかのsentinelを要求し、SENTINEL get-master-addr-by-name <master name>を送信すると現在のプライマリredisのipとportを得ることができる.
現在のプライマリredisのipとportを取得
クライアントはredisに接続する前にsentinelにリクエストを送信し、プライマリredisのipとportを取得し、戻ってきたipとportでredisに接続します.
この方法の欠点は、redisを操作するたびに少なくとも2回の接続要求、1回目のsentinel要求、2回目のredis要求を送信する必要があることが明らかである.
phpリクエストsentinelプログラムコードは、以下を参照してください.https://github.com/huyanping/redis-sentinel
より良い方法はVIPを使用することです.もちろん、redisがアリクラウドサーバに構築されているなど、構成環境に一定の要求があります.VIPはサポートされていない可能性があります.
VIP方式は、redisシステムが外部に対して常に同じipアドレスであり、redisがフェイルオーバを行う場合、VIPを以前のredisサーバから現在の新しいプライマリredisサーバにドリフトする必要がある.
例えば、現在のredisシステムにおけるプライマリredisのipアドレスが192.168.56.101である場合、VIP(192.168.56.250)は192.168.56.101を指し、クライアントプログラムはVIP(192.168.56.250)アドレスでredisに接続され、実際に接続されているのは現在のプライマリredisであり、sentinelへの要求の送信を回避する.
プライマリredisがダウンタイムし、フェイルオーバが行われると、192.168.56.102というサーバ上のredisがプライマリに昇格し、VIP(192.168.56.250)は192.168.56.102を指し、クライアントプログラムはコードを変更する必要がなく、192.168.56.102というプライマリredisに接続されている.
VIP指向192.168.56.101
フェイルオーバ後、VIPドリフトは192.168.56.102を指す
七、ドリフトVIP
では、現在の問題は、redisフェイルオーバ時にVIPを新しいプライマリredisサーバにドリフトする方法です.
ここではredis sentinelのパラメータclient-reconfig-scriptを使用します.このパラメータは実行スクリプトを構成します.sentinelはfailoverを行うときにこのスクリプトを実行し、6つのパラメータを渡します.ここでは新しいマスターredisのIPアドレスです.このスクリプトでVIPドリフト操作ができます.
sentinel client-reconfig-script master8000   /opt/notify_master6800.sh

3つのサーバのredis-sentinelプロファイル/etc/sentinelを変更します.conf、上の行を増やします.次に/opt/ディレクトリの下にnotify_を作成します.master6800.shスクリプトファイル、このスクリプトはVIPドリフト操作を行い、内容は以下の通りである.
#notify_master6800.sh    
#!/bin/bash
MASTER_IP=$6  #        redis ip  
LOCAL_IP='192.168.56.101'  #         192.168.56.102,192.168.56.103
VIP='192.168.56.250'
NETMASK='24'
INTERFACE='eth1'
if [ ${MASTER_IP} = ${LOCAL_IP} ];then   
    /sbin/ip  addr  add ${VIP}/${NETMASK}  dev ${INTERFACE}  # VIP        
    /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else 
   /sbin/ip  addr del  ${VIP}/${NETMASK}  dev ${INTERFACE}   # VIP        
   exit 0
fi
exit 1  #    1,sentinel         

現在のプライマリredisは192.168.56.102であり、VIPをサーバに手動でバインドする必要があります.
/sbin/ip  addr add 192.168.56.250/24 dev eth1
/sbin/arping -q   -c 3 -A 192.168.56.250 -I eth1

次に、別のサーバにVIPアドレスでredis-serverとredis-sentinelを接続します.
VIPによるredis接続
上記からも、現在の主redisは192.168.56.102であることがわかる.
次に、このredisサービスをオフにして、VIPが別のサーバにドリフトしているかどうかを確認します.
redis-cli -h 192.168.56.102 -p 8000 shutdown

sentinelをクエリーすると、192.168.56.103がメインに昇格したことがわかりました.
VIP接続redisにアクセスすると、VIPは192.168.56.103を指していることがわかります.
八、まとめ
以上の操作により、redis主従+歩哨(sentinel)+ドリフトVIPのスキームを用いてredis高可用性システムを構築したが、このシステムは単一のredisインスタンスの高可用性を保証するので、業務の比較的小さい応用に適している.ビジネスが大きく、コンカレント量が高い場合は、公式redis clusterやオープンソースcodingsクラスタなどのredisクラスタの構築をお勧めします.
また,ドリフトVIPはkeepalivedソフトウェアを用いて実現できるが,ここではあまり紹介しない.