redisプライマリマルチ高可用性クラスタから構築

18337 ワード

Redis 1マスター2高可用性環境から構築


RedisはMaster-Slave(マスタースレーブ)モードをサポートし、Redisサーバは別のRedisサーバのホスト(スレーブ)に設定でき、スレーブは定期的にホストからデータを受け取る.特に、スレーブも同じようにRedisサーバのホストに設定できます.これにより、Master-Slaveの分布は、ホストでもスレーブでもRedisサーバでもサービスを提供できるように、有向無ループDAGのように見えます.
環境:centos 6.5、テストのため、今3つのredisを1台の機械の上に置きます.

一、redisのインストール


1.ダウンロード、解凍
[root@bmsoft home]# cd bmsoft/
[root@bmsofthome]# wget http://download.redis.io/releases/redis-3.2.6.tar.gz
[root@bmsoft bmsoft]# tar -zxvf redis-3.2.6.tar.gz 

2.解凍されたファイルを/bmsoftの3つのフォルダredis 1、redis 2、redis 3にそれぞれ配置します.ここで、reids 1をホストmasterディレクトリ、redis 2、redis 3をスレーブslaverディレクトリに設定します.
[root@bmsoft bmsoft]# mv redis-3.2.6 /home/bmsoft/redis1
[root@bmsoft bmsoft]# mv redis-3.2.6 /home/bmsoft/redis2
[root@bmsoft bmsoft]# mv redis-3.2.6 /home/bmsoft/redis3

3.以下、redis 1を例に1つずつコンパイルを開始する[root@bmsoft bmsoft]# cd redis1/redis-3.2.6 [root@bmsoftbmsoft]#make上のコマンドはredis 1、redis 2、redis 3でそれぞれ1回実行します.
ヒント:コンパイルに失敗した場合、gccとgcc-c++がインストールされていない可能性があります.redisコンパイルには環境サポートが必要なため、tclもインストールされる可能性があります.

二、redisを配置する。conf


インストールが完了すると、構成が開始されます.一主多従の棚なので、redis 1をメインに、redis 2、redis 3を従に選びました.各redis解凍ディレクトリの下にredisがあります.confは、まずプライマリredisの構成を変更します.以下のすべての構成はredis.confファイルは#コメントで削除します.コメントを開いてください.そうしないと無効です.
1.マスターノードredis 1のredis.conf構成
bind  0.0.0.0        //   127.0.0.1,     ip,springboot  redis              
Protected-mode no
port 7000          
daemonize yes     //redis           
pidfile "/var/run/redis_7000.pid"  //  7001,7002
dir “/home/bmsoft/redis1/data//       
slave-priority 100  
appendonly yes
appendfsync everysec 

2.ノードredis 2のredisから.conf構成
bind    ip                         //   127.0.0.1,         127.0.0.1      
Protected-mode no
port 7001                            
daemonize yes                      //redis           
pidfile "/var/run/redis_7001.pid"   
dir “/home/bmsoft/redis2/data//       
slaveof 127.0.0.1 7000             //      ip +  
slave-read-only yes                 //          
slave-priority 90                 // master     sentinel   slave-priority        master
appendonly yes
appendfsync everysec 

3.ノードredis 3のredisから.conf構成
bind    ip                         //   127.0.0.1,         127.0.0.1      
Protected-mode no
port 7002                         
daemonize yes                      //redis           
pidfile "/var/run/redis_7002.pid"   
dir “/home/bmsoft/redis3/data//       
slaveof 127.0.0.1 7000              //      ip +  
slave-read-only yes                 //          
slave-priority 80                // master     sentinel   slave-priority        master
appendonly yes  
appendfsync everysec 

注:最初はredis 1がbindだったのは127.0.0.1だったが、springbootが接続されていないことに気づき、connect refusedが表示され、その後0.0.0.0に変更され、redis 2とredis 3のslaveofのホストIPも0.0.0.0に変更され、調べた後(./redis-cli-pエンドスローガンinfo Replication)にホストの次のスレーブもなくなった.その後、redis 1を0.0.0.0に変更し、redis 2とredis 3のslaveofの後ろのホスト値が127.0.0.1であればよいことが分かった.

三、setinelを配置する.conf


1.setinelを構成する.confの前に、redisのSetinelシステム:RedisのSentineシステムは、複数のRedisサーバ(instance)を管理するために使用されています.このシステムは、次の3つのタスクを実行します.注意(Notification):監視されているRedisサーバに問題が発生した場合、CentinelはAPIを通じて管理者または他のアプリケーションに通知を送信することができる.自動フェイルオーバ(Automatic failover):プライマリ・サーバが正常に動作しない場合、Centinelは自動フェイルオーバ操作を開始します.これにより、失効したプライマリ・サーバの1つがサーバから新しいプライマリ・サーバにアップグレードされ、失効したプライマリ・サーバの他のプライマリ・サーバから新しいプライマリ・サーバのコピーに変更されます.クライアントが無効なプライマリ・サーバに接続しようとすると、クラスタは新しいプライマリ・サーバのアドレスをクライアントに返し、クラスタが無効なサーバの代わりに新しいプライマリ・サーバを使用できるようにします.
3.setinelを構成する.confは各redisのディレクトリの下でredisと.confが並んでいるのはsentinelです.confファイル、これが哨兵の配置です.各redisには哨兵がいて、その配置は基本的に同じです.1.1 redis 1の下のsentinelをそれぞれ羅列する.conf
protected-mode no  
port 27000  
dir "/home/bmsoft/redis1/temp"  
Daemonize yes
sentinel monitor redis1     ip 7000 2
sentinel down-after-milliseconds redis1 10000  
sentinel failover-timeout redis1 60000

