Redis 集群

比眉伴天荒 2021-12-11 10:39 428阅读 0赞

目录

  1. Redis集群介绍
  2. Redis 集群的优势
  3. Redis 集群的数据分片
  4. Redis 集群的主从复制模型
  5. Redis 一致性保证
  6. 搭建并使用Redis集群
  7. 集群状态信息查看
  8. 集群节点管理

    1. 新增Master节点

      1. 新建空节点,启动这个新节点
      2. 加入空节点到集群
      3. 为空节点分配slot
      4. 验证使用该节点
    2. 新增Slave节点(不能为一个非空并且分配了slot的主节点继续添加从节点)

      1. 新建空节点,启动这个新节点
      2. 加入空节点到集群
      3. 先删除主节点的slots(将主节点的数据先转移其他主节点,在删除)
      4. 再删除从节点的slots
      5. 指定从节点
      6. 查看下主从节点关系
    3. 删除Master节点

      1. 转移主节点slots
      2. 删除主节点
    4. 删除Slave节点

      $redis-trib.rb del-node 127.0.0.1:7382

  9. 故障转移

    1. 自动转移
    2. 手动转移
  10. 注意

#

一.Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.

#

二.Redis 集群的优势:

  • 自动分割数据到不同的节点上。
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

#

三.Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

  • 节点 A 包含 0 到 5500号哈希槽.
  • 节点 B 包含5501 到 11000 号哈希槽.
  • 节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

#

四.Redis 集群的主从复制模型

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了

不过当B和B1 都失败后,集群是不可用的.

#

五.Redis 一致性保证

Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作.

第一个原因是因为集群是用了异步复制写操作过程:

  • 客户端向主节点B写入一条命令.
  • 主节点B向客户端回复命令状态.
  • 主节点将写操作复制给他得从节点 B1, B2 和 B3.

主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。 注意:Redis 集群可能会在将来提供同步写的方法。 Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤立。

举个例子 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, A1 、B1 、C1 为A,B,C的从节点, 还有一个客户端 Z1 ,假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点 A 、C 、A1 、B1 和 C1 ,小部分的一方则包含节点 B 和客户端 Z1 .

Z1仍然能够向主节点B中写入, 如果网络分区发生时间较短,那么集群将会继续正常运作,如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中得数据便丢失了.

注意, 在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项:

#

六.搭建并使用Redis集群

搭建集群的第一件事情我们需要一些运行在 集群模式的Redis实例. 这意味这集群并不是由一些普通的Redis实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了.

下面是一个最少选项的集群的配置文件:

  1. port 7000
  2. cluster-enabled yes
  3. cluster-config-file nodes.conf
  4. cluster-node-timeout 5000
  5. appendonly yes
  6. #文件中的 cluster-enabled 选项用于开实例的集群模式,
  7. #而 cluster-conf-file 选项则设定了保存节点配置文件的路径
  8. #默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。

详细步骤:

第一步:安装配置**redis **

  1. 第一步:创建cluster-test文件夹
  2. 第二步:在cluster-test文件夹下,创建6个文件夹
    2019070900092769.png
  3. 第三步:
    第一步:在文件夹 7000 至 7005 中, 各创建一个 redis.conf 文件, 文件的内容可以使用上面的示例配置文件, 但记得将配置中的端口号从 7000 改为与文件夹名字相同的号码。
    第二步:官网下载redis,将解压后的edis-server.exe文件,复制到文件夹 7000 至 7005 中。
    第三步:在文件夹 7000 至 7005 中,创建一个start可执行文件,同样记得将配置中的端口号从 7000 改为与文件夹名字相同的号码。
    20190709001739920.png
    内容如下:

    1. title redis-7000
    2. redis-server.exe redis.conf
  4. 第四步:点击start执行

第二步:安装Ruby

redis的集群使用 ruby脚本编写,所以系统需要有 Ruby 环境 ,下载地址 https://rubyinstaller.org/downloads/

第三步:安装Redis的Ruby驱动redis-xxxx.gem

  1. 下载地址 https://rubygems.org/pages/download
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0NjMyMA_size_16_color_FFFFFF_t_70
  2. 下载后解压,当前目录切换到解压目录中,如 D:\Program Files\Redis_cluster\rubygems-2.7.7 然后命令行执行 ruby setup.rb
  3. 再用 GEM 安装 Redis :切换到redis安装目录,需要在命令行中,执行 gem install redis
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0NjMyMA_size_16_color_FFFFFF_t_70 1

第四步:下载Redis源码包

通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZ3VhbmdfODIw_size_16_color_FFFFFF_t_70

第五步:搭建集群

现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。

切换到redis源码包/src目录下执行命令

  1. redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

这个命令在这里用于创建一个新的集群, 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:

  1. [OK] All 16384 slots covered

这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。

注意:

注意:如果出现 redis-trib.rb is not longer available! 如果redis版本是5.0以上,则使用如下命令:

  1. redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380
  2. 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

原因是redis5.0以上不再需要redis-trib.rb了,而是使用自带的redis-cli作为创建集群的命令了。

#

七.集群信息查看

  1. 使用Redis客户端Redis-cli.exe来查看数据记录数,以及集群相关信息
    命令 redis-cli –c –h ”地址” –p “端口号” ; c 表示集群
    20181102142639436.png
  2. 查看集群的信息,命令:cluster info
    20181102142639512.png
  3. 查看主从关系,命令: info replication
    主库显示信息:
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0NjMyMA_size_16_color_FFFFFF_t_70 2

    从库显示信息:
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0NjMyMA_size_16_color_FFFFFF_t_70 3

  4. 查看各个节点分配slot,命令 cluster nodes
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0NjMyMA_size_16_color_FFFFFF_t_70 4
  5. 存几个值,看下值的分布
    watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0NjMyMA_size_16_color_FFFFFF_t_70 5
    以6380节点为例,管理的slots为5461-10922,key为test的slot为6918,显然命中6380管理的卡槽6918,所以客户端也跳转到了6380。key为test1的slot为4768,在6379的卡槽范围0-5460,所以客户端又跳转到了6379。

#

八.注意

  1. 主从复制

    Redis集群支持主从复制功能,也就是主节点对应的从节点,但是不需要在从节点中加入slaveof :,否则会报错

  2. 主从配置

    一般情况下,从节点的配置和对应的主节点的配置类似,但是一般从节点的大小要小于主节点的配置大小,这主要考虑内存和性能均衡方面,请在实际使用时留意下。

  3. 实例通信

    Redis集群中的节点实例间的数据共享机制是通过定位哈希槽(set时的键值分配的哈希),不会区分主从节点或是普通节点的通信。

发表评论

表情:
评论列表 (有 0 条评论,428人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis

    当单台redis服务器的内存存储空间有限的情况下,可以使用redis集群扩展存储空间 一、redis-cluster架构图 ![SouthEast][] 架构细

    相关 Redis --- Redis

    Redis集群原理 如何从海量数据里快速找到所需? 分片:按照某种规则去划分数据,分散储存在多个节点上 常规按照哈希划分无法实现节点的动态增减 一致性哈希算法:对2^3

    相关 Redis

    Redis主从复制集群: slaveof,可redis.conf配置也可客户端命令 PSYNC:初始全量复制,master进行bgsave生成rdb传给slave 断线