# redis集群搭建
持久化保证了即使redis服务重启不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障。接下来开始redis集群的搭建。
1、ruby环境
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
1.1安装ruby
yum -y install ruby
yum -y install rubygems
1.2安装ruby和redis的接口程序
下载redis-3.0.0.gem 拷贝至/usr/local下
执行: gem install /usr/local/redis-3.0.0.gem
2、创建集群
2.1 集群结点规划
这里在同一台服务器用不同的端口表示不同的redis服务器,如下:
主节点:192.168.101.3:7001 192.168.101.3:7002 192.168.101.3:7003
从节点:192.168.101.3:7004 192.168.101.3:7005 192.168.101.3:7006
在/usr/local下创建redis-cluster目录,其下创建7001、7002。。7006目录,如下:
将redis安装目录bin下的文件拷贝到每个700X目录内,同时将redis源码目录src下的redis-trib.rb拷贝到redis-cluster目录下。
修改每个700X目录下的redis.conf配置文件:
port XXXX
bind 192.168.101.3
cluster-enabled yes
2.2 启动每个结点redis服务
./redis-server ./redis.conf
查看服务ps aux|grep redis
2.3执行创建集群命令
执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。
./redis-trib.rb create –replicas 1 192.168.101.3:7001 192.168.101.3:7002 192.168.101.3:7003 192.168.101.3:7004 192.168.101.3:7005 192.168.101.3:7006
说明:
redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点
replicas指定为1表示每个主节点有一个从节点
创建集群输出如下:
3 查询集群信息
[root@localhost 7001]# ./redis-cli -c -h 192.168.145.130 -p 7001
其中-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号
cluster nodes 查询集群结点信息
cluster info 查询集群状态信息
4.测试集群
4.1 普通测试
// 连接集群
@Test
public void testJedisCluster(){
// 集群节点
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.145.130", 7001));
jedisClusterNode.add(new HostAndPort("192.168.145.130", 7002));
jedisClusterNode.add(new HostAndPort("192.168.145.130", 7003));
jedisClusterNode.add(new HostAndPort("192.168.145.130", 7004));
jedisClusterNode.add(new HostAndPort("192.168.145.130", 7005));
jedisClusterNode.add(new HostAndPort("192.168.145.130", 7006));
// jediscluster
JedisCluster jedisCluster = new JedisCluster(jedisClusterNode);
jedisCluster.set("name", "xiaoming");
System.out.println(jedisCluster.get("name"));
}
4.2 spring整合
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
配置文件applicationContext.xml
<!-- jedisPool配置信息 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 控制一个pool最多有多少个状态为idle(空闲)的jedis实例 -->
<property name="maxIdle" value="${redis.maxIdle}" />
<!-- 控制一个pool可分配多少个jedis实例 -->
<property name="maxTotal" value="${redis.maxTotal}" />
<!-- 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException -->
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<!-- 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的 -->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg type="String" value="${redis.host}"/>
<constructor-arg type="int" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg type="String" value="${redis.host}"/>
<constructor-arg type="int" value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg type="String" value="${redis.host}"/>
<constructor-arg type="int" value="7003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg type="String" value="${redis.host}"/>
<constructor-arg type="int" value="7004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg type="String" value="${redis.host}"/>
<constructor-arg type="int" value="7005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg type="String" value="${redis.host}"/>
<constructor-arg type="int" value="7006"/>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"/>
</bean>
测试类
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
}
// redis 集群
@Test
public void testSpringJedisCluster() {
JedisCluster jedisCluster = (JedisCluster) applicationContext.getBean("jedisCluster");
jedisCluster.set("name", "xiaoming");
System.out.println(jedisCluster.get("name"));
}