Redis快速上手篇七(集群-六台虚拟机)

Redis集群

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

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

基本原理

哨兵选举机制,如果过半数节点发现某个异常节点,共同决定更改异常节点的状态,如果该节点是主节点,对应的备节点自动顶替为主节点。

Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器。并能在被监视的主服务器下线时自动将下线主服务器下的某个从服务器升级为新的主服务器。

配置集群所需的环境

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

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。

学习可以采用伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号。

分布式集群搭建:

1.在安装目录下新建目录redis_cluster,文件夹下新建文件redis7001.conf

2. vim redis7001.conf

在不同的服务器 这个可以不要

cluster-config-file nodes-7006.conf 伪集群每个节点这个文件一样所以需要加这个

引入的配置文件为安装目录下的 redis.conf 文件复制过来

cp usr/local/bin/redis.conf /usr/local/bin/redis_cluster

include /usr/local/bin/redis_cluster/redis.conf #引入配置文件
port 7001 #端口设置
pidfile "/var/run/redis_7001.pid" #存放进程ID防止启动多个进程副本
dbfilename "dump_7001.rdb" #持久化文件名称
dir "/usr/local/bin/redis_cluster" #持久化保存位置
logfile "/usr/local/bin/redis_cluster/redis_err_7001.log"
cluster-enabled yes    #开启集群
cluster-config-file nodes-7001.conf #节点名称
cluster-node-timeout 15000 #节点过期时间
                          

集群一般不设置密码

3.后台启动,查看启动是否正常

4.关闭 建议使用 shutdown 不要使用 kill杀死进程

一台虚拟机多个节点需要 -h 指定 IP

5.完整克隆第一台虚拟机五次(关机后在进行克隆)

6.启动六台虚拟机并修改 IP 与 .conf

/etc/sysconfig/network-scripts/ifcfg-ens32(这个数值看个人网卡)

/etc/sysconfig/network-scripts/ifcfg-ens+tab(自动补全)

vim /usr/local/bin/redis_cluster/redis7001.conf(文件名不用更改即可)

service network restart         修改网络配置后重启网络服务

(1)

vim /etc/sysconfig/network-scripts/ifcfg-ens32

克隆的五台虚拟机需要删掉此行 UUID

(2)

按esc通过vim 底行指令快速修改

vim /usr/local/bin/redis_cluster/redis7001.conf

cluster-node-timeout 15000        1会被修改

        :%s/7001/7002/g        不会修改 15000

五台克隆的虚拟机均进行以上操作

保证:(1)不在同一个ip

           (2)不在同一个端口启动

如图:

ip                                                                redis运行端口

192.168.253.16                                                7001

192.168.253.21                                                7002

192.168.253.22                                                7003

192.168.253.23                                                7004

192.168.253.24                                                7005

192.168.253.25                                                7006

7.在6个虚拟机分别启动redis

因为没有更改文件名称,可以直接去每个虚拟机粘贴执行即可

 /usr/local/bin/redis-server /usr/local/bin/redis_cluster/redis7001.conf 

ps -ef | grep redis 查看进程

8.创建redis集群

/usr/local/bin/redis-cli  --cluster create  192.168.253.16:7001 192.168.253.21:7002 192.168.253.22:7003 192.168.253.23:7004 192.168.253.24:7005 192.168.253.25:7006 --cluster-replicas 1

cluster-replicas 1

1其实代表的是一个比例,就是主节点数/从节点数的比例。会按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

这里输入 yes        如下图创建集群成功

切记 先开启服务端在连接客户端

9.使用cli连接redis集群

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

/usr/local/bin/redis-cli -c -h 192.168.253.21 -p 7002

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

11.检查集群的状态

/usr/local/bin/redis-cli --cluster check 192.168.253.21:7002

12.添加主节点

新建虚拟机,配置 ip 与 .conf文件,与前六台配置一样。

例如 IP 192.168.253.26 redis服务端口 7007

启动服务后

/usr/local/bin/redis-cli --cluster add-node 192.168.253.26:7007 192.168.253.21:7002

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

13.配置从节点

新建虚拟机 配置 IP 与 端口

