非关系型数据库(缓存数据库)redis的集群

目录

一.群集模式——Cluster

1.原理

2.作用 

3.特点

4.工作机制

哈希槽

哈希槽的分配 

 哈希槽可按照集群主机数平均分配(默认分配)

根据主机的性能以及功能自定义分配 

redis集群的分片 

  分片

如何找到给定key的分片 

优势

 二. 搭建Redis群集模式

 关闭防火墙

安装redis

​编辑

创建集群配置目录及文件 

开启群集功能

启动redis节点 

​编辑

  启动集群 

测试集群


一.群集模式——Cluster

1.原理

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。

集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。

哨兵模式解决了主从复制不能自动故障转移,达不到高可用的问题,但还是存在难以在线扩容,Redis容量受限于单机配置的问题。Cluster模式实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。

2.作用 

  • 数据分区:数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
  • 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

3.特点

Cluster采用无中心结构

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

4.工作机制

哈希槽

Redis集群引入了哈希槽的概念

● Redis集群有16384个哈希槽(编号0-16383)

● 集群的每个节点负责一部分哈希槽

● 每个key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到所对应的节点,然后直接跳转到这个对应的节点上进行存取操作。

哈希槽的分配 
 哈希槽可按照集群主机数平均分配(默认分配)

以3个节点组成的集群为例:

节点A包含0-5460号哈希槽

节点B包含5461-10922号哈希槽

节点C包含10923-16383号哈希槽

根据主机的性能以及功能自定义分配 

以3个节点组成的集群为例:

节点A性能最差,包含0-2000号哈希值

节点B性能中等,包含2001-7000号哈希值

节点C性能最强,包含7001-16383号哈希值

redis集群的分片 
  分片

使用Redis集群时我们会将存储的数据分散到多台redis机器上,这称为分片。简言之,集群中的每个Redis实例都认为是整个数据的一个分片。 

如何找到给定key的分片 

为了找到给定key的分片,我们对key进行CRC16(key)算法处理并通过对总分片数量取模。然后,使用确定性哈希函数,这意味着给定的key将多次始终映射到同一个分片,我们可以推断将来读取特定key的位置。

优势

最大优势:方便扩缩容和数据分派查找。

这种结构很容易添加或者删除节点,比如如果我想新添加个节点D,我需要从节点A、B、C中取部分槽到D上,如果我移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。

 二. 搭建Redis群集模式

redis的集群一般需要6个节点,3主3从。方便起见,这里在同一台服务器上模拟; 以端口号进行区分,3个主节点端口号6001/6002/6003,对应的从节点端口号6004/6005/6006。 

服务器主机名IP主端口从端口
Node1节点node192.168.209.6060016004
Node2节点node192.168.209.6160026005
Node3节点node192.168.209.6360036006

 关闭防火墙

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0

安装redis

