[一]主从集群的缺点,客户端分片的缺点
(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. Navcat中Oracle连接的坑-Instant Client

    报错信息: 官方下载Instant Client下载: http://www.oracle.com/technetwork/cn/topics/intel-macsoft-102027-zhs.htm ...

  2. POI 2018.10.20

    [POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...

  3. 20181015 考试记录&数论

    题目传送门 W神爷的题解 数论 小 M 的算式 [问题描述] 小 M 在做数学作业的时候遇到了一个有趣的问题:有一个长度为 n 的数字 串 S,小 M 需要在数字之间填入若干个“+”和恰好一个“=”, ...

  4. 《python核心编程》--读书笔记 第21章 数据库编程

    准备:今天拿笔记本装了mysql,这样就能在不同地方用其他电脑远程访问同一个数据库了. python安装MySQLdb模块:http://www.codegood.com/downloads. 21. ...

  5. Wand FZU - 2282 全错位重排

    N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...

  6. C++虚基类的初始化

    #include<iostream> using namespace std; class Base{ public: Base(int sa) { a=sa; cout<<& ...

  7. Java nio和io

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  8. 【c#】Tesseract-ocr 3.0.2 版本使用实例

    简介 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷. ...

  9. [USACO13NOV] Pogo-Cow

    https://www.luogu.org/problem/show?pid=3089 题目描述 In an ill-conceived attempt to enhance the mobility ...

  10. 数据结构&字符串:01字典树

    利用01字典树查询最大异或值 01字典树的是只含有0和1两种字符的字典树,在使用它的时候,把若干数字转成二进制后插入其中 在查询树中的哪个数字和给定数字有最大异或值的时候,从根开始贪心查询就ok了 H ...