十二、Cluster集群

目录

    • 一、集群简介
      • 1、现状问题
      • 2、集群作用
    • 二、集群结构设计
      • 1、集群存储设
      • 2、消息通信设计
    • 三、Cluster集群三主三从结构搭建
      • 1、redis.conf配置文件可配置项
      • 2、配置集群
      • 3、链接集群
      • 4、命令客户端连接集群并使用
    • 四、集群扩容
      • 1、添加节点
      • 2、槽位分配
      • 3、添加从节点
    • 五、集群缩容
      • 1、删除从节点
      • 2、删除主节点

一、集群简介

1、现状问题

  • redis提供的服务OPS可以达到10万/秒,当前业务OPS已经达到20万/秒
  • 内存单机容量达到256G,当前业务需求内存容量1T

2、集群作用

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难

二、集群结构设计

1、集群存储设

  1. 让key通过方法CRC161计算一个hash值,再继续取余%16384,得出在Redis中存储的位置。
  2. 将所有的存储空间计算切割16384个槽,每台主机保存一部分。
    • 这个槽代表一个存储空间,不是一个key的保存空间。
  3. 将key按照计算出的计算放到对应的存储空间。
    当增加一台计算机,内部就会优化,其余redis把自身一些槽,分给新加的节点。如果去机器把原来的槽再返回给原来的节点。这样可扩展性就得到增强。

2、消息通信设计

  • 各个数据库互相通信,保存各个库中槽的编号数据
  • 一次命中,直接返回。
  • 一次未命中,告知具体位置,直接去下一个库中寻找,命中返回。
    这样最多两次命中,就可以找到数据。
    在这里插入图片描述

三、Cluster集群三主三从结构搭建

1、redis.conf配置文件可配置项

  • 打开 cluster 集群配置
    • cluster-enabled yes|no
  • cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容
    • cluster-config-file <filename>
  • 节点服务响应超时时间,用于判定该节点是否下线或切换为从节点
    • cluster-node-timeout <milliseconds>
  • master连接的slave最小数量
    • cluster-migration-barrier <count>

2、配置集群

注意redis5.0.5以后,就不需要安装ruby了

  • 清除redis中data目录所有数据
rm -rf ./data
  • 新建redis-端口号.conf文件
port 端口号
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
# 打开 cluster集群配置
cluster-enabled yes# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
# cluster集群配置文件
cluster-config-file nodes-端口号.conf# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
# 当前这个节点超时时,多少秒后反馈信息
cluster-node-timeout 10000

复制六份这样的文件,每个配置文件的参数改成端口号

  • 启动六个cluster节点

    /usr/local/bin/redis-server /opt/module/redis-5.0.5/conf/redis-端口号.conf

3、链接集群

进入到一个redis,bin目录下执行命令

./redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

如果集群有密码:./redis-cli 后面跟 -a password
–cluster-replicas 1 表示 一个master后有几个slave,redis集群自行分配
注意 ip一定不能用127.0.0.1 不然外部无法重定向访问集群 cluster-replicas后面的1表示一个主机有几个从机 因为现在只有一个因此是1 工作中是2

4、命令客户端连接集群并使用

  • 注意:-c 表示是以redis集群方式进行连接
    ./redis-cli -a 123456 -h 127.0.0.1 -p 6379 -c
  • 查看集群状态
    • cluster info
  • 查看集群中的节点
    • cluster nodes
  • 查看帮助
    • cluster help
  • 新增master节点
    • cluster meet ip:port
  • 忽略一个没有solt的节点
    • cluster forget id
  • 手动故障转移
    • cluster failover
  • 进入从节点redis,切换其主节点
    • cluster replicate masterID
  • 当存放数据存,放的key:001根据crc16算法算出值然后对16384取余算出的值恰好落在分配到7001的槽中,所以就存放到7001中。我们去7002中进行获取的时候。会重定向到7001中进行获取。
    在这里插入图片描述

四、集群扩容

新加入的节点都是master,并且不会分配任何slot槽位,我们要手动为新节点分配hash槽

1、添加节点

  • 启动6385节点 进入bin目录进行启动
    • ./redis-server redis-6385.conf
  • 申请加入集群
    • ./redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6379
    • 命令解释:添加节点 6385 去meet6379申请加入集群
  • 启动客户端并查看节点信息:
    • redis-cli -a 123456 -h 127.0.0.1 -p 6379 -c
    • cluster nodes

2、槽位分配

使用redis-cli --cluster reshard命令为新加入的节点分配槽位,需要使用集群中任意一个master节点对其进行重新分片
redis-cli -a 123456 --cluster reshard 127.0.0.1:6385

