分布式存储极简艺术Minio解析

分布式存储极简艺术Minio解析,第1张

 MinIO 对象存储系统是为海量数据存储、人工智能、大数据分析而设计,基于

Apache License v2.0 开源协议的对象存储系统,它完全兼容 Amazon S3 接口,单个对象的最大可达 5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。作为一个开源服务,MinIO 在设计上汲取了Glusterfs的相关经验不教训,系统复杂度上作了大量简化,目前大小只有40+M,部署只需要一个命令即可完成!另外,minio舍弃了传统分布式存储扩容所需要的迁移流程,采用联盟模式添加集群的方式,极大简化了扩容流程;除此之外,minio还具有纠删编码、比特位保护、单写多读(worm)、下面来依次简要解析一下Mioio的特点及具体实现:

  元数据和数据一起存放在磁盘上。元数据以明文形式存放在元数据文件里(xl.json)。假定对象名字为key_name, 它所在桶的名字是bucket_name, disk路径就是/disk,那么存储路径就是:/disk/bucket_name/key_name,windows下C盘存放桶名为test,对象名为minio.exe示例如图:

其中part.1是实际存储数据(单机模式为原生数据,分布式为纠删码分块),xl.json是如下所示的json字符串:

  在同一集群内,MinIO 自己会自劢生成若干纠删组,用于分布存放桶数据。一个纠删组中的一定数量的磁盘发生的故障(故障磁盘的数量小于等于校验盘的数量),通过纠删码校验算法可以恢复出正确的数据。MinIO 集成了 Reed-Solomon 纠删码库,MinIO 存储对象数据时,首先把它分成若干等长的片段(对于大对象,默认按 5MB 切片),然后每一个片段会纠删算法分成若干分片,包括数据分片不校验分片,每个分片放置在一个纠删组的某个节点上。对象的每一个数据分片、校验分片都被“防比特位衰减”算法所保护。

  MinIO 会根据对象名(类似于文件系统的全路径名),使用 crc32 哈希算法计算出一个整数。然后使用这个整数除以纠删组的个数,得到一个余数。这个余数,可以作为纠删组的序号,这样就确定了这个对象所在的纠删组。MinIO 采用 CRC32 哈希算法,不 glusterfs 的Davies Meyer哈希算法(性能、冲突概率不md4, md5相近)不一样的是,CRC32算法的哈希值分布较不均匀,但运算速度极快,高出 md4 数倍。相对于容量均衡,MinIO 更看重数据的写入速度。

纠删组如何配置?

官方文档说明如下:

 也就是说纠删组的总大小只能从这7中情况中根据你提供的盘的个数(或者说路径个数)来自动选取最大值的,我们 不能灵活地配置m+k纠删存储格式。但这样说又不是很准确 ,因为虽然不能配置任意的m+k,但是在系统已经选取好擦除编码集的的个数后(也就是m+k),可以使用storage class存储类来自定义m和k的数量,默认是1:1的。

存储类:

 MinIO支持配置两种存储类别,精简冗余类别和标准类别,默认是标准类别(1:1),可以在启动MinIO服务器之前使用设置的环境变量来定义这些类。使用环境变量定义每个存储类别的数据和奇偶校验磁盘后,您可以 在上传对象时通过请求元数据字段设置对象的存储类别x-amz-storage-class 。然后,MinIO服务器通过将对象保存在特定数量的数据和奇偶校验磁盘中来兑现存储类。具体配置和使用可以参考官方文档 https://github.com/minio/minio/tree/master/docs/erasure/storage-class

传统的扩展方式的劣势

  通过增加节点来扩展单集群,一般需要进行数据均衡,否则群集内各存储节点会因负载不均而出现新的瓶颈。除了数据均衡操作的时机这个问题以外,在均衡过程中一般需要仍存储使用率高的节点吐使用率低的节点迁移数据。当集群扩容后,大量已经写入的文件落点会出现改变,文件需要迁移到真实的落点。当存储系统容量比较大时,则会发生大量的文件/对象进行迁移,迁移过程可能由于占用大量资源而导致上层应用性能下降。而且当文件/对象迁移过程中,机器故障可能会导致一些意想不到的情冴,尤其是有大量业务的时候。当然针对此类问题,Gluterfs之类的文件系统有一些比较复杂的处理办法。

不支持扩展优势

在开发中经常会用到的就是文件存储了,以前经常都是在服务器目录上映射一个目录用来存储文件,这个当然也没有问题,如果存储量不大的话。当然还有的会选择使用第三方存储比如七牛云、阿里云的oss云储存方案,自己搭建常用的可能会使用fastdfs或其他的,我接触minio后发现这个还是很不错,使用简单,支持多种语言SDK开发起来特别方便,多的就不说了,赶快上车了解下。

文档地址: minio相关文档

docker快速安装单机版:(默认你已经安装了docker环境,不清楚先了解docker安装使用再来吧!)

GNU/Linux 和 macOS

Windows

特别提醒:(-v 映射路径一定要是绝对路径,不然启动会报错)

