Docker高级篇之安装Redis集群(分布式存储案例)

文章目录

    • 1. 案例场景
    • 2. 3主3从redis集群扩缩容配置案例架构说明
    • 3. 3主3从redis集群扩缩容配置案例搭建
    • 4. 主从容错切换迁移案例
    • 5. 主从扩容
    • 6. 主从缩容

1. 案例场景

1~2亿条数据需要缓存,如何设计这个存储案例?这种情况下单机存储100%是不可能的,肯定是分布式存储,那么用redis如何落地?

  • 哈希取余分区

在这里插入图片描述
2亿条记录就是2亿个k-v对,我们单机不行必须要用分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key)%N台机器数,计算出hash值,用来决定映射到哪一个节点上。这样做的优点是,简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落在一台服务器上,这样每台服务器固定处理一部分请求,起到负载均衡+分而治之的作用。但这个方法缺点也是很明显的,原来规划好的节点,进行扩容或者缩容就比较麻烦,每次数据变动导致节点有变动,映射关系需要重新计算,在服务器个数不变时,哈希取余分区方法是很高效的,如果需要弹性扩容或者故障停机的情况下,原来的取模公式就会发生变化。此时,如果某个节点宕机了,那么导致整个hash取余就会重新洗牌,根据公式获取数据失效。

  • 一致性哈希算法

一致性hash算法是在1997年由麻省理工学院提出来的,设计目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量就会改变了,自然取余失效的情况。(当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系),该方法步骤如下:

  1. 使用一致性算法构建哈希环

一致性hash算法必然有个hash函数,并按照算法产生hash值,这个算法所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,2321],这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首位相连,这样让它逻辑上形成一个环形空间。一致性哈希算法也是按照使用取模的方法,不不同hash不同的是,一致性hash算法取模对象不是服务器数量,而是对 2 32 2^{32} 232取模,简单来说,一致性hash算法将整个hash空间组织成了一个虚拟的环,如果设某hash函数H的值空间为 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,2321],整个hahs环如下图:整个空间按顺时针方向组织,圆的正上方的点代表0,0右侧的第一个点代表1,以此类推,2、3、4…直到 2 32 − 1 2^{32}-1 2321,也就是说0点左侧的第一个点代表 2 32 − 1 2^{32}-1 2321,0和 2 32 − 1 2^{32}-1 2321在0点中方向重合,我们把这个由 2 32 2^{32} 232个点组成的圆称为hash环。

在这里插入图片描述
2. 服务器IP节点映射

将集群中某个IP节点映射到环上的某一个位置。将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行hash,这样每台机器就能确定其在hash环上的位置,假如4个节点Node A、B、C、D,经过IP地址的哈希函数计算(hash(ip)),使用IP地址哈希后的环空间位置如下:
在这里插入图片描述

  1. key落到服务器的落键规则

当我们需要存储一个k-v时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出hash值并确定此数据在环上的位置,从次位置沿环顺时针行走,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。

在这里插入图片描述

一致性hash算法有很多优点,首先它具有容错性,假设上图的Node C节点宕机了,此时Object C的数据就会放到Node D中,也就是说在一执行hash算法中,如果一台服务器不可用,则受影响的数据仅仅是次服务器到其环空间中前一台服务器的数据,其它不会收到影响。此外,一致性hash算法还具有扩展性,假如上图中Node A和Node B中加入了一个Node X,此时受到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余全部数据重新洗牌。

当然一致性hash算法也有一定的局限性,一致性hash算法有数据倾斜问题,一致性hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如下图系统只有两个服务器:
在这里插入图片描述

  • hash槽分区(用的比较广泛)

为了解决一致性hash算法的数据倾斜问题提出了hash槽分区的概念。哈希槽实质上就是一个数组,数组 [ 0 , 2 14 − 1 ] [0,2^{14}-1] [0,2141]形成hash slot空间。哈希槽能解决均匀分配的问题,在数据节点之间又加入了一层,把这层称为哈希槽,用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。
在这里插入图片描述
槽解决的事粒度问题,相当于把粒度变大了,这样便于数据移动。hash解决的事映射问题,使用key的hash值来计算所在的槽,用于数据分配。

