最近项目上需要对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
分享到:
相关推荐
在本教程中,我们将详细探讨如何在CentOS7环境下搭建Redis集群,涵盖单机安装、主从复制、哨兵(Sentinel)集群以及分片(Sharding)集群。 一、单机安装Redis 首先,你需要在每台服务器上安装Redis。在CentOS7中,可以...
Redis集群(Redis Cluster)是Redis官方提供的分布式解决方案,通过数据分片(Sharding)实现水平扩展,并支持主从复制和故障转移,以保证服务的高可用性。在Redis 6中,引入了更多改进,如客户端重定向、更好的错误...
Redis Cluster是Redis官方提供的原生集群解决方案,它通过数据分片(Sharding)来实现数据的分布式存储,并且具备故障转移功能,确保服务的高可用性。 在Windows环境下配置Redis集群,首先需要安装以下几个关键组件...
Redis 集群配置是将多个 Redis 实例组合在一起,以提供高可用性、扩展性和数据冗余。Redis 集群模式通过分片(sharding)技术将数据分散存储在多个节点上,每个节点负责一部分键空间。下面将详细介绍 Redis 集群的...
Redis Sentinel是Redis的高可用解决方案,它可以监控Redis实例,自动检测主节点的故障并执行故障转移。当主节点失效时,Sentinel会选择一个新的从节点升级为主节点,并通知其他从节点进行切换,确保服务不中断。 三...
总结,分布式Redis储存方式在Java应用中扮演着关键角色,通过主从复制、Sentinel、Cluster、数据分片等策略,实现了数据的高可用性和可扩展性。开发者需要理解这些技术的原理,选择合适的方法,并进行相应的优化,以...
Redis集群不再依赖哨兵,而是通过分片(Sharding)技术实现了数据的分布式存储,同时提供了复制和高可用性。在集群中,数据被分散到多个主节点,每个主节点都有对应的从节点,这样既实现了负载均衡,又增强了容错...
在Redis集群中,为了保证数据的安全性和高可用性,通常采用主从复制(Master-Slave)的策略,即每个主节点(Master)都有一个或多个从节点(Slave)。由于奇偶校验的原因,集群要求至少有奇数个节点,以避免在某些...
Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,实现高可用性和水平扩展。Redis Cluster不依赖外部协调服务,而是通过在各个节点之间共享部分信息来管理集群状态,确保数据的...
2. **Sentinel配置**:Sentinel是Redis提供的高可用性解决方案,它可以监控Redis主从集群,当检测到主节点故障时,自动进行故障转移,保证服务的连续性。在Tomcat8与Redis集成时,Sentinel可以增加系统的健壮性。 3...
哨兵系统(Sentinel)是Redis的一个高可用性解决方案,用于监控、故障检测和自动故障转移。通过哨兵,多个Redis实例可以形成一个集群,当主节点出现故障时,哨兵会自动将从节点提升为主节点,确保服务的连续性。在...
Redis是一种高性能的键值数据存储系统,常用于缓存、消息队列等场景。Spring是Java领域广泛使用的应用框架,其强大的依赖注入和AOP特性使得集成第三方库如Redis变得非常方便。 首先,集成Redis到Spring项目中,我们...
在面试中,你需要了解Redis的主要功能,比如缓存机制、持久化策略(RDB和AOF)、主从复制、Sentinel哨兵系统和Cluster集群等。同时,理解Redis的适用场景也很关键,例如作为会话存储、计数器、发布/订阅系统等。 ...
这可能涉及主从复制、哨兵系统(Sentinel)或Cluster集群,以确保服务高可用性。 7. **监控与报警**:为了保证系统的健康运行,分片池的监控和报警也是必不可少的。可以监控各项指标如CPU、内存使用率、网络延迟、...
综上所述,解决Redis高并发问题需要从客户端优化、网络调整、Redis自身特性利用以及架构设计等多个方面综合考虑。正确理解和应用这些策略,可以有效地提高Redis在高并发环境下的表现,保证服务的稳定性和响应速度。...
2. **哨兵(Sentinel)**: 哨兵系统是Redis的高可用性解决方案,它可以监控主从节点的状态,当主节点故障时自动将从节点提升为主节点,保证服务的连续性。 **Java操作Redis** 1. **Jedis库**: Java开发中,通常使用...