Redis
Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储)。
Redis 和Memcache类似,但很大程度补偿了Memcache的不足:
-
Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。
- 而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。
Redis支持存储的value类型包括string(字符串)、list( 链表 )、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些 数据类型 都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。而memcached是在内存中,所以是用来弥补memcached的不足。在Redis没出来之前Memcached是被广泛使用,用于与关系型数据库进行补充,存储大量数据的KV结构数据时使用的。而之Redis诞生之后逐渐取代了Memcached。主要是因为4个原因:1、内存缓存 2、数据持久化 3、操作原子性 4、分布式支持
Redis 提供了Java,C/C++,C#,PHP,JavaScript,Perl,ObjectC,Python,Ruby,Erlang等客户端,使用很方便。
Redis从第3版本开始支持主从同步和分片(以前的版本需要自己实现,也就是说不是自带的功能)。数据可以从主服务器向任意位置的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。分片机制使Redis可以增加读写性能。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步,可订阅一个频道并接收主服务器完整的消息发布记录。分片机制增加了数据的可扩展性,数据的同步增加了数据冗余和容灾。
redis cluster 模式
redis 集群模式需要redis3.0及以上版本。
为了在大流量访问下提供稳定的业务,集群化是存储的必然形态,redis从3.0版本开始致力于分布式redis集群;
redis cluster 原理
Redis 集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集,Redis 集群不像单机 Redis 那样支持多数据库功能, 集群只使用默认的 0 号数据库, 并且不能使用 SELECT index 命令。
Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)。
redis cluster 架构设计由两部分组成: 主从节点 和 hash slot(槽)。
主从节点
类似HDFS系统,redis也有主从节点,随着数据量的增加,redis为了能提高读性能,将从redis节点处理读请求,将主redis节点作为写请求。
主从模式的设计优缺点:
优点:读写分离,通过增加Slaver可以提高并发读的能力。
缺点:
1)Master写能力是瓶颈。
2)虽然理论上对Slaver没有限制但是维护Slaver开销总将会变成瓶颈。
3)Master的磁盘大小也将会成为整个Redis集群存储容量的瓶颈。
hash slot(槽)
1)数据对象保存到Redis之前先经过CRC16哈希到一个指定的redis节点上,例如 数据1 最终Hash到了redis1 节点上。
2) 每个Node被平均分配了一个Slot段,对应着0-16384,Slot不能重复也不能缺失,否则会导致对象重复存储或无法存储。
3)Node之间也互相监听,一旦有Node退出或者加入,会按照Slot为单位做数据的迁移。例如redis1 节点如果掉线了,0-5640这些Slot将会平均分摊到redis2 和redis3 上,由于redis2 和 redis3 本身维护的Slot还会在自己身上不会被重新分配,所以迁移过程中不会影响到5641-16384Slot段的使用。
哈希Slot的优缺点:
缺点:每个redis 节点无备用节点,一旦某个节点挂掉了,redis集群会停止运作;
优点:将Redis的写操作分摊到了多个节点上,提高写的并发能力,扩容简单。
主从节点 和 hash slot(槽)结合
在hash slot 基础上,在redis服务节点上,增加master 和 slave 节点。
redis-cluster架构中,被设计成共有16384个hash slot。每个master分得一部分slot,其算法为:hash_slot = crc16(key) mod 16384 ,这就找到对应slot。采用hash slot的算法,实际上是解决了redis-cluster架构下,有多个master节点的时候,数据如何分布到这些节点上去。key是可用key,如果有{}则取{}内的作为可用key,否则整个可以是可用key。
redis-cluster 架构至少需要3主3从,且每个实例可使用不同的配置文件。
在cluster架构下,默认的,redis-master节点一般用于接收读写,而redis-slave节点则一般只用于备份(高可用),其与对应的master拥有相同的slot集合;若某个redis-master意外失效,则再将其对应的slave进行升级为临时redis-master。
但如果不介意读取的是redis-cluster中有可能过期的数据并且对写请求不感兴趣时,则亦可通过readonly命令,将slave设置成可读,然后通过slave获取相关的key,达到读写分离。
在cluster架构下,你如果要支撑更大的读吞吐量,或者写吞吐量,或者数据量,都可以直接对master进行横向扩展就可以了。