Redis Sentinel的Redis集群(主从&Sharding)高可用方案
在不使用redis3.0之后版本的情况下,对于redis服务端一般是采用Sentinel哨兵模式,也就是一主多备的方式。
这里,先抛出三个问题,
问题1:单节点宕机数据丢失?
问题2:多节点(节点间没有主从关系)数据分片,采用sharedJedisPool,某节点宕机,导致获取不到连接
问题3:主从模式下,通过哨兵配置,单个集群数据无法分片(备复制->主的数据,备无写权限)
关于问题1,解决方式,多台redis节点,采用Sentinel哨兵模式,也就是一主多备的方式。
关于问题2,这里先不谈解决方式,在节点间无依赖的情况下,采用redis分片存储数据,也就是采用redis的sharedjedispool连接池,他有一个缺点,那就是当我的某个
节点宕机后,会导致整个连接出问题。
关于问题3,在一个集群环境下,从复制主的数据,这个时候一个集群下的redis实例之间的数据是同步,也就没有办法去做数据分片
在不适用redis3.0后的新特征load balance,也就是 ....
Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定
关于上面三个问题,在使用redis2.X版本的情况下,解决方式就是:
多个集群,然后就是集群之间数据分片,这样压力小很多。
举个例子:


看到上面的图应该就懂了。
在这里还有一个比较坑爹的问题就是,spring封装的那套spring-data-redis ,相对于jedis真的是不太好用,而且关于哨兵的配置文件,就是下面这段,
<bean id="sentinelConfiguration"
class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<property name="master">
<bean class="org.springframework.data.redis.connection.RedisNode">
<property name="name" value="mymaster"></property>
</bean>
</property>
<property name="sentinels">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host"
value="192.168.8.50"></constructor-arg>
<constructor-arg name="port"
value="26379"></constructor-arg>
</bean>
</set>
</property>
</bean>
我在spring3.x版本下,死活报错,注入不了sentinels,然而打开源码去看,确实是有的,换成spring4.X后,就没有出现问题。
叹气!!!
决定弃用spring-data-redis,还是采用jedis。
但是jedis也有一个问题,在jedis2.5之后增加了redis.clients.jedis.JedisSentinelPool这个哨兵管理连接池,他也有一个问题,就是他取得的redis操作实例是jedis,而不是sharedJedis,因为sharedJedis,是从sharedJedisPool里面取出的,这样是不是又有一个问题,嗯,支持集群了,但不支持分片了!!

