Redis集群简记

Redis集群

http://doc.redisfans.com/topic/cluster-tutorial.html

redis 集群是为了多个节点之间数据的共享和集群高可用的保证。
redis 集群不支持同时处理多个键的redis命令,由于集群需要在多个redis之间迁移数据,在高负载的情况下这些命令会降低redis的性能,并导致不可预知的问题。

redis集群的好处

  • 将数据自动切分到多个不同的节点的能力。
  • 当集群中的某一部分不可用时,仍然可以处理命令请求的能力。

Redis 集群数据共享

  • redis 集群采用分片(sharding)而非一致性哈希(consistency hashing)来实现
  • 一个redis集群包含了 16384 个哈希槽(hash slot)
  • 使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽
  • 添加或删除节点都不会导致阻塞,因此也不会导致集群的不可用

添加或删除节点数据迁移:

1、添加节点,根据 CRC16(key) % 16384来从新计算节点数据分配并迁移相应节点数据。
2、删除节点,在节点数据迁移完毕后下线即可。

Redis 集群中的主从复制

  • Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。
  • 如果某个节点的 master 下线,则其 replica 会接管 master 的工作,使得集群继续可用。
  • 如果某个节点的 master 和所有 replica 都下线了,则会导致整个集群不可用。

Redis 集群的一致性保证(guarantee)

  • Redis 集群不保证数据的强一致性(strong consistency)
  • 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。
客户端->master:发送写命令
master->master:执行写命令
master->客户端:发送写成功命令
master->slave:发送复制命令(如果此时不可用,则会导致数据的不一致性\n如果等待slave复制完成,则会导致整个集群性能极低。)
  • Redis 集群另外一种可能会丢失命令的情况是, 集群出现网络分裂(network partition), 并且一个客户端与至少包括一个主节点在内的少数(minority)实例被孤立。

创建Redis集群的实例

最少选项的集群配置文件

port 端口
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

cluster-enabled 用于开启集群, cluster-conf-file 用于设定节点配置文件。

需要几个节点的集群,则根据最小配置分别创建几个存放配置文件的目录和配置文件并修改端口即可。

启动集群的每个节点: ./redis-server 配置文件所在位置

创建集群 redis-trib

创建新集群检查集群或者对集群进行重新分片reshared):

通过使用 Redis 集群命令行工具 redis-trib

如创建集群:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
  • 给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
  • 选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
  • 之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。

检测和确认完成后,如果一切正常的话, redis-trib 将输出以下信息:

>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

对集群进行重新分片

重新分片并不会对正在运行的集群程序产生任何影响

$ ./redis-trib.rb reshard 127.0.0.1:7000

只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。接下来根据需要的提示和需要做相应的操作即可。

添加新节点到集群

  • 添加的新节点是一个主节点
  • 添加的新节点是一个从节点

1、第一步要做的总是添加一个空节点。

和上述创建节点实例一样:

port 端口
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

2、启动节点

../../redis-server redis.conf

3、将新节点添加到集群里

./redis-trib.rb addnode 新节点IP:新节点端口 原有集群节点IP:原有集群某个主节点端口
如:
./redis-trib.rb addnode 127.0.0.1:7006 127.0.0.1:7000

此时,新节点已经连上集群;成为了集群的一部分。但是和其他主节点相比, 新节点还有两点区别:

  • 新节点没有包含任何数据, 因为它没有包含任何哈希槽。
  • 尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点;因此在集群将某个从节点升级为新的主节点前, 这个新节点不会被选中。

4、使用redis-trib转移哈希槽数据到新节点

具体转移方式见前文。

在数据转移完毕后,新节点就会成为真正的主节点了。

5、如果是想让新增的节点成为从节点

在新节点中执行如下命令

redis 新增节点IP:新增节点端口> cluster replicate 新增节点所在主节点的ID
如:
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

移除一个节点

1:如果删除的节点是主节点

1) 要把节点中的哈希槽转移到其他节点中

./redis-trib.rb reshard 127.0.0.1:7000

2) 根据系统提示输入需要删除节点哈希槽的数量

3) 根据系统提示输入要接收这些哈希槽的节点的ID

4) 完成后,输入要移除的节点ID,并输入 done 命令

5) 最后删除节点

./redis-trib.rb del-node 需要删除节点的IP:端口 需要删除节点的IP:端口

如:
./redis-trib.rb del-node 127.0.0.1:7006 127.0.0.1:7006

