`

docker高级篇2-分布式存储之三种算法

阅读更多

面试题:

1~2亿条数据需要缓存,请问如何设计这个缓存案例?

答:单机单台100%是不可能的。肯定是分布式缓存的。那么用Redis如何落地?

一般有三种方案:

哈希取余分区;一致性哈希算法分区;哈希槽分区。如下图:

a791fd553bf3b7666ed7e4207c786d7f.png

大家好,我是凯哥Java(kaigejava),乐于分享,每日更新技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~

哈希取余分区:

对redis的key进行hash后和机器总数取余。公式:has(key)%N

这种分区算法的优点:

简单粗暴,直接有效。只需要预估好数据规划好节点。就能保证一段时间的数据支撑。使用HASH算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求,起到负载均衡+分而治之的作用。

缺点:

原来规划后的节点,进行扩容或者缩容就比较麻烦了。不管是扩容还是缩容,每次数据变更导致几点有变动,映射关系需要重新进行计算。在服务器个数固定不变的时候没问题。如果需要弹性扩容或者故障停机的情况下,原来的取模公式就会发生变化。此时地址经过某个redis机器宕机了。由于机器总数量发生了变化,会导致hash取余全部数据重新洗牌啊!!

一致性哈希算法分区:

一致性hash算法是什么?

一致性hash算法在1997年麻省理工学院提出的,设计目标是为了解决:

分布式缓存数据变动和映射问题。某个机器宕机了,分母数量改变了,自然取余就出问题了。

一致性hash算法能干嘛?

提出一致性hash解决方案。目的是当服务器个数发生变动的时候,尽量减少影响客户端到服务器的映射关系。

都有哪些步骤?

3大步骤。

1:算法构建一致性哈希环;

一致性哈希算法必然有个hash函数并安装算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为hash空间,范围是[0,2^32-1],这是一个线性空间,但是在算法中,通过适当的逻辑控制将其首尾相连(0=2^32),这样在逻辑上,就形成了一个环形的空间。

一致性哈希环也是使用的取模的方方,是对2^32取模。一致性hash算法将这个哈希值空间组织成一个虚拟的圆环,整个哈希环是按照顺时针方法组织的。如下图:

393f5eec28962da1332cfbc95733ffe7.png

2:服务器IP节点映射

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

a938aca2882396590626fff082ba02e0.png

 

3:key落到服务器的落键规则

hash环构建了、服务器IP节点也映射了,那么当我们需要存储一个KV键值对的时候,先要计算的是key对应的hash值(hash(key)),将这个key使用相同的函数hash计算出哈希值并确定此数据在环上的位置,从此位置沿着环顺时针"行走",第一遇到的服务器就是其应该定位到的服务器。并将该键值对存储在这个节点上。

例如:我们有ObjA、ObjB、ObjC、ObjD四个数据对象,在经过hash计算之后,在环上分布的空间位置如下图。

根据一致性hash算法,ObjA的数据将会被定位到NodeA上。其他的类推,B将会在NodeB上,C将会在NodeC上,D将会在NodeD上.

4a5bc04625fd58d8ec7385f9a34981f2.png

一致性hash算法的优点是什么?

1:一致性哈希算法的容错性

假设上图中的NodeC所在的服务器宕机了,可以看到次数对象ABD不会受到影响,只有C队形会被重定位到NodeD的机器上。一般地,在一致性Hash算法中,如果一台服务器不可用了,则受到影响的数据仅仅是对应服务器到其环空间中前一台服务器(也就是沿着逆时针方向行走遇到的第一台服务器)之间的数据而已,其他的数据不会受到影响,简单的来说,就是C服务器挂了,受影响的只是B、C之间的数据,并且这些数据会迁移到D上进行存储。

43f6d5ccd8e103b8ec59c4e79870422a.png

 

2:一致性哈希算法的扩展性

所谓的扩展性,就是数据量增加了,则需要增加一台节点NodeX,X的位置在A和B之间,那受到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash重新取余,全部数据重新洗牌.如下图:

a8a4317d684b46528eb12ca9b30b32ef.png

 

一致性hash算法的缺点是什么?

一致性哈希算法的数据倾斜问题

在服务器节点太少的情况下,容易因为节点数据分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)的问题。假设系统中只有两台服务器。那么出现数据倾斜就如下图:

3acd61d9f32f1766e82bbea2e3d9e691.png

总结一致性hash算法:

目的:为了在节点数目发生改变时尽可能少迁移数据。将所有的存储节点排列在相接的hash环上,每个key在计算hash之后,会按照顺时针找到的存储节点存放。而当有节点加入或者退出时候,仅影响该节点在hash环上的顺时针相邻的后续节点。

优点:加入和删除节点只会影响哈希环中顺时针方向相邻的节点,对其他节点无影响。

缺点:数据的分布和节点的位置有关,因为这些节点不是均匀地分布在哈希环上的,所以数据进行存储时候达不到均匀分布效果。可能就出现了数据倾斜问题。

针对上面问题,于是,又有了新的方案。就是接下来要讲的,哈希槽分区。

哈希槽分区

哈希槽是什么?

为什么会出现哈希槽算法?

因为一致性哈希算法的数据倾斜问题,为了解决这个问题。

哈希槽实质上就是一个数组,数组[0,2^14-1]形成hash slot空间。

能干什么?

解决均匀分配的问题,在数据和节点之间又加入了一层,把这一层称为哈希槽(slot),用于管理数据和节点之间的关系。现在就相当于节点上放的是槽,槽里面上的是数据。

621e4296584006fd105db502d512b905.png

槽解决的是粒度问题,相当于是把粒度变大了。这样便于数据移动。

哈希解决的是映射问题,使用key的哈希值来计算所对应槽,便于数据分配。

多少个hash槽:

一个集群中只能有16384个槽。编号为0--16383(0-2^14-1),这些槽会分配给集群中所有的主节点,分配策略没有要求。可以指定哪个编号的槽分配给哪个主节点。集群会记录节点和槽对应的关系。解决了节点和槽的关系后,接下来就需要对key进行hash值计算,然后对16384取余。余数是几,那么key就落入到对应的槽中。slot=CRC16(key)%16384.以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容器,这样数据迁移问题就解决了.

哈希槽计算

Redis集群中内置了16384个哈希槽,Redis会根据节点数量大致均等地将hash槽映射到不同的节点。当需要在集群中放置一个k-v时,Redis先对key使用crc16算法算出一个结果,然后把结果对16834求余数。这样每个key都会对应一个编号,也就会映射到某个节点上。如下图:

24c4e7b31fb116780e1f8401148ee46a.png

结束语

如操作有问题欢迎去 我的 个人博客(www.kaigejava.com)留言或者   微信公众号(凯哥Java)留言交流哦。

 

 

直通车,本系列教程已发布文章,快速到达,《Docker学习系列》教程已经发布的内容如下:

【图文教程】Windows11下安装Docker Desktop

【填坑】在windows系统下安装Docker Desktop后迁移镜像位置

【Docker学习系列】Docker学习1-docker安装

【Docker学习系列】Docker学习2-docker设置镜像加速器

【Docker学习系列】Docker学习3-docker的run命令干了什么?docker为什么比虚拟机快?

【Docker学习系列】Docker学习2-常用命令之启动命令和镜像命令

【Docker学习系列】Docker学习系列3:常用命令之容器命令

【Docker学习系列】Docker学习4-常用命令之重要的容器命令

【Docker教程系列】Docker学习5-Docker镜像理解

【Docker教程系列】Docker学习6-Docker镜像commit操作案例

【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云

【Docker学习教程系列】8-如何将本地的Docker镜像发布到私服?

「Docker学习系列教程」9-Docker容器数据卷介绍

「Docker学习系列教程」10-Docker容器数据卷案例

Docker学习11-Docker常规方式安装软件

「Docker学习系列教程」基础篇小总结及高级篇预告

docker高级篇1-dockeran安装mysql主从复制

 

【Docker学习教程系列汇总】笔记及遇到问题解决文章


 



 

 

分享到:
评论

相关推荐

    advanced-java-master.zip

    本资源包"advanced-java-master.zip"主要涵盖了Java后端开发的高级主题,源自GitHub,旨在为开发者提供便捷的下载途径。这个压缩包中包含了一个完整的项目目录,让我们来逐一探讨其中可能涉及的知识点。 1. **Java...

    Java相关、分布式架构、网络存储、数据结构与算法、面试相关等个人总结的MD文档

    2. **分布式架构**:分布式架构涉及如何将应用程序设计为多个相互协作的部分,以提高可扩展性、容错性和性能。可能会讨论微服务架构、服务发现、负载均衡、消息队列(如RabbitMQ或Kafka)、分布式缓存(如Redis)...

    【Java核心知识面试】-阿里Java面试集锦.zip

    - SQL语言:掌握基本的查询、增删改操作,以及高级特性如索引、事务、存储过程。 - JDBC:了解数据库连接、执行SQL语句、结果集处理等。 10. **分布式** - 分布式ID生成:如雪花算法、UUID等。 - 分布式缓存:...

    Java架构面试专题(含答案)和学习笔记(5).rar

    Java架构面试专题涵盖了Java开发中的核心概念和技术,是求职者准备高级Java工程师或者架构师面试的重要参考资料。这个压缩包文件包含的学习笔记和答案,旨在帮助读者深入理解Java技术栈的关键点,提升解决问题的能力...

    行业文档-设计装置-一种云平台的硬盘保护方法和系统.zip

    综上所述,这份“一种云平台的硬盘保护方法和系统.pdf”文档可能涵盖了冗余存储、备份恢复、数据加密、健康监测、多租户隔离以及分布式存储等多个关键领域,旨在为云平台构建全面、高效且安全的硬盘保护方案。...

    2023软考高级系统分析师真题回忆版

    2. 页式存储管理: 内存页淘汰机制中,优先淘汰的是访问位和修改位均为0且状态位为0的页,因为这些页不在内存中,淘汰它们不会引起数据丢失。这一策略有助于优化内存利用率。 3. 数据库系统: 自然连接通常比...

    分布式编程内容纲要及试验设计

    实验四.ppt:可能涉及到更高级的主题,如分布式数据库的使用,例如通过Cassandra进行数据存储和查询,理解分布式数据存储的挑战和解决方案。 实验三.ppt:可能涵盖了微服务的实现,如使用Docker和Kubernetes进行...

    Java高级架构必备知识点

    - **金刚之躯之分布式跟踪系统**:构建可靠的分布式追踪系统。 **7.15 微服务架构技术栈分析** - **Spring Boot的使用**:掌握Spring Boot的基础用法。 **7.16 分布式协调服务Zookeeper** - **Zookeeper集群及...

    西电软院分布式往年试题

    从基础的网络通信协议、分布式系统架构到高级的分布式服务框架(如Hadoop、Spark、Docker、Kubernetes等),以及相关的开源项目和最佳实践,都是这部分内容可能涉及的范围。 复习这些知识点对于理解和应对考试至关...

    大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程

    ### 大型SpringMVC、Mybatis、Redis、Solr、Nginx、SSM分布式电商项目视频教程知识点概述 #### 一、SpringMVC框架介绍与应用 **SpringMVC**是Spring框架的一个模块,它实现了MVC设计模式,主要用于构建Web应用程序...

    大数据课程分类.docx

    大数据课程涵盖了多个层面的技术知识,从基础到高级,旨在培养具备大数据处理能力的专业人才。以下是对各个阶段课程内容的详细解析: **基础阶段** - **Linux**:学习Linux操作系统的基本概念,包括安装、配置和...

    整理的2018 java面试汇总,要面试的抓紧看了

    - 是一种键值对存储系统。 - 支持多种数据结构,如字符串、列表、集合等。 - **Redis集群** - 分布式部署方案,提高性能和扩展性。 - **Redis持久化** - 包括RDB快照和AOF日志两种方式。 #### 六、Web服务器...

    PyPI 官网下载 | NRSur7dq2-1.0.3.tar.gz

    《PyPI官网下载:NRSur7dq2-1.0.3.tar.gz——Python库在分布式环境中的应用》 PyPI(Python Package Index)是Python开发者的重要资源库,它为全球的Python开发者提供了一个发布、查找和安装Python软件包的平台。在...

    Neo4j Manual 2.3.0

    - **定义**: Neo4j是一种高性能的NoSQL图形数据库,能够存储和处理具有高度关联性的数据。 - **特点**: - 支持原生图形存储模型。 - 使用Cypher查询语言进行数据检索。 - 提供强大的API接口用于应用程序集成。 -...

    程序员必经之路~~高级程序员复习资料

    11. **分布式系统**:了解分布式计算、分布式存储、负载均衡、分布式缓存、消息队列等,如Hadoop、Spark、Kafka、RabbitMQ等。 12. **云计算与虚拟化**:对AWS、Azure、Google Cloud等云服务提供商的熟悉,以及...

    藏经阁-回顾我的阿里8年之路.pdf

    分布式技术是阿里云的核心技术之一,在文章中,作者提到了分布式计算、分布式存储和分布式调度等技术。分布式计算是指将计算任务分配到多个计算节点上,以提高计算速度和可靠性。分布式存储是指将数据存储在多个存储...

    redis-6.2.14.tar包版本

    2. **持久化机制**:Redis通过RDB(快照)和AOF(Append Only File)两种方式实现数据持久化。RDB在特定时间点创建数据的全量备份,而AOF记录所有写操作日志,确保在系统重启后能够恢复数据。 3. **复制功能**:...

    高级架构师九阶段

    - **分布式存储**:学习NoSQL数据库、分布式文件系统(如HDFS)的设计思路。 - **微服务架构**:了解微服务的概念、优势与挑战;掌握Docker容器化技术、Kubernetes集群管理等工具。 - **消息队列**:熟悉RabbitMQ、...

    大厂 Go 工程师面试题集锦.docx

    - **解释**:Raft是一种分布式一致性算法,相较于Paxos更加易于理解和实现,适用于分布式系统的场景。 7. **Go语言内存泄露处理** - **知识点**:掌握Go语言中内存泄露的常见原因及处理方法。 - **解释**:内存...

Global site tag (gtag.js) - Google Analytics