[一]主从集群的缺点,客户端分片的缺点
(1)主从+哨兵的redis集群,只是做主从备份,数据冗余的一种处理。但在存储空间的扩展上还是有限制。因为集群中的节点都是存储同样的数据。单一节点的容量,就可以决定整个集群存储数据的容量。木桶效应。
(2)客户端规划的分片(就是将不同的键存储在不同的节点上),包括客户端预分片技术,解决了存储容量的不受单台最小存储节点的限制,但在集群节点新加入和节点下线上,就会造成数据的命中率不高,需要人工手动重新规划,数据转移。
 
 
[二]redis3.0版本支持集群(包括存储容量水平扩展,新节点加入或下线的问题解决。)
(1)redis的Cluster,拥有和单机实例同样的性能
(2)在网络分区后能够提供一定的可访问性以及对主数据库故障恢复的支持
(3)例外集群几乎支持所有的单机实例支持的命令,对于涉及多键的命令(mget),如果每个键都位于同一个节点,则可以正常支持,否则报错。
(4)除此之外集群还有一个限制,是只能使用默认的0号数据库,如果使用select命令切换数据库,就会提示错误。
 
 
[三]使用3.0的redis的原因
(1)很好支持分片和存储容量的扩容
(2)哨兵和集群是两个独立的功能,单从特性上来看哨兵可以视为集群的子集,当不需要数据分片,或者已经在客户端进行分片的场景下,哨兵使用就足够了,单如果需要进行水平(存储容量扩容和数据分片)扩容,则集群是一个非常好的选择。
 
 
[四]redis3.0以上cluster集群的节点的增加
(1)redis-trib.rb是使用CLUSTER MEET命令来使每个节点认识集群中的其他节点的,可想而知如果想要向集群中加入新节点,也需要使用CLUSTER MEET命令实现。
(2)使用命令:CLUSTER MEET ip port
  --->集群中加入新节点A。
  --->向新节点发送:“CLUSTER MEET ip port”命令,ip和port是集群中任意一个节点的地址和端口号,A接收到客户端发来的命令后,会与该地址和端口号的节点B进行握手,使B将A认作当前集群中的一员。当B与A握手成功后,B会使用Gossip协议将节点A的信息通知给集群中的每一个节点。通过这一方式,即使集群中有多个节点,也只需要选择MEET其中任意一个节点,即可使新节点最终加入整个集群。  
 
