基于jedis、redis-sentinel的redis主从、高可用、sharding架构

标签: jedis redis sentinel | 发表时间:2015-03-17 21:31 | 作者:penggle
出处:http://www.iteye.com
最近项目上需要对Redis(目前redis用的是2.8版本)做高可用、集群等优化,就扩展了jedis客户端(MasterSlaveJedis、MasterSlaveJedisPool、ShardedMasterSlaveJedis、ShardedMasterSlaveJedisPool),以满足以下几个需求:
1、主Redis与各个从Redis之间能够实现高可用(监控、自动故障迁移等),这个委托给redis-sentinel来实现。
2、业务代码中为分散redis服务的压力,全部写操作走主库,部分读操作需要走从服务器的业务需求。(就目前jedis 2.6.2版本中的JedisSentinelPool做不到这点)
3、对多个Master-Slaves组成的高可用单元做sharding集群

一、针对仅Master-Slaves架构组成的使用例子

sentinel_63791.conf

port 63791
daemonize yes
logfile "/var/log/redis/sentinel_63791.log"

#master-1
sentinel monitor master-1 192.168.137.101 6379 2
sentinel down-after-milliseconds master-1 15000
sentinel parallel-syncs master-1 1
sentinel failover-timeout master-1 90000

sentinel_63792.conf

port 63792
daemonize yes
logfile "/var/log/redis/sentinel_63792.log"

#master-1
sentinel monitor master-1 192.168.137.101 6379 2
sentinel down-after-milliseconds master-1 15000
sentinel parallel-syncs master-1 1
sentinel failover-timeout master-1 90000

Set<String> sentinels = new LinkedHashSet<String>();
sentinels.add("192.168.137.101:63791");
sentinels.add("192.168.137.101:63792");
Pool<MasterSlaveJedis> masterSlaveJedisPool = new MasterSlaveJedisSentinelPool("master-1", sentinels,jedisPoolConfig);

MasterSlaveJedis masterSlaveJedis = masterSlaveJedisPool.getResource();
//>>> masterSlaveJedis = MasterSlaveJedis {master=192.168.137.101:6379, slaves=[192.168.137.101:6380, 192.168.137.101:6381]}
System.out.println(">>> masterSlaveJedis = " + masterSlaveJedis);

masterSlaveJedis.set("nowTime", "2015-03-16 15:34:55"); // 底层实际调用主Redis上的相应方法master.set("nowTime", "2015-03-16 15:34:55");

LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(200));

String slaveHolder1 = "myslave1";
Jedis slave1 = masterSlaveJedis.opsForSlave(slaveHolder); //如果全部slave都挂掉的话,那么opsForSlave则返回master
System.out.println(">>> nowTime = " + slave1.get("nowTime")); //>>> nowTime = 2015-03-16 15:34:55

String slaveHolder2 = "myslave1";
Jedis slave2 = masterSlaveJedis.opsForSlave(slaveHolder);
System.out.println(">>> nowTime = " + slave2.get("nowTime")); //>>> nowTime = 2015-03-16 15:34:55

System.out.println(slave1.equals(slave2)); // 如果slaveHolder1 equals slaveHolder2那么slave1.equals(slave2)肯定是同一个对象

masterSlaveJedisPool.returnResource(masterSlaveJedis);


二、针对由各个Master-Slaves单元组成的sharding集群架构使用例子

假设有两个Master-Slaves单元:
master-1 : master=192.168.137.101:6379 slaves=[192.168.137.101:6380, 192.168.137.101:6381](相当于一个shard)
master-2 : master=192.168.137.101:6382 slaves=[192.168.137.101:6383, 192.168.137.101:6384](相当于一个shard)

sentinel_63791.conf

port 63791
daemonize yes
logfile "/var/log/redis/sentinel_63791.log"

#master-1
sentinel monitor master-1 192.168.137.101 6379 2
sentinel down-after-milliseconds master-1 15000
sentinel parallel-syncs master-1 1
sentinel failover-timeout master-1 90000
#master-2
sentinel monitor master-2 192.168.137.101 6382 2
sentinel down-after-milliseconds master-2 15000
sentinel parallel-syncs master-2 1
sentinel failover-timeout master-2 90000

sentinel_63792.conf

port 63792
daemonize yes
logfile "/var/log/redis/sentinel_63792.log"

#master-1
sentinel monitor master-1 192.168.137.101 6379 2
sentinel down-after-milliseconds master-1 15000
sentinel parallel-syncs master-1 1
sentinel failover-timeout master-1 90000
#master-2
sentinel monitor master-2 192.168.137.101 6382 2
sentinel down-after-milliseconds master-2 15000
sentinel parallel-syncs master-2 1
sentinel failover-timeout master-2 90000

Set<String> masterNames = new LinkedHashSet<String>();
masterNames.add("master-1");
masterNames.add("master-2");
Set<String> sentinels = new LinkedHashSet<String>();
sentinels.add("192.168.137.101:63791");
sentinels.add("192.168.137.101:63792");
Pool<ShardedMasterSlaveJedis> shardedMasterSlaveJedisPool = new ShardedMasterSlaveJedisSentinelPool(masterNames, sentinels,jedisPoolConfig);

