参考:http://www.linuxidc.com/Linux/2015-04/116798.htm
纠结了半天,最终还是放弃使用spring data redis。因为它好像是不支持读写分离的。我想要一主多从,写在master上,读在slave上(我还配置了sentinel,用作主备切换),但是就我从spring官网上看的例子以及网络上找到的资料来看,spring data redis目前(1.7.0.RELEASE)及以前的版本并不支持读写分离。
不管如何,我先把配置记下吧。如果我的理解有误,还请大家批评指出。
我配置的一主多从如下,一个master,两个slave,三个sentinel,下方的数字是它们的端口号,redis是windows版(版本:3.0.501),所有实例都运行在一台机器上。
1、maven
这里由于版本兼容问题,使用的是1.6.0.RELEASE版
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.0.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
2、配置文件
#2、redis配置相关
redis.master.host=127.0.0.1
redis.master.port=9379
redis.slave1.host=127.0.0.1
redis.slave1.port=9380
redis.slave2.host=127.0.0.1
redis.slave2.port=9381
redis.sentinel1.host=127.0.0.1
redis.sentinel1.port=29379
redis.sentinel2.host=127.0.0.1
redis.sentinel2.port=29380
redis.sentinel3.host=127.0.0.1
redis.sentinel3.port=29381
#redis连接池配置
#最大分配的对象数
redis.pool.maxActive=3000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#当池内没有返回对象时,最大等待时间
#redis.pool.maxWait=1000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
3、spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<property name="master">
<bean class="org.springframework.data.redis.connection.RedisNode">
<property name="name" value="mymaster"/>
<constructor-arg name="host" value="${redis.master.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.master.port}"></constructor-arg>
</bean>
</property>
<property name="sentinels">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="${redis.sentinel1.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.sentinel1.port}"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="${redis.sentinel2.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.sentinel2.port}"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="${redis.sentinel3.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.sentinel3.port}"></constructor-arg>
</bean>
</set>
</property>
</bean>
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxActive}" />
<property name="maxIdle" value="${redis.pool.maxIdle}" />
<!-- <property name="maxWait" value="${redis.pool.maxWait}" /> -->
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
<property name="testOnReturn" value="${redis.pool.testOnReturn}" />
</bean>
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="poolConfig" ref="jedisPoolConfig"></property>
<constructor-arg ref="redisSentinelConfiguration"/>
</bean>
<bean id="stringRedisTemplate"
class="org.springframework.data.redis.core.StringRedisTemplate"
p:connection-factory-ref="jedisConnectionFactory"/>
</beans>
查看JedisConnectionFactory源码发现pool是Pool<Jedis>,而不是Pool<ShardedJedis>。因此我猜目前spring data redis是做不了读写分离的,stringRedisTemplate读写操作都是在master上。
4、其它
sentinel.conf 的最小配置如下:
port 29380
sentinel monitor mymaster 127.0.0.1 9379 2
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
启动命令:
redis-server sentinel.conf --sentinel
redis命令及相关资料可以在这个文档查看:http://doc.redisfans.com/
另外,我把本文搭建的redis主从复制的三个文件夹上传到了:http://download.csdn.net/detail/zhutulang/9585010
说明:
1、windows下redis,版本是3.0.501。特意弄了三份,用于搭建一个master和2个slave的主从复制。
2、压缩包下共三个文件,一个master,端口号是9379,一个slave1,端口号是9380,一个slave2,端口号是9381。另外,每个文件夹下各有一个sentinel.conf,用于启动sentinel。启动命令是redis-server sentinel.conf --sentinel
3、redis.conf配置项可参考:http://blog.csdn.net/zhutulang/article/details/51969760
搭建主从复制可参考:http://www.linuxidc.com/Linux/2015-04/116798.htm