高性能云原生数据对象存储MinIO实战-上

35 篇文章 1 订阅
26 篇文章 0 订阅

概述

定义

MinIO 官网地址 http://www.minio.org.cn/

MinIO GitHub地址 https://github.com/minio/minio

MinIO 文档地址 http://docs.minio.org.cn/docs/

MinIO 是一款高性能、分布式的对象存储系统.可运行在标准硬件即X86等低成本机器。构建高性能的云原生数据,机器学习,大数据分析,海量存储的基础架构,MinIO支持各种应用程序数据工作负载。

  • 高性能:MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。
  • 可扩展性:MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。简单可扩展.” 在 MinIO, 扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心。 通过添加更多集群可以扩展名称空间, 更多机架,直到实现目标。
  • 开放全部源代码 + 企业级支持:MinIO 基于Apache V2 license 100% 开放源代码 。
  • 与Amazon S3 兼容:亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。
  • 简单:极简主义是MinIO的指导性设计原则。简单性减少了出错的机会,提高了正常运行时间,提供了可靠性,同时简单性又是性能的基础。 只需下载一个二进制文件然后执行,即可在几分钟内安装和配置MinIO。

特性

MinIO的企业级功能代表了对象存储空间中的标准。从AWS S3 API支持到S3 Select支持,以及设计的擦除编码和数据安全等实现,代码受到了技术和业务领域的一些知名人士的广泛赞誉和频繁使用。

  • 纠删码:MinIO使用按对象的嵌入式擦除编码保护数据,该编码以汇编代码编写,可提供最高的性能。 MinIO使用Reed-Solomon代码将对象划分为n / 2个数据和n / 2个奇偶校验块-尽管可以将它们配置为任何所需的冗余级别。 这意味着在12个驱动器设置中,将一个对象分片为6个数据和6个奇偶校验块。即使丢失了多达5个((n / 2)–1)个驱动器(无论是奇偶校验还是数据),仍然可以从其余驱动器可靠地重建数据。MinIO的实现可确保即使丢失或无法使用多个设备,也可以读取对象或写入新对象。最后,MinIO的纠删码位于对象级别,并且可以一次修复一个对象。
  • bitrot
    • 无声的数据损坏或Bitrot是磁盘驱动器面临的严重问题,导致数据在用户不知情的情况下损坏。原因多种多样(驱动器老化,电流尖峰,磁盘固件错误,虚假写入,读/写方向错误,驱动程序错误,意外覆盖),但结果是一样的——数据泄漏。
    • MinIO对高速哈希算法的优化实现可确保它永远不会读取损坏的数据-它可以实时捕获和修复损坏的对象。 通过在READ上计算哈希值,并在WRITE上从应用程序,整个网络以及到内存/驱动器的哈希值,来确保端到端的完整性。 该实现旨在提高速度,并且可以在Intel CPU的单个内核上实现超过10 GB /秒的哈希速度。
  • 加密
    • 加密飞行中的数据是一回事,保护静态数据是另一回事。 MinIO支持多种复杂的服务器端加密方案,以保护数据-无论其位于何处。 MinIO的方法可确保机密性,完整性和真实性,而性能开销却可以忽略不计。 使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。加密的对象使用AEAD服务器端加密进行了防篡改。此外,MinIO与所有常用的密钥管理解决方案(例如HashiCorp Vault)兼容并经过测试。
    • MinIO使用密钥管理系统(KMS)支持SSE-S3。如果客户端请求SSE-S3,或启用了自动加密,则MinIO服务器会使用唯一的对象密钥对每个对象进行加密,该对象密钥受KMS管理的主密钥保护。由于开销极低,因此可以为每个应用程序和实例打开自动加密。
  • WORM:启用WORM后,MinIO会禁用所有可能会使对象数据和元数据发生变异的API。这意味着一旦写入数据就可以防止篡改。这对于许多不同的法规要求具有实际应用。
  • 身份认证和管理:MinIO支持身份管理中最先进的标准,并与OpenID connect兼容提供商以及主要的外部IDP供应商集成。这意味着访问是集中的,密码是临时的和轮换的,而不是存储在配置文件和数据库中。此外,访问策略是细粒度的且高度可配置的,这意味着支持多租户和多实例部署变得简单。
  • 连续复制
    • 传统复制方法的挑战在于它们无法有效扩展到几百TB。话虽如此,每个人都需要一种复制策略来支持灾难恢复,并且该策略需要跨越地域,数据中心和云。 MinIO的连续复制旨在用于大规模的跨数据中心部署。通过利用Lambda计算通知和对象元数据,它可以高效,快速地计算增量。
    • Lambda通知确保与传统的批处理模式相反,更改可以立即传播。连续复制意味着即使发生高动态数据集,如果发生故障,数据丢失也将保持在最低水平。最后,就像MinIO所做的一样,连续复制是多厂商的,这意味着您的备份位置可以是从NAS到公共云的任何位置。
  • 全局一致性
    • 现代企业到处都有数据。 MinIO允许将这些各种实例组合在一起以形成统一的全局名称空间。具体来说,最多可以将32个MinIO服务器组合成一个分布式模式集,并且可以将多个分布式模式集组合成一个MinIO服务器联合。每个MinIO Server Federation都提供统一的管理员和名称空间。
    • MinIO Federation Server支持无限数量的分布式模式集。这种方法的影响在于,对象存储可以为大型的,地理上分散的企业进行大规模扩展,同时保留从以下位置容纳各种应用程序(S3 Select,MinSQL,Spark,Hive,Presto,TensorFlow,H20)的能力。单一控制台。
  • 多云网关
    • 所有企业都在采用多云策略。这也包括私有云。因此,您的裸机虚拟化容器和公共云服务(包括Google,Microsoft和阿里巴巴等非S3提供商)必须看起来完全相同。尽管现代应用程序具有高度的可移植性,但为这些应用程序提供支持的数据却并非如此。
    • MinIO应对的主要挑战是,无论数据位于何处,都使数据可用。 MinIO在裸机,网络连接存储和每个公共云上运行。更重要的是,MinIO通过Amazon S3 API从应用程序和管理角度确保您对数据的看法完全相同。
    • MinIO可以走得更远,使您现有的存储基础架构与Amazon S3兼容。其影响是深远的。现在,组织可以真正统一其数据基础架构-从文件到块,所有这些都显示为可通过Amazon S3 API访问的对象,而无需迁移。