例如 IP 192.168.253.27 redis服务端口 7008

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

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

--cluster-master-id 为从节点对应主节点的id

列: 添加刚才主节点的从节点

/usr/local/bin/redis-cli --cluster add-node 192.168.253.27:7008 192.168.253.26:7007 --cluster-slave --cluster-master-id 刚才添加的主节点的id

14.重新分配slots

添加的主节点还不能使用,因为没有分配slots,

slot的概念。slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读

/usr/local/bin/redis-cli --cluster reshard 192.168.253.21:7002(要移动插槽的IP)

然后再执行后的输入框 输入 接收插槽的IP的id

最后输入 all 或 done 

all 代表从所有有数据据节点进行迁移到目的节点,也可以选择 目标节点id回车,最后以done进行结束

done 代表结束

15.删除主节点

--cluster del-node 节点id

删除主节点需要先使用 reshard 把主节点的slots移到其他节点才可以

/usr/local/bin/redis-cli --cluster del-node 节点IP:端口 节点id(要删除节点的slots要移动到的ip的id)

16.删除从节点

--cluster del-node 集群 节点id(要删除的从节点id)

/usr/java/redis/bin/redis-cli --cluster del-node 节点ip:端口 节点id(要删除的从节点id)

17.故障检测

验证集群是否生效

关闭一个主节点查看对应的备用节点是不是能够顶替主节点成为主节点

存/取数据的时候查看对应的端口号

(关闭主节点以后需要耐心等待一会儿 让他重新分配一下空间)

关闭的时候一定要使用shutdown命令不要使用kill命令

/usr/java/redis/bin/redis-cli -h 192.168.253.21 -p 7002 shutdown

关闭之后查看7006是否成为了主节点

7006变成了主节点 证明集群配置成功

下图为正常的

10-20秒左右查看集群状态发现 7006 已经成为主机,集群配置成功

主节点恢复后,主从关系会如何?主节点回来变成从机。

如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储。

redis.conf中的参数 cluster-require-full-coverage

什么是slots

[OK] All 16384 slots covered.

一个 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 号插槽。

在集群中录入值

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

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

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

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

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

Redis 集群优点

实现扩容

分摊压力

无中心配置相对简单

Redis 集群的不足

多键操作是不被支持的

多键的Redis事务是不被支持的

由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#学习相关系列之多线程---ConfigureAwait的用法

一、ConfigureAwait的作用 ConfigureAwait方法是Task类中的一个实例方法,它用于配置任务的运行上下文。运行上下文指的是任务在执行期间所处的环境,包括线程、同步上下文等。ConfigureAwait方法接受一个布尔值参数,用于决定是否捕获上下文。当…

导弹拦截(最大不上升 或 不下降子序列,dp)

算法分析: 1.求最长子序列 1.每次输入时,计算每个元素对应的序列的长度 1.向前遍历找大于当前元素的数 2.若之前元素对应长度1 大于当前长度,更新当前长度 2.若当前元素对应长度 大于最大长度,更新最大长度 2.dilworth定理 故需…

HarmonyOS开发:NodeJs脚本实现组件化动态切换

前言 上篇文章,我们使用NodeJs脚本完成了HarmonyOS项目的组件化运行,但是由于脚本是基于4.0.0.400版本的DevEco Studio开发的,可能在配置文件的修改上有些许差距,那么遇到这种情况怎么办,一种是再写一套针对性的脚本文…

系列四十二、Spring的事务传播行为案例演示(二)#REQUIRED

一、演示Spring的默认传播行为(REQUIRED) 1.1、运行之前表中的数据 1.2、StockServiceImpl /*** Author : 一叶浮萍归大海* Date: 2023/10/30 15:43* Description:*/ Service(value "stockServiceREQUIRED") public class StockServiceImpl…

MSQL系列(十) Mysql实战-Join驱动表和被驱动表如何区分

Mysql实战-Join驱动表和被驱动表如何区分 前面我们讲解了Mysql的查询连接Join的算法原理, 我发现大家都知道小表驱动大表,要让小表作为驱动表, 现在有2个问题 查询多表, 到底哪个是驱动表?哪个是被驱动表, 如何区分?索引如何优化,到底是加在驱动表上,还是被驱动表上? &…

