Redis集群安装之分片集群

news2025/1/12 6:07:22

1.为什么使用分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

  • 海量数据存储问题
  • 高并发写的问题 哨兵模式本质是依旧是主从模式,在主从模式下我们可以增加slave节点来拓展读并发能力,但是没办法扩展写能力和存储能力。

使用分片集群可以解决上述问题,分片集群特征:

  • 集群中有多个master,每个master保存不同数据。
  • 每个master都可以有多个slave节点。
  • master之间通过ping监测彼此健康状态。
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点。

2.分片集群介绍

分片集群是将多个Redis主从结构联合起来,每个主从结构具有一个主实例和多个从实例。Redis的分片集群可以在数据量不断增大的情况下进行水平扩容,将键值放在指定的实例中,以此来降低系统对单主节点的依赖,从而提高Redis服务的读写性能。

在这里插入图片描述

3.散列插槽

Redis会把每一个master节点映射到0~1638316384个插槽(hash slot)上。哈希槽类似于数据分区,每个键值对都会根据它的key,被映射到一个哈希槽中,具体执行过程分为两大步:

  • 根据键值对的key,按照CRC16算法计算一个16bit的值
  • 再用16bit值对16384取模,得到0~16383范围内的模数,每个模数代表一个相应编号的哈希槽 每个Redis节点负责处理一部分槽位,假如集群中有master节点ABC,每个节点负责的槽位范围如下:
master节点处理槽位
A0-5460
B5461-10922
C10923-16383

在这里插入图片描述

查看集群信息时就能看到:

注意:**数据key不是与节点绑定,而是与插槽绑定。**这样绑定的好处是,当集群发生扩容增加节点或者宕机减少了master节点,Redis能够更加方便的将插槽转移到仍然存活的节点上,数据跟随插槽转移,使得我们能够找到原本数据所在的位置。

Redis会根据key的有效部分计算插槽值,分两种情况:

  • key中包含"{}“,且”{}“中至少包含1个字符,”{}"中的部分是有效部分
  • key中不包含"{}",整个key都是有效部分

4.搭建分片集群

4.1.集群结构

分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:

在这里插入图片描述

这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:

IPPORT角色
10.0.4.107001master
10.0.4.107002master
10.0.4.107003master
10.0.4.108001slave
10.0.4.108002slave
10.0.4.108003slave

4.2.准备实例和配置

删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:

# 进入/home/redis目录
cd /home/redis
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003

/home/redis下准备一个新的redis.conf文件,内容如下:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /home/redis/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /home/redis/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 10.0.4.10
# 保护模式
protected-mode no
# 数据库数量
databases 16
# 日志
logfile /home/redis/6379/run.log

将这个文件拷贝到每个目录下:

# 进入/home/redis
cd /home/redis
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:

# 进入/home/redis目录
cd /home/redis
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

4.3.启动

因为已经配置了后台启动模式,所以可以直接启动服务:

# 进入/home/redis目录
cd /home/redis
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通过ps查看状态:

ps -ef | grep redis

发现服务都已经正常启动:

在这里插入图片描述

如果要关闭所有进程,可以执行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill

或者(推荐这种方式):

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

4.4.创建集群

虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。

我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。

1)Redis5.0之前

Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。

# 安装依赖
yum -y install zlib ruby rubygems
gem install redis

然后通过命令来管理集群:

# 进入redis的src目录
cd /home/redis/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 10.0.4.10:7001 10.0.4.10:7002 10.0.4.10:7003 10.0.4.10:8001 10.0.4.10:8002 10.0.4.10:8003

2)Redis5.0以后

我们使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:

redis-cli --cluster create --cluster-replicas 1 10.0.4.10:7001 10.0.4.10:7002 10.0.4.10:7003 10.0.4.10:8001 10.0.4.10:8002 10.0.4.10:8003

命令说明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
  • create:代表是创建集群
  • --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

运行后的样子:

在这里插入图片描述

这里询问是否按照上面列出的方式创建集群?如果没有问题,输入yes,则集群开始创建:

在这里插入图片描述

通过命令可以查看集群状态:

redis-cli -p 7001 cluster nodes

在这里插入图片描述

4.5.测试

尝试连接7001节点,存储一个数据:

# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1

结果悲剧了:

在这里插入图片描述

集群操作时,需要给redis-cli加上-c参数才可以:

redis-cli -c -p 7001

这次可以了:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目笔记-瑞吉外卖(全)

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能:star:4.1代码实现 5.退出功能6.页面效果出现 day021.完善登录功能2.新增员工功能3.启用禁用员工信息:star:(自定义消息转换器使用)4.编辑员工信息 day031.公共字段自动填充2.新增分类…

第11届蓝桥杯Scratch国赛真题集锦

编程题 第 1题 问答题 3D打印小猫 题目说明 背景信息:3D打印技术,它与普通打印工作原理基本相同,打印机内装有液体或粉未等“打印材料”,与电脑连接后,通过电脑控制把“打印材料”一层层叠加起来,最终把计算机上的蓝图变成实物。 编程实现:通过滑杆控制小猫造型变化,按下…

聚类算法以及聚类算法模型评估的介绍

一、聚类算法的介绍 1.什么是聚类算法 聚类算法是一类无监督学习算法,用于将数据集中的对象分组(或聚类)成具有相似性的集合。聚类算法不依赖于预定义的类别标签,而是根据数据的内在特点将相似的数据点聚集在一起。聚类算法的目…

