一文聊聊Redis中的Cluster集群

本篇文章给大家介绍一下redis中的cluster集群,看看tcp端口、数据分片,了解一下如何利用docker搭建一个三主三从的redis集群。

一文聊聊Redis中的Cluster集群

Redis Cluster (Redis集群)

Redis Cluster是Redis的分布式实现。当我们传输数据到 Redis Cluster,数据会自动分片,存储到各个Redis节点上。【相关推荐:Redis视频教程】

Redis Cluster相对于单点Redis,可以在一些节点出现故障或无法通信时继续运行。但是,如果服务器出现较大故障(例如,超过一半以上的服务器不可用),群集将停止运行。

Redis Cluster TCP端口

每个Redis群集节点都需要打开两个TCP连接。一是用于服务客户端的常规TCP端口,默认为6379。第二个端口用于群集总线,默认设置16379,二进制协议的节点到节点通信通道。节点利用群集总线用于故障检测,配置更新,故障转移授权等。

客户端永远不要尝试与群集总线端口进行通信,而应始终与普通的Redis命令端口进行通信,但是请确保同时打开防火墙中的两个端口,否则Redis群集节点将无法进行通信。命令端口和集群总线端口的偏移量是固定的,并且始终为10000。如果没有同时打开两个TCP端口,则群集将无法正常工作。集群总线使用不同的二进制协议进行节点到节点的数据交换,它更适合于用很少的带宽和处理时间在节点之间交换信息。

Redis Cluster数据分片

Redis Cluster不使用一致性哈希,而是使用一种叫哈希槽hash_slot的东西。

Redis群集中有16384个哈希槽,当我们在Redis中存储一对Key-Value时,要计算给定Key的哈希槽。方法是先计算Key的CRC16,然后对计算出的结果取模16384:

hash_slot = CRC16(key) mod 16384

Redis群集中的每个Redis节点都负责哈希槽的子集,因此,如果有一个包含3个节点的群集,其中:

节点A包含从0到5500的哈希槽。节点B包含从5501到11000的哈希槽。节点C包含从11001到16383的哈希槽。

这样可以轻松添加和删除集群中的节点。例如,如果我想添加一个新节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从群集中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。

因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加或删除或者更改节点持有的哈希槽的占比不需要任何停机时间。

接下来我们利用docker搭建一个三主三从的Redis集群。

使用Docker搭建RedisCluster

Redis配置

port ${PORT}                                       ##节点端口protected-mode no                                  ##开启集群模式cluster-enabled yes                                ##cluster集群模式cluster-config-file nodes.conf                     ##集群配置名cluster-node-timeout 5000                          ##超时时间cluster-announce-ip 192.168.1.XX                   ##实际为各节点网卡分配ip  先用一个ip代替cluster-announce-port ${PORT}                      ##节点映射端口cluster-announce-bus-port 1${PORT}                 ##节点总线端口appendonly yes                                     ##持久化模式

登录后复制

创建自定义network

docker network create redis-net

登录后复制

自定义路径

mkdir -p /usr/redis_clustercd /usr/redis_cluster

登录后复制

在自定义路径下生成成conf和data目标,并生成配置信息

for port in `seq 6001 6006`; do    mkdir -p ./${port}/conf    touch ./${port}/conf/redis.conf     mkdir -p ./${port}/data     echo "port ${port}" >>./${port}/conf/redis.conf    echo "protected-mode no" >>./${port}/conf/redis.conf    echo "cluster-enabled yes" >>./${port}/conf/redis.conf    echo "cluster-config-file nodes.conf" >>./${port}/conf/redis.conf    echo "cluster-node-timeout 5000" >>./${port}/conf/redis.conf    echo "cluster-announce-ip 192.168.1.XX" >>./${port}/conf/redis.conf    echo "cluster-announce-port ${port}" >>./${port}/conf/redis.conf    echo "cluster-announce-bus-port 1${port}" >>./${port}/conf/redis.conf    echo "appendonly yes" >>./${port}/conf/redis.confdone

登录后复制cluster-announce-ip 192.168.1.XX 中的IP必须是容器间通信的ip,之后可以在之前新增的network中查看。共生成6个文件夹,从6001到6006,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。

启动Redis容器

for port in `seq 6001 6006`; do   docker run -d --privileged=true -p ${port}:${port} -p 1${port}:1${port}  -v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf   -v $PWD/${port}/data:/data   --restart always --name redis-${port} --net redis-net   redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf; done

登录后复制

启动集群

