`
penggle
  • 浏览: 57855 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多
最近项目上需要对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")
  • 大小: 373 KB
  • 大小: 423.6 KB
分享到:
评论

相关推荐

    java使用 redis-sentinel

    NULL 博文链接:https://yuhuiblog695685688425687986842568269.iteye.com/blog/2391347

    tomcat-redis-session-manager-master-2.0.0

    tomcat-redis-session-manager-2.0.0.jar jedis-2.5.2.jar commons-pool2-2.2.jar 2.修改 conf 目录下的 context.xml 文件 host="localhost" port="6379" database="0" maxInactiveInterval="60" /&gt; ...

    nginx1.8-tomcat7-redis3.2-session配置和jar包

    commons-pool-1.6.jar jedis-2.1.0.jar tomcat-redis-session-manager-1.2-tomcat-7.jar 和tomcat的context.xml配置文件。 2.7.2版包含 commons-pool2-2.4.1.jar jedis-2.7.2.jar tomcat-redis-session.jar 和...

    tomcat-redis-session-manager for tomcat8.5

    压缩文件包括tomcat-redis-session-manager-master-2.0.0.jar、jedis-2.7.3.jar、commons-pool2-2.3.jar三个jar包使用方法请参照https://github.com/jcoleman/tomcat-redis-session-manager。apache-tomcat-8.5.33....

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar commons-pool-1.6.jar jedis-2.0.0.jar

    tomcat-redis-session-manager-2.0.0.jar

    tomcat-redis-session-manager-2.0.0.jar,可用于Tomcat8下Redis的Session共享,亲测可用,还需要下载另外两个jar包:commons-pool2-2.4.2.jar和jedis-2.9.0.jar,maven仓库有,此处不再上传

    Redis-Sentinel-Client

    Redis-Sentinel-客户端Sentinel-cluster 下的 Redis 客户端。 从 sentinel-cluster 获取 Redis-master。 基于 Jedis 创建。

    tomcat8.5.20-redis-session共享-JAR包大全

    这个包里含有commons-pool2-2.4.2、jedis-2.9.0、tomcat85-session-redis-1.0三个主要JAR包。apache-tomcat-8.5.20.tar.gz源码包和context.xml文件,这套配置是我自己亲测可用的。。另外我用的redis4这个版本。注意...

    tomcat-redis-session-manager-1.2-tomcat-6&7

    包括commons-pool-1.6.jar,jedis-2.0.0.jar,tomcat-redis-session-manager-1.2-tomcat-6&7.jar

    Redis从入门到精通视频.rar

    01-redis-redis简介.avi,网盘文件,永久连接 02-redis-数据库应用发展历程.avi 03-redis-redis是一种Nosql数据库.avi 04-redis-redis数据库特点简介....54-redis-Jedis的使用.mp4 55-redis-redis的客户端连接工具.avi

    Redis-x64-3.2.100

    REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-...Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    springdataredis-demo

    SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis - 提供了对不同Redis客户端的整合(Lettuce...

    Redis-x64-3.2.100 Jedis-2.9.0 pool2-2.42例子及jar.rar

    Redis-x64-3.2.100 Jedis-2.9.0 pool2-2.42例子及jar.rar

    redis-4.0.2 Linux版本及手写安装文档及jedis jar

    redis-4.0.2 Linux版本及在Linux上安装文档与开发是连接redis需要的jar包

    tomcat-redis-session-manager-by-eguid.zip

    实现tomcat 8及以后版本的tomcat集群的session持久化操作,基于redis实现tomcat容器的session的持久化 tomcat-redis-session-manager-by-eguid.jar+jedis-2.9.0.jar+commons-pool2-2.2.jar集合包

    tomcat-redis-session

    使用tomcat-redis-session-manager开源框架实现使用Redis存储Nginx+Tomcat负载均衡集群的Session所需要的3个jar:tomcat-redis-session-1.0-SNAPSHOT.jar、jedis-2.7.2.jar、commons-pool2-2.0.jar

    tomcat-redis-session.tar.gz

    Tomcat7,jdk1.7基于redis的session共享 包括一下内容: tomcat-redis-session-manager-VERSION.jar jedis-2.5.2.jar commons-pool2-2.2.jar 使用地址:https://mp.csdn.net/postedit/98846884

    spring-data-redis-1.7.2.RELEASE.jar

    jedis、spring-redis-datade的整合使用,如果版本不匹配可能存在不兼容的问题,从而产生异常。 这里给出无异常的版本匹配: 1、spring-data-redis-1.7.2.RELEASE.jar 2、pring-data-commons-1.8.2.RELEASE.jar2 ...

    Spring-4.1.7、jedis-2.8.0、spring-data-redis-1.6.2

    我在虚拟机上装的是redis-3.0.6,基本Spring-4.1.7、jedis-2.8.0、spring-data-redis-1.6.2开发的并测试通过,我是封装的静态类,大家如果不想用静态类可以直接把所有的static全部替换掉就可以了,异常处理也是,...

Global site tag (gtag.js) - Google Analytics