搭建Redis集群

一 应用场景

为什么需要redis集群?

当主备复制场景,无法满足主机的单点故障时,需要引入集群配置。

一般数据库要处理的读请求远大于写请求 ,针对这种情况,我们优化数据库可以采用读写分离的策略。我们可以部 署一台主服务器主要用来处理写请求,部署多台从服务器 ,处理读请求。

二 基本原理

哨兵选举机制,如果有半数节点发现某个异常节点,共同决定改异常节点的状态,如果该节点是主节点,对应的备节点自动顶替为主节点。Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

1.主从复制的作用

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

4、读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。

5、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

2.配置集群所需的环境

Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的。

槽点

在Redis集群中,槽(Slot)是一种逻辑上的划分方式,用于将数据按照Key进行分片存储。Redis集群默认将所有数据分成16384个槽,每个槽可以存储一个或多个键值对。

槽的作用是实现数据的分布式存储和负载均衡。通过对Key进行哈希计算,确定每个键值对应该存放在哪个槽中,从而将数据均匀地分配到整个集群中的各个节点上。这样可以保证数据在集群中的分布相对均衡,提高整个集群的性能和可扩展性。

在Redis集群中,每个节点负责处理一部分槽的数据。当一个节点加入或离开集群时,槽的重新分配会发生变化。集群中的主节点会根据需要将槽从一个节点迁移到另一个节点,以实现负载均衡和高可用性。

3.配置集群所需的环境

Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的。

(1).规划网络。

用一台虚拟机模拟6个节点,一台机器6个节点,创建出3 master、3 salve 环境。虚拟机是 CentOS7 ,ip地址192.168.195.33

或者

创建六台服务器,步骤与一台创建六个节点效果相同

(2).创建 Redis 节点

首先在 192.168.195.33  机器上 /usr/目录下创建 myredis目录;

mkdir myredis

(创建六台服务器的克隆服务器安装配置好redis就可以,不用执行2、3)

(3).创建目录

在 myredis 目录下,创建名为7001、7002,7003、7004、7005,7006的目录

mkdir 7001 7002 7003 7004 7005 7006

 (4).配置7001、7002,7003、7004、7005,7006

先在7001目录配置,添加redis.conf文件

写入

include /usr/th/redis/redis-5.0.14/redis.conf //th是我自己的目录
port 7001
pidfile "/var/run/redis_7001.pid"
dbfilename "dump_7001.rdb"
dir "/usr/myredis/7001"
logfile "/usr/myredis/7001/redis_err_7001.log"
bind 0.0.0.0
protected-mode no
daemonize yescluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000

(配置内容参考redis主从复制的文章)

机器一般不设置密码

(5).将 7001的redis.conf 拷贝到这六个目录中

echo ./7002 ./7003 ./7004 ./7005 ./7006 | xargs -n 1 cp -v /usr/myredis/7001/redis.conf

拷贝完然后更改里面的端口号可以了

(6)启动

一键启动,在myredis中写一个stredis的脚本,并给脚本赋权限

#!/bin/bash
/usr/local/bin/redis-server /usr/myredis/7001/redis.conf
/usr/local/bin/redis-server /usr/myredis/7002/redis.conf
/usr/local/bin/redis-server /usr/myredis/7003/redis.conf
/usr/local/bin/redis-server /usr/myredis/7004/redis.conf
/usr/local/bin/redis-server /usr/myredis/7005/redis.conf
/usr/local/bin/redis-server /usr/myredis/7006/redis.conf

 (7) 创建redis的集群

Redis-cli --cluster create 节点(ip:端口号)

--cluster-replicas 1

分配主从 比例1

/usr/local/bin/redis-cli --cluster create 192.168.195.33:7001 192.168.195.33:7002 192.168.195.33:7003 192.168.195.33:7004 192.168.195.33:7005 192.168.195.33:7006 --cluster-replicas 1

六个节点  三个主节点 三个从节点配置成功如下图

(8)使用cli连接redis集群

使用客户端链接集群 必须使用 -c 连接

