百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis Cluster集群

mhr18 2024-11-21 18:00 18 浏览 0 评论

Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时,就可以采用Cluster架构达到负载均衡目的。官方文档:https://redis.io/topics/cluster-tutoria

 Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案:
 Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:

2.1.redis cluster特点

 1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
 2.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
 3.节点的fail是通过集群中超过半数的节点检测失效时才生效。

2.2redis-cluster数据分布

Redis集群中有16384个哈希槽,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。

2.3数据分布存储原理

Redis 集群使用数据分片(sharding)来实现:Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数(集群使用公式 CRC16(key) % 16384),这样每个key 都会对应一个编号在 0-16384 之间的哈希槽,那么redis就会把这个key 分配到对应范围的节点上了。同样,当连接三个节点任何一个节点想获取这个key时,也会这样的算法,然后内部跳转到存放这个key节点上获取数据。

例如三个节点:哈希槽分布的值如下:

 cluster1:  0-5460
 cluster2:  5461-10922
 cluster3:  10923-16383

这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:

  • 如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
  • 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。

因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。

3、Redis Cluster主从模式

 redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,
主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点
选取一个来充当主节点,从而保证集群不会挂掉.
 
 ?
 ?
 2.什么时候整个集群就不能用了?
 如果集群任意一个主节点挂掉,且当前主节点没有从节点,则集群将无法继续,因为我们不再有办法为这个节点承担范围内的哈希槽提供服务。但是,如果这个主节点和所对应的从节点同时失败,则Redis Cluster无法继续运行。

二、集群部署

 环境准备:
 1.准备三机器,关闭防火墙和selinux
 2.制作解析并相互做解析。
 注:规划架构两种方案,一种是单机多实例,这里我们采用多机器部署:
 三台机器,每台机器上面两个redis实例,一个master一个slave,第一列做主库,第二列做备库
 #记得选出控制节点
 ?
 redis-cluster1 192.168.116.172   7000、7001
 redis-cluster2 192.168.116.173   7002、7003
 redis-cluster3 192.168.116.174   7004、7005