二维数组如何更快地遍历

二维数组如何更快地遍历 有时候,我们会发现,自己的代码和别人的代码几乎一模一样,但运行时间差了很多,别人是 AC \text{AC} AC,你是 TLE \text{TLE} TLE,这是为什么呢? 一个可能的原因是数组的…

2023高德地图poi资源下载

全国8千万地图poi地图数据:含名称、地址、电话、省份、城市、区县、经纬度、电话等信息

第五章 I/O管理 六、I/O核心子系统

目录 一、核心子系统 1、I/O调度 2、设备保护 二、假脱机技术 1、脱机: 2、假脱机(SPOOLing技术): 3、应用: 1.独占式设备: 2.共享设备: 4、共享打印机原理分析 三、总结 一、核心子系…

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包,用于构建跨平台应用程序,支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo,支持linux/windows/mac/android/ios操作系统,此demo在ubuntu桌面环境下测试成功。…

Jenkins项目部署

使用jenkins部署项目 简易版使用jenkins部署项目 将war包部署到tomcat中 将已有的war包部署到tomcat中(jenkins与tomcat在同一台主机) 点击Jenkins主页的新建任务 输入任务名称 选择构建一个自由风格的软件项目后点击确定 在构建内添加构建步骤,选择执行shell 输入…

时间序列预测大模型-TimeGPT

时间序列预测领域正在经历一个非常激动人心的时期。仅在过去的三年里,我们就看到了许多重要的贡献,例如N-BEATS、N-HiTS、PatchTST和TimesNet。 与此同时,大型语言模型 (LLM)最近在 ChatGPT 等应用程序中广受欢迎,因为它们无需进…

自动化项目实战 [个人博客系统]

自动化博客项目 用户注册登录验证效验个人博客列表页博客数量不为 0 博客系统主页写博客 我的博客列表页效验 刚发布的博客的标题和时间查看 文章详情页删除文章效验第一篇博客 不是 "自动化测试" 注销退出到登录页面,用户名密码为空 用户注册 Order(1)Parameterized…

Spring Cloud之API网关(Zuul)

目录 Zuul 简介 功能 工作流程 搭建 1.引入依赖 2.添加注解 3.路由转发 4.测试 实现原理 EnableZuulProxy注解 ZuulServlet FilterProcessor Zuul内置过滤器 常用配置 Zuul 简介 zuul是SpringCloud子项目的核心组件之一,可以作为微服务架构中的API网…

【C】C语言文件操作

1.为什么使用文件 我们前面学习结构体时,写通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下…

超全整理,Jmeter性能测试-脚本error报错排查/分布式压测(详全)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能脚本error报错…

域名系统 DNS

DNS 概述 域名系统 DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为 IP 地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”&#x…

S5PV210裸机(九):ADC

本文主要探讨210的ADC相关知识。 ADC ADC:模数转换(模拟信号转数字信号) 量程:模拟电压信号范围(210为0~3.3V) 精度:若10二进制位来表示精度(210为10位或12位),量…

线性代数 第三章 向量

一、运算 加法、数乘、内积 施密特正交化 二、线性表出 概念:如果,则称可由线性表出(k不要求不全为0) 判定: 非齐次线性方程组有解无关,相关 如果两个向量组可以互相线性表出,则称这两个…

Xilinx 7 系列 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性

如果通过LVDS进行接口,可以按照以程图中的步骤操作,以确保满足正确使用LVDS的所有要求。 40191 - 7 系列 - 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性 与LVDS兼容驱动器和接收器连接时,7系列LVDS和LVDS_25输入和输出应该不存在兼容性问…

案例分析真题-系统建模

案例分析真题-系统建模 2009年真题 【问题1】 【问题2】 【问题3】 2012年真题 【问题1】 【问题2】 【问题3】 2014年真题 【问题1】 【问题2】 骚戴理解:这个题目以前经常考,不知道今年会不会考,判断的话就是看加工有没有缺少输入和输出&a…