【redis6】第十四章(Redis集群)

news2024/11/19 6:39:52

问题

容量不够,redis如何进行扩容?

并发写操作,redis如何分摊?

另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。

之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。

什么是集群

Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

Redis集群通过分区(partition)来提供一定程度的可用性(availability):及时集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

搭建集群

删除持久化数据

将rdb,aof文件都删除掉

创建6个实例

6379,6380,6381,6389,6390,6391

配置基本信息

开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 关掉或者换名字

redis cluster配置修改

cluster-enabled yes 打开集群模式

cluster-config-file nodes-6379.conf 设定节点配置文件名

cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

老师的文档:

include /home/bigdata/redis.conf
port 6379
pidfile "/var/run/redis_6379.pid"
dbfilename "dump6379.rdb"
dir "/home/bigdata/redis_cluster"
logfile "/home/bigdata/redis_cluster/redis_err_6379.log"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

拷贝多个redis.conf文件

在这里插入图片描述
用查找替换修改另外5个文件

:%s/6379/6380  

启动6个redis服务

在这里插入图片描述

将六个节点合成一个集群

组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常。
在这里插入图片描述

合体

[root@localhost myredis]# cd /opt/redis-6.2.8/src/
[root@localhost src]# redis-cli --cluster create --cluster-replicas 1 192.168.10.130:6379 192.168.10.130:6380 192.168.10.130:6381 192.168.10.130:6389 192.168.10.130:6390 192.168.10.130:6391

此处不要用127.0.0.1, 请用真实IP地址
–replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组。

在这里插入图片描述
在这里插入图片描述

登录集群(策略连接)

普通方式登录
可能直接进入读主机,存储数据时,会出现MOVED重定向操作。所以,应该以集群方式登录。

-c 采用集群策略连接,设置数据会自动切换到相应的写主机

[root@localhost src]# redis-cli -c -p 6379
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
-> Redirected to slot [12706] located at 192.168.10.130:6381
OK
192.168.10.130:6381> 

查看集群信息

通过 cluster nodes 命令查看集群信息
在这里插入图片描述

分配节点

redis cluster 如何分配这六个节点?

一个集群至少要有三个主节点。

选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

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

什么是slots

在这里插入图片描述

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

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

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。

在集群录入值

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

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

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

不在一个slot下的键值,是不能使用mget,mset等多键操作。
在这里插入图片描述
可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
在这里插入图片描述

查询集群中的值

计算key的插槽值
在这里插入图片描述

计算插槽值有几个键(只能看自己的插槽)
在这里插入图片描述
CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。
在这里插入图片描述

故障恢复

如果主节点下线?从节点能否自动升为主节点?注意:15秒超时
在这里插入图片描述
6390是6379的从
在这里插入图片描述

6379停掉后

在这里插入图片描述

主节点恢复后,主从关系会如何?主节点回来变成从机。
在这里插入图片描述

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

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

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

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

集群的Jedis开发

即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。
无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。

public class JedisClusterTest {

    public static void main(String[] args) {
        //创建对象
        HostAndPort hostAndPort = new HostAndPort("192.168.10.130",6381);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);

        //进行操作
        jedisCluster.set("k111","v111");
        String value = jedisCluster.get("k111");
        System.out.println("value:"+value);

        jedisCluster.close();

    }


}

Redis 集群提供了以下好处

实现扩容
分摊压力
无中心配置相对简单

Redis 集群的不足

多键操作是不被支持的

多键的Redis事务是不被支持的。lua脚本不被支持

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

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

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

相关文章

什么是Go语言?

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者|慕课网精英讲师 Codey 1. Go 语言的出身 Go(又称 golang)是 Google 开发的一种静态强类型、编译型、并发型,并具…

OpenMMLab AI实战课笔记-第1节课

1. 第一节课(课程链接) 1.1 计算机视觉任务 计算机视觉主要实现以下目标: 分类目标检测分割:语义分割、实例分割 (对像素进行精确分类, 像素粒度或细粒度)关键点检测 1.2 OpenMMLab框架 框架选择:PyTorchOpenMML…

多级缓存案例说明

多级缓存案例说明1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启2.导入SQL3.创建Demo工程3.1.分页查询商品3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id查询库存3.8.启动4.创建商品查询页面4.1.运行nginx服务4.2.反向代理为了演示…

CSS网格教程:网格布局模块/网格容器/网格项目

目录 CSS 网格布局模块 网格布局 浏览器支持 网格元素 实例 Display 属性 实例 实例 网格列(Grid Columns) 网格行(Grid Rows) 网格间隙(Grid Gaps) 实例 实例 实例 实例 网格行&#xff0…

java基础面试题1