2:如果删除的节点是从节点

./redis-trib.rb del-node 127.0.0.1:7006 127.0.0.1:7006
时间: 2024-07-31 11:35:36

Redis集群简记的相关文章

这可能是最全的 Redis 集群方案介绍了

由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以达到100GB.200GB的规模,但是单实例模式限制了Redis没法满足业务的需求(例如新浪微博就曾经用Redis存储了超过1TB的数据).Redis的开发者Antirez早在博客上就提出在Redis 3.0版本中加入集群的功能,但3.0版本等到2015年才发布正式版.各大企业在3.0版本还没发布前为了解决Redis的存储瓶颈,纷纷推出了各自的Redis集群方案.

Redis集群技术及Codis实践

Redis集群技术及Codis实践 前言 本文主要讨论Redis集群相关技术及新发展,关于Redis运维等内容,以后另开主题讨论. 本文重点推荐Codis--豌豆荚开源的Redis分布式中间件(该项目于4个月前在GitHub开源,目前star已超过2100).其和Twemproxy相比,有诸多激动人心的新特性,并支持从Twemproxy无缝迁移至Codis. 好吧我们正式开始. 1. Redis常见集群技术 长期以来,Redis本身仅支持单实例,内存一般最多10~20GB.这无法支撑大型线上业务

一步一个脚印:解密唯品会中Redis集群架构演进与功能定制

在2016杭州云栖大会的"开源数据库之Redis专场"上,来自唯品会的高级数据工程师申政带来了题为<Redis在唯品会的应用实践>的精彩分享.分享中,他主要介绍Redis集群架构演进.Redis使用经验以及唯品会对Redis二次开发实践积累三部分,干货满满,精彩不容错过. 以下内容根据演讲PPT及现场分享整理. Redis集群架构演进 目前在唯品会内对Redis的使用属于重量级别,目前在唯品会内大概有8000个Redis实例.1000台物理机.500个应用. 上图是唯品会对

redis集群相关资料

Cluster简介         Redis 3.0引入的cluster.cluster是具有有自动数据分片.容错.针对读取速度有了显著的提升.改进了AOF重写等的redis分布式实现.     Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset).     Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一

Redis集群环境安装指南

环境 RHLinux-6.4-64-EN, 红帽6.4 64位,英文正式发布版.   Redis3.0.0 redis2.x版本还不支持集群,3.0版本将会支持,现在3.0版本还在开发中,现在是beta-3版本(截止2014-5-8),但功能是可用的. 下载Redis3.0.0 beta-3版本,点击这里下载. Redis3的安装可以参照之前的单机安装指南操作. 创建Redis集群实例 创建集群节点的文件夹,先创建cluster-test文件夹,再以端口为名称创建子文件夹.这里我们要创建6个Re

《Redis官方教程》Redis集群规范

原文链接(on 20 Jul)  作者:antirez  译者:carlvine   Redis集群规范 欢迎来到Redis集群规范.在这里你可以找到有关Redis的算法和设计的基本原理.这篇文章是一项正在进行的工作,因为它是不断地与Redis的实际实现同步.   主要属性和设计原理 Redis的集群目标   Redis集群是一个分布式的实现,具有以下目标,按设计的重要性排序: 高性能,并且多达1000个节点的线性可扩展性.没有代理,使用异步复制,并且在进行赋值时没有合并操作. 可接受程度的写安

基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定),Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求: Redis Sentinel介绍 Redis Sentinel是Redis官方提供的集群管理工具,主要有三大功能: 监控,能持续监控Redis的主从实例是否正常

commons-pool2实现redis集群,报JedisDataException异常

问题描述 commons-pool2实现redis集群,报JedisDataException异常 配置文件如下: <bean id="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig"> <property name="maxTotal" value="${redis.maxActive}&quo

《Redis官方文档》Redis集群教程

原文链接 译文链接 译者: tiffany 这篇教程是Redis集群的简要介绍,而非讲解分布式系统的复杂概念.它主要从一个使用者的角度介绍如何搭建.测试和使用Redis集群,至于Redis集群的详细设计将在"Redis集群规范"中进行描述. 本教程以redis使用者的角度,用简单易懂的方式介绍Redis集群的可用性和一致性. 注意: 本教程要求redis3.0或以上的版本. 如果你打算部署redis集群,你可以读一些关于集群的详细设计,当然,这不是必须的.由这篇教程入门,先大概使用一下