/usr/java/redis/bin/redis-cli -c -h 192.168.159.34 -p 7002

查看集群的节点的信息 :cluster nodes

 

(9)检查节点的信息 

 /usr/local/bin/redis-cli --cluster check 192.168.184.33:7003

(10)添加主节点

配置文件 7007 /redis.conf

在添加之前首先要像7001-6一样,修改配置文件

启动7007 服务 

添加主节点

/usr/java/redis/bin/redis-cli --cluster add-node 192.168.159.34:7007 192.168.159.34:7002

前面的IP加端口号是要添加的redis节点,后面的IP和端口号是集群中的任意一个节点。

 表示添加成功

(11) 配置从节点 

刚才添加的主节点还没有分配槽,所以无法使用

添加从节点之前需要设置从节点并启动节点

配置7008成为7007的从节点

 /usr/local/bin/redis-cli --cluster add-node 192.168.195.33:7008 192.168.195.33:7002 --cluster-slave --cluster-master-id 9b1df1481e5a40bf6028dcd036a823cca4f880f7

主节点分配槽 

槽在创建集群时就已分配只有那么多,所有只能重分配

 /usr/local/bin/redis-cli --cluster reshard 192.168.195.33:7001

查看7007,可以看到已分配500个槽

 (12)删除从节点

 --cluster del-node 集群的节点 节点的id

 /usr/local/bin/redis-cli --cluster del-node 192.168.195.33:7001 d1fcea6d16a4434493f6615e48c5bc9ba89364a0

(12)删除主节点

先将槽归还给集群

槽点为归0删不了

/usr/local/bin/redis-cli --cluster reshard 192.168.195.33:7001

槽点为0

删除主节点(只有槽点为0后才能删除主节点)

(13)测试集群 

关闭7002后7005成为主节点

 /usr/local/bin/redis-cli -p 7002 shutdown(优雅的关闭)

 

 如果7002重新启动成为7005的从节点

 优雅的关闭脚本 不能kill -9

 vim stpredis 

#!/bin/bash
/usr/local/bin/redis-cli -h 192.168.184.33 -p 7001 shutdown
/usr/local/bin/redis-cli -h 192.168.184.33 -p 7002 shutdown
/usr/local/bin/redis-cli -h 192.168.184.33 -p 7003 shutdown
/usr/local/bin/redis-cli -h 192.168.184.33 -p 7004 shutdown
/usr/local/bin/redis-cli -h 192.168.184.33 -p 7005 shutdown

三 slots

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,

集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

name 2 [0-5460]

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:

节点 A 负责处理 0 号至 5460 号插槽。

节点 B 负责处理 5461 号至 10922 号插槽。

节点 C 负责处理 10923 号至 16383 号插槽。

1.在集群中录入值

在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

redis-cli客户端提供了 –c 参数实现自动重定向。

如 redis-cli -c –p 7000登入后,再录入、查询键值对可以自动重定向。

批量添加

不在一个slot下的键值,是不能使用mget,mset等多键操作。

可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。(按组分配插槽)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法——队列

概述 计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。添加的一端称为尾,移除的一端称为头。 功能 插入offer(value : E) : boolean  取值并移除poll() : E  取值peek() : E  判断…

项目中日历管理学习使用

一些项目中会有日历或日期设置,最基本的会显示工作日,休息日,节假日等等,下面就是基于项目中的日历管理功能,要显示工作日,休息日,节假日 效果图 获取国家法定节假日工具类 public class Holi…

「QT」QString类的详细说明

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「

Qt编写手机端视频播放器/推流工具/Onvif工具

一、视频播放器 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、…

第十七讲_HarmonyOS应用开发Stage模型应用组件

HarmonyOS应用开发Stage模型应用组件 1. 应用级配置2. Module级配置3. Stage模型的组件3.1 AbilityStage3.1.1 AbilityStage的创建和配置3.1.2 AbilityStage的生命周期回调3.1.3 AbilityStage的事件回调: 3.2 UIAbility3.2.1 UIAbility生命周期3.2.3 UIAbility启动模…

