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
命令进行主从对调。