REDIS集群

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis集群是指将多个Redis节点组成一个集群,通过节点间的数据分布和协调来提供高可用性和性能的数据库解决方案。每个节点可以存储数据,处理请求,并与其他节点进行通信,以实现数据的拷贝和复制。

前言

Redis集群是指将多个Redis节点组成一个集群,通过节点间的数据分布和协调来提供高可用性和性能的数据库解决方案。每个节点可以存储数据,处理请求,并与其他节点进行通信,以实现数据的拷贝和复制。


Redis集群的主要特点包括:

1. 数据分片:将数据分成多个片段并存储在不同的节点上,以提高性能和负载均衡。

2. 数据复制:每个主节点都会有多个从节点,用于数据的备份和复制,以增加数据的可靠性和容错性。

3. 节点协调:有一个特殊的节点作为集群的主节点,负责监控和协调其他节点的状态和数据分布,以保持集群的正常运行。

4. 故障转移:当主节点发生故障时,从节点会自动选举一个新的主节点来接管服务,以实现高可用性和容错性。

5. 节点间通信:节点之间通过内部的二进制协议进行通信,以传输数据和同步状态。


使用Redis集群可以实现数据的高可用性和性能的提升,因为数据被分布在多个节点上,可以并行处理请求,同时通过数据的复制和故障转移,可以提供持久性和容错性。此外,Redis集群还支持自动的故障检测和修复机制,可以在节点故障或网络分区的情况下保持服务的可用性。


一、概述


Redis3.0版本以上开始支持cluster,采用的是hashslot(hash槽),可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散到群集的多台机器上。


当客户端向群集中任一节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己。如果键所在的槽正好指派给了当前节点,那么节点直接执行这个命令;如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)正确的节点,并再次发送之前想要执行的命令.


群集角色有Master和Slave.Master之间分配slots,一共16384个slot,Slave向它指定的Master 同步数据,实现备份。当其中的一个Master无法提供服务时,该Master的Slave将提升为Mester,以保证群集间 slot 的完整性,当其中的某一个Master和它的Slave都失效,导致了slot不完整,群集失效,这时就需要人工去处理了。


群集搭建好后,群集中的每个节点都会定期地向其他节点发送PING消息,如果接收PONG消息的节点没有在规定的时间内返回PONG 消息,那么发送PNG消息的节点就会将其标记为疑似下线(probable fail,PFAL)。各个节点会通过互相发送消息的方式来交换群集中各个节点的状态信息。如果在一个群集里面,半数以上的主节点都将某个主节点×报告为疑似下线,那么这个主节点×将被标记为已下线(FAL),同时会向群集广播一条关于主节点×的FAL消息,所有收到这条FAL消息的节点都会立即将主节点×标记为已下线。


当需要减少或者增加群集中的机器时,我们需要将已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且将相关槽所属的键值对从源节点移动到目标节点。


Redis群集的重新分片操作是由Redis的群集管理软件redis—trib负责执行的,不支持自动的分片,而且需要自己计算从哪些节点上迁移多少 Slot。在重新分片的过程中,群集不需要下线,并且源节点和目标节点都可以继续处理命令请求。


Redis Cluster是一个无中心的结构,每个节点都保存数据和整个群集的状态。每个节点都会保存其他节点的信息,知道其他节点所负责的槽,并且会与其他节点定时发送心跳信息,能够及时感知群集中异常的节点。

二、架构细节


