`

Redis Cluster集群主从方案(附Jedis Cluster教程)

阅读更多

Redis Cluster集群主从方案(附Jedis Cluster教程)

本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制).

附:
Redis Cluster集群主从方案:http://wosyingjun.iteye.com/blog/2289220
Redis Sentinel主从高可用方案:http://wosyingjun.iteye.com/blog/2289593

一、Redis集群介绍

  • Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
  • Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.
  • Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.
  • Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: 节点 A 包含 0 到 5500号哈希槽. 节点 B 包含5501 到 11000 号哈希槽. 节点 C 包含11001 到 16384号哈希槽.

二、Redis Cluster集群的优势:

  • 自动分割数据到不同的节点上。
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
  • 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  • 支持主从复制模型。(slave->master 选举,集群容错)

三、Redis Cluster集群的主从复制模型:

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,假如有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了。

四、Redis Cluster模型图

五、Redis的安装以及cluster配置

下载redis最新的安装包
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
解压
tar xzf redis-3.0.7.tar.gz 
安装支持包tcl
yum install tcl 编译原文件
make
创建集群相关文件(方便管理)
mkdir cluster 
cd cluster
mkdir 6379 6380 6381 6382 6383 6384 
cluster下面每个目录中都创建一个redis.conf文件. 注意修改文件中的端口号:

port 6379
cluster-enabled yes
cluster-config-file nodes_6379.conf
cluster-node-timeout 5000
appendonly yes

把redis-server的可执行文件复制到cluster下面的各个目录, 然后打开6个shell终端,进入各个目录,启动每个实例, 命令如下: 
./redis-server redis.conf

检查6个服务是否都启动了

搭建集群
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
此时报错,发现缺少相应的ruby环境,如下安装相应环境:
yum install ruby
yum install rubygems
gem install redis

安装好环境后再次搭建集群
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 

检测集群节点相关信息 
./redis-trib.rb check 127.0.0.1:6379 

 

可以发现系统将前3个服务做了主节点,后3个服务作为了从节点,并且是相对应的。

进入某个节点验证
./redis-cli -c -h 127.0.0.1 -p 6379

 

可以发现程序根据key对16384取模的值为3488,根据hash槽的分布跳转到了对应的节点上。 可见集群环境正常运行

六、Jedis Cluster教程

<?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.xsd">

	<!-- Jedis链接池配置,注意:Jedis版本建议升级到最新 -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxTotal" value="100" />
		<property name="maxIdle" value="20" />
		<property name="minIdle" value="10" />
		<property name="blockWhenExhausted" value="true"></property>
		<property name="maxWaitMillis" value="3000" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="testWhileIdle" value="true" />
		<property name="minEvictableIdleTimeMillis" value="60000" />
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<property name="numTestsPerEvictionRun" value="-1" />
	</bean>

	<!-- JedisCluster -->
	<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
		<constructor-arg index="0">
			<set>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.1.111" />
					<constructor-arg index="1" value="7111" type="int" />
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.1.112" />
					<constructor-arg index="1" value="7112" type="int" />
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.1.113" />
					<constructor-arg index="1" value="7113" type="int" />
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.1.114" />
					<constructor-arg index="1" value="7114" type="int" />
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.1.115" />
					<constructor-arg index="1" value="7115" type="int" />
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.1.116" />
					<constructor-arg index="1" value="7116" type="int" />
				</bean>
			</set>
		</constructor-arg>
		<constructor-arg index="1" value="2000" type="int"></constructor-arg>
		<constructor-arg index="2" value="100" type="int"></constructor-arg>
		<constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg>
	</bean>

</beans>

 

package wusc.edu.demo.redis;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redis.clients.jedis.JedisCluster;


public class RedisClusterSpringTest {
	private static final Log log = LogFactory.getLog(RedisClusterSpringTest.class);

	public static void main(String[] args) {
		try {
			ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
			context.start();
			
			JedisCluster jedisCluster = (JedisCluster) context.getBean("jedisCluster");
			int num = 1000;
			String key = "yingjun";
			String value = "";
			for (int i=1; i <= num; i++){
				// 存数据
				//jedisCluster.set(key+i, "yingjun"+i);
				//jedisCluster.setex(key+i, 60, "yingjun"+i);
				
				// 取数据
				value = jedisCluster.get(key+i); 
				log.info(key+i + "=" + value);
				
				// 删除数据
				//jedisCluster.del(key+i); 
				//value = jedisCluster.get(key+i); 
				//log.info(key+i + "=" + value);
			}

			context.stop();
		} catch (Exception e) {
			log.error("==>RedisSpringTest context start error:", e);
			System.exit(0);
		} finally {
			log.info("===>System.exit");
			System.exit(0);
		}
	}
}

 

 

2
3
分享到:
评论
3 楼 bo_hai 2017-08-05  
juvconan 写道
./redis-trib命令建立集群时,如果是通过127.0.0.1的方式建立的集群,那么在往Redis Cluster中写入数据时写入速度比较慢。可以通过配置真实的IP来规避此问题。

非常有道理。
2 楼 juvconan 2016-11-12  
./redis-trib命令建立集群时,如果是通过127.0.0.1的方式建立的集群,那么在往Redis Cluster中写入数据时写入速度比较慢。可以通过配置真实的IP来规避此问题。
1 楼 白云飞 2016-09-07  
按照文章构建,为何执行的时候特别特别慢,好几秒执行一条插入或者读取

相关推荐

    jfinal redis cluster plugin-JFinal redis cluster集群插件 带连接池和Jedis包

    描述中提到,JFinal原生只支持Redis的主从集群模式,但不包括Redis的Cluster集群模式。Cluster模式是Redis的一种分布式解决方案,可以将数据分散在多个节点上,提供高可用性和可扩展性。为了解决这个问题,有开发者...

    25_你能聊聊redis cluster集群模式的原理吗?.zip

    Redis Cluster是Redis官方提供的分布式集群解决方案,它允许用户在多台服务器上部署Redis实例,形成一个高可用、可扩展的数据存储集群。Redis Cluster通过数据分片(Sharding)和槽分区(Slot Partitioning)策略来...

    redisCluster集群demo

    在`redisCluster-demo`这个项目中,你可以期待找到一个使用Java实现的示例,展示如何配置和使用`JedisCluster`或者`Lettuce`来连接Redis Cluster,以及如何进行基本的数据操作。这个示例可以帮助初学者理解如何在...

    jfinal redis cluster plugin-JFinal redis cluster集群插件

    使用JFinal Redis Cluster插件时,首先需要将其引入到项目中,这里我们看到有一个名为 "jfinal-rediscluster-plugin-by-shixiaotian-0.0.1.jar" 的文件,这应该是该插件的可执行版本。通常,开发者会将这个JAR文件...

    redis cluster 集群配置.conf简约版.zip

    Redis Cluster是Redis官方提供的分布式集群解决方案,它支持数据的分片(sharding)以及自动故障转移,从而在大型系统中实现高性能、高可用性。在本文中,我们将深入探讨Redis Cluster的基本概念、配置要点以及如何...

    redis7.0.0集群相关安装包

    2. **复制与故障转移**:Redis 集群支持主从复制,每个节点可以有多个从节点。如果主节点失败,其从节点将自动晋升为主节点,确保服务不间断。这个过程称为故障转移(Failover)。 3. **槽迁移**:在节点添加或移除...

    rediscluster配置文件.zip

    这个压缩包文件"rediscluster配置文件.zip"包含了一系列配置文件,用于搭建一个三主三从的Redis Cluster架构。在这个架构中,每个主节点都有一个对应的从节点,确保在主节点失效时可以从其从节点接管服务,从而保持...

    Windows环境Redis-Cluster配置

    2. 副本(Replication):Redis-Cluster支持主从复制,每个节点都有一个或多个副本节点,用于提高数据的安全性和服务的可用性。当主节点故障时,其副本可以接管服务。 3. 路由(Routing):客户端与集群交互时,需要...

    最全redis线程池实现,Spring支持,redis Cluster线程池,主从Redis读写分离,sentenl读写分离等

    在本文中,我们将深入探讨如何在Java环境中,特别是在Spring框架下,实现全面的Redis线程池配置,包括Redis Cluster线程池、主从Redis的读写分离以及Sentinel的读写分离策略。 首先,我们要理解Redis线程池的重要性...

    大规模redis集群的服务治理之路.pdf

    Redis Cluster是一种去中心化的分布式集群解决方案,它支持string、hash、list、set、sorted set、hyperloglog、geo、pubsub等大部分单机Redis功能。Redis Cluster具有主从全量/增量同步、服务端分片、节点水平伸缩...

    tomcat8 Redis Cluster Session同步需要的jar

    2. **Sentinel配置**:Sentinel是Redis提供的高可用性解决方案,它可以监控Redis主从集群,当检测到主节点故障时,自动进行故障转移,保证服务的连续性。在Tomcat8与Redis集成时,Sentinel可以增加系统的健壮性。 3...

    rediscluster.rar

    Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,实现高可用性和水平扩展。Redis Cluster不依赖外部协调服务,而是通过在每个节点上存储部分数据并维护集群状态来实现数据分布。...

    redis-cluster集群配置.zip

    Redis Cluster是Redis官方提供的分布式解决方案,它通过分片(sharding)技术将数据分散存储在多个节点上,实现了数据的高可用性和可扩展性。在本压缩包中,你将找到关于配置Redis Cluster的详细步骤和相关文件。...

    redis集群以及Spring-data-redis操作集群

    在Spring应用中,可以使用`JedisCluster`类来操作Redis集群。 1. **依赖引入**:在项目中添加Spring-data-redis和Jedis的相关依赖。 2. **配置**:在Spring的配置文件中定义`JedisCluster`的bean,设置集群节点地址...

    Redis部署笔记(单机+主从+哨兵+集群)

    基于Centos7系统,由浅入深讲解如何部署Redis的四种模式,分别是:单机模式、主从模式、哨兵模式、集群模式。 完整原文:http://exp-blog.com/2018/09/14/pid-2285/ 同时提供Jedis客户端封装源码: ● 屏蔽Jedis与...

    Redis集群搭建教程(含搭建文档和所需软件).zip

    本教程将详细介绍如何搭建一个完整的Redis集群。 **一、Redis集群基础** 1. **数据分片**:Redis Cluster通过数据分片技术将数据分散到多个节点上,每个节点存储一部分数据。它采用CRC16算法计算键的槽位,然后将...

    shiro连接redis集群 根据org.crazycake.shiro包改造源码

    1. **RedisClient**:原有的Shiro Redis连接器可能使用了单一的Redis连接,现在可能被替换为一个支持集群的客户端,如JedisCluster或Lettuce,这两个库都支持与Redis集群交互。 2. **Session管理**:`...

    Redis-5.0.0集群配置

    - **Jedis (Java Cluster Client)**: Java应用程序可以通过Jedis客户端库来连接Redis集群。 - **r3c (C++ Cluster Client)**: 对于使用C++开发的应用程序,可以使用r3c作为客户端库。 #### 11. 新增节点 - **添加...

    Redis从入门到精通2024版 视频教程 下载 百度网盘链接4.zip

    Redis从入门到精通2024版 视频教程 下载 ├─第 01 章 开篇 │ 001.Redis 录制计划.mp4 │ 002.Redis 介绍.mp4 ...│ 18.RedisCluster[集群介绍].mp4 │ 19.RedisCluster[集群搭建].mp4 │ 20.RedisCluster

    redis集群,使用ruby脚本搭建集群

    本教程将深入探讨如何使用 Ruby 脚本搭建 Redis 集群。 首先,了解 Redis 集群的基本概念。Redis 集群是通过数据分片(Sharding)实现的,即将数据分散存储在多个节点上,每个节点负责一部分数据。这种方式能够确保...

Global site tag (gtag.js) - Google Analytics