redis를 HA로 구성했을 경우, SDR(spring-data-redis 1.4) 와 jedis커넥션을 이용한 spring과 redis 연동.
RedisSentinelConfiguration 클래스를 이용하면, HA를 지원하는 redis의 이중화 상태에서도 spring을 이용한 redis연동이 가능하다.
java코드로 연동하는 방법은 여러곳에서 나와있으므로, 본 글 에서는
xml을 이용한 DI(Dependency Injection)방식으로 spring과 HA redis를 연동하는 방식을 설명한다.
1. pom.xml 수정 (SDR , jedis를 추가)
이전글과 동일하다. 단 common-pool 대신에 이를 상속받은 JedisPoolConfig을 써봄으로 인해 common-pool은 제거.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.5.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
2. application-config.xml 수정
2.1 네임스페이스에 xmlns:p,c, util 추가.
2.2.1 mymaster와 setntinels을 xml로 구성
2.2.2 RedisSentinelContiguration을 이용해서 HA구성.
=> SDR에 미흡한 부분이 하나 존재하여, MySentinelConfiguration 를 별도로 생성해서 이용하도록 함.
(이유는 아래 xml의 코멘트 참조)
2.2.3 jedis를 이용한 Pool과 connection구성.
이렇게만 하면 이전 예제와 동일하게 그냥 redisTemplate만을 이용해서 개발하면 자동으로 HA구성을 지원하는 개발이 된다.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- Uncomment and add your base-package here:-->
<context:component-scan base-package="my"/>
<!-- myster -->
<bean id="myMaster" class= "org.springframework.data.redis.connection.RedisNode" c:host="127.0.0.1" c:port="6379" p:name="mymaster"/>
<!-- Sentinels -->
<bean id="mySent1" class= "org.springframework.data.redis.connection.RedisNode" c:host="127.0.0.1" c:port="26379"/>
<bean id="mySent2" class= "org.springframework.data.redis.connection.RedisNode" c:host="127.0.0.1" c:port="26381"/>
<bean id="mySents" class= "java.util.HashSet">
<constructor-arg>
<list>
<ref bean="mySent1" />
<ref bean="mySent2" />
</list>
</constructor-arg>
</bean>
<!-- RedisSentinelConfiguration: org.springframework.data.redis.connection.RedisSentinelConfiguration"
2.2.2 이 부분이 유일하게 아직 SDR에서 미흡한 부분이다. 이 부분은 ReidsSentinelConfiguration class 가
getter와 setter 파라미터가 다른 오류가 발생하므로, 자체 class를 하나 만들어서 해결하였다.
-->
<bean id="redisSentinelConf" class="my.MySentinelConfiguration"
p:master-ref="myMaster"
p:mySentinels-ref="mySents"
/>
<!-- p:sentinels-ref="mySents" : ERROR 발생-->
<!--2.2.3 POOL & Connection-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:use-pool="true"
p:poolConfig-ref="jedisPoolConfig"
c:sentinelConfig-ref="redisSentinelConf"
/>
<!--p:host-name="127.0.0.1" p:port="6379" -->
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<!-- redis template definition -->
<bean id="redisTemplate"
class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnFactory"
p:keySerializer-ref="stringRedisSerializer"
p:hashKeySerializer-ref="stringRedisSerializer"
p:valueSerializer-ref="stringRedisSerializer"/>
</beans>
3. JAVA 코드 - 유일하게 추가한 MySentinelConfiguration코드이다. 추가만 해 놓으면 된다.
- 단지, SDR의 getter와 setter의 오류를 피하기 위한 클래스이다. 향후에는 SDR에서 개선이 될 것으로 기대된다.
public class MySentinelConfiguration extends RedisSentinelConfiguration {
MySentinelConfiguration(){
super();
}
public Set<RedisNode> getMySentinels(){
Set<RedisNode> sets=super.getSentinels();
return sets;
}
public void setMySentinels( Set<RedisNode> sentinels){
super.setSentinels(sentinels);
}
}