How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:把这600个hash槽移动到哪个节点上去,需要指定节点id,可通过 cluster nodes 查看当前节点id)
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.Type ‘done’ once you entered all the source nodes IDs.
Source node 1:all(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)

3、添加从节点

  • 添加节点(这时候的节点是master节点,并不会分配槽位)

    • redis-cli -a 123456 --cluster add-node 192.168.0.61:6386 192.168.0.61:6379
  • 先登录从节点,然后在replicate命令中指定主节点的id

    • redis-cli -a 123456-c -h 192.168.0.61 -p 6379
  • 将当前节点分配给指定的master节点作为slave节点

    • cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 *#后面这串id为要添加slave节点的master的节点id*

五、集群缩容

接下来将上面新增加的两个节点删除

1、删除从节点

  • redis-cli --cluster del-node 删除从节点6386,指定删除节点ip和端口,以及节点id
    • redis-cli -a hs --cluster del-node 127.0.0.1:6386 a1cfe35722d151cf70585cee21275565393c0956

2、删除主节点

主节点的里面是有分配了hash槽的,所以我们这里必须先把6385里的hash槽放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题

只能把master的数据迁移到一个节点上,暂时做不了平均分配功能

  • 任选一个主节点进行重新分片*
    • redis-cli -a 123456 --cluster reshard 127.0.0.1:6385
    • How many slots do you want to move (from 1 to 16384)? 600
      (ps:需要多少个槽移动到新的节点上)
      What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
      (ps:把这600个hash槽移动到哪个节点上去,这里使用6379的主节点id)
      Please enter all the source node IDs.
      Type ‘all’ to use all the nodes as source nodes for the hash slots.
      Type ‘done’ once you entered all the source nodes IDs.
      Source node 1:2728a594a0498e98e4b83a537e19f9a0a3790f38
      (ps:这里是需要数据源,也就是我们的6385节点id。这里这次就不写all了)
      Source node 2:done
      (ps:这里直接输入done 开始生成迁移计划)
      Do you want to proceed with the proposed reshard plan (yes/no)? yes
      (ps:这里输入yes开始迁移)
      
  • 查看节点信息,发现没有插槽数了
    • cluster info
  • 开始删除节点
    这次就不写all了)
    Source node 2:done
    (ps:这里直接输入done 开始生成迁移计划)
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
    (ps:这里输入yes开始迁移)
  • 查看节点信息,发现没有插槽数了
    • cluster info
  • 开始删除节点
    • redis-cli -a 123456 --cluster del-node 192.168.0.61:6385 2728a594a0498e98e4b83a537e19f9a0a3790f38

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

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

相关文章

Java基础 3.29

1.数组的相关注意事项 错误示范一 String strs[] new String[2]{"a", "b"}; 正确示范一 String strs[] new String[]{"a", "b"}; 让JVM自己判断有几个数据&#xff0c;无需再其中写明有几组数据 错误示范二 String strs[] new…

从入门到精通:HTML 项目实战中的学习进度(一)

一、基础夯实阶段 1.1 HTML 文档结构与核心语法 在 HTML5 的世界里&#xff0c;构建一个文档就像是搭建一座大厦&#xff0c;坚实的基础至关重要。HTML5 文档的基础框架以<!DOCTYPE html>声明开场&#xff0c;这就好比是给浏览器下达的一份 “指令书”&#xff0c;明确…

FFmpeg —— 实时绘制音频波形图(附源码)

🔔 FFmpeg 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 实时绘制音频波形图 步骤                 FFmpeg打开媒体文件,读取每一包数据,将音频数据包进行缓冲,一包一包处理音频缓冲,对音频缓冲包进行解码,读…

大数据学习(88)-zookeeper实现的高可用(HA)

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

基于MFC按钮逻辑

void CSUCCES1Dlg::SetDlgItemState()//IDC_BTN_INIT初始化按钮 { GigeState state = GigeState::ARV_NONE;//GigeState是一个枚举类型,stat状态为ARV_NONE int idx = ((CListBox*)GetDlgItem(IDC_LIST_GIGE))->GetCurSel();//GetDlgItem 是 MFC 框架提供的一个成员…

EF Core 乐观并发控制(并发令牌)

文章目录 前言一、乐观并发的核心思想二、实现方法1&#xff09;使用并发令牌&#xff08;Concurrency Token&#xff09;2&#xff09;处理并发冲突 三、工作原理四、适用场景五、与悲观并发的对比六、最佳实践总结 前言 Entity Framework (EF) Core 默认支持 乐观并发控制&a…

解决 FFmpeg 使用 C/C++ 接口时,解码没有 shell 快的问题(使用多线程)