架构细节:

   (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

   (2)节点的失效(fail)在群集中超过半数的主(master)节点检测失效时才生效。

   (3)客户端与 redis 节点直连,不需要中间代理(proxy)层,客户端不需要连接群集所有节点,连接群集中任何一个可用节点即可。

   (4)redis-cluster 把所有的物理节点映射到【0-16383】slot 上,cluster 负责维护 node<->slot<->key。

三、选举过程


1.选举过程是群集中所有master参与,如果半数以上master节点与当前 master 节点通信超时(cluster—node—timeout),认为当前 master 节点挂掉。以下两种情况为整个群集不可用(cluster_state:fail),当群集不可用时,所有对群集的操作都不可用,收到((error)CLUSTEFDOWN The cluster is down)错误。


2.如果群集任意 master挂掉,且当前 master 没有 slave,则群集进入 fail状态,也可以理解成群集的slot映射【0 ~16383】不完整时进入fail状态。


3.如果群集中超过半数的master挂掉,无论是否有slave,群集都进入 fail状态。


4.默认情况下,每个群集的节点都使用两个TCP端口.一个是6379,一个是16379;6379服务于客户端的连接,16379 用于群集总线,即使用二进制协议的节点到节点通信通道。节点使用群集总线进行故障检测、配置更新、故障转移授权等。如果开启了防火墙,需要开放这两个端口。

四、搭建


这里我以分布式搭建的形式来搭建:

1、准备三台主机IP分别设置为192.168.115.128  ;192.168.115.129 ; 192.168.115.130

2、分别设置防火墙、selinux、图形化,并且互相测试通联性

3、三台主机上安装REDIS

1. yum -y install epel-release.noarch
2. yum -y install redis

4、在每台主机上配置REDIS

                复制配置文件/etc/redis.conf

mkdir /etc/redis
cp /etc/redis.conf /etc/redis1_6379.conf
cp /etc/redis.conf /etc/redis2_6380.conf
#####在其他主机上也是一样的的操作,不过我们需要注意的是修改文件名用来区分:例如在192.168.115.129主机上可以
cp /etc/redis.conf /etc/redis3_6379.conf
cp /etc/redis.conf /etc/redis4_6379.conf

5、 分别编辑复制的配置文件

1. vim /etc/redis1_6379.conf
2. vim /etc/redis2_6380.conf

在这里我们需要修改的地方如下:

protected-mode yes

port 对应的端口号


bind 192.168.115.128

修改对应的监听地址


daemonize yes

允许后台启动


dir /var/lib/redis/redis1_6379/

修改目录,并在命令行创建对应的新目录


修改完成后我们修改/etc/redis2_6380.conf 包括其他主机上对应的配置文件,都按照此方法进行配置(注意端口、ip地址)

6、启动服务验证是否正常


1. 启动:
2. redis-server /etc/redis/redis1_6379.conf
3. redis-server /etc/redis/redis2_6380.conf 
4. 验证:
5. netstat -anput | grep redis

同理验证其他主机上的REDIS是否正常启动:


由此可验证所有服务启动正常,可以进行下一步试验


7、修改配置文件,开启集群功能

与上步一样,依次修改我们的配置文件

1. vim /etc/redis1_6379.conf
2. vim /etc/redis2_6380.conf

主要修改位置

cluster-enabled yes //开启集群功能
cluster-config-file nodes-6379.conf// 修改我们的配置文件名
cluster-node-timeout 15000 //超时时间

通过此步骤修改我们所有的其他配置文件,并且要注意文件名要修改成对应的


8、重启REDIS


kill REDIS的进程号


重启:

redis-server /etc/redis/redis1_6379.conf
redis-server /etc/redis/redis2_6380.conf


查看端口:

192.168.115.128


192.168.115.129


192.168.115.130


9、在192.168.115.128的6379端口登录并将其他的REDIS端加入集群


登录:

redis-cli -h 192.168.115.128 -p 6379

  把除了当前登录状态之外的REDIS加入集群(REDIS内操作):

CLUSTER MEET 192.168.115.128 6380

10、按照要求为master分配哈希槽


在命令行操作:

redis-cli -h 192.168.115.128 -p 6379 cluster addslots {0..5461}
redis-cli -h 192.168.115.129 -p 6380 cluster addslots {5462..10922}
redis-cli -h 192.168.115.130 -p 6380 cluster addslots {10923..16383}

11、依据实验要求建立主从关系

登录REDIS:

redis-cli -h 192.168.115.128 -p 6379

查看UUID号:

cluster nodes

根据UUID进行配对:

redis-cli -h IP地址 -p端口号 cluster replicate UUID号 ##(IP写slave的 UUID写master)

12、登录REDIS进行查看

登录:

redis-cli -h 192.168.115.128 -p 6379

查看:

cluster info

翻译结果如下:


集群状态:正常


已分配的槽位数量:16384


正常的槽位数量:16384


故障预测的槽位数量:0


失败的槽位数量:0


已知节点数量:6


集群大小:3


当前集群纪元:5


我的集群纪元:1


发送的ping消息数量:5841


发送的pong消息数量:5764


发送的meet消息数量:5


发送的消息总数:11610


接收的ping消息数量:5764


接收的pong消息数量:5846


接收的消息总数:1610

查看:

cluster nodes

查看端口:


##如果此处操作有误,主从建立有误使用cluster reset重置集群cluster reset命令可以重置整个集群,包括哈希槽位。执行cluster reset命令后,集群将会被重置为初始状态,所有的哈希槽位将会被重新分配。请注意,执行cluster reset命令会导致集群中的数据丢失,请谨慎操作。)

测试:

配置完成。


总结

     在进行配置时要注意的是每完成一步验证一步,这样就算出错了也能找出在哪一个环节。另外修改配置文件时重复性高,要仔细一些;在分配哈希槽时是分配给master,确立主从关系时要注意我们的关系要捋清楚。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 NoSQL Java
flea-cache使用之Redis集群模式接入
【1月更文挑战第2天】本篇博文介绍笔者 flea-framework 下的 flea-cache 模块中的Redis集群模式接入
39 1
flea-cache使用之Redis集群模式接入
|
26天前
|
运维 NoSQL 算法
Redis-Cluster 与 Redis 集群的技术大比拼
Redis-Cluster 与 Redis 集群的技术大比拼
24 0
|
2月前
|
机器学习/深度学习 NoSQL Redis
Redis高可用之集群架构(第三部分)
Redis高可用之集群架构(第三部分)
|
2月前
|
存储 NoSQL Redis
Redis+SpringBoot企业版集群实战------【华为云版】(上)
Redis+SpringBoot企业版集群实战------【华为云版】
46 0
|
3天前
|
NoSQL 测试技术 Redis
六步操作教你轻松搭建Redis集群
Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Redis集群。本文参考了Rdis的官方文档和使用Redis官方提供的Redis Cluster工具搭建Rdis集群。
15 0
|
2月前
|
NoSQL 前端开发 Redis
Redis 集群面试题
Redis 集群面试题
28 0
|
2月前
|
NoSQL Linux Redis
Redis 6.X Cluster 集群搭建
Redis 6.X Cluster 集群搭建
27 0
|
2月前
|
监控 NoSQL 程序员
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
70 5
|
2月前
|
NoSQL Linux Redis
Redis 6.X Sentinel 哨兵集群搭建
Redis 6.X Sentinel 哨兵集群搭建
26 5
|
2月前
|
存储 负载均衡 NoSQL
Redis的集群模式是什么?它的优点和缺点是什么?
Redis的集群模式是什么?它的优点和缺点是什么?
29 0