redis高可用性システムの構築
12323 ワード
一、単一のインスタンス
システムにRedisが1台しか稼働していない場合、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をダウンロードします
redisディレクトリの下にredisがあります.confとsentinel.confプロファイルの例では、
プライマリredis-serverプロファイルの内容を変更するには、次の手順に従います.
変更内容は、redis-serverプロファイルから次のようになります.
redis-serverを起動します.
3つのredisサービスが起動したら、コマンドラインに入り、info replicationを実行して現在のプライマリ・スレーブ構成を表示します.
プライマリ・ノードのプライマリ・スレーブ情報の表示
ノードからの情報がないことがわかりました.
3.主従間通信不可
ここでは、ファイアウォールが8000ポートを遮断しているため、ファイアウォールの設定を変更し、8000ポート(同じredis-sentinelの6800ポート)を開放する必要があります.
8000ポートと6800ポートを追加
次に、プライマリ・ノードに再アクセスし、プライマリ・スレーブ情報を表示すると、redis-serverプライマリ・スレーブが構成済みであることを示す2つのスレーブ・ノード情報が表示されます.
プライマリ・ノードのプライマリ・スレーブ情報の表示
4.redis-sentinelシステムの構築
redis-sentinelプログラムはすでにインストールされています.ここではプロファイルを変更するだけでいいです.変更/etc/sentinel.conf、作成しなければいいです.
sentinelを変更します.confプロファイルの内容は次のとおりです.
redis-sentinelを起動します.
3つのredis-sentinelサービスが開始されると、任意のsentinelサービスに接続して現在のプライマリredisサービス情報を知ることができます.
sentinelモニタ状態
五、テスト
1.redisを止める
2.redis-sentinelのモニタリングステータスの表示
sentinelモニタ状態
102というredis-serverがメインライブラリに昇格していることがわかりました.
これでredisの高可用性スキームが構築されました.
六、クライアントプログラム
PHPプログラムなどのクライアントプログラムがredisに接続する場合はipとportが必要ですが、redis-serverがフェイルオーバする場合は主redisが変化するのでipアドレスも変化します.クライアントプログラムは、現在のプライマリredisのipアドレスとポートをどのように感知しますか?redis-sentinelはインタフェースを提供し、いずれかのsentinelを要求し、
現在のプライマリ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ドリフト操作ができます.
3つのサーバのredis-sentinelプロファイル/etc/sentinelを変更します.conf、上の行を増やします.次に/opt/ディレクトリの下にnotify_を作成します.master6800.shスクリプトファイル、このスクリプトはVIPドリフト操作を行い、内容は以下の通りである.
現在のプライマリredisは192.168.56.102であり、VIPをサーバに手動でバインドする必要があります.
次に、別のサーバにVIPアドレスでredis-serverとredis-sentinelを接続します.
VIPによるredis接続
上記からも、現在の主redisは192.168.56.102であることがわかる.
次に、このredisサービスをオフにして、VIPが別のサーバにドリフトしているかどうかを確認します.
sentinelをクエリーすると、192.168.56.103がメインに昇格したことがわかりました.
VIP接続redisにアクセスすると、VIPは192.168.56.103を指していることがわかります.
八、まとめ
以上の操作により、redis主従+歩哨(sentinel)+ドリフトVIPのスキームを用いてredis高可用性システムを構築したが、このシステムは単一のredisインスタンスの高可用性を保証するので、業務の比較的小さい応用に適している.ビジネスが大きく、コンカレント量が高い場合は、公式redis clusterやオープンソースcodingsクラスタなどのredisクラスタの構築をお勧めします.
また,ドリフトVIPはkeepalivedソフトウェアを用いて実現できるが,ここではあまり紹介しない.
システムに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つのパラメータ
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ソフトウェアを用いて実現できるが,ここではあまり紹介しない.