一个redis集群只能有16384个槽,编号0-16383。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号分配给哪个主节点,集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求hash值,然后对16384取余,余数是几key就落入对应的槽中。以槽为单位移动数据,因为槽的数量是固定的,处理起来比较容器,这样数据移动的问题就解决了。

在这里插入图片描述

2. 3主3从redis集群扩缩容配置案例架构说明

  • redis集群(3主3从-docker配置案例说明)

在这里插入图片描述

3. 3主3从redis集群扩缩容配置案例搭建

  • 3主3从redis集群配置

新6个docker实例

docker run -d --name redis-node-1 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r1:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6381 --daemonize no --protected-mode no

docker run -d --name redis-node-2 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r2:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6382 --daemonize no --protected-mode no

docker run -d --name redis-node-3 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r3:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6383 --daemonize no --protected-mode no

docker run -d --name redis-node-4 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r4:/data  redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6384 --daemonize no --protected-mode no

docker run -d --name redis-node-5 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r5:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6385 --daemonize no --protected-mode no

docker run -d --name redis-node-6 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r6:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6386 --daemonize no --protected-mode no

–net host:使用宿主机的IP和端口
–privileged=true:获取宿主机root用户权限
–cluster-enabled yes :开启redis集群
–appendonly yes:开启redis持久化

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

进入容器内部构建集群关系

首先进入redis-node-1

docker exec -it redis-node-1 /bin/bash

然后构建主从关系:

redis-cli -p 6381 --cluster  create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1

-cluster-replicas 1表示为每个master创建一个slave节点

在这里插入图片描述

可以上面图片中表示hash槽被分配到了三个redis节点中,可以发现节点之间的主从关系也分配好了

然后登陆6381号机器查看集群的状态:

redis-cli -p 6381
cluster info

在这里插入图片描述

cluster nodes

在这里插入图片描述

从上面可以知道,集群关系如下表所示:

masterslave
63816385
63826386
63836384

4. 主从容错切换迁移案例

  • 数据读写存储

我们进入6381机器,然后插入一条数据。出现(error) MOVED 12706 127.0.0.1:4381

这是因为k1转换后的hash值不属于这个6381分配到的hash槽位,所以插入不进去,所以我们redis-cli不能连接具体的节点,而是整个redis集群,要使用-c参数

在这里插入图片描述

redis-cli -p 6381 -c

在这里插入图片描述

现在就重定向插入成功了

#这个也可以看集群的信息
redis-cli --cluster check 127.0.0.1:6381

在这里插入图片描述

  • redis集群的主从切换

我们让master 6381宕机:

在这里插入图片描述
然后进入6382查看集群情况:

在这里插入图片描述
可以发现原来6381的从节点6385切换成了主节点

如果6381恢复了,分析现在的主从关系:

在这里插入图片描述

可以发现6381成为了6385的master了,实验完毕后恢复原来的架构图(6381再次成为master,手动恢复)

5. 主从扩容

现在我们再加入一个主从节点,成为四主四从架构。

  • 新增主机6387和6388
docker run -d --name redis-node-7 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r7:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6387 --daemonize no --protected-mode no

docker run -d --name redis-node-8 --net host --privileged=true -v /Users/jackchai/Desktop/lottory_docker/learndocker/redis/r8:/data redis:6.0.8  --cluster-enabled yes --appendonly yes --port 6388 --daemonize no --protected-mode no

在这里插入图片描述

  • 进入6387中,将新增的6387节点(空槽号)作为master节点加入到原集群
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6381

在这里插入图片描述

6387成功加入,但是没有分配任何hash槽

redis-cli --cluster check 127.0.0.1:6381

在这里插入图片描述

现在确实是4主4从