1.三台机器相同操作

 1.安装redis
 [root@redis-cluster1 ~]# mkdir /data
 [root@redis-cluster1 ~]# yum -y install gcc automake autoconf libtool make
 [root@redis-cluster1 ~]# wget https://download.redis.io/releases/redis-6.2.0.tar.gz
 [root@redis-cluster1 ~]# tar xzvf redis-6.2.0.tar.gz -C /data/
 [root@redis-cluster1 ~]# cd /data/
 [root@redis-cluster1 data]# mv redis-6.2.0/ redis
 [root@redis-cluster1 data]# cd redis/
 [root@redis-cluster1 redis]# make    #编译
 [root@redis-cluster1 redis]# mkdir /data/redis/data #创建存放数据的目录
 2.创建节点目录:按照规划在每台redis节点的安装目录中创建对应的目录(以端口号命名)
 [root@redis-cluster1 redis]# pwd
 /data/redis
 [root@redis-cluster1 redis]# mkdir cluster #创建集群目录
 [root@redis-cluster1 redis]# cd cluster/
 [root@redis-cluster1 cluster]# mkdir 7000 7001 #创建节点目录
 ?
 [root@redis-cluster2 redis]# mkdir cluster
 [root@redis-cluster2 redis]# cd cluster/
 [root@redis-cluster2 cluster]# mkdir 7002 7003
 ?
 [root@redis-cluster3 redis]# mkdir cluster
 [root@redis-cluster3 redis]# cd cluster/
 [root@redis-cluster3 cluster]# mkdir 7004 7005
 3.拷贝配置文件到节点目录中,#三台机器相同操作
 [root@redis-cluster1 cluster]# cp /data/redis/redis.conf 7000/
 [root@redis-cluster1 cluster]# cp /data/redis/redis.conf 7001/
 ?
 [root@redis-cluster2 cluster]# cp /data/redis/redis.conf 7002/
 [root@redis-cluster2 cluster]# cp /data/redis/redis.conf 7003/
 ?
 [root@redis-cluster3 cluster]# cp /data/redis/redis.conf 7004/
 [root@redis-cluster3 cluster]# cp /data/redis/redis.conf 7005/
 4.修改集群每个redis配置文件。(主要是端口、ip、pid文件,三台机器相同操作),修改如下:
 [root@redis-cluster1 cluster]# cd 7000/
 [root@redis-cluster1 7000]# vim redis.conf #修改如下
 bind 192.168.116.172  #每个实例的配置文件修改为对应节点的ip地址
 port 7000   #监听端口,运行多个实例时,需要指定规划的每个实例不同的端口号
 daemonize yes #redis后台运行
 pidfile /var/run/redis_7000.pid #pid文件,运行多个实例时,需要指定不同的pid文件
 logfile /var/log/redis_7000.log #日志文件位置,运行多实例时,需要将文件修改的不同。
 dir /data/redis/data #存放数据的目录
 appendonly yes #开启AOF持久化,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
 appendfilename "appendonly.aof"  #AOF文件名称
 appendfsync everysec #表示对写操作进行累积,每秒同步一次
 以下为打开注释并修改
 cluster-enabled yes #启用集群
 cluster-config-file nodes-7000.conf #集群配置文件,由redis自动更新,不需要手动配置,运行多实例时请注修改为对应端口
 cluster-node-timeout 5000 #单位毫秒。集群节点超时时间,即集群中主从节点断开连接时间阈值,超过该值则认为主节点不可以,从节点将有可能转为master
 cluster-replica-validity-factor 10 #在进行故障转移的时候全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了导致数据过于陈旧,不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。(计算方法为:cluster-node-timeout * cluster-replica-validity-factor,此处为:5000 * 10 毫秒)
 cluster-migration-barrier 1 #一个主机将保持连接的最小数量的从机,以便另一个从机迁移到不再被任何从机覆盖的主机
 cluster-require-full-coverage yes #集群中的所有slot(16384个)全部覆盖,才能提供服务
 ?
 #注:
 所有节点配置文件全部修改切记需要修改的ip、端口、pid文件...避免冲突。确保所有机器都修改。
 5.启动三台机器上面的每个节点(三台机器相同操作)
 [root@redis-cluster1 ~]# cd /data/redis/src/
 [root@redis-cluster1 src]# ./redis-server ../cluster/7000/redis.conf 
 [root@redis-cluster1 src]# ./redis-server ../cluster/7001/redis.conf
 ?
 [root@redis-cluster2 7003]# cd /data/redis/src/
 [root@redis-cluster2 src]# ./redis-server ../cluster/7002/redis.conf 
 [root@redis-cluster2 src]# ./redis-server ../cluster/7003/redis.conf
 ?
 [root@redis-cluster3 7005]# cd /data/redis/src/
 [root@redis-cluster3 src]# ./redis-server ../cluster/7004/redis.conf 
 [root@redis-cluster3 src]# ./redis-server ../cluster/7005/redis.conf

查看端口

 6.创建集群:在其中一个节点操作就可以
 redis节点搭建起来后,需要完成redis cluster集群搭建,搭建集群过程中,需要保证6个redis实例都是运行状态。
 Redis是根据IP和Port的顺序,确定master和slave的,所以要排好序,再执行。
 ?
 参数:
 --cluster-replicas 1:表示为集群中的每个主节点创建一个从节点.书写流程:主节点ip+port 对应一个从节点ip+port(注意:若节点在不同的机器上,注意主节点的书写位置,要避免主节点在同一台机器上,影响性能。正常是前面三个节点为主节点,后面的为从节点)
 ?
 [root@redis-cluster1 src]# cd /data/redis/src/
 [root@redis-cluster1 src]# ./redis-cli --cluster create --cluster-replicas 1 192.168.116.172:7000 192.168.116.172:7001 192.168.116.173:7002 192.168.116.173:7003 192.168.116.174:7004 192.168.116.174:7005
 >>> Performing hash slots allocation on 6 nodes...
 Master[0] -> Slots 0 - 5460
 Master[1] -> Slots 5461 - 10922
 Master[2] -> Slots 10923 - 16383
 Adding replica 192.168.116.173:7003 to 192.168.116.172:7000
 Adding replica 192.168.116.174:7005 to 192.168.116.173:7002
 Adding replica 192.168.116.172:7001 to 192.168.116.174:7004
 M: de5b4b2f6a559362ed56d4de1e3994fd529917b5 192.168.116.172:7000
    slots:[0-5460] (5461 slots) master
 S: 2e8c1caa63ac4a1b9a6eea4f0fd5eab4c6b73c21 192.168.116.172:7001
    replicates 60e3755761c9cbdacb183f59e3d6205da5335e86
 M: e0370608cd33ddf5bb6de48b5627799e181de3b6 192.168.116.173:7002
    slots:[5461-10922] (5462 slots) master
 S: 4035841f20f07674671e6bff5d4c6db99c00626b 192.168.116.173:7003
    replicates de5b4b2f6a559362ed56d4de1e3994fd529917b5
 M: 60e3755761c9cbdacb183f59e3d6205da5335e86 192.168.116.174:7004
    slots:[10923-16383] (5461 slots) master
 S: e200afc33b10bd6975160bfeda7277d02371981a 192.168.116.174:7005
    replicates e0370608cd33ddf5bb6de48b5627799e181de3b6
 Can I set the above configuration? (type 'yes' to accept): yes  #写yes同意
 >>> Nodes configuration updated
 >>> Assign a different config epoch to each node
 >>> Sending CLUSTER MEET messages to join the cluster
 Waiting for the cluster to join
 .
 >>> Performing Cluster Check (using node 192.168.116.172:7000)
 M: de5b4b2f6a559362ed56d4de1e3994fd529917b5 192.168.116.172:7000
    slots:[0-5460] (5461 slots) master
    1 additional replica(s)
 M: e0370608cd33ddf5bb6de48b5627799e181de3b6 192.168.116.173:7002
    slots:[5461-10922] (5462 slots) master
    1 additional replica(s)
 S: 2e8c1caa63ac4a1b9a6eea4f0fd5eab4c6b73c21 192.168.116.172:7001
    slots: (0 slots) slave
    replicates 60e3755761c9cbdacb183f59e3d6205da5335e86
 M: 60e3755761c9cbdacb183f59e3d6205da5335e86 192.168.116.174:7004
    slots:[10923-16383] (5461 slots) master
    1 additional replica(s)
 S: 4035841f20f07674671e6bff5d4c6db99c00626b 192.168.116.173:7003
    slots: (0 slots) slave
    replicates de5b4b2f6a559362ed56d4de1e3994fd529917b5
 S: e200afc33b10bd6975160bfeda7277d02371981a 192.168.116.174:7005
    slots: (0 slots) slave
    replicates e0370608cd33ddf5bb6de48b5627799e181de3b6
 [OK] All nodes agree about slots configuration.
 >>> Check for open slots...
 >>> Check slots coverage...
 [OK] All 16384 slots covered.
 7.查看集群状态可连接集群中的任一节点,此处连接了集群中的节点192.168.116.172:7000
 #登录集群客户端,-c标识以集群方式登录
 [root@redis-cluster1 src]# ./redis-cli -h 192.168.116.172 -c -p 7000
 192.168.116.172:7000> ping
 PONG
 192.168.116.173:7002> cluster info  #查看集群信息
 cluster_state:ok  #集群状态
 cluster_slots_assigned:16384 #分配的槽
 cluster_slots_ok:16384
 cluster_slots_pfail:0
 cluster_slots_fail:0
 cluster_known_nodes:6 #集群实例数
 ......
 ?
 192.168.116.172:7000> cluster nodes  #查看集群实例



相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: