典型的高可用设计(一):MinIO

news2024/11/17 3:53:18

        为了更好的了解高可用设计,将各类常用服务关于高可用的设计原理汇总到一起,通过横向对比的方式去发现这些典型设计的共同之处和差异点。

一、部署方式

        MinIO 有单机单硬盘、单机多硬盘、多机多硬盘三种部署模式。单机单硬盘存在单点风险,数据没有安全保障,一般只用于测试环境、开发环境。单机多硬盘同样有单点风险,但数据有安全保障。多机多硬盘是最常用的部署方式,在多台(2-32)服务器上搭建服务,且数据分散在多块(最少4块,无上限)磁盘上,提供了较为强大的数据冗余机制(Reed-Solomon纠删码),规避了单点风险。

二、分布式部署

        MinIO 采用多机多硬盘的分布式部署方式保证系统的高可用。下图是MinIO的存储示意图。一行是一个MinIO的服务,一个MinIO服务可以有多个Drive(本地硬盘),Set是一组 Drive 的集合。

        看几个MinIO的概念:

        Object:存储到 MinIO 的基本对象,如文件、字节流,Anything...

        Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。

        Drive:部署 MinIO 时设置的磁盘,MinIO 中所有的对象数据都会存储在 Drive 里。

        Set:在同一集群内,MinIO 自己会自动生成若干Set(纠删组),用于分布存放桶数据。是一组 Drive 的集合,每个 Set 中的 Drive 分布在不同位置。一个对象存储在一个 Set 上。(For example: {1…64} is divided into 4 sets each of size 16.)。

        DataDrives :纠删码中的数据盘,用来存储 Object 原始数据。

        ParityDrives:纠删码中的冗余盘,用来存储 Object 计算出来的冗余数据。

三、对象存储

        MinIO 是通过数据编码,将原来的对象编码成 N 份,N 就是一个 Set 上面 Drive 的数量。对象被编码成N份之后,把每一份,写到对应的 Drive 上面,这就是把一个对象存储在整个 Set 上。

         一个集群包含多个 Set,每个对象最终存储在哪个 Set 上是根据对象的名称进行哈希,然后影射到唯一的 Set 上面,这个方式从理论上保证数据可以均匀的分布到所有的 Set 上。

        根据的观测,数据分布的也非常均匀,一个 Set 上包含多少个 Drive 是由系统自动根据集群规模算出来的,当然,也可以自己去配置。

        一个 Set 的 Drive 系统会考虑尽可能把它放在更多的节点上面,保证它的可靠性。

        对于上传的 Object,Minio 会将其划分为多个 Block 来计算纠删码。如果 Object Size > 10 MB,那么每个 block 的大小就是 10 MB。如果 Object Size < 10 MB,如果也划分一个 10 MB 的 block 就太浪费空间了,所以分配一个大小刚好为 Object Size 的 block 就够了。

        一个 Set 中有多个 Drive(DataDrives + ParityDrives),所以 Minio 会先将一块 Block 按照 Drive 数量,划分为多个小块,这些小块在 Minio 中叫做 Shards。比如一个 Block 是 10MB, 而 Set 里有 6 个 Drive(3 DataDrives + 3 ParityDrives),此时 Minio 会将 Block 按照 10 MB / 3 DataDrives 的方式,将数据划分到 3 个 Data Shards,并额外再创建 3 个 空 Shards,用来存储编码后的冗余数据。

四、高可用

        对于用户来说,直观的感觉是把某个Object存到了某个Bucket中,而不用关心这个对象具体放到了哪些服务的那些磁盘中。

        Minio采用去中心化的无共享架构,对象数据被打散存放在不同节点的多块硬盘,对外提供统一命名空间访问,并通过负载均衡或者DNS轮询在各个服务器之间实现负载均衡。

        多节点组成的分布式Minio集群可保证服务的高可用,一个N节点的分布式Minio,只要有N/2节点在线,数据就是安全的。不过需要至少有N/2+1个节点才能创建新的对象。

        例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服务器宕机,这个集群仍然是可读的,不过需要9台服务器才能写数据。

        分布式Minio自动引入了纠删码功能来保证数据安全,防范多个节点宕机和位衰减bit rot。分布式Minio至少需要4个硬盘。一个Set中的一定数量的硬盘发生的故障(故障硬盘的数量小于等于校验盘的数量),通过纠删码校验算法可以恢复出正确的数据。

        只要遵守分布式Minio的限制,可以组合不同的节点和每个节点几块硬盘。比如,可以使用2个节点,每个节点4块硬盘;可以3个节点,每个节点2块硬盘;也可以使用4个节点,每个节点1块硬盘,诸如此类。在这些集群配置下,至少能保证1个节点宕机或者1块磁盘损坏的情况下不丢数据,能读数据,能恢复服务。节点越多、每个节点的硬盘越多可用性越高。

五、注意事项

  1. 所有运行分布式 MinIO 的节点都应该共享一个共同的根凭证,以便节点相互连接和信任。为此,建议在执行 MinIO 服务器命令之前,将 root 用户和 root 密码导出为环境变量,MINIO_ROOT_USER并在所有节点上导出。MINIO_ROOT_PASSWORD如果未导出,minioadmin/minioadmin则应使用默认凭据。
  2. MinIO 创建每组2到16 个驱动器的纠删码集。提供的驱动器总数必须是这些数字之一的倍数。
  3. MinIO 选择最大的 EC 集大小,将其划分为给定的驱动器总数或节点总数,确保保持均匀分布,即每个节点参与每组相同数量的驱动器。
  4. 每个对象都写入单个 EC 集,因此分布在不超过 16 个驱动器上。
  5. 建议运行分布式 MinIO 设置的所有节点是同质的,即相同的操作系统、相同数量的磁盘和相同的网络互连。
  6. 分布式Minio使用干净的目录,里面没有数据。也可以与其他程序共享磁盘,这时候只需要把一个子目录单独给MinIO使用即可。例如,可以把磁盘挂在到/export下, 然后把/export/data作为参数传给MinIO server即可。
  7. 运行分布式 MinIO 实例的服务器之间的间隔应小于 15 分钟(之前是3s)。可以启用NTP服务作为最佳实践,以确保跨服务器的时间相同。
  8. 在Windows操作系统上运行分布式 MinIO被认为是实验性的。请谨慎行事。

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

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

相关文章

ElasticSearch 部署及安装ik分词器

ansiable playbook链接&#xff1a; https://download.csdn.net/download/weixin_43798031/87719490 需要注意的点&#xff1a;公司es集群现以三个角色部署分别为 Gateway、Master、Data 简单的理解可以理解为在每台机器上部署了三个es&#xff0c;以端口和配置文件来区分这三…

itop-3568 开发板系统编程学习笔记(18)LED 应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 应用层操作 LED 的两种方式sysfs 方式控制 LED控制方法原理简介 编写 LED 应用程序 应用层操作 LED 的两种方式 应用层操作底层硬件有两种方法&#xff0c;分别…

数据治理与数据中台架构

随着工业 4.0 时代的到来&#xff0c;传统行业的数字化转型是大势所趋&#xff1b;将数据提高到数据要素层面&#xff0c;让传统的技术在新的场景下发挥出新的作用&#xff0c;是近期研究和探讨的焦点话题。数语科技支持和服务传统行业多年&#xff0c;聚焦于传统数据建模和数据…

PostgreSQL中的复制延迟

PostgreSQL是一个流行的开源关系数据库管理系统&#xff0c;PostgreSQL中可能遇到的一个常见问题是复制延迟。 在这篇博客中&#xff0c;我们将讨论什么是复制延迟&#xff0c;它为什么会发生&#xff0c;以及如何在PostgreSQL中减轻它。 什么是复制延迟&#xff1f; 复制延迟…

Flink系列-9、Flink DataStream的输入数据集Data Source

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录 addSource方…

【A component required a bean of type ‘xxx‘ that could not be found.】

在学谷粒商城项目的时候出现了以下问题&#xff1a; *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type org.redisson.Redisson that could not be found. Action: Consider defining a…

React-Router详解

React-Router详解 简介React-Router React-Router是一款用于构建单页面应用&#xff08;SPA&#xff09;中处理路由的JavaScript库。在现代的Web应用中&#xff0c;SPA已经成为了一种常见的应用架构模式&#xff0c;它允许在不刷新整个页面的情况下进行交互式的用户体验。而Re…

GPT能给审计带来什么

ChatGPT的出现&#xff0c;让人工智能再次站在了聚光灯下&#xff0c;引发持续性的热议和关注。GPT模型作为重要的支撑&#xff0c;国内外近段时间密集性地发布了众多的大语言模型&#xff0c;OpenAI推出GPT-4、谷歌推出LaMDA和PaLM等大模型、Meta推出开源大模型LLaMA&#xff…

2023-04-23 学习记录--C/C++-邂逅C/C++(中)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 上一篇&#xff1a;邂逅C/C&#xff08;上&#xff09; 一、if语句 ⭐️ &#xff08;一&#xff09;、格式 &#x1f36d; if…

6.1 欧拉方法与改进欧拉方法

6.1.1 欧拉方法 欧拉方法是一种数值解常微分方程&#xff08;ODE&#xff09;的方法&#xff0c;可以用于近似求解给定的初值问题。它是以欧拉命名的瑞士数学家莱昂哈德欧拉所发明的&#xff0c;因此得名。 欧拉方法的基本思路是将连续的常微分方程转化为离散的形式。具体而言…

全功能药效团图谱(Full-feature pharmacophore map)是什么?怎么绘制?

药效团和全功能药效团图谱是什么&#xff1f; 药效团是指与靶点相互作用并导致生物活性的化学基团或者分子结构片段。【药效团通常包括氢键受体/供体、疏水部位、离子化部位等关键成分】 "全功能药效团图谱" &#xff08;Full-feature pharmacophore map&#xff0…

.net6 core web项目发布部署到Linux,以守护进程服务的形式部署启动,nginx实现转发

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台&#xff08;Linux-x64&#xff09; 3、文件夹选项&#xff1a;在发布前删除所有现有文件 二、部署项目&#xff08;安装.net6环境&#xff1a;参考Linux安装 dotnet sdk 6.0&#xff09; &#xff08;1&#xff09;…

toRef

toRef就是把什么东西变成ref 用这个页面来讲解 改成这样就用不了&#xff0c;失去了响应的功能 为什么会这样&#xff1f; 看这个页面&#xff0c;其实这个Proxy的实现就响应式的原理&#xff0c;但是let namep.name实际上就是let name张三&#xff0c;只是把这个值给了name&…

Android 日志框架使用

在实际开发中&#xff0c;经常会遇到需要打印日志并保存到文件中&#xff0c;便于后面取日志分析代码运行情况&#xff0c;当然如果只是打印日志不需要记录文件&#xff0c;使用android自带的log工具就完全够了&#xff0c; Log打印日志会记录到系统日志中&#xff0c;可以取出…

光敏电阻传感器模块资料

实物项目案例 实物图&#xff1a; PCB图&#xff1a; 原理图&#xff1a; 用途&#xff1a; 光线亮度检测,光线亮度传感器&#xff0c;智能小车寻光模块 模块特色&#xff1a; 1、采用灵敏型光敏电阻传感器 2、比较器输出&#xff0c;信号干净&#xff0c;波形好&#x…

【Leetcode】10. 正则表达式匹配

10. 正则表达式匹配&#xff08;困难&#xff09; 题解 如果从左向右进行匹配的话&#xff0c;需要考虑字符后是否有 * 。 因此选择从右向左扫描更为简单。 *前面肯定有一个字符&#xff0c;它像是一个拷贝器&#xff0c;能够复制前面的单个字符&#xff0c;甚至也可以把这个…

Java 1.8新特性

接口的默认方法 Java 8允许给接口添加一个非抽象的方法实现&#xff0c;只需要使用default关键字即可&#xff0c;这个特征又叫做扩展方法 interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);} }Formula接口在拥有calculate方法之…

【Linux初阶】进程的相关概念 | 进程管理 查看进程 获取进程标识符 fork进程创建

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程的概念&#xff0c;进程管理初识&#xff08;描述、管理进程&#xff09;&#xff0c;查看进程的基础方法…

【Nav2】ROS2 Eloquent中使用robot_state_publisher发布松灵Scout mini的urdf

【背景】 本来打算把ROS1版本的松灵Scout mini 模型描述文件直接移植到ROS2的工作空间里去&#xff0c;用robot_state_publisher加载出来&#xff0c;结果行不通&#xff1b;于是找到了ROS2版本的Scout mini 模型描述&#xff0c;结果因为我用的是 Eloquent 版本&#xff0c;而…

MobTech MobPush|A/B测试提升运营决策

在实际推送过程中&#xff0c;我们常常有这样的困惑&#xff1a; 我们如何确定哪种推送内容更能吸引用户&#xff1f; 我们如何衡量推送效果的提升程度&#xff1f; 我们如何优化推送方案&#xff0c;实现更高的ROI&#xff1f; 为了解决这些困惑&#xff0c;我们需要一种科…