Redis集群

Redis集群

1.简介
(1)什么是集群(Cluster)
  • Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。
  • 数据量过大时单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展,每个复制集只负责存储整个数据集的一部分。
  • 概括来说,Redis集群是一个提供在多个Redis节点间共享数据的程序集。
(2)集群的作用
  • 集群支持多个主机,每个主机有可以挂载多个从机。

    • 可以实现读写分离。
    • 支持数据的高可用。
    • 支持海量数据的读写存储操作。
  • 集群自带哨兵的故障转移机制,内置高可用的支持。

  • 客户端与redis的节点连接不需要连接集群中的所有节点,只需连接集群中的一个可用节点即可。

  • 槽位(slot)负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系。

2.集群算法
(1)分片-槽位(slot)
  • 集群的密钥空间被分成 16384 个槽,有效地设置了 16384 个主节点的集群大小上限 (但是,建议的最大节点大小约为 1000 个节点)。

  • 集群中的每个主节点处理 16384 个哈希槽的一个子集。

  • Redis使用哈希槽的概念来进行数据分片。

  • ,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

    在这里插入图片描述

  • 这种结构很容易添加或者删除节点,只需要操作移动插槽即可。

(2)槽位映射 — 哈希取余算法
  • 通过哈希公式计算出哈希值,用来决定映射节点。

  • 优点

    • 简单粗暴,直接有效。
    • 使用哈希算法让固定的请求落在同一台服务器上,起到负载均衡和分而治之的效果。
  • 缺点

    • 扩容与缩容处理繁琐复杂,每次数据变动导致节点有变动,映射关系需要重新进行计算。
    • 如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化,此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。
    • 台数数量变化,会导致hash取余全部数据重新洗牌。
(3)槽位映射 — 一致性哈希算法
  • 通过hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间[0, 2^32-1]。

  • 我们通过适当的逻辑控制将它首尾相连(0 = 2^32),这样让它逻辑上形成了一个环形空间。

  • 一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,整个空间按顺时针方向组织。

  • 将各个服务器使用Hash进行哈希,确定其在哈希环上的位置。

  • 当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置。

  • 从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。

  • 优点

    • 容错性:改动某一台服务器,受影响的数据仅仅是此服务器到其环空间中前一台服务器。C挂了,受到影响的只是B、C之间的数据且这些数据会转移到D进行存储。
    • 扩展性:增加一台节点NodeX,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余全部数据重新洗牌。
  • 缺点

    • 数据倾斜:服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)。
(4)槽位映射 — 哈希槽分区
  • 哈希槽实质就是一个数组,数组[0,2^14 -1]形成hash slot空间。

  • 解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。

  • 槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

  • 一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。

3.集群案例
(1)集群配置
  • 同主从复制与哨兵监控配置类似,需要conf配置文件,长运基本配置如下。

    bind 0.0.0.0
    daemonize yes
    protected-mode no
    port 6381
    logfile "/myredis/cluster/cluster6381.log"
    pidfile /myredis/cluster6381.pid
    dir /myredis/cluster
    dbfilename dump6381.rdb
    appendonly yes
    appendfilename "appendonly6381.aof"
    requirepass xxxx
    masterauth xxxx
     
    cluster-enabled yes
    cluster-config-file nodes-6381.conf
    cluster-node-timeout 5000
    
  • 其中新出现的cluster相关配置行含义如下。

    • cluster-enabled yes:表示启用Redis集群模式,告诉Redis服务器要以集群模式运行。
    • cluster-config-file nodes-6381.conf:指定了Redis集群节点的配置文件名。每个Redis集群节点都会通过这个配置文件来获取集群拓扑信息和节点状态。
    • cluster-node-timeout 5000:设置了Redis集群中节点之间的通信超时时间,以毫秒为单位。
  • 每个配置文件代表了集群中的一个节点,多个节点组成了集群。

(2)构建集群关系
  • redis-cli -a 密码 --cluster create --cluster-replicas ip1:port1 .....

  • 此命令用来构建集群。

  • 其中1代表为每一个主机主机创建一个从机,则后边的节点信息两个为一组,一主一丛。数字为其他时,以此类推。

  • 在启动链接时,一定要加上-c开启路由到位,否则不在当前主机哈希槽范围的数据无法写入。

    redis-cli -a xxx -p xxx -c
    
(3)查看集群状态
  • info replocation:查看 Redis 主从复制的状态信息,包括主节点和从节点的连接状态、同步进度等信息。

  • cluster info:用于获取 Redis 集群的状态信息,包括节点数量、槽位映射、集群数据分布、集群复制信息等。

  • cluster nodes: 获取 Redis 集群中所有节点的详细信息,包括节点 ID、IP 地址、端口号、角色、状态、槽位分配等。

(4)容错切换
  • 某主机挂掉后,会进行主机选举,此次选举所有节点均可以参见,最后选出与原来相同数量个主机,并构建主从关系。

  • 集群不保证数据一致性,在某些情况下会有数据丢失。

  • 原先挂掉主机重新上线后,会以从机的身份挂载到某个主机下。

  • 可以通过cluster failover命令进行主从对调。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值