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架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key
2) redis-cluster选举:容错
(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复制特性,所以集群的复制行为和单机复制行为是完全一样的;
下图展示了为每个主节点各添加一个从节点:
节点故障检测和自动故障转移
Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移;
集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。
举个栗子:当7000下线时,7001和7002会觉察到这一点,并对7000进行故障转移。