[一]主从集群的缺点,客户端分片的缺点
(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)
- 菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章
菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章 cheungmine, 2014-10-25 0 引言 在生产环境上安装Hadoop高可用集群一直是一个需要极度耐心和体力的细致工作 ...
- 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法
"为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...
- Redis高可用(持久化、主从复制、哨兵、集群)
Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...
- Redis安装、主从配置及两种高可用集群搭建
Redis安装.主从配置及两种高可用集群搭建 一. 准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...
- 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章
菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...
- redis(十八):Redis 配置
#redis.conf# Redis configuration file example.# ./redis-server /path/to/redis.conf ################# ...
- Redis学习总结(八)--Redis云平台
在实际生产环境中通过命令行的形式去进行集群的管理是一件很繁琐并且容易出现错误的事情,所以就引入了云平台的概念. 什么是云平台 Redis 云平台是指通过 BS 等架构实现对 Redis 的管理和监控. ...
- (十九)SpringBoot之使用Spring Session集群-redis
一.引入maven依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnc ...
- 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主 ...
随机推荐
- [LOJ 6004] 圆桌聚餐
link 其实网络流就是再考你如何去建边. 先见$S$,$T$为源点与汇点,然后将$S$连向每一个单位,流量为每个单位的人数,然后将每一个单位连向每一个餐桌,流量为$1$,最后在将每一个餐桌与$T$相 ...
- 仅此一文让你明白ASP.NET MVC 之Model的呈现
本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class HomeController : Controller { pu ...
- bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法
[HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4370 Solved: 2041[Submit][Status][D ...
- 001 Python中的变量和字符串
1.Python“变量”更像“名字” 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(variable). 在大多数语言中,都把这种行为称为“给变量赋值”或“把 ...
- HDU 4258 斜率优化dp
Covered Walkway Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- [技巧篇]12.从Spring的编码过滤器说起
有一枚学生问问了我一个问题,突然灵感爆发,他使用的Spring的过滤器,前台利用GET方式向后端发出一个请求,由于里面含有中文数据,结果在后端显示的是乱码,他问我为什么?明明在Spring里面也配了字 ...
- 【c#】Tesseract-ocr 3.0.2 版本使用实例
简介 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷. ...
- MSSQL Procudure Sample
代码: USE [Internal_Timesheet] GO /****** Object: StoredProcedure [dbo].[ManageTSReminder] Script Date ...
- Java进行http请求工具类代码(支持https)
package com.guyezhai.modules.utils; import java.io.BufferedReader; import java.io.DataOutputStream; ...
- Robot Framework 自定义关键字 Ignore error
以上是关键字的完整写法. 一下是调用该关键字的实例.