然后我们需要现在需要重新分配槽位(重点关注是如何分配槽位的

redis-cli --cluster reshard 127.0.0.1:6381

在这里插入图片描述
槽位分配完后,看看集群现在情况:
在这里插入图片描述

最后将6388加入为6387的从节点

redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave --cluster-master-id d8c2c1b1173153a52bbb5d3b1621e264bc58e399

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

6. 主从缩容

现在我们删除上面增加的6387和6388恢复3主3从架构。

  • 先清除掉从节点6388
redis-cli --cluster del-node 127.0.0.1:6388 5b783d293e3499437eea2e0a368f31f488e04740

在这里插入图片描述

可以发现现在只有3个从节点了

  • 将6387的槽号清空,本例将清出来的槽号都给6381
redis-cli --cluster reshard 127.0.0.1:6381

在这里插入图片描述
在这里插入图片描述
最后删除6387节点:

redis-cli --cluster del-node 127.0.0.1:6387 d8c2c1b1173153a52bbb5d3b1621e264bc58e399

在这里插入图片描述

又恢复到3主3从架构了

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

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

相关文章

【kubernetes】k8s集群安全机制 保姆级攻略哦

目录 一、认证(Authentication) 1.1三种认证方式 1.2需要被认证的访问类型: 1.3安全性说明: 1.4证书颁发: 1.5kubeconfig 1.6Service Account 1.7Secret 与 SA 的关系 1.7.1Kubernetes 设计了一种资源对象叫做…

Qt Creator常用的快捷键和常用功能

常用快捷键 新建项目,ctrl n 运行项目,ctrl r 构建项目,ctrl b 改变编辑器界面字体显示比例大小,ctrl 鼠标滚轮 对齐代码,ctrl a; ctrl i 跳转到上一行,ctrl shift enter 跳转到下一行,…

sc.tl.rank_genes_groups()问题

今天被问到了一个关于sc.tl.rank_genes_groups()的奇怪的问题 import scanpy as sc import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # from CellDART import da_cellfraction # from CellDART.utils import random_mix from…

Linux网络服务之SSH(远程访问及控制)

ssh远程管理: ssh是一种安全通道协议,用来实现字符界面的远程登录。远程复制,远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式(可以实现免密登录) ssh 22 网络层 传输层 数据传输…

制造执行MES系统在光伏行业的应用

全球对可再生能源的需求不断增长,光伏能源作为一种清洁、可持续的能源形式,已经在广泛应用中受到了广泛关注。为满足工业领域的光伏能源需求,光伏制造执行系统(MES)作为一种集成化的技术解决方案,提供了更高效、更可靠的解决方案。…

代码随想录算法训练营第四十六 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 视频讲解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…

Apache POI(使用Java读写Excel表格数据)

1.Apache POI简介 Apache POI是一个开源的Java库&#xff0c;用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能&#xff0c;包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API&#xff0c;使得Java开发者能够…

【Mybatis】动态SQL标签2

choose (when, otherwise)标签是使用举例 类似switch...case&#xff0c;从上到下匹配&#xff0c;找到匹配的条件&#xff0c;就结束匹配其他的&#xff01; set标签是使用举例 set这个标签是用在更新操作上的 set标签代替sql中的set关键字&#xff0c;可以把set语句后多余的…

【精选案例】Sellfy | 电子商务平台怎么利用客户裂变系统实现用户增长?

Sellfy是一种基于云的电子商务解决方案&#xff0c;特别为数字内容创作者所设计。 一、主要目标用户&#xff1a; Sellfy主要针对的是包括作家、插画家、设计师、音乐家和电影制作人在内的数字内容创作者&#xff0c;他们可以在Sellfy上在线销售自己的产品。 二、平台特点&a…

商淘云电商分账系统如何为企业降低连锁财务成本

当今激烈的市场竞争中&#xff0c;连锁品牌企业面临着多样化的挑战&#xff0c;其中财务管理尤为关键。商淘云连锁收银系统作为一款专为连锁品牌量身定制的解决方案&#xff0c;不仅可以帮助企业实现总部入账管控财务、银行结算规范财务的目标&#xff0c;还能通过分账系统优化…

Django里的ModelForm组件

ModelForm组件 自动生成HTML标签 自动读取关联数据表单验证 错误提示数据库进行&#xff1a;新建&#xff0c;修改 步骤如下&#xff1a; 创建类 # 在 views.py 文件里# 创建一个类 class AssetModelForm(forms.ModelForm):class Meta:model models.AssetSet #fields [n…

IDEA完整卸载和破解安装

1、完全卸载IDEA 1.卸载 2、清理注册表 windows R 输入 regedit 打开注册表 3、系统文件清理 C:\用户\${用户名称}\IdeaProjects\ # 如果你想删除 IDEA 相关&#xff0c;则只需要删除 JetBrains 目录下包含 IDEA 的文件夹即可 C:\用户\${用户名称}\AppData\Roaming\JetBra…

NPDP|智造业产品经理的战略智慧与行动之道

在智能制造风起云涌的时代&#xff0c;智造业产品经理的角色愈发重要。他们不仅需要具备深厚的行业知识&#xff0c;更要拥有前瞻的战略眼光和高效的行动能力。那么&#xff0c;智造业产品经理如何进行战略思考与行动呢&#xff1f;本文将为您揭示其中的奥秘。 洞察市场趋势&am…

File类操作文件方法详解及其简单应用

一、File 类介绍 Java 中的 File 类是 java.io 包的一部分&#xff0c;它提供了操作文件和目录的能力。File 类可以用来表示文件系统中的文件或目录。 二、路径 在讲File用法之前咱们先介绍一下路径是什么&#xff1f; 在计算机中&#xff0c;路径&#xff08;Path&#xff0…

Python中__init__.py文件的作用

作用 在Python中,__init__.py 文件有几个重要的作用,主要与包的管理和模块的导入相关。具体来说,它有以下几个功能: 标识包: __init__.py 文件存在的主要目的是标识包含它的目录是一个Python包。没有这个文件,Python解释器不会将该目录视为包的一部分。因此,即使文件夹中…

王炸级产品:字节跳动的Seed-TTS

在人工智能的快速发展中&#xff0c;文本到语音&#xff08;TTS&#xff09;技术已成为连接数字世界与人类沟通的重要桥梁。而字节跳动推出的Seed-TTS模型&#xff0c;无疑是这一领域的一个突破性进展&#xff0c;它以其卓越的性能和高度的自然度&#xff0c;被誉为TTS模型中的…

翻译《The Old New Thing》- What’s with this MSH_MOUSEWHEEL message?

Whats with this MSH_MOUSEWHEEL message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080806-00/?p21353 Raymond Chen 2008年06月06日 MSH_MOUSEWHEEL 消息是怎么回事&#xff1f; 硬件团队正在研发一种鼠标滚轮设备&#xff0c;并…

14 个必须了解的微服务设计原则

想象一下&#xff0c;一个机场有各种各样的业务&#xff0c;每个部门都是一个精心设计的微服务&#xff0c;专门用于预订、值机和行李处理等特定操作。机场架构必须遵循这个精心设计的架构的基本设计原则&#xff0c;反映微服务的原则。 例如&#xff0c;航空公司独立运营&…

什么是视频号招商团长?如何加入成为视频号招商团长

视频号招商团长&#xff0c;是通过微信视频号平台的线上和线下活动&#xff0c;撮合商家和达人进行合作&#xff0c;帮助商家、达人在视频号成长发展&#xff1b;同时还可以通过邀请内容创作者入驻微信视频号并为其提供支持&#xff1b;从而获取佣金收益的&#xff0c;而其作用…

【西瓜书】4.决策树

1 递归返回情况 &#xff08;1&#xff09;结点包含样本全为同一类别 &#xff08;2&#xff09;属性集为空&#xff0c;没有属性可供划分了 或 有属性&#xff0c;但是在属性上划分的结果都一样 &#xff08;3&#xff09;结点为空结点 **结束时判定该结点的类别遵循如下规则&…