# 进入任意Redis容器docker exec -it redis-6001 /bin/bash# 初始化Redis集群命令redis-cli --cluster create 172.19.0.2:6601 172.19.0.3:6602 172.19.0.4:6603 172.19.0.5:6604 172.19.0.6:6605 172.19.0.7:6606 --cluster-replicas 1

登录后复制创建成功后我们可以使用redis-cli命令连接到其中一个Redis服务.

# 单机模式启动redis-cli -h 127.0.0.1 -p 6001# 集群模式启动redis-cli -c -h 127.0.0.1 -p 6001

登录后复制之后通过cluster nodes命令可以查看节点信息,发现符合3主3从的预期

参考文档

Redis官方文档

更多编程相关知识,请访问:编程视频!!

以上就是一文聊聊Redis中的Cluster集群的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2040484.html

(0)
上一篇 2025年2月24日 00:13:23
下一篇 2025年2月24日 00:13:43

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何利用Redis高效获取和缓存产品排行榜详细信息?

    Redis缓存方案:高效获取产品排行榜详情 高效利用Redis缓存产品排行榜数据至关重要。假设已有一个包含前20个产品ID的Redis有序集合(zset),本文将探讨如何进一步优化缓存方案,高效获取和缓存产品详细信息。 首先,排行榜前20个…

    2025年4月5日
    100
  • JSON序列化与JDK序列化在存储和效率上的差异有哪些?

    JSON序列化与JDK序列化:存储与效率差异分析 Redis应用中,开发者常青睐JSON序列化,认为其效率更高、存储空间更小。然而,实践中并非总是如此,例如Pig框架的OAuth2实现就选择了JDK序列化存储token。本文将深入探讨JSO…

    2025年4月5日
    300
  • JSON序列化与JDK序列化在存储上的差异是什么?

    JSON序列化与JDK序列化:存储空间差异分析 本文探讨JSON序列化和JDK序列化两种常用方法在数据存储方面的差异。在Redis等存储系统中,选择合适的序列化方式至关重要,因为它直接影响存储效率和空间占用。 背景: 笔者在学习Redis过…

    2025年4月5日
    200
  • 如何优化Debian JS日志查询速度

    提升 Debian 系统 JavaScript (JS) 应用日志查询速度,需要多方面协同优化。以下策略能有效改善查询效率: 一、选择高效日志管理工具 rsyslog 或 syslog-ng: 这些系统日志服务比轻量级工具更高效,支持日志轮…

    2025年4月5日
    200
  • Java框架性能优化常见问题解答

    Java 框架性能优化常见问题解答 引言 在高并发和数据吞吐量高的系统中,Java 框架的性能优化至关重要。本文探讨了一些常见的性能优化问题及其对应的解决方案。 1. 数据库连接管理 立即学习“Java免费学习笔记(深入)”; 问题:应用程…

    2025年4月2日
    100
  • 利用分布式缓存优化Java框架的性能

    分布式缓存通过存储常用数据,可有效提升 java 应用程序性能。使用 redis 作为缓存,添加 redis 客户端库后即可应用。实战案例中,通过缓存用户信息,大幅提升获取速度,因为多数情况下可直接从缓存中获取数据,减少数据库查询次数。 利…

    2025年4月2日
    100
  • java延时队列怎么做

    Java延时队列是一种允许延迟插入元素的队列。实现方法包括:延迟任务调度器(适用于较短延迟)优先级队列和定时器(适用于较长延迟)Redis ZSet(优先级队列的实现)Apache ActiveMQ Delayed Delivery(适用于…

    2025年4月2日
    100
  • 哪些开源替代品具有独特的特性和优势?

    postgresql、mongodb、redis 和 mariadb 等开源数据库引擎提供独特的特性和优势:postgresql:可扩展性、安全性、jsonb 支持mongodb:文档结构、分布式架构、云服务redis:内存数据库、键值存储…

    2025年4月2日
    100
  • java分布式锁怎么用

    在分布式系统中使用分布式锁可以保证共享资源在同一时间只有一个客户端访问,以维护数据一致性和完整性。Java中常见的实现方式包括ZooKeeper、Redis和etcd。使用分布式锁的一般步骤包括获取锁、执行操作和释放锁。需要注意死锁、性能和…

    2025年4月2日
    200
  • 开源替代品是否有任何潜在的风险或限制?

    采用开源替代品时应注意潜在风险和局限性:安全性风险:开源软件的公开源代码可能为恶意行为者提供利用漏洞的机会。支持有限:开源软件通常由社区提供支持,问题解决和新功能请求可能需要较长时间。功能限制:开源软件可能缺少专有软件中某些功能或特性。性能…

    2025年4月2日
    100

发表回复

登录后才能评论