启动成功后访问浏览器: http://localhost :{port} 进行访问,不指定key和secret默认都是minioadmin,访问后进入登陆页面,输入key和secret即可登陆,登陆成功页面如下:

接下来点击红色按钮创建一个存储桶,即可上传文件,比如创建一个test

在2007年,GlusterFS演变为大型分布式存储方案后,任何配备合适硬件的公司,单位都可以利用个做分布式的流媒体,数据分析。在2011年,Red Hat收购了GlusterFS.

Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。Minio兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java,Python,Javacript, Golang语言。

Minio 提供对象存储服务,兼容了 AWS S3 存储协议,用于非结构化的数据存。非结构化对象,比如图像,音、视频,日志文件,备份镜像…等等管理不方便,不定长,大小变化大、类型多,云端的访问复杂,minio就是来解决这种场景的。非结构化的文件从数KB到5TB都能很好的支持。开源并且用 Go 语言开发,有web操作界面,我们可以用它来搭建兼容S3协议的存储云服务。

Minio可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。

官网: https://minio.io

那么,如何自己搭建一个私有的S3存储云服务呢?

官方的话是推荐用Docker来搞,我们先用普通的二进制文件来直接解决了!

######################################################################################

# mkdir /data/aws_s3

# wget   https://dl.minio.io/server/minio/release/linux-amd64/minio

# mv  minio /usr/local/bin/

#  chmod  755  /usr/local/bin/minio 

# minio server  /data/aws_s3

#############################################################

Created minio configuration file successfully at /root/.minio

Endpoint: http://10.5.10.89:9000   http://127.0.0.1:9000   http://172.17.0.1:9000

AccessKey: U3XLU4IMXY3IDKHU268F 

SecretKey: /6NCL6HGacviaCgRqr2qLbVOjhkkJdRpV7wz0JJD 

Region:    us-east-1

SQS ARNs:  

Browser Access:

http://10.5.10.89:9000   http://127.0.0.1:9000   http://172.17.0.1:9000

Command-line Access:  https://docs.minio.io/docs/minio-client-quickstart-guide

################################################################

$ mc config host add myminio  http://10.5.10.89:9000  U3XLU4IMXY3IDKHU268F /6NCL6HGacviaCgRqr2qLbVOjhkkJdRpV7wz0JJD

Object API (Amazon S3 compatible):

Go:  https://docs.minio.io/docs/golang-client-quickstart-guide

Java:  https://docs.minio.io/docs/java-client-quickstart-guide

Python:  https://docs.minio.io/docs/python-client-quickstart-guide

JavaScript:  https://docs.minio.io/docs/javascript-client-quickstart-guide

Drive Capacity: 8.3 GiB Free, 9.1 GiB Total

##############################################################

我们就成功启动了minio的s3服务,默认端口9000,可以通过网页访问:

http://10.5.10.89:9000  

http://127.0.0.1:9000  

http://172.17.0.1:9000

注意 :第一次打开时候需要填写AccessKey和SecretKey才能进入,我们上面启动服务的时候,已经看到屏幕有输出:

AccessKey: U3XLU4IMXY3IDKHU268F 

SecretKey:6NCL6HGacviaCgRqr2qLbVOjhkkJdRpV7wz0JJD

把这两个Key填入,就能顺利进入,进入后展开页面如下:

这就是我们的S3云存储的管理页面了,看着是不是和七牛什么的提供云存储的产品页面挺像的,大家都是基于S3协议开发的!

上传个文件试试:

点击右下角的红色小加号按钮,弹出的菜单选择”create bucket”则会创建一个桶,输入名字”test”

点击刚才那个红色小加号按钮,这次选择”Upload file”上传文件,给这个桶上传了一个叫login.txt的文本文档

此时页面如下:

至此我们可以看到文件已经上传,要访问这个文件,可以点击文件右侧的三个点的按钮,选择分享就可以得到一个外链,在浏览器中访问这个外链就可以直接访问文件。

那么文件到底被存到哪里去了呢,我们启动命令中其实指定了工作路径/data/aws_s3/,所以到服务器这个目录下看看:

# ls /data/aws_s3/ 

test

# ls /data/aws_s3/test/

login.txt 

桶名称test是一个目录,其下就有上传的login.txt文件。

如果想指定ip和端口,可以这样写:

# minio server /data/aws_s3 --address=0.0.0.0:9000

如果想让服务在后台运行:

# nohup minio server /data/aws_s3   --address=0.0.0.0:443 &

[1] 19882

// nohup: 忽略输入并把输出追加到启动命令的当前目录下的 "nohup.out"文件

minio可以用来搭建分布式存储系统 GlusterFS,这样就成了真正的云存储了,有时间再研究下把它从现在的单机测试,变成一朵存储云!

minio官网: https://minio.io

minio官方文档: https://docs.minio.io/docs/minio-docker-quickstart-guide

minio github主页: https://github.com/minio/minio


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/298274.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-25
下一篇2023-04-25

发表评论

登录后才能评论

评论列表(0条)

    保存