架构设计

MinIO设计为云原生,可以作为轻量级容器运行,由外部编排服务(如Kubernetes)管理。整个服务器约为40MB静态二进制文件,即使在高负载下也可以高效利用CPU和内存资源。达到共享硬件上共同托管大量租户。

  • MinIO在带有本地驱动器(JBOD / JBOF)的商品服务器上运行。集群中的所有服务器的功能均相同(完全对称的体系结构)。没有名称节点或元数据服务器。
  • MinIO将数据和元数据作为对象一起写入,从而无需使用元数据数据库。此外,MinIO以内联,严格一致的操作执行所有功能(擦除代码,位rotrot检查,加密),异常灵活。
  • 每个MinIO群集都是分布式MinIO服务器的集合,每个节点一个进程。 MinIO作为单个进程在用户空间中运行,并使用轻量级的协同例程来实现高并发性。将驱动器分组到擦除集(默认情况下,每组16个驱动器),然后使用确定性哈希算法将对象放置在这些擦除集上。
  • MinIO专为大规模,多数据中心云存储服务而设计。每个租户都运行自己的MinIO群集,该群集与其他租户完全隔离,从而使他们能够保护他们免受升级,更新和安全事件的任何干扰。每个租户通过联合跨地理区域的集群来独立扩展。

image-20220803183950284

推荐配置

MinIO与硬件无关,可在从基于ARM的嵌入式系统到高端x64和POWER9服务器的各种硬件体系结构上运行。但是对于大规模数据存储基础结构,
建议以高密度和高容量形式使用以下服务器配置。(注意:对象存储操作主要受吞吐量限制。因此,MinIO充分利用了现代硬件改进,例如AVX-512 SIMD加速,100GbE网络和NVMe SSD可用)。

image-20220803184510958

常见应用场景

  • 互联网海量非结构化数据的存储需求
  • 电商网站:海量商品图片
  • 视频网站:海量视频文件
  • 网盘:海量文件
  • 社交网站:海量图片

部署

支持部署方式

如只是在开发和测试环境使用可使用podman和docker容器快速部署。MinIO是一个云原生的应用程序,旨在在多租户环境中以可持续的方式进行扩展。编排(orchestration)平台为MinIO的扩展提供了非常好的支撑。支持Docker Swarm、Docker Compose、Kubernetes、DC/OS编排平台的MinIO部署文档。

  • 为什么说MinIO是云原生的(cloud-native)?
    • 云原生这个词代表的是一些思想的集合,比如微服务部署,可伸缩,而不是说把一个单体应用改造成容器部署。一个云原生的应用在设计时就考虑了移植性和可伸缩性,而且可以通过简单的复制即可实现水平扩展。现在兴起的编排平台,像Swarm、Kubernetes以及DC/OS,让大规模集群的复制和管理变得前所未有的简单,哪里不会点哪里。
    • 容器提供了隔离的应用执行环境,编排平台通过容器管理以及复制功能提供了无缝的扩展。MinIO继承了这些,针对每个租户提供了存储环境的隔离。
    • MinIO是建立在云原生的基础上,有纠删码、分布式和共享存储这些特性。MinIO专注于并且只专注于存储,而且做的还不错。它可以通过编排平台复制一个MinIO实例就实现了水平扩展。
    • 在一个云原生环境中,伸缩性不是应用的一个功能而是编排平台的功能。
    • 现在的应用、数据库,key-store这些,很多都已经部署在容器中,并且通过编排平台进行管理。MinIO提供了一个健壮的、可伸缩、AWS S3兼容的对象存储,这是MinIO的立身之本,凭此在云原生应用中占据一席之地。

部署常见错误

io.minio.errors.ErrorResponseException: Access denied

原因可能是:

  • 时间不同步,如果经过niginx的话,需要配置一下9000的映射。
  • 如果是时间不同步,可以按以下步骤进行
# 安装ntp ntpdate
yum -y install ntp ntpdate
# 与时间服务器同步时间
ntpdate cn.pool.ntp.org
# 将系统时间写入硬件时间
hwclock --systohc

快速入门MinIO

如果开发熟悉使用可以直接使用单机容器部署

# podman中运行MinIO单点模式非持久化,9000端口是提供客户端的端口,9001是MinIO控制台页面端口
podman run \
  -p 9000:9000 \
  -p 9001:9001 \
  minio/minio server /data --console-address ":9001"
# docker中运行MinIO单点模式持久化宿主机  
docker run \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  minio/minio server /data --console-address ":9001"
# 如果需要设置密码可以使用可以再加上如下参数
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin123" \

image-20220805102648312

查看docker进程

image-20220805102907408

访问http://192.168.50.95:9001/ 输入上述提示的用户名密码minioadmin/minioadmin123 ,进入后首页显示如下

image-20220805102845578

Minio纠删码快速入门

Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。

  • 什么是纠删码erasure code?

    • 纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复,是不是很NB,感兴趣的同学请翻墙google。
  • 为什么纠删码有用?

    • 纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。
  • 什么是位衰减bit rot保护?

    • 位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 HighwayHash基于哈希的校验和来防范位衰减。
  • Minio纠删码快速入门

    • 前提条件需要安装Minio
    • 以纠删码模式运行Minio,示例: 使用Minio,在12个盘中启动Minio服务。
    minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8 /data9 /data10 /data11 /data12
    
    • 示例: 使用Minio Docker镜像,在8块盘中启动Minio服务。
Copydocker run -p 9000:9000 --name minio \
  -v /mnt/data1:/data1 \
  -v /mnt/data2:/data2 \
  -v /mnt/data3:/data3 \
  -v /mnt/data4:/data4 \
  -v /mnt/data5:/data5 \
  -v /mnt/data6:/data6 \
  -v /mnt/data7:/data7 \
  -v /mnt/data8:/data8 \
  minio/minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8

分布式MinIO

分布式Minio可以将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

  • 数据保护
    • 分布式Minio采用纠删码来防范多个节点宕机和位衰减bit rot。
    • 分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
  • 高可用
    • 单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,数据就是安全的。不过需要至少有N/2+1个硬盘来创建新的对象。
    • 例如一个16节点的Minio集群,每个节点16块硬盘,就算8台服务器宕机,这个集群仍然是可读的,不过你需要9台服务器才能写数据。
    • 注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。
  • 一致性
    • Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

启动一个分布式Minio实例只需要把硬盘位置做为参数传给minio server命令即可,然后需要在所有其它节点运行同样的命令。注意

  • 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。
  • 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
  • 下面示例里的IP仅供示例参考,需要改成你真实用到的IP和文件夹路径。
  • 分布式Minio里的节点时间差不能超过3秒,可以使用NTP来保证时间一致。
  • 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。

启动分布式Minio实例启动分布式Minio实例4个节点,每节点4块盘(虚拟),需要在4个节点上都运行下面的命令;先根据上面下载服务端和客户端,这里修改默认MinIO客户端端口和控制台端口,依次在每一台执行。

# 模拟多个盘
mkdir -p /home/minio/data1 /home/minio/data2 /home/minio/data3 /home/minio/data4
# 进入目录
cd /home/minio/
# 下载服务端
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin123
nohup ./minio server --address :9900 --console-address :9901 \
               http://192.168.5.52:9900/home/minio/data1 http://192.168.5.52:9900/home/minio/data2 \
               http://192.168.5.52:9900/home/minio/data3 http://192.168.5.52:9900/home/minio/data4 \
               http://192.168.5.53:9900/home/minio/data1 http://192.168.5.53:9900/home/minio/data2 \
               http://192.168.5.53:9900/home/minio/data3 http://192.168.5.53:9900/home/minio/data4 \
               http://192.168.50.95:9900/home/minio/data1 http://192.168.50.95:9900/home/minio/data2 \
               http://192.168.50.95:9900/home/minio/data3 http://192.168.50.95:9900/home/minio/data4 \
               http://192.168.12.28:9900/home/minio/data1 http://192.168.12.28:9900/home/minio/data2 \
               http://192.168.12.28:9900/home/minio/data3 http://192.168.12.28:9900/home/minio/data4 > run.log &                 

当所有都执行完后,每一台都有如下启动配置完成的输出,系统配置保存在每个盘下面.minio.sys文件夹,这个是一个隐藏文件夹,如果想重置初始化部署可以删除这个目录。

image-20220805135911977

登录http://192.168.5.52:9901/ 输入用户名密码minioadmin/minioadmin123,查看

image-20220805143040418

接下来创建一个名称为file的Bucket,然后在file下上传文件tinyid-server-1.0.tar.gz,

image-20220805140418807

我们登录另外一台http://192.168.5.52:9901/ 后查看的结果是一样的

image-20220805140929057

点击右边的Download下载按钮,瞬间下载完毕,MinIO真的就是快,上传下载基本上只受限于网络带宽,至此分布式部署已完成

**本人博客网站 **IT小神 www.itxiaoshen.com

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值