显然不是我们想要的,怎么办呢,Google了下,在github上找到有人去写了一个连接池,地址在这
https://github.com/warmbreeze/sharded-jedis-sentinel-pool,
代码拿下来后,看了下,应该是可以的,加上测试下。
<?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-3.0.xsd">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="" />
<property name="maxTotal" value="" />
<property name="maxWaitMillis" value="" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
</bean>
<!-- jedis连接池配置 -->
<!-- <bean id="jedisPool" class="redis.clients.jedis.JedisSentinelPool">
<constructor-arg index="" value="mymaster" />
<constructor-arg index="">
<set>
<value>192.168.8.50:</value>
</set>
</constructor-arg>
<constructor-arg index="" ref="jedisPoolConfig" />
</bean> -->
<!-- 自定义分片处理哨兵池配置 -->
<bean id="shardedJedisPool" class="com.yto.demo.java.jedis.spring.sentinel.pool.ShardedJedisSentinelPool">
<constructor-arg index="" ref="jedisPoolConfig" />
<constructor-arg index="">
<list>
<value>mymaster</value> <!-- 集群1 -->
<value>mymaster02</value> <!-- 集群2 --> </list>
</constructor-arg>
<constructor-arg index="">
<set>
<value>192.168.8.50:</value>
<value>192.168.8.50:</value>
</set>
</constructor-arg>
</bean>
<!-- 自定义抽象jedis 信息 -->
<bean id="redisDataSource" class="com.yto.demo.java.jedis.spring.api.impl.RedisSharedSentinelDataSourceImpl">
<property name="shardedJedisPool" ref="shardedJedisPool"></property>
</bean> <bean id="redisClientTemplate" class="com.yto.demo.java.jedis.spring.client.RedisSharedSentinelClientTemplate">
<property name="redisDataSource" ref="redisDataSource"></property>
</bean> </beans>
ShardedJedisSentinelPool这个代码自己去git上面拿下来吧!!至于里面有没有bug我还没仔细去看里面的代码,但是确实支持主从+分片了。。
Redis Sentinel的Redis集群(主从&Sharding)高可用方案的更多相关文章
- (转)基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
转载自:http://warm-breeze.iteye.com/blog/2020413 本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedi ...
- 基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...
- 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...
- LVS集群和Keepalived高可用实战
第四十章LVS集群和Keepalived高可用实战 一.ARP协议 1.概念 地址解析协议,即ARP(AddressResolutionProtocol),是根据IP地址获取物理MAC地址的一个TCP ...
- EMQ集群搭建实现高可用和负载均衡(百万级设备连接)
一.EMQ集群搭建实现高可用和负载均衡 架构服务器规划 服务器IP 部署业务 作用 192.168.81.13 EMQTTD EMQ集群 192.168.81.22 EMQTTD EMQ集群 192. ...
- Redis操作及集群搭建以及高可用配置
NoSQL - Redis 缓存技术 Redis功能介绍 数据类型丰富 支持持久化 多种内存分配及回收策略 支持弱事务 支持高可用 支持分布式分片集群 企业缓存产品介绍 Memcached: 优点:高 ...
- Kubernetes容器集群 - harbor仓库高可用集群部署说明
之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...
- 分布式架构高可用架构篇_03-redis3集群的安装高可用测试
参考文档 Redis 官方集群指南:http://redis.io/topics/cluster-tutorial Redis 官方集群规范:http://redis.io/topics/cluste ...
- Redis5以上版本伪集群搭建(高可用集群模式)
redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台机器(可以多台机器部署,修改一下ip地 ...
随机推荐
- Oracle backgroup processes
PMON: Process Monitor 用自己主动注冊动态监听,处理异常进程. SMON: System Monitor 用于instance recovery. LCKn:仅使用于RAC数据库, ...
- Clojure 学习入门(19)—— 数组
1.创建数组 1.1 从集合创建数组 into-array into-array (into-array aseq) (into-array type aseq) 演示样例: user=> (i ...
- Android创建启动画面[转]
每个Android应用启动之后都会出现一个Splash启动界面,显示产品的LOGO.公司的LOGO或者开发者信息.如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥 ...
- mac itunes ios 7 升级 出现 this device isn't eligible for the requested build
今天在对我的iPod 进行iOS7 升级的时候(在mac iTunes 上进行的),一直弹出框提示 解决办法就是 1. 打开HOSTS (Mac 下路径为:/etc/hosts, 至于怎么打开host ...
- ContextMenuStrip 添加在窗体。点击右键不能显示问题解答
ContextMenuStrip控件,系统默认为点击菜单,使用时.需要与你的窗体绑定.如图所示,,form窗体上包括一个contextMenustrip信息.默认状态是无.所以在使用contextMe ...
- 自定义ASP.NET WebApplication中调用SharePoint2010的对象
如果你是做SharePoint开发的话,一定不会对如下这段代码陌生: using(SPSite oSiteCollection = new SPSite("http://Server_Nam ...
- UCML快速开发平台学习1-UCML环境安装
最近公司项目时间紧张,经过各位大神的PK,决定用多年前话10W采购过来,一直被雪藏的UCML来开发.为啥花了钱买回来不用我就不吐槽了. UCML安装 翻看安装手册,貌似不 ...
- Excel中公式的绝对引用和相对引用单元格
在Excel的表格中,非常常用的就是公式里的绝对引用和相对引用了,具体情况请看下列表格吧. 步骤1 打开做好的excel表格.公式中的相对单元格引用是基于包含公式和单元格引用的单元格的相对位置,若公式 ...
- [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数
今天面试遇到一道有关C++转换构造函数的题目,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,学习之路很长啊! 其实我们已 ...
- [C#参考]Struct结构体
结构体是一种简单的用户自定义类型,也是类的一种轻量级的替代品. 相似之处:他们都有构造函数.属性.方法.字段.操作符.嵌套类型和索引器. 差异之处:类是一种引用类型,而结构体是一种值类型.因此结构体一 ...