目录 Java语言有哪些特点 Java都有那些开发平台? Jdk和Jre和JVM的区别【重要】 面向对象和面向过程的区别 什么是数据结构?Java的数据结构有哪些? 1.数组: 2.队列 Queue 3.链表 Linked List 4.栈Stack 5.树Tree 什么是…

13薪|初级测试工程师

"众推职聘”以交付结果为宗旨的全流程化招聘服务平台!今日招聘信息↓【工作内容】1、制定、编写软件测试方案与计划2、根据需求文档编写测试用例,组织测试用例评审3、按时完成软件测试工作任务,执行测试,跟踪缺陷状态&#x…

第十四章 集合(集合框架体系、List)

一、集合框架体系 (1)可以动态保存任意多个对象 (2)提供了一系列方便的操作对象的方法:add、remove、set、get等 集合框架体系: 二、Collection 1. Collection 接口常用方法 (1)add…

学习QCustomPlot【3】库结构

文章目录一、前言二、库结构三、图层3.1、坐标轴层一、前言 学习一个陌生的库,我们首先要明确它有什么用,可以结合库官方examples,学习怎么简单的用。 但是如果要对该库有一个全面的认识,还是需要了解它的开发思路和库结构。 例…

2、计算机视觉之图像分类算法基础(笔记)

什么是图像分类? 识别图像所表示内容的任务称为图像分类。我们可以对图像分类模型进行训练以识别各类图像。例如,您可以训练模型来识别表示三种不同类型动物的照片:兔子、仓鼠和狗。 下面几个神经网络重点关注准确率的问题 上图只是训练方式…

java—for结构

for循环语句1.1循环结构循环结构的组成:初始化语句条件判断语句循环体语句条件控制语句循环结构对应的语法:初始化语句条件判断语句循环体语句条件控制语句1.2for循环语句格式//格式 for (初始化语句;条件判断语句;条件控制语句){ 循环体语句; }执行流程…

记录每日LeetCode 环形链表II Java实现

题目描述: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&#xf…

06_PyTorch 模型训练[学习率与优化器基类]

当数据、模型和损失函数确定,任务的数学模型就已经确定,接着就要选择一个合适 的优化器(Optimizer)对该模型进行优化。 PyTorch 中所有的优化器(如:optim.Adadelta、optim.SGD、optim.RMSprop 等)均是 Optimizer 的子类,Optimizer…

STM32串口收发、串口中断、串口波特率的理解、普通IO模拟串口

STM32串口收发、串口中断一 、串口中断二、使用DMA三、串口波特率的理解开发环境:stm32cubuMax Keil5一 、串口中断 1.当收到消息的时候,立即进入控制程序,实现通过串口控制硬件; 2.在stm32cubeMax中配置串口 配置全局中断 2.在main函数中…

Django项目搭建_修改目录结构

1.安装环境 使用conda下载Django项目需要的依赖 pip install django2.2.6 -i https://pypi.douban.com/simple/pip install djangorestframework -i https://pypi.douban.com/simple/pip install PymySQL -i https://pypi.douban.com/simple/pip install Pillow -i https://p…

CSDN为什么会发展社区?看看官方怎么说

文章目录🌟 课前小差🌟 23年可兼收名利?🌟 博客之星🌟 红包活动🌟 相聚线下🌟 妙笔生花🌟 原力计划🌟 个人定位🌟 为什么要发展社区?&#x1f31f…

100种思维模型之决策树思维模型-004

选择决定了现状和未来,在生活中有很多选择的机会,但是真的选择对了吗?在该读书的年纪,却想着长大真好。在该工作奋斗的年纪,却后悔自己年轻时没好好读书,而悔恨。其实不是我们没有选择的权利,而…

2023年情人节浪漫表白神器(附源码下载)

2023年情人节将要来临,作为一名程序猿也不要落后了,快来用代码展示你的爱吧!下面给大家准备了6款情人节表白神器,把说不出口的话,放到代码里送给你爱的人吧!祝大家表白成功,俘获美人心&#xff…

Spring Boot集成 Swagger2 展现在线接口文档

一:swagger是什么? Swagger是一款RESTFUL接口的文档在线自动生成功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧…

浅析云边端协同框架下的“AI+”视频融合能力以及场景应用

随着边缘侧与终端侧业务的规模化落地部署,很多新的业务场景已经逐渐不满足于中心化的云端计算模式。尤其是在AI人工智能技术进一步落地应用的趋势下,基于云边端深度融合与协同的“AI”模式,在满足用户对视频服务的智能识别需求上,…

centos环境docker安装nexus3搭建maven私有仓库

拉取最新nexus3镜像docker pull nexus3创建宿主机上的映射文件目录,并授权[root1-0002 ~]# mkdir -p /mnt/lckj/nexus/data [root1-0002 ~]# chmod -R 777 /mnt/lckj/nexus/data运行redis,生成相应容器-d 后台启动[root1-0002 ~]# docker run -d --name …