[五]什么是插槽?
(1)插槽的计算,将每个键的键名的有效部分使用CRC16算法计算出散列值,然后对16384取余数。这样使得每个键都可以分配到16384个插槽中
(2)键名的有效部分:
  --->如果键名包含{符号,且在{符号后面存在}符号。并且{和}之间有至少一个字符,则有效部分是指{和}之间的内容
  --->如果不满足上一条规则,那么整个键名是有效部分。
比如:{user102}:last.name的键名有效部分是:user102      shangxiaofei键名的有效部分是:shangxiaofei
 
 
[五]如何将插槽分配给指定的节点。插槽的分配分为如下几种情况。
(1)插槽之前没有被分配过,现在想分配给指定节点。链接上指定节点的服务器,输入分配插槽的命令。
  --->命令:CLUSTER ADDSLOTS  slot1 slot2.... [slotn]
  --->redis-trib.rb也是通过该命令在创建集群时为新节点分配操作的。如果插槽已经被分配给某个节点,则会提示(error) err solts 100 is already busy
(2)插槽之前被分配过,现在想移动到指定的节点。
  --->利用命令查看插槽的分配情况.CLUSTER SLOTS。
  ==>查看插槽的分配情况
  
  ==>利用redis-trib.rb进行插槽移动
 
  ==>查看插槽的移动结果
 
 
 
  (3)手动再将0号插槽从6380节点移动回6379节点
  --->插槽中没有任何键的移动命令:CLUSTRE SETSLOT 插槽号 NODE 新节点的运行id.
  --->该命令的迁移的前提是插槽中没有任何键,因为CLUSTER SETSLOT命令迁移插槽时并不会连同相应的键一起迁移。这就造成了客户端在指定节点无法找到未迁移的键,
 
 
  (4)将有键存在的插槽,从一个节点,移动到另一个节点,并将插槽中的键一并移动过去
  --->手工获取某个插槽存在那些键:CLUSTER GETKEYSINSLOT 插槽号 要返回的键的数量
  --->之后对每个键,使用MIGRATE命令将其迁移到目标节点:MIGRATE 目标节点的地址 目标节点端口 键名 数据库号码 超时时间 [COPY][REPLACE]
  --->其中COPY选项,不将键从当前数据库删除,只是复制一份副本发往目标数据库。
  --->其中REPLACE选项,如果目标存在同名键,则覆盖
 
三:如果实现redis不下线的情况迁移数据
(1)两条命令
--->CLUSTER SETSLOT 插槽号 MIGRATING 新节点的运行id
--->CLUSTER SETSLOT 插槽号 IMPORTING 原节点的运行ID
(2)假设把0号插槽从A迁移到B
--->在B执行:CLUSTER SETSLOT 0  IMPORTING A
--->在A执行:CLUSTER SETSLOT 0 MIGRATING B
--->执行CLUSTER GETKEYSINSLOT 0 获取零号插槽的键列表
--->对第三步获取的每个键执行MIGRATE命令,将其从A迁移到B
--->执行CLUSTRE SETSLOT 0 NODE B来完成迁移。
&&:注意:在迁移过程中,如果访问A节点,如果键尚未迁移,则正常处理,如果已经完成迁移,则返回一个ask跳转请求,告诉客户端这个键在B。避免键在迁移过程中出现临时丢失的现象。
 
四:获取与插槽对应的节点。
五:故障恢复
(1)在一个集群中每个节点都会定期向其他节点发送ping命令。并通过有没有收到回复来判断目标节点是否已经下线。
(2)每隔1秒随机选择5个节点,然后选择其中最久没有响应的节点发送ping命令。
(3)故障恢复和哨兵机制类似。
  --->一旦节点a认为节点b疑似下线,就会在集群中传播该消息,所有其他节点收到消息后都会记录该信息。
  --->当其群中某一节点c收集到半数以上的节点认为b疑似下线,就会将b标记为下线,并向集群中的其他节点传播该消息,从而使得b在整个集群中下线。若下线节点为主节点,则从对应的从节点列表中选举一个从节点升级成新主节点。选举算法:和哨兵中的选举领头哨兵算法一致,基于raft算法。当选举出新的主节点,则执行SLAVEOF ON ONE将自己升格为主数据库。
  --->如果一个至少负责一个插槽的主数据库下线,且没有相应的从数据库可以进行故障恢复,则整个集群默认会进入下线状态无法工作。如果想在这种情况下,使集群仍能正常工作,可以修改配置cluster-require-full-coverage为no(默认值为yes)
 

redis之(十八)redis的支持水平扩容的集群特性,以及插槽的相关操作的更多相关文章

  1. 菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章

    菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章 cheungmine, 2014-10-25 0 引言 在生产环境上安装Hadoop高可用集群一直是一个需要极度耐心和体力的细致工作 ...

  2. 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法

    "为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...

  3. Redis高可用(持久化、主从复制、哨兵、集群)

    Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...

  4. Redis安装、主从配置及两种高可用集群搭建

    Redis安装.主从配置及两种高可用集群搭建 一.            准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...

  5. 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章

    菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...

  6. redis(十八):Redis 配置

    #redis.conf# Redis configuration file example.# ./redis-server /path/to/redis.conf ################# ...

  7. Redis学习总结(八)--Redis云平台

    在实际生产环境中通过命令行的形式去进行集群的管理是一件很繁琐并且容易出现错误的事情,所以就引入了云平台的概念. 什么是云平台 Redis 云平台是指通过 BS 等架构实现对 Redis 的管理和监控. ...

  8. (十九)SpringBoot之使用Spring Session集群-redis

    一.引入maven依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnc ...

  9. Redis随笔(四)Centos7 搭redis3.2.9集群-3主3从的6个节点服务

    1.虚拟机环境 使用的Linux环境已经版本: Centos 7   64位系统 主机ip: 192.168.56.180 192.168.56.181 192.168.56.182 每台服务器是1主 ...

随机推荐

  1. MyBatis之二级缓存

    二级缓存与一级缓存区别:二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域. 每一个mapper都有一个自己的二缓存区域(按namespace区分),两个map ...

  2. bzoj3810: [Coci2015]Stanovi(记忆化搜索)

    实际上切出来的矩阵在原矩阵上的位置是不重要的...重要的只有矩阵的大小和上下左右是否在边界上. 于是我们可以设f[x][y][l][r][u][d]表示x*y的矩阵上下左右是不是边界的最小代价. 记忆 ...

  3. pandas模块(数据分析)------Series

    pandas是一个强大的Python数据分析的工具包. pandas是基于NumPy构建的. pandas的主要功能: 具备对其功能的数据结构DataFrame.Series 集成时间序列功能 提供丰 ...

  4. BigDATA面试题

    Big Data 面试题总结 JAVA相关 1-1)List 与set 的区别? 老掉牙的问题了,还在这里老生常谈:List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复 ...

  5. Linux服务器上nginx安装的完整步骤

    1.环境准备: 服务器系统版本:CentOS 6.5 nginx软件版本:nginx-1.13.9 2.资源准备: nginx下载地址:http://nginx.org/download/nginx- ...

  6. sublime Text 块编辑方法

    比如我们要把SQL语句中的多表查询结果封装成pojo SQL: SELECT a.id, a.title, a.sell_point, a.price, a.image, b.`name` categ ...

  7. selenium - 获取断言信息

    断言:通过脚本提取相应元素的数值,将实际结果与预期结果进行比较.通常获取title,URL,text等信息进行断言. from selenium import webdriver from time ...

  8. 再来说一说sudo

    app        ALL = (ALL:ALL) ALL eric.zhan ALL = (app : app) ALLDefaults:eric.zhan runas_default=app 如 ...

  9. 通过psexec实现远程安装软件包

    1.在管理机上下载和安装psexec https://docs.microsoft.com/en-us/sysinternals/downloads/psexec 2.在管理机上编写bat脚本,存放在 ...

  10. Java设计模式の装饰者模式

    目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...