1.2 redis 2の下のsentinel.conf
protected-mode no  
port 27001 
dir "/home/bmsoft/redis2/temp"  
Daemonize yes
sentinel monitor redis1     ip 7000 2
sentinel down-after-milliseconds redis1 10000  
sentinel failover-timeout redis1 60000

1.3 redis 3の下のsentinel.conf
protected-mode no  
port 27002  
Daemonize yes
dir "/home/bmsoft/redis3/temp"  
sentinel monitor redis1     ip 7002 2
sentinel down-after-milliseconds redis1 10000  
sentinel failover-timeout redis1 60000

四、redisとsentinelを起動する


1.redis 1、redis 2、redis 3を順次起動する
cd /bmsoft/redis1/redis-3.2.6/src  
./redis-server   /home/bmsoft/redis1/redis.conf
cd /bmsoft/redis2/redis-3.2.6/src  
./redis-server   /home/bmsoft/redis2/redis.conf
cd /bmsoft/redis3/redis-3.2.6/src  
./redis-server   /home/bmsoft/redis3/redis.conf

2.各redisの哨兵を順次起動する
1.cd /bmsoft/redis1/src  
2../redis-sentinel  /home/bmsoft/redis1/sentinel.conf
3.cd /bmsoft/redis2/src  
4../redis-sentinel  /home/bmsoft/redis2/sentinel.conf
5.cd /bmsoft/redis3/src  
6../redis-sentinel  /home/bmsoft/redis3/sentinel.conf

五、各redisの状態を表示する


redis 1、redis 2、redis 3のredisステータスコマンドを表示するには、次の手順に従います.
1.cd /crmtestXieHao/redis1/src  
2../redis-cli  -h 127.0.0.1  -p  7000 info Replication
3../redis-cli  -h 127.0.0.1  -p  7001 info Replication
4../redis-cli  -h 127.0.0.1  -p  7002 info Replication

プライマリredis 1は読み書き可能であり、redis 2およびredis 3からは読み取り専用であるため、先にredis 1のクライアントにデータを挿入することができる
cd /bmsoft/redis1/src  
./redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> set name bmsoft
ok
127.0.0.1:7000>  get name  
"bmsoft"

redisテストから
./redis-cli -h 127.0.0.1 -p 7000 
127.0.0.1:7000> set ll test
(error) READONLY You can't write against a read only slave.    
127.0.0.1:7000> get name
"bmsoft"  

六、failover失効テスト


1.マスターマスターマスターredisをシャットダウンアナログダウンログを表示
23833:X 05 May 07:55:47.967 # +switch-master redis1 127.0.0.1 7000 127.0.0.1 7002

哨兵は、マウントされた7000主redisを7001のredisノードに切り替えた.哨兵モードでは、システムは私たちに従ってredisに配置されます.confのslave-priorityは,slave-priority値の最小を新しいmasterプライマリノードに推挙する.前のマスターノードが再起動すると、スレーブノードとしてマスターノードの下に掛けられ、逐一テストされず、前のマスターノードが再起動してスレーブノードになります.1.1マスターを停止する
[bmsoft@bmsoft src]$ ./redis-cli -p 7000 
127.0.0.1:7000> ping
PONG
127.0.0.1:7000> shutdown·
not connected>

1.2以前redis.confファイルでは、7002ポートのslave-priority設定が小さいため、哨兵モードは小さな値に基づいてmasterに設定し、7002ポートの状態を表示します
[bmsoft@bmsoft src]$ ./redis-cli -p 7002 info Replication

 Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7001,state=online,offset=18097,lag=1
master_repl_offset:18097
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:18096

7002のroleがmaster 1.3になっているのが見えます.このとき再起動する前に閉じた7000ポート、元のメインノード
[bmsoft@bmsoft src]$ ./redis-server /home/bmsoft/redis0/redis.conf 
[bmsoft@bmsoft src]$ ./redis-cli -p 7000  info Replication


 Replication
role:slave
master_host:127.0.0.1
master_port:7002

元メインノード7000のroleがslaveになっているのが見えます以上の手順を経て、redis一主多従が完成しました!!

七.Springboot接続redisクラスタ


application.propertiesファイル構成redisと哨兵サービス
# Redis     (   0)
spring.redis.database=0
# Redis       (    )
spring.redis.password=
#         (          )
spring.redis.pool.max-active=8
#            (          )
spring.redis.pool.max-wait=-1
#            
spring.redis.pool.max-idle=8
#            
spring.redis.pool.min-idle=0
#       (  )
spring.redis.timeout=0

#sentinel  
 #    redis server    
spring.redis.sentinel.master=redis1
#         
spring.redis.sentinel.nodes=122.112.210.226:27000,122.112.210.226:27001,122.112.210.226:27002
#sentinel  

穴:エラーメッセージCan connect to sentinel,but redis 1 seems to be not monitored...不注意でspring.redis.sentinel.master=redis 1、redis 1後にうっかりスペースを入れてしまったため、このエラーが発生し、スペースを外して実行に成功しました.