一、问题 硬件设备为香橙派 5Plus&#xff0c;最近需要使用硬件视频解码来加速 YOLO 的检测&#xff0c;shell 窗口的FFmpeg已经调通&#xff0c;详见文章&#xff1a; 编译支持 RKmpp 和 RGA 的 ffmpeg 源码_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article…

工业控制网络中常用的通信协议

1. 现场总线协议 Modbus 概述&#xff1a;Modbus 是最广泛使用的工业协议之一&#xff0c;主要用于串行通信&#xff0c;支持主/从架构&#xff0c;通过 RS-232 或 RS-485 传输&#xff0c;也有基于以太网的 Modbus TCP 版本。特点&#xff1a;简单易用&#xff0c;易于实现&am…

【Mac】npm error Error: EACCES: permission denied, mkdir‘/Users/...

问题描述&#xff1a;Mac电脑中的 vscode 下载依赖的时候提示没有权限&#xff1a; 故障分析 首先账号是有权限的&#xff0c;电脑就建了一个账号是管理员&#xff1b;在桌面用shell直接执行命令npm init 命令可以执行成功&#xff0c;那么问题就出在vscodes上面了&#xff0…

Ruby 简介

Ruby 简介 引言 Ruby 是一种广泛使用的动态、开源的编程语言,自 1995 年由日本程序员 Yukihiro Matsumoto(通称 Matz)设计以来,它以其优雅的语法、强大的库支持和跨平台特性赢得了全球开发者的青睐。本文将详细介绍 Ruby 的起源、特点、应用领域以及它在现代软件开发中的…

[Qt5] QMetaObject::invokeMethod使用

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

Windows10清理机器大全集

Windows10清理机器大全集 写在前面先这么个标题&#xff0c;逐渐补充禁止Update移除Microsoft Compatibility Telemetrywindows-defender-remover其它 写在前面 看到标题&#xff0c;读者已经就吐了。 我是说&#xff0c;我非常认可: IT从业者&#xff0c;如果你银子比较充足&…

【AI】NLP

不定期更新&#xff0c;建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…

如何为 Debian 和 Kali 系统更换软件源并更新系统

在 Linux 系统中&#xff0c;软件源&#xff08;Software Repository&#xff09;是获取软件包和更新的核心途径。然而&#xff0c;默认的软件源可能会因为地理位置、网络状况等原因导致下载速度缓慢&#xff0c;甚至无法访问。为了提升系统的软件获取效率&#xff0c;许多用户…

android 一步完成 aab 安装到手机

家人们谁懂&#xff01;在 Android 系统安装 aab 应用超麻烦。满心期待快速体验&#xff0c;却发现 aab 无法直装&#xff0c;得先转为 apks 格式&#xff0c;这过程复杂易错。好不容易转好&#xff0c;还得安装 apks&#xff0c;一番折腾&#xff0c;时间与耐心全耗尽。别愁&a…

mac部署CAT监控服务

在 Mac 上部署美团点评开源的 CAT 监控服务端&#xff0c;可以按照以下步骤操作&#xff1a; 1. 环境准备 1.1 安装依赖 确保已安装以下工具&#xff1a; JDK 8&#xff08;建议 OpenJDK 11&#xff09; MySQL 5.7&#xff08;存储监控数据&#xff09;&#xff08;8.0不支持…

C语言基础:第10天笔记

内容提要 函数 函数的概述 函数的分类 函数的定义 形参和实参 函数的返回值 函数 函数的概述 函数&#xff1a;实现一定功能的&#xff0c;独立的代码模块&#xff0c;函数是c程序的核心构成模块&#xff0c;可以说c程序就是由众多的函数组成&#xff0c;对于函数的使用…

集成开发环境革新:IntelliJ IDEA与Cursor AI的智能演进

集成开发环境革新&#xff1a;IntelliJ IDEA 与 Cursor AI 的智能演进 集成开发环境&#xff08;IDE&#xff09; 是软件开发者必不可少的工具。一个优秀的 IDE 不仅能够帮助编写和调试代码&#xff0c;还能集成版本控制和代码优化等多种功能。如今&#xff0c;随着人工智能&a…

【Django】教程-1-安装+创建项目+目录结构介绍

欢迎关注我&#xff01;后续会更新django教程。一周2-3更&#xff0c;欢迎跟进&#xff0c;本周会更新第一个Demo的单独一个模块的增删改查【Django】教程-4-一个增删改查的Demo【Django】教程-2-前端-目录结构介绍【Django】教程-3-数据库相关介绍 1.项目创建 1.1 安装 Djan…

智能仪表板DevExpress Dashboard v24.2新版亮点:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设备的决策…