修复idea,eclipse ,clion控制台中文乱码

控制台乱码问题主要原因并不在编译器IDE身上,还主要是Windows的控制台默认编码问题。。。 Powershell,cmd等默认编码可能不是UTF-8,无需改动IDE的settings或者properties(这治标不治本),直接让Windows系统…

初识MQRabbitMQ快速入门

一、同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你却不能…

老旧小区火灾频发,LoRa无线系统筑牢安全防线

近日,全国各地多个老旧小区火灾事故频发,从安微合肥南二环一老旧小区居民楼起火、上海金山区一小区居民楼火灾,到1月24日江西新余市特大火灾......都造成了不同程度的人员伤亡和财产损失,令人扼腕痛惜,教训十分深刻。 …

【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解

【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解 提示:最近开始在【医学图像分割】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解前言UNet模型运行环境搭…

前端工程化之:webpack1-6(编译过程)

一、webpack编译过程 webpack 的作用是将源代码编译(构建、打包)成最终代码。 整个过程大致分为三个步骤: 初始化编译输出 1.初始化 初始化时我们运行的命令 webpack 为核心包, webpack-cli 提供了 webpack 命令,通过…

第八篇 交叉编译华为云Iot SDK到Orangepi3B

本篇主要内容: 一、交叉编译华为云Iot SDK依赖1.宿主机安装交叉编译工具链(1)选择下载交叉编译工具链(2)解压、添加环境变量、重启2.交叉编译依赖库(0) 准备工作(1) 交叉…

水文模型SWMM与LisFlood耦合(pdf文档、软件见资源)

总技术路线图 INP生成图解 文献:面向服务的Web-SWMM构建研究 regardingINP为ArcGIS Pro项目 1.SWMM模型数据准备与参数设置 1.子汇水区 文件位于:beforeGenerateINP/generateSub.py(一级划分) 问题: 水文分析阈值划…

【PyTorch】使用PyTorch创建卷积神经网络并在CIFAR-10数据集上进行分类

前言 在深度学习的世界中,图像分类任务是一个经典的问题,它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集,包含了10个类别的60000张32x32彩色图像。在本博客中,我们将探讨如何使用PyTorch框架创建一个简…

CSS3如何实现从右往左布局的按钮组(固定间距)

可以通过下方CSS实现,下面的CSS表示按钮从右往左布局,且间距为10px: .right-btn {position: relative;float: right;margin-right: 10px; }类似这种: 这种: 注意: 不能使用right:10px代替margin-right:10px&#x…

LINUX基础培训十八之常见服务vsftp介绍

前言、本章学习目标 了解vsftp服务用途掌握配置vsftp服务器掌握vsftp日常使用 一、什么是文件传输协议(VSFTP) vsftpd一红帽企业版linux的默认ftp服务器 不再由xinetd管理 xinetd是一个非独立服务有很多服务要依靠它实现” xinetd是一个daemon程序,所有结尾带d的…

Backtrader 文档学习-Bracket Orders

Backtrader 文档学习-Bracket Orders 1. 概述 组合订单类型是一个非常宽泛的订单类别,只要brokder支持的订单类型都可以, 包括(Market, Limit, Close, Stop, StopLimit, StopTrail, StopTrailLimit, OCO)。 该功能用于回测,交互broker Brac…

银行数据仓库体系实践(3)--数据架构

狭义的数据仓库数据架构用来特指数据分布,广义的数据仓库数据架构还包括数据模型、数据标准和数据治理。即包含相对静态部分如元数据、业务对象数据模型、主数据、共享数据,也包含相对动态部分如数据流转、ETL、整合、访问应用和数据全生命周期管控治理。…

TensorFlow2实战-系列教程2:神经网络分类任务

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、Mnist数据集 下载mnist数据集: %matplotlib inline from pathlib imp…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

【干货】【常用电子元器件介绍】【电阻】(二)--敏感电阻器

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。   电子电路中除了采用普通电阻器外,还有一些敏感电阻器(如热敏电阻器、压敏电阻器、光敏电阻器等)也被广泛地应用。然而…