redis-sentinelはHAをします

6645 ワード

基本的な紹介
本論文はredis-2.8.10とjedis 2に基づいている.4.2リリース.
redis 2.8以降のバージョンでは、Centinelがクライアント機能をリスニングすることをサポートし始めました.1つ以上のSentineをリスニングクラスタとして使用します.
バックエンドN個(master+slave)はredisクラスタを構成する.
Centinelは、Redisのmasterインスタンスが生存しているかどうかを検出し、Redis masterインスタンスに障害が発生した場合に、Redis masterのslaveをmasterに昇格させることにより、
古いマスターがredis sentinelのクラスタに再加入すると、新しいマスターのslaveとして再構成されます.
これはredis sentinelベースのHAクラスタが自己管理できることを意味します!
アプリケーションはsentinelによって、書き込み済みのmasterのIPとポートを直接構成するのではなく、現在のmasterの接続を動的に得ることができる.
これにより、master、slave切り替え後にアプリケーション構成の接続が使用できない場合を回避できます.
インストール構成
http://download.redis.io/releases/redis-2.8.17.tar.gz

1.  redis: 

tar zxvf redis-2.8.17.tar.gz (    tcl)

cd redis-2.8.8 

(  Liunx    :getconf LONG_BIT)
   32 :make CFLAGS="-march=i686"
   64 :make

      (make clean)

cd src 
make test
make install  
mkdir -p /opt/portal/redis/bin
mkdir -p /opt/portal/redis/conf
mkdir -p /opt/portal/redis/logs
cd /opt/portal/redis/redis-2.8.8
cp redis.conf sentinel.conf /opt/portal/redis/conf
cd /opt/portal/redis/redis-2.8.8/src
cp  redis-server redis-cli redis-sentinel redis-benchmark  mkreleasehdr.sh redis-check-aof redis-check-dump   /opt/portal/redis/bin

    
vi /etc/profile
alias redis-server='/opt/portal/redis/bin/redis-server /opt/portal/redis/conf/redis.conf'
alias redis-cli='/opt/portal/redis/bin/redis-cli'
       
. /etc/profile

slaveのredisのredis.confはmasterのIPとポートを構成する必要があります#slabeof
Centinel公式ドキュメント:公式サイト:http://redis.io/topics/sentinel
<span style="font-size:24px;">sentinel.conf   6    </span>

<span style="color:#ff0000;">port 26329
sentinel monitor mymaster 192.168.14.191 6379 2</span>
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel notification-script <master-name> <script-path>


port:   sentinel     (  redis server client  tcp     )
monitor:   sentinel monitor redis  ,    redis     (alias) redis   ip+port,<span style="color:#006600;">       2    2 setinel       redis server   ,  redis server      real fail。  ,      2,      sentinel    1 ,   redis      ,sentinel         。           。</span>
down-after-milliseconds:   sentinel   redis           ,       down。       sentinel     redis    ,      。
failover-timeout:  sentinel          failover  (    master/slave    ),     failover  。    4   ,     sentinel.conf    ,    ,      。
parallel-syncs:   failover   ,   sentinel reconfigure   slave   。  reconfigure   ,   slave          ,       slave     ,       。
notification-script:   sentinel   master-name        ,       。      ,         。

テスト
191192には、同じマスターを監視するために1つのSentineが配置されています.
192配置master,191配置slave(
redis.confでmasterを構成するアドレスslave of 192.168.11.190 6379)
redis,Sentinalの起動
nohup ./bin/redis-sentinel ./conf/sentinel.conf> ./logs/redis-sentinel.log 2>&1&

redis-cli info       redis       
redis-cli -p 26379    redis-sentinel     info   master  ,   slave,     

         master
192.168.14.192:26381> sentinel monitor mymaster 192.168.14.193 6379 2 
       master   slaves:
192.168.14.192:26379> sentinel slaves mymaster
<span style="color:#3333ff;">192  master: redis-cli shutdown </span>
 redis-sentinel.log 
 +sdown master mymaster 192.168.14.192 6379     192down 
+vote-for-leader bccb0d2d048a9a8497f87137a856add2ff57bceb 1     master
+switch-master mymaster 192.168.14.192 6379 192.168.14.191 6379      master192   191
+slave slave 192.168.14.192:6379 192.168.14.192 6379 @ mymaster 192.168.14.191 6379 192   191 slave

redis-cli info Replication <span style="color:#3333ff;">191   role:master</span>



<span style="color:#3333ff;">     192
redis-cli info Replication 192 role:slave</span>

<span style="color:#3333ff;">  191 shutdown 192    master </span>

Springプロファイル&コード
	<bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
		<property name="master">
			<bean class="org.springframework.data.redis.connection.RedisNode">
				<property name="name" value="mymaster"></property>
			</bean>
		</property>
		<property name="sentinels">
			<set>
				<bean class="org.springframework.data.redis.connection.RedisNode">
					<constructor-arg name="host" value="192.168.14.192"></constructor-arg>
					<constructor-arg name="port" value="26379"></constructor-arg>
				</bean>		
				<bean class="org.springframework.data.redis.connection.RedisNode">
					<constructor-arg name="host" value="192.168.14.191"></constructor-arg>
					<constructor-arg name="port" value="26379"></constructor-arg>
				</bean>			
			</set>
		</property>
	</bean>

	<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>
	</bean>
	

	<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
		<property name="connectionFactory" ref="connectionFactory" />
	</bean>

プロファイルをリロードするには、java-daoはgetBeanでredisTemplateを取得し、getBeanの前にJedis jedis=new Jedis(ip,port)を使用します.テストしないとredis接続できません.
Sentinel         

sentinelConfiguration構成リスニングのリスト
connectionFactory:現在のマスターをリスニングから取得
redisTemplate:connectionFactoryへの接続の取得
		Long listFormRedis=redisTemplate.opsForList().size("login_record_list");
		String hostName=connectionFactory.getSentinelConnection().masters().iterator().next().getHost();
		
		System.out.println(listFormRedis);
		System.out.println(hostName);

マスター切り替え時に適用されるログ:
It seems like server has closed the connection.; nested exception 
2014-11-10 16:57:46 redis.clients.jedis.JedisSentinelPool initPool
  : Created JedisPool to master at 192.168.14.191:6379