十二、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.rhkb.cn/news/43298.html

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

相关文章

Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景、父进程等待子进程结束后自己再结束

收尾 进程终止&#xff1a;子进程通过exit()或_exit()终止&#xff0c;父进程通过wait()或waitpid()等待子进程终止&#xff0c;并获取其退出状态。&#xff1f;其实可以考虑在另一篇博文中来写 fork函数讲解 fork函数概述 fork() 是 Linux 中用于创建新进程的系统调用。当…

【AI论文】挑战推理的边界:大型语言模型的数学基准测试

摘要&#xff1a;近年来&#xff0c;大型推理模型的迅猛发展导致现有用于评估数学推理能力的基准测试趋于饱和&#xff0c;这凸显出迫切需要更具挑战性和严谨性的评估框架。为填补这一空白&#xff0c;我们推出了OlymMATH&#xff0c;这是一项全新的奥林匹克级数学基准测试&…

典范硬币系统(Canonical Coin System)→ 贪心算法

【典范硬币系统】 ● 典范硬币系统&#xff08;Canonical Coin System&#xff09;是指使用贪心算法总能得到最少硬币数量解‌的货币面值组合‌。 ● 给定一个硬币系统 &#xff0c;若使其为典范硬币系统&#xff0c;则要求其各相邻面值比例 &#xff0c;及各开区间 内各金额…

Android7 Input(二)Linux 驱动层输入事件管理

概述 在Linux系统中&#xff0c;将键盘&#xff0c;鼠标&#xff0c;触摸屏等这类交互设备交由Linux Input子系统进行管理&#xff0c;Linux Input驱动子系统由于具有良好的和用户空间交互的接口。因此Linux Input驱动子系统&#xff0c;不止于只管理输入类型的设备。也可以将其…

高清壁纸一站式获取:海量分类,免费无弹窗

软件介绍 在如今这个追求个性化与高品质视觉体验的时代&#xff0c;一款出色的壁纸应用无疑能为我们的电子设备增添别样魅力。此刻&#xff0c;要给大家重磅推荐的便是Wallpaper这款应用&#xff0c;它犹如一个绚丽多彩的壁纸宝库&#xff0c;全方位满足你的审美需求。 海量壁…

Linux安装Cmake (Centos 7.9)

cmake安装 这个虽然已经更新到了4.0.0版本了&#xff0c;但是我们要用3.5版本的&#xff0c;因为这个比较稳定 官方地址&#xff1a;https://github.com/Kitware/CMake/releases/tag/v3.5.0&#xff0c;选择那个cmake-3.5.0-Linux-x86_64.tar.gz下载&#xff0c; 首先解压文…

Centos7,tar包方式部署rabbitmq-3.7.6

1. 环境准备 安装编译工具和依赖包 yum -y install make gcc gcc-c glibc-devel m4 perl openssl openssl-devel ncurses-devel ncurses-devel xz xmlto perl 2. Erlang环境搭建 版本对应&#xff1a;https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…

【MySQL篇】事务管理,事务的特性及深入理解隔离级别

目录 一&#xff0c;什么是事务 二&#xff0c;事务的版本支持 三&#xff0c;事务的提交方式 四&#xff0c;事务常见操作方式 五&#xff0c;隔离级别 1&#xff0c;理解隔离性 2&#xff0c;查看与设置隔离级别 3&#xff0c;读未提交&#xff08;read uncommitted&a…

C++Primer学习(14.1 基本概念)

当运算符作用于类类型的运算对象时&#xff0c;可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。举个例子&#xff0c;因为在Sales_item类中定义了输入、输出和加法运算符&#xff0c;所以可以通过下述形式输出两个Sales_item…

循相似之迹:解锁协同过滤的核心推荐逻辑

目录 一、引言二、协同过滤的基本原理三、协同过滤的算法类型&#xff08;一&#xff09;基于用户的协同过滤&#xff08;二&#xff09;基于物品的协同过滤 四、协同过滤的应用案例&#xff08;一&#xff09;电商平台的商品推荐&#xff08;二&#xff09;音乐平台的歌曲推荐…

RuoYi基础学习

1 若依搭建 前后端分离版本&#xff1a;RuoYi-Vue利用SpringBoot作为后端开发框架&#xff0c;与Vue.js结合&#xff0c;实现了前后端分离的开发模式。这种架构有助于提高开发效率&#xff0c;前后端可以独立开发和部署&#xff0c;更适合现代化的Web应用开发。 RuoYi-Vue3&a…

Docker 安装部署Harbor 私有仓库

Docker 安装部署Harbor 私有仓库 系统环境:redhat x86_64 一、首先部署docker 环境 定制软件源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum install -y yum-utils device-mapper-persistent-data lvm2…

【Basys3】外设-灯和数码管

灯 约束文件 set_property PACKAGE_PIN W5 [get_ports CLK] set_property PACKAGE_PIN U18 [get_ports rst] set_property PACKAGE_PIN U16 [get_ports {led[0]}] set_property PACKAGE_PIN E19 [get_ports {led[1]}] set_property PACKAGE_PIN U19 [get_ports {led[2]}] set…

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

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

蓝桥杯 之 二分

文章目录 习题肖恩的n次根分巧克力2.卡牌 二分是十分重要的一个算法&#xff0c;常常用于求解一定范围内&#xff0c;找到满足条件的边界值的情况主要分为浮点数二分和整数二分二分问题&#xff0c;最主要是写出这个check函数&#xff0c;这个check函数最主要就是使用模拟的方法…

SpringBoot集成腾讯云OCR实现身份证识别

OCR身份证识别 官网地址&#xff1a;https://cloud.tencent.com/document/product/866/33524 身份信息认证&#xff08;二要素核验&#xff09; 官网地址&#xff1a;https://cloud.tencent.com/document/product/1007/33188 代码实现 引入依赖 <dependency><…

2025年3月电子学会c++五级真题

结绳 #include <bits/stdc.h> using namespace std;int n,a[10010];int main() {cin>>n;for(int i 0;i<n;i){cin>>a[i];}sort(a0,an);//将a数组从小到大排序double sum 0;for(int i 0;i<n;i){sum (suma[i])/2;}cout<<(int)sum;return 0; } 最…

Typora使用Gitee作为图床

Typora使用Gitee作为图床 文章目录 Typora使用Gitee作为图床Gitee准备图床仓库下载安装软件安装插件 配置Typora Gitee准备图床仓库 新建一个仓库右上角下拉->设置->安全设置->私人令牌->生成新令牌&#xff0c;注意将令牌保存&#xff08;只会出现一次&#xff0…

QT音乐播放器(1):数据库保存歌曲

实现功能&#xff1a;用数据库保存本地导入和在线搜索的歌曲记录 目录 一. 保存本地添加的歌曲 1. 使用QSettings &#xff08;1&#xff09;在构造函数中&#xff0c;创建对象。 &#xff08;2&#xff09;在导入音乐槽函数中&#xff0c;保存新添加的文件路径&#xff0c…