redis-cluster研究和使用

  • redis

rediscluster分布式存储

最近研搭建redis-cluster,正好搭建了一个环境,遇到了很多坑,系统的总结下,

一:关于redis cluster

1:redis cluster的现状

reids-cluster计划在redis3.0中推出,

目前的最新版本见: http://www.redis.cn/

目前redis支持的cluster特性(已测试):

1):节点自动发现

2):slave->master 选举,集群容错

3):Hot resharding:在线分片

4):集群管理:cluster xxx

5):基于配置(nodes-port.conf)的集群管理

6):ASK 转向/MOVED 转向机制.

2:redis cluster 架构

1)redis-cluster架构图

redistemplate 查询 key redis cluster查询key_数据

                         

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key

2) redis-cluster选举:容错

 

redistemplate 查询 key redis cluster查询key_数据_02

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.

(2):什么时候整个集群不可用(cluster_state:fail)? 

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.2.1.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

  ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

 

 

内存中对象是否可以设置失效时间

 

一般String使用setex()命令进行插入有时效的value;

 

频繁添加、修改、删除对象对Redis性能是否有影响()

 

作为NOSQL的代表,redis性能还是很不错的,

读写同时处理10000次/秒不在话下,测试20万条写仅用了0.8秒;

 

 



针对同一对象并发修改是否有限制

 

有限制,redis地层时单线程操作,所以用的时候尽量对这种操作进行加锁处理。

 

 


redis 主从复制,把主的数据删掉,从的怎么办

从的数据也会被删掉,

 

当主节点fail时,数据持久化在哪

Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用(PS:持久化在rdb、aof)

。Redis借助了fork命令的copy on write机制。在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,

将数据写成为RDB文件。  AOF日志的全称是append only file,从名字上我们就能看出来,它是一个追加写入的日志文件。与一般数据库的binlog不同的是,

AOF文件是可识别的纯文本,它的内容就是一个个 的Redis标准命令。当然,并不是发送发Redis的所有命令都要记录到AOF日志里面,

只有那些会导致数据发生修改的命令才会追加到AOF文件。那么每一条修改数据的命令都生成一条日志。

 

redis数据库中的所有数据都储存在内存中,为防止程序退出后内存中的数据丢失,redis提供了对持久化的支持,就是把内存中的数据异步写入到硬盘中,同时不影响继续提供服务

(也有数据丢失情况,即在刚写入到内存的数据,还没来的及持久化到硬盘,就fail,)

不适合储存不允许丢失的数据

 

 

基本上也就是数据已经存到内存还没有进行持久化。这个持久化需要一定的策略的,比如说100分钟持久化一次,或者200分钟

 

这个是持久化设置在redis.conf进行设置

 

save 900 1
# 900秒有一个key变化,就做一次保存
save 300 10
# 300秒有十个key变化,就做一次保存
save 60 10000
# 60秒有10000个key变化,就做一次保存

 

 

 

 

 

 

Redis使用的是单线程模型,保证了数据按顺序提交

 

 

 

复制

Redis集群的每个节点都有两种角色可选:主节点(master node)和从节点(slave node),其中主节点用于存储数据,而从节点则是某个主节点的复制品;

当用户需要处理更多的请求时,添加从节点可以扩展系统的读性能。因为Redis集群重用了单机Redis复制特性,所以集群的复制行为和单机复制行为是完全一样的;

下图展示了为每个主节点各添加一个从节点:

redistemplate 查询 key redis cluster查询key_redis_03

 

节点故障检测和自动故障转移

Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移;

集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。

举个栗子:当7000下线时,7001和7002会觉察到这一点,并对7000进行故障转移。

 

redistemplate 查询 key redis cluster查询key_数据_04