`
chembo
  • 浏览: 938665 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

无单点redis 故障自动转移redis

阅读更多
github 传送门:https://github.com/chembohuang/no-single-point-of-failure-jedis

一、开发初衷:memcached 无单点方案过于陈旧,配置过于复杂。其中针对memcached的方案一是日本人开发的repcached,但这个项目差不多三年前就没有更新过了。支持的memcached版本也比较低。方案二是使用memcached的代理magent,这个就更离谱了,差不多4年没人理过了,而且安装配置麻烦,在出现故障重启时,旧数据还会丢失。
因此决定针对此缓存自写一个中间件,而新兴的redis在性能上又完爆memcached,没有不用的道理。最终的方案便于基于jedis(redis 的java 封装),使用apache的common-pools2和jdk的序列化反序列化通过程序的控制做到缓存的实时备份,故障自动切换,心跳监测功能。

二、使用方法(基于spring容器):
1.将代码打成jar包,引入所需工程,另外加依赖:
	<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.4.1</version>
		</dependency>
		<dependency>
		  <groupId>org.ow2.asm</groupId>
		  <artifactId>asm-util</artifactId>
		  <version>4.0</version>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
			<version>3.0</version>
		</dependency>
		

2.xml配置:
<!-- jedis configuration starts-->
<bean id="config" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
         <property name="maxTotal" value="200"></property>  
        <property name="maxIdle" value="50"></property> 
        <property name="minIdle" value="10"></property> 
        <property name="maxWaitMillis" value="15000"></property>  
        <property name="lifo" value="true"></property>
        <property name="blockWhenExhausted" value="true"></property>
        <property name="testOnBorrow" value="false"></property>
        <property name="testOnReturn" value="false"></property>
        <property name="testWhileIdle" value="false"></property>
        <property name="timeBetweenEvictionRunsMillis" value="30000"></property>
    </bean>

    <bean id="jedisCluster" class="com.csair.wx.cache.redis.FailoverJedisCluster" init-method="init">
        <property name="redisServers"  value="10.92.2.61:6379,10.92.2.60:6379" />
    </bean>

    <bean id="jedisPool" class="com.csair.wx.cache.redis.FailoverJedisPool">
        <constructor-arg type="org.apache.commons.pool2.impl.GenericObjectPoolConfig" ref="config" />
        <constructor-arg type="com.csair.wx.cache.redis.FailoverJedisCluster" ref="jedisCluster" />
        <constructor-arg type="org.apache.commons.pool2.impl.AbandonedConfig" ref="abandonConfig" />
    </bean>

    <bean id="abandonConfig" class="org.apache.commons.pool2.impl.AbandonedConfig">
        <property name="removeAbandonedTimeout" value="10"></property>
        <property name="removeAbandonedOnBorrow" value="true"></property>
        <property name="removeAbandonedOnMaintenance" value="true"></property>
    </bean>

    <bean class="com.csair.wx.cache.redis.util.SpringContextutil" />
<!-- jedis configuration ends-->

3.使用前注入该实例:
@Autowired
    private FailoverJedisPool jedisPool;


4.set对象进去redis:
jedisPool.getJedis().saveOrUpdate("myKey", someSerializeObject);

上面默认是半个小时失效,或者调用以下方法添加超时时间:
jedisPool.getJedis().saveOrUpdate("myKey", someSerializeObject,60*30);


5.从redis取对象:
SomeSerializeObject g = jedisPool.getJedis().getValue("myKey", SomeSerializeObject.class);


三、需要注意的是:
1.不要缓存jedisFacade这个实例,使用时先从jedisPool 取出来:
jedisPool.getJedis()
,因为这是池里的对象,用完后是要还回去的,实例通过cglib代理,用完后自动还了。

2.基于最新的jedis 2.4.1。

3.序列化与反序列化这块使用的是jdk默认的方式,如果想换成其它方式例如:fastjson\kryo\thrift等等,改jedisFacadeImpl.java里面两个方法即可。

4.程序控制redis的主从关系,所以你安装时全部以独立形式安装,也不要配主从。


分享到:
评论
2 楼 yupengda 2014-11-20  
如果有密码时候,同步的时候会报:
(Non critical) Master does not understand REPLCONF
listening-port: -NOAUTH Authentication required.

我的解决方法是将FailoverJedisCluster类中的HealthChecker方法需要改下,添加下密码:

if(elected!=null && !m.equals(elected)){
     edis.slaveof(elected.getHost(), elected.getPort());
     if(null != elected.getPassword() && !"".equals(elected.getPassword())){
           jedis.configSet("masterauth", elected.getPassword());
     }
}

感谢作者分享!
1 楼 lixuanbin 2014-04-23  
  

相关推荐

    shiro+spring+data+session+redis实现单点登录

    - 故障恢复:考虑Redis故障时的备份策略,避免单点故障影响SSO服务。 通过上述组件的组合,开发者可以构建一个高效、安全的SSO解决方案,提高用户体验,同时降低系统间的管理复杂度。学习和理解这些技术的集成与...

    redis无外网安装

    请注意,为了保障系统的安全,你应该进一步配置防火墙规则,限制对Redis服务的访问,并考虑使用`redis Sentinel`或`Redis Cluster`进行高可用性部署,以应对单点故障。此外,定期更新Redis到最新版本也是必要的,...

    结合keepalived实现redis群集高可用故障自动切换

    在实际应用中,单一的Redis实例可能存在单点故障的风险,一旦该实例出现问题,整个服务可能会中断。为了提高服务的稳定性,通常会构建Redis集群,通过复制和分片机制分散数据和读写请求。然而,即使有了集群,仍然...

    FastDFS安装文档以及测试类,redis单点故障解决方案之keepalived

    总结来说,本压缩包包含了FastDFS的安装文档和测试代码,以及Redis单点故障的Keepalived解决方案,这些都是构建高效、可靠的分布式存储系统的关键组件。了解并熟练掌握这些技术,对于提升大型互联网应用的性能和稳定...

    redis单机安装手册

    - **Redis Sentinel**:实现高可用性,通过监控主节点的状态并在必要时进行故障转移。 - **自动分区(Auto-partitioning)**:通过集群模式自动分割数据到多个节点上,提高性能。 #### 三、Redis-3.0.7单机安装步骤...

    redis7.2.3-windows

    Redis Sentinel提供监控、故障检测和自动故障转移,是高可用性解决方案的关键部分。而Redis Cluster则实现了数据分片,支持大规模数据存储。尽管Windows环境下部署可能相对复杂,但依然可行。 9. **性能优化** ...

    redis+Keepalived实现Redis高可用性

    然而,单点故障是Redis面临的主要问题,为了克服这一点,我们通常会采用主从复制(Master-Slave)模式,并配合Keepalived进行故障转移。 Keepalived是一个网络服务,主要用于实现IP负载均衡和高可用性。它支持VRRP...

    redis6.0 window版本

    - `redis-sentinel.exe`:Redis Sentinel是Redis的高可用性解决方案,监控、故障检测和自动故障转移。 - `redis-check-rdb.exe`:用于检查RDB持久化文件的工具,确保数据的完整性和一致性。 - `redis-server.exe`:...

    redis 详细实践笔记

    - 只能单点故障转移:一个主节点对应多个从节点,但只能有一个备选晋升为主。 2. 哨兵部署 哨兵系统是 Redis 的高可用解决方案,监控主从节点状态并自动执行故障转移。 2.1 哨兵的作用 - 监控:检测主从节点的...

    redis_win_x64_x32 redis服务端 绿色免安装版本

    6. ** sentinel 系统**:Redis Sentinel是Redis的高可用性解决方案,它可以监控主从复制的集群,当检测到主服务器故障时,自动进行故障转移,确保服务的连续性。 关于这个“redis_win_x64_x32”版本的使用方法: 1...

    redis7.0.0集群相关安装包

    6. **Sentinel系统**:虽然不是直接包含在安装包中,但Redis Sentinel是一个独立的服务,用于监控、警告和自动故障转移。在大型集群中,Sentinel系统可以提供更高级别的高可用性保障。 7. **持久化**:Redis提供了...

    redis集群:redis-sentinel(哨兵机制)集群

    总结来说,Redis Sentinel集群是Redis高可用性的重要组成部分,通过监控、通知和故障转移机制,它能够有效地防止单点故障,保证服务的稳定性和可靠性。在Linux环境中,搭建和配置Sentinel集群需要对Redis和Linux有...

    Redis高级.docx

    通过哨兵系统,Redis 可以提供高可用性保障,避免因单点故障导致的服务中断。在实际生产环境中,使用哨兵监控和管理 Redis 集群是必要的实践,它可以自动化处理许多故障情况,减轻运维人员的压力。同时,理解哨兵的...

    Redis面试常考知识点

    7. **高可用性**:通过主从复制和Sentinel实现故障自动转移。 ##### 缺点: 1. **内存占用较高**:所有数据都在内存中,可能造成较高的内存消耗。 2. **单线程限制**:虽然简化了并发控制,但在某些高并发场景下...

    SpringBoot集成Redis集群

    同时,Redis集群也可以提供高可用性的服务,避免单点故障的出现。 集成Redis集群的步骤 ### 第一步:架包 在SpringBoot 2.X中,需要添加相关的依赖项,以便集成Redis集群。这些依赖项包括spring-boot-starter-...

    redis(哨兵模式配置)

    7. **安全性和网络隔离**:为了提高系统的安全性,通常建议将Sentinel节点部署在不同的物理或虚拟主机上,避免因单点故障影响整个集群。 8. **配置文件详解**:`sentinel.conf`配置文件中还有许多其他选项,如故障...

    redis高可用笔记,包括RedisCluster集群方式和完全纯手写Redis缓存框架

    3. **无中心架构**:每个节点都是平等的,减少了单点故障的风险。 4. **部分数据丢失**:由于数据分片,如果节点故障,可能丢失部分数据,但不影响其他槽的数据访问。 5. **客户端适配**:客户端需要支持与Redis ...

    redis-gem.zip

    3. **无中心架构**:Redis Cluster没有中心节点,所有节点之间互相通信,减少了单点故障的风险。 为了使用`redis-gem.zip`,你需要先确保已经安装了Ruby运行环境,包括Ruby解释器和Gem包管理器。在命令行中,你可以...

    keepalived 配置redis高可用

    在主节点故障时,虚拟IP应自动转移到备用节点。 **四、优化与注意事项** 1. **数据持久化**:即使有高可用方案,数据持久化仍然是必要的,以防硬件故障或灾难性事件。 2. **网络隔离**:避免主从节点位于同一网络...

Global site tag (gtag.js) - Google Analytics