传入安装包到/opt目录
yum install -y gcc gcc-c++ make
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
cd /opt/redis-5.0.7/utils
./install_server.sh
......
Please select the redis executable path []
#输入/uar/local/redis/bin/redis-server
ln -s /usr/local/redis/bin/* /usr/local/bin/

创建集群配置目录及文件 

[root@node ~]# cd /etc/redis
[root@node redis]# mkdir -p redis-cluster/redis600{1..6}
#创建redis-cluster文件夹,并在下面依次创建redis6001到redis6006文件夹
[root@node redis]# for i in {1..6}
> do
> cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
> cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
> done
[root@node redis]# ls -R redis-cluster/
#查看是否创建成功

开启群集功能

  • 仅以redis6001为例,其他5个文件夹的配置文件以此类推修改,特别注意端口号的修改。
[root@node redis]# cd redis-cluster/redis6001
[root@node redis6001]# vim redis.conf ##69行,注释掉bind项,默认监听所有网卡
#bind 127.0.0.1
##88行,修改,关闭保护模式
protected-mode no
##92行,修改,redis监听端口
port 6001
##136行,开启守护进程,以独立进程启动
daemonize yes
##832行,取消注释,开启群集功能
cluster-enabled yes
##840行,注销注释,群集名称文件设置
cluster-config-file nodes-6001.conf
##846行,注销注释,群集超时时间设置
cluster-node-timeout 15000
##700行,修改,开启AOF持久化
appendonly yes

 

 

启动redis节点 

  • 分别进入那六个文件夹,执行命令:“redis-server redis.conf”,来启动redis节点
  • [root@node redis6001]# for d in {1..6}
    > do
    > cd /etc/redis/redis-cluster/redis600$i
    > ^C
    [root@node redis6001]# for d in {1..6}
    > do
    > cd /etc/redis/redis-cluster/redis600$d
    > redis-server redis.conf
    > done
    [root@node1 redis6006]# ps -ef | grep redis

  启动集群 

[root@node redis6006]#redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1 

测试集群

可以看到hash节点的起始编号和中止编号

 

槽号自动跳转了 

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

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

相关文章

TAB标签美化 - SVG作为mask

今天觉得V3的标签不是很好看,忽然想起来之前看过Vue Admin Beautiful Pro的样式挺好的,顺手研究了一把。发现Vue Admin Beautiful是采用PNGmask css来解决的。于是乎打算把V3的标签页做点小美化,但是迁移过程发生些小插曲,在此记录…

探索自然语言处理:简单而完整的学习路线指南

引言: 自然语言处理(NLP)作为人工智能和语言学的交汇点,正在彻底改变我们与技术的互动方式。从Siri到Google翻译,NLP技术已成为现代生活的不可或缺的一部分。本文旨在为初学者提供一个简单而全面的NLP学习路径&#xf…

【算法】动态规划练习(一)

目录 1137. 第 N 个泰波那契数 分析 代码 面试题 08.01. 三步问题 分析 代码 746. 使用最小花费爬楼梯 分析 代码 泰波那契序列 Tn 定义如下: T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n,请返回第 n 个泰波…

【智能排班系统】基于AOP和自定义注解实现接口幂等性

文章目录 接口幂等性介绍为何重视接口幂等性幂等性实现策略token机制存在问题: 先删除token还是执行完业务再删除 乐观锁与版本号分布式锁唯一约束防重表 实现定义注解handler处理器handler接口定义接口实现:基于token机制ServiceController实现 接口实现&#xff1…

蓝桥杯22年第十三届省赛-数组切分|线性DP

题目链接: 蓝桥杯2022年第十三届省赛真题-数组切分 - C语言网 (dotcpp.com) 1.数组切分 - 蓝桥云课 (lanqiao.cn) 这道题C语言网数据会强一些。 说明: 对于一个切分的子数组,由于数组是1-N的一个排列,所以每个数唯一 可以用子…

5 两个有序链表序列的合并

分数 10 作者 DS课程组 单位 浙江大学 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: List Merge( List L1, List L2 );其中List结构定义如下: typedef struct Node *PtrToNode; stru…

计算机网络——34LANs

LANs MAC地址和ARP 32bit IP地址 网络层地址用于使数据到达目标IP子网:前n - 1跳从而到达子网中的目标节点:最后一跳 LAN(MAC/物理/以太网)地址: 用于使帧从一个网卡传递到与其物理连接的另一个网卡(在同…

数位排序(Comparator<int[]>())

题目 import java.util.Arrays; import java.util.Comparator; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int[][] a new int[n][2];for(int i0;i…

MCU电子方案开发

MCU电子方案开发,在酷得进行MCU电子方案开发,可以充分利用当地的产业链资源,降低研发成本,提高研发效率。 东莞市酷得智能科技有限公司(以下简称:酷得)2018年成立于松山湖,且在汕头设…

C语言进阶课程学习记录-第25课 - # 和 ## 操作符使用分析

C语言进阶课程学习记录-第25课 - # 和 ## 操作符使用分析 #运算符实验-#转化字符串预处理后代码 实验-#输出函数名预处理后的代码 ##运算符实验-##定义变量预处理后代码 实验-##定义结构体预处理后的代码 小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图…

【Redis】golang操作Redis基础入门

【Redis】golang操作Redis基础入门 大家好 我是寸铁👊 总结了一篇【Redis】golang操作Redis基础入门sparkles: 喜欢的小伙伴可以点点关注 💝 Redis的作用 Redis(Remote Dictionary Server)是一个开源的内存数据库,它主…

深度学习中的注意力模块的添加

在深度学习中,骨干网络通常指的是网络的主要结构或主干部分,它负责从原始输入中提取高级特征。骨干网络通常由卷积神经网络(CNN)或者类似的架构组成,用于对图像、文本或其他类型的数据进行特征提取和表示学习。 注意力…

设计模式:策略模式示例

文章目录 示例 1: 排序策略示例 2: 支付策略示例 3: 压缩策略 策略模式的示例非常多样,下面是一些场景的示例及其代码实现: 示例 1: 排序策略 在需要对不同类型的数据集进行排序时,可以使用策略模式来选择不同的排序算法。 // 策略接口 pub…

libVLC 音频输出设备切换

libvlc_audio_output_list_get和libvlc_audio_output_device_list_get是libVLC 库中用于处理音频输出的两个函数。 libvlc_audio_output_list_get函数用于获取可用的音频输出模块列表。这个列表通常包括不同的音频输出方式,例如 Pulseaudio、ALSA 等。通过这个函数…

Linux——用户管理,文件压缩命令

用户管理命令 (1)系统存储用户信息的位置: /etc/passwd:存储用户的基本信息 UID:用户ID GID:组ID; (2)系统存储组信息的位置: /etc/group (3)系统存储用户密码信息的位置: /etc/shadow (2)添加用户 使用命令添加新用户:useradd newname 桌面添加:右键:设置:用户,解锁,添加用…

算法第三十九天-验证二叉树的前序序列化

验证二叉树的前序序列化 题目要求 解题思路 方法一:栈 栈的思路是「自底向上」的想法。下面要结合本题是「前序遍历」这个重要特点。 我们知道「前序遍历」是按照「根节点-左子树-右子树」的顺序遍历的,只有当根节点的所有左子树遍历完成之后&#xf…

排查Java中的OOM(Out of Memory)问题

Java的OOM(OutOfMemoryError)问题通常表示Java虚拟机(JVM)在尝试分配内存给对象时,无法找到足够的连续内存空间。这可能是由于内存泄漏、堆内存不足或其他原因导致的。排查OOM问题通常涉及以下几个步骤: 查…

使用 Docker 部署 Photopea 在线 PS 工具

1)Photopea 介绍 GitHub:https://github.com/photopea/photopea 官方手册:https://www.photopea.com/learn/ Adobe 出品的「PhotoShop」想必大家都很熟悉啦,但是「PhotoShop」现在对电脑配置要求越来越高,体积越来越大…

逆向入门:为ctf国赛而写的笔记 day01

目录 通用寄存器: EAX:累加寄存器,是很多加法乘法指令的缺省寄存器 EBX:基地址寄存器,在内存寻址时存放基地址 ECX:计数器 EDX:数据寄存器,被用于来放整数除法产生的余数 变址寄存器 标志…

流行的API架构学习

几种流行的API架构风格图 SOAP(Simple Object Access Protocol) 优点:SOAP 是一种基于 XML 的通信协议,具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能,并支持复杂的消息交换模式。 缺点&#xf…