分布式网络通信框架(三)——protobuf使用案例

例子1 test.proto文件如下: syntax "proto3"; // 声明了protobuf版本package fixbug; // 声明了代码所在的包(生成C代码后就是namespace 名字)// 定义登录消息类型 message LoginRequest {string name 1; // 1 代表name是这个m…

详解uni-app项目运行在安卓真机调试

详解uni-app项目运行在安卓真机调试 uni-app项目运行在安卓真机调试 文章目录 详解uni-app项目运行在安卓真机调试前言为什么要用真机调试?真机调试操作步骤总结 前言 UNI-APP学习系列之详解uni-app项目运行在安卓真机调试 为什么要用真机调试? 因为安…

mybatis-plus实现非法sql拦截(防止全表更新与删除)

文章目录 什么是非法sql:拦截的意义是:使用:1、在pom文件中添加依赖2、注入MybatisPlusInterceptor类,并配置BlockAttackInnerInterceptor拦截器 测试: 什么是非法sql: 不带where子句的delete和update&…

C++反向迭代器

C反向迭代器 📟作者主页:慢热的陕西人 🌴专栏链接:C 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容介绍反向迭代器的概念和模拟实现一个通用的反向…

HTB-Escape

HTB-Escape 信息收集立足sql_svc -> RyanRyan -> Administrator扩展NTLM简单介绍 信息收集 可以从中获取两个域名。 看看 rpc服务是否有可以收集的信息。 看看samba。 rpc的Public共享文件有一个关于SQL Server的pdf。 阅读它! 从中能得到几个用户名…

unix环境高级编程 第一章 UNIX基础知识 Go实现代码

ls命令的Go语言实现 package mainimport ("fmt""os" )func main() {if len(os.Args) ! 2 {panic("参数数量不足")}targetPath : os.Args[1]if dirList, err : os.ReadDir(targetPath); err nil {for _, dirInfo : range dirList {fmt.Println(…

SpringBoot集成ElasticSearch

文章目录 前言一、ElasticSearch本地环境搭建二、SpringBoot整合ElasticSearch1.pom中引入ES依赖2.application.yaml配置elasticsearch3.ElasticSearchClientConnect连接ES客户端工具类4.ElasticSearchResult封装响应结果5.Person实体类6.Person实体类7.ElasticsearchControlle…

OS之磁盘调度算法

目录 一、先来先服务(FCFS) 基本思想 案例 二、最短寻道时间优先(SSTF) 基本思想 案例 饥饿现象 三、扫描算法(SCAN) 基本思想 案例 四、循环扫描算法(CSCAN) 基本思想 案例 一、先来先服务(FCFS) 基本思想 根据进程请求访问磁盘的先后次序来进行调度 案例 二、…

数据结构与算法04:队列

目录 什么是队列? 循环队列 双端队列 阻塞队列 队列的应用场景 每日一练 什么是队列? 在 上一篇文章 中讲述了栈:先进后出就是栈,队列刚好相反,先进先出的数据结构就是队列,还是拿纸箱子来举例&…

《数据库应用系统实践》------ 校友会信息系统

系列文章 《数据库应用系统实践》------ 校友会信息系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构(需包含功能结构框图和模块说明)3.系统功能简介 二、概念模型设计1.基本要素(符号介绍说明&#x…

DJ6-6/7 文件共享和访问控制、文件保护

目录 6.6 文件共享和访问控制 1、同时存取 2、存取权限 3、文件共享的实现 6.6.1 基于索引结点的共享方式 1、基本思想 2、具体操作 6.6.2 利用符号链接实现文件共享 6.6.3 利用 URL 实现文件共享 6.7 文件保护 6.6 文件共享和访问控制 文件共享的有效控制涉及…

腾讯云服务器可用区是什么?怎么选择随机吗?

腾讯云服务器可用区什么意思?可用区(Zone)是指腾讯云在同一地域内电力和网络互相独立的物理数据中心,一个可用区故障不会影响另一个可用区的正常运行,所以可用区用于构建高容灾、高可靠性应用。腾讯云服务器网来详细说…

如何在华为OD机试中获得满分?Java实现【截取字符串】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

PCA主成分分析 | 机器学习

1、概述(Principal componet analysis,PCA) 是一种无监督学习方法,是为了降低特征的维度。将原始高维数据转化为低维度的数据,高维数据指的是数据的特征维度较多,找到一个坐标系,使得这些数据特征映射到一个二维或三维的坐标系中…

Python爬虫教程:如何爬取教育漏洞报告平台中的漏洞报告?

部分数据来源:ChatGPT 引用 在本教程中,我们将使用 Python 语言和 requests、lxml 库来分析和爬取教育漏洞报告平台的数据。 1. 爬取网站数据 首先,我们需要从教育漏洞报告平台上获取需要的数据。我们可以通过 requests 库向特定网址发送请求,获取响应内容。 import req…

路径规划算法:基于布谷鸟优化的路径规划算法- 附代码

路径规划算法:基于布谷鸟优化的路径规划算法- 附代码 文章目录 路径规划算法:基于布谷鸟优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

数字信号的基本运算——线性卷积(相关)和圆周卷积(相关)

简介 在介绍卷积和相关运算之前,需要先认识一些更加基本的运算 翻折 设某一序列x(n),则x(-n)是以n0的纵轴为对称轴,将x(n)加以翻折得到的 移位 设某一序列x(n),m为正整数,x(n-m)表示x(n)逐项依次延时&#xff08…