1五、Redis的集群

 写在前面的话:读书破万卷,编码若有神
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
一、复制的问题
因为复制中,每一个数据库都是拥有完整的数据,所以复制的总数据存储量,受限于内存最小的数据库节点,若是数据量过大,复制就无能为力了。
二、分片(partitioning)
分片就是将你的数据拆分到多个Redis实例的过程,这样每一个redis实例将只包含完整数据的一部分。常见的分片方式:
  • 按照范围分片
  • 哈希分片,好比一致性哈希
三、常见的分片实现
  1. 在客户端进行分片
  2. 经过代理来进行分片,好比:Twemproxy
  3. 查询路由:就是发送查询到一个随机实例,这个实例会保证转发你的查询到正确的节点,Redis集群在客户端的帮助下,实现了查询路由的一种混合形式,请求不是直接从Redis实例转发到另外一个,而是客户端收到重定向到正确的节点。
  4. 在服务器端进行分片,Redis采用哈希槽(hash slot)的方式在服务器端进行分片:Redis集群有16384个哈希槽,使用键的CRC16编码对16384取模来计算一个键所属的哈希槽。
四、Redis分片的缺点
  1. 不支持涉及多键的操做,如mget,若是所操做的键都在同一个节点,就正常执行,不然会提示错误
  2. 分片的粒度是键,所以每一个键对应的值不要太大
  3. 数据备份会比较麻烦,备份数据时你须要聚合多个实例和主机的持久化文件
  4. 扩容的处理比较麻烦
  5. 故障恢复的处理也比较麻烦,可能须要从新梳理Master和Slave的关系,并调整每一个复制集里面的数据
五、Redis集群
因为数据量过大,单个复制集难以承担,所以须要对多个复制集进行集群,造成水平扩展,每一个复制集只负责存储整个数据集的一部分,这就是Redis的集群
  1. 在之前版本中,redis的集群是依靠客户端来分片来完成,可是这会有不少缺点,好比维护成本高,须要客户端编码解决;增长、移出节点都比较繁琐等。
  2. Redis3.0新增的一大特性就是支持集群,在不下降性能的状况下,还提供了网络分区后的可访问下和支持对主数据库故障的恢复
  3. 使用集群后,都只能使用默认的0号数据库
  4. 每一个Redis集群节点须要两个TCP链接打开,正常的TCP端口用来服务客户端,列如6379,增长10000的端口用做数据端口,必须保证防火墙打开着两个端口。
  5. Redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统受到的写入请求命令。
六、集群架构
  1. 全部的Redis节点彼此互联,内部使用二进制协议优化传输速度和带宽
  2. 节点的fail是经过集群中超过半数的节点检测失效时才生效
  3. 客户端与Redis节点直连,不须要中间proxy层。客户端不须要链接集群的全部节点,链接集群中任何一个可用节点便可
  4. 集群把全部的物理节点映射到[0-16383]插槽上,集群负责维护:节点-插槽-值 的关系
七、集群操做的基本命令
(1)cluster info : 获取集群的信息
(2)cluster nodes : 获取集群当前已知的全部节点,以及这些节点的相关信息
(3)cluster meet <ip> <port> : 将ip和port所指定的节点添加到集群中
(4)cluster forget <node_id> : 从集群中移除node_id指定的节点
(5)cluster replicate <node_id> : 将当前节点设置为node_id指定的节点的从节点
(6)cluster saveconfig :将节点的配置文件保存到硬盘里面
(7)cluster addslots <slot> [slot ...] :将一个或者多个槽分配给当前节点
(8)cluster delslots <slot> [slot ...] : 从当前节点移除一个或者多个槽
(9)cluster flushslots : 移除分配给当前节点的全部槽
(10)cluster setslot <slot> NODE <node_id> : 将槽分配给node_id指定的节点,若是槽已经分配给了另外一个节点,那么先让另外一个节点删除该槽,而后再进行分配。
(11)cluster setslot <slot> migrate <node_id> : 将本节点的槽迁移到指定的节点中
(12)cluster setslot <slot> importing <node_id> : 从指定节点导入槽到本节点
(13)cluster setslot <slot> stable : 取消对槽的导入(importing)或迁移(migrate)
(14)cluster keyslot <key> : 计算键key应该被放置在哪一个槽
(15)cluster countkeysinslot <slot> : 返回槽目前包含的键值对数量
(16)cluster getkeysinslot <slot> <count> : 返回count个槽中的键
(17)migrate 目的节点ip 目前节点port 键名 数据库号 超时时间 [copy] [replace] : 迁移某个键值对
相关文章
相关标签/搜索