ShardedMasterSlaveJedis shardedMasterSlaveJedis = shardedMasterSlaveJedisPool.getResource();
for(int i = 0; i < 10; i++){
    String key = "shard-" + i;
    shardedMasterSlaveJedis.set(key, String.valueOf(i));
    // shard-0, shard-2, shard-6, shard-8, shard-9各key分布在master-1[192.168.137.101:6379], shard-1, shard-3, shard-4, shard-5, shard-7各key分布在master-2[192.168.137.101:6382]
    System.out.println(key + " = " + shardedMasterSlaveJedis.get(key));

    LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(200));
    System.out.println(key + " = " + shardedMasterSlaveJedis.getShard(key).opsForSlave().get(key)); // 从一个Master-Slaves单元中的某一个从Redis实例获取key的值
}

shardedMasterSlaveJedisPool.returnResource(shardedMasterSlaveJedis);


项目地址:https://github.com/penggle/jedis-ms-sentinel 
该项目已经发布到maven中央库上: 
maven: 
      <groupId>com.github.penggle</groupId> 
      <artifactId>jedis-ms-sentinel</artifactId> 
      <version>1.0.0</version> 
      <name>jedis-ms-sentinel</name> 
gradle: 
      compile("com.github.penggle:jedis-ms-sentinel:1.0.0")

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jedis redis sentinel] 推荐:

基于jedis、redis-sentinel的redis主从、高可用、sharding架构

- - 开源软件 - ITeye博客
最近项目上需要对Redis(目前redis用的是2.8版本)做高可用、集群等优化,就扩展了jedis客户端(MasterSlaveJedis、MasterSlaveJedisPool、ShardedMasterSlaveJedis、ShardedMasterSlaveJedisPool),以满足以下几个需求:.

在Redis Sentinel环境下,jedis该如何配置 - iVictor - 博客园

- -
在Redis主从复制架构中,如果master出现了故障,则需要人工将slave提升为master,同时,通知应用侧更新master的地址. 这样方式比较低效,对应用侧影响较大. 为了解决这个问题,Redis 2.8中推出了自己的高可用方案Redis Sentinel. Redis Sentinel架构图如下:.

Redis-sentinel实现redis HA 过程

- - CSDN博客架构设计推荐文章
本文原创自 http://blog.csdn.net/voipmaker  转载注明出处. Redis-sentinel 介绍:. Redis-sentinel是官方介绍的监控redis的工具,实际是一个进程,通过tcp socket通信. (1)     监控 实时监测当前master和slave的状态.

Redis客户端之Spring整合Jedis

- - 开源软件 - ITeye博客
1.下载相关jar包,并引入工程:. 2.将以下XML配置引入spring. 3.将shardedJedisPool注入相关的类中即可使用. * 设置一个key的过期时间(单位:秒). * @param key key值. * @param seconds 多少秒后过期. * @return 1:设置了过期时间 0:没有设置过期时间/不能设置过期时间.

使用Jedis的ShardedJedis做Redis集群

- - 丕子
之前一直没仔细看过ShardedJedis的代码,最近遇到了shard后集群扩容后的 数据迁移问题. 今天在看ShardedJedis源码的时候,发现ShardedJedis并没有使用节点的Ip和port做hash,而是用的instance的顺序或者name,太赞了. 一开始你可以设置足够多的instance,数据扩容的时候,只需要将几个instance的数据copy到别的机器上.

Redis客户端Jedis使用示例

- - 移动开发 - ITeye博客
Jedis 是 Redis 官方首选的 Java 客户端开发包. 工作过程总结的一个示例,贴出来,如下:.      * 在不同的线程中使用相同的Jedis实例会发生奇怪的错误. 但是创建太多的实现也不好因为这意味着会建立很多sokcet连接, .      * 也会导致奇怪的错误发生. 单一Jedis实例不是线程安全的.

Redis Sentinel的配置和使用

- - 丕子
Redis主从系统,除了做数据冗余,开可以做高可用性灾备. Reids提供了Sentinel工具来监控各Master的状态,如果Master异常,则会做主从切换,将slave作为master,将master作为slave. 主从切换之后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变.

Redis核心解读–集群管理工具(Redis-sentinel)

- - NoSQLFan
Redis作为高性能的key-value存储,一直在单实例上表现良好,但是长期以来一直缺乏一种官方的 高可用方案支持. 于是 Redis-sentinel应运而生,提供了对客户端透明的高可用支持. 下面文章对Redis- sentinel的原理进行了系统的讲解. 文章来源: www.wzxue.com.

基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

- - 开源软件 - ITeye博客
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定),Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求;.

动手实践Redis主从复制、Sentinel主从切换、Cluster分片

- - 掘金 后端
Redis 提供的如下技术「Redis Sentinel『主从切换』、Redis Cluster『分片』」,有效实现了 Redis 的高可用、高性能、高可伸缩性,本文对以上技术进行亲自动手实践. Redis Sentinel「主从切换」. 监控主从节点的在线状态,并根据配置自行完成切换「基于raft协议」.