合 MinIO_S3的简介和安装使用
Tags: GreenPlumS3异地备份存储sshfsMinIO存储服务器备份服务器
简介
GitHub:https://github.com/minio/
官方文档:https://min.io/docs/minio/linux/index.html
中文文档:https://www.minio.org.cn/docs/minio/linux/index.html
MinIO 的名称来源于 "Minimal Object Storage"(最小化对象存储)的缩写,体现了其设计理念——提供一个简单、高效的对象存储系统。名称中的 "Min" 代表 "Minimal"(最小的),而 "IO" 代表 "Input/Output"(输入/输出)。
MinIO 是一个高性能的对象存储系统,采用 Go 语言编写,设计上与 Amazon S3 兼容,支持 S3 API。MinIO 主要用于存储海量的非结构化数据,比如图片、视频、日志文件和备份等。它可以部署在本地数据中心、公有云或混合云环境中,并且通过 S3 API 实现与现有工具和应用的兼容性。
MinIO 是一种高性能、S3 (Simple Storage Service) 兼容的对象存储。它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。
不需要购买任何专有硬件,就可以在云上和普通硬件上拥有分布式对象存储。
MinIO拥有开源 GNU AGPL v3 和商业企业许可证的双重许可。
MinIO 是一个开源的对象存储服务器,用于存储和管理大规模的非结构化数据,例如图像、视频、日志文件、备份和容器镜像。MinIO 旨在提供高性能、高可用性、可扩展性和易用性的对象存储解决方案,适用于私有云、公共云和混合云环境。
以下是 MinIO 的主要特点和介绍:
- 开源和自由:
MinIO是一个开源项目,根据Apache License 2.0许可证发布,这意味着您可以免费使用、修改和分发它。 - 对象存储:
MinIO是一种对象存储系统,它使用存储桶(buckets)来组织数据,每个存储桶包含多个对象。对象可以是各种文件、文档、媒体和其他非结构化数据。 - 高性能:
MinIO具有出色的性能,能够以高速处理大规模数据。它采用了分布式、并行和多线程处理技术,以支持高吞吐量和低延迟。 - 高可用性:
MinIO具有内置的冗余和故障转移功能,支持数据备份和多副本存储,以确保数据的持久性和高可用性。它还支持数据版本控制。 - 容器化:
MinIO可以轻松部署在容器化环境中,如Docker和Kubernetes。这使得它适用于云原生应用和容器化工作负载。 - 分布式扩展:
MinIO支持分布式架构,可以轻松扩展以适应不断增长的数据需求。您可以添加更多的MinIO实例以构建多节点集群。 - S3 兼容:
MinIO提供了S3(Simple Storage Service) API兼容性,这意味着它可以与现有的S3客户端和应用程序集成,无需进行大规模修改。 - 安全性:
MinIO提供数据加密、身份验证和访问控制功能,以确保数据的保密性和完整性。它还支持SSL/TLS加密。 - 易用性:
MinIO的配置和管理非常简单,具有用户友好的命令行界面和Web管理控制台。它还有丰富的文档和活跃的社区支持。
MinIO 是一个功能强大且易于使用的对象存储解决方案,适用于各种应用,从数据备份和存档到大规模媒体存储和分析。它为云原生环境提供了一个强大的存储选项,并且由于其开源性质,广受开发者和组织的欢迎。
优点:
部署简单:一个single二进制文件即是一切,还可支持各种平台。
minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB;
兼容Amazon S3接口,充分考虑开发人员的需求和体验;
低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠删码集合(Erasure Coding Set)中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。
读写性能优异
MinIO 基础概念
S3——Simple Storage Service,简单存储服务,这个概念是Amazon在2006年推出的,对象存储就是从那个时候诞生的。S3提供了一个简单Web服务接口,可用于随时在Web上的任何位置存储和检索任何数量的数据。Object——存储到 Minio 的基本对象,如文件、字节流,Anything...Bucket——用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。Drive——部署 Minio 时设置的磁盘,Minio 中所有的对象数据都会存储在 Drive 里。Set——一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的 Drive 分布在不同位置。一个对象存储在一个Set上
一个集群划分为多个Set
一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
一个SET中的Drive尽可能分布在不同的节点上
纠删码EC(Erasure Code)
MinlO使用纠删码机制来保证高可靠性,使用highwayhash来处理数据损坏( Bit Rot Protection)。关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。
即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。
在standalone模式下,还可以分为non-erasure code mode(无纠删码模式)和erasure code mode(纠删码模式)。
non-erasure code mode
在此启动模式下,对于每一份对象数据, minio直接在data 下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏就表示数据丢失。
erasure code mode
此模式为minio server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server会自动启用erasure code mode.
erasure code对磁盘的个数是有要求的,如不满足要求,实例启动将失败。erasure code启后,要求传给minio server的endpoint(standalone模式下,即本地磁盘上的目录)至少为4个。
下载
http://minio.org.cn/download.shtml#/windows
http://minio.org.cn/download.shtml#/linux
http://minio.org.cn/download.shtml#/docker
docker安装
https://hub.docker.com/r/minio/minio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | docker rm -f minio docker run -itd --name minio -h minio \ -p 8000:9000 -p 8001:9001 \ -e "MINIO_ROOT_USER=minioadmin" \ -e "MINIO_ROOT_PASSWORD=minioadmin" \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --restart=always \ --privileged=true minio/minio server \ /data --console-address ":9000" -address ":9001" docker logs -f minio http://192.16.7.162:8000/login |
9000端口指的是minio的WebUI端口,9001是API的端口
MINIO_ACCESS_KEY :账号
MINIO_SECRET_KEY :密码(账号长度必须大于等于5,密码长度必须大于等于8位)
API: http://192.92.0.27:9001 http://127.0.0.1:9001
RootUser: minioadmin
RootPass: minioadminWebUI: http://192.92.0.27:9000 http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin
Linux单机安装
https://dl.min.io/server/minio/release/linux-amd64/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | docker rm -f lhrminio docker run -itd --name lhrminio -h lhrminio \ -p 9000:9000 -p 9001:9001 -p 39389:3389 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --restart=always \ --privileged=true lhrbest/lhrcentos76:9.2 \ /usr/sbin/init docker exec -it lhrminio bash echo 'export LC_TIME=POSIX' >> /etc/profile echo 'export TMOUT=0' >> /etc/profile source /etc/profile echo 'export LANG=en_US.UTF-8' >> /etc/profile ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config setenforce 0 systemctl start firewalld firewall-cmd --add-port=0-65535/tcp --permanent firewall-cmd --add-port=0-65535/udp --permanent firewall-cmd --reload firewall-cmd --list-ports systemctl disable firewalld.service systemctl stop firewalld.service systemctl mask firewalld.service systemctl status firewalld.service wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20240826153307.0.0-1.x86_64.rpm rpm -ivh minio-20240826153307.0.0-1.x86_64.rpm mkdir -p /minio/data export MINIO_ROOT_USER=minioadmin export MINIO_ROOT_PASSWORD=minioadmin minio server /minio/data --console-address ":9000" --address ":9001" cat > /etc/default/minio <<"EOF" MINIO_ROOT_USER="minioadmin" MINIO_ROOT_PASSWORD="minioadmin" MINIO_VOLUMES="/minio/data" MINIO_OPTS="--console-address :9000 --address :9001" #MINIO_PROMETHEUS_AUTH_TYPE="public" #MINIO_PROMETHEUS_URL="http://192.168.10.148:9090" #配置prometheus监控的服务器地址 #MINIO_SERVER_URL="http://192.168.192.163:9000" #负载均衡地址,没有负载均衡就不要放开注释 EOF cat > /usr/lib/systemd/system/minio.service <<"EOF" [Unit] Description=MinIO Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/bin/minio [Service] Type=notify WorkingDirectory=/usr/local User=root Group=root EnvironmentFile=-/etc/default/minio ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi" ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES # Let systemd restart this service always Restart=always # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE=1048576 # Specifies the maximum number of threads this process can create TasksMax=infinity # Disable timeout logic and wait until process is stopped TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target # Built for ${project.name}-${project.version} (${project.name}) EOF sudo systemctl daemon-reload # 启动失败查看日志:journalctl -u minio.service --no-pager sudo systemctl start minio sudo systemctl enable minio sudo systemctl status minio -- 可以登录 9000端口创建一个 bucket了 ,minioadmin/minioadmin http://192.16.7.162:9000/login |
Linux单主机多硬盘模式
在启动 MinIO 时,若传入参数是多个目录,则会以纠删码的形式运行,即具备高可靠性意义。即在一个服务器(单节点)上对,多个磁盘上运行 MinIO。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | mkfs.xfs /dev/sdb -L DISK1 mkfs.xfs /dev/sdc -L DISK2 mkfs.xfs /dev/sdd -L DISK3 mkfs.xfs /dev/sde -L DISK4 mkfs.xfs /dev/sdf -L DISK5 mkfs.xfs /dev/sdg -L DISK6 mkfs.xfs /dev/sdh -L DISK7 mkfs.xfs /dev/sdi -L DISK8 mkfs.xfs /dev/sdj -L DISK9 mkdir -p /minio/data{1..9} cat >> /etc/fstab <<"EOF" # <file system> <mount point> <type> <options> <dump> <pass> LABEL=DISK1 /minio/data1 xfs defaults,noatime 0 2 LABEL=DISK2 /minio/data2 xfs defaults,noatime 0 2 LABEL=DISK3 /minio/data3 xfs defaults,noatime 0 2 LABEL=DISK4 /minio/data4 xfs defaults,noatime 0 2 LABEL=DISK5 /minio/data5 xfs defaults,noatime 0 2 LABEL=DISK6 /minio/data6 xfs defaults,noatime 0 2 LABEL=DISK7 /minio/data7 xfs defaults,noatime 0 2 LABEL=DISK8 /minio/data8 xfs defaults,noatime 0 2 LABEL=DISK9 /minio/data9 xfs defaults,noatime 0 2 EOF mount /dev/sdb /minio/data1 mount /dev/sdc /minio/data2 mount /dev/sdd /minio/data3 mount /dev/sde /minio/data4 mount /dev/sdf /minio/data5 mount /dev/sdg /minio/data6 mount /dev/sdh /minio/data7 mount /dev/sdi /minio/data8 mount /dev/sdj /minio/data9 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20240826153307.0.0-1.x86_64.rpm rpm -ivh minio-20240826153307.0.0-1.x86_64.rpm -- mkdir -p /minio/data export MINIO_ROOT_USER=minioadmin export MINIO_ROOT_PASSWORD=minioadmin -- minio server /minio/data --console-address ":9000" --address ":9001" cat > /etc/default/minio <<"EOF" MINIO_ROOT_USER="minioadmin" MINIO_ROOT_PASSWORD="minioadmin" MINIO_VOLUMES="/minio/data{1...9}" MINIO_OPTS="--console-address :9000 --address :9001" #MINIO_PROMETHEUS_AUTH_TYPE="public" #MINIO_PROMETHEUS_URL="http://192.168.10.148:9090" #配置prometheus监控的服务器地址 #MINIO_SERVER_URL="http://192.168.192.163:9000" #负载均衡地址,没有负载均衡就不要放开注释 EOF cat > /usr/lib/systemd/system/minio.service <<"EOF" [Unit] Description=MinIO Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/bin/minio [Service] Type=notify WorkingDirectory=/usr/local User=root Group=root EnvironmentFile=-/etc/default/minio ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi" ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES # Let systemd restart this service always Restart=always # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE=1048576 # Specifies the maximum number of threads this process can create TasksMax=infinity # Disable timeout logic and wait until process is stopped TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target # Built for ${project.name}-${project.version} (${project.name}) EOF sudo systemctl daemon-reload # 启动失败查看日志:journalctl -u minio.service --no-pager sudo systemctl start minio sudo systemctl enable minio sudo systemctl status minio # 从日志里可以看到访问入口地址,也可以看/var/log/messages -- 可以登录 9000端口创建一个 bucket了 ,minioadmin/minioadmin http://192.16.7.162:9000/login |
file systemLabel就是分区的标签,在最初安装系统是填写的挂载点就是标签的名字。使用设备名(例如:/dev/sdb)和label及uuid作为标识的不同。这里使用的是lable。mount point挂载目录。type文件系统类型,包括xfs、ext2、ext3、ext4、reiserfs、nfs、vfat等。options文件系统的参数,参数如下:Async/sync:设置是否为同步方式运行,默认为asyncauto/noauto:当执行mount -a的命令时,此文件系统是否被主动挂载。默认为autorw/ro:是否以以只读或者读写模式挂载exec/noexec:限制此文件系统内是否能够进行"执行"的操作user/nouser:是否允许用户使用mount命令挂载suid/nosuid:是否允许SUID的存在Usrquota:启动文件系统支持磁盘配额模式Grpquota:启动文件系统对群组磁盘配额模式的支持Defaults:同事具有rw,suid,dev,exec,auto,nouser,async等默认参数的设置
dump是一个用来作为备份的命令参数值解释如下:0代表不要做dump备份1代表要每天进行dump的操作2代表不定日期的进行dump操作
扩容
注意数据的丢失!!!
如果需要加磁盘,必须先把这个这个目录删掉,要不然无法启动,
/data{1..4}/.minio.sys,报错:ERROR Unable to initialize backend: /data1 drive is already being used in another erasure deployment. (Number of drives specified: 5 but the number of drives found in the 1st drive's format.json: 4)
FATAL Unable to initialize backend: /minio/data1 drive is already being used in another erasure deployment. (Number of drives specified: 9 but the number of drives found in the 1st drive's format.json: 6)
1 | rm -rf /minio/data{1..9}/.minio.sys |
Linux分布式集群部署(多主机、多硬盘模式)
分布式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一致性模型。
Windows安装
http://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe
http://dl.minio.org.cn/client/mc/release/windows-amd64/mc.exe
1 2 3 4 5 6 | set MINIO_ROOT_USER=minioadmin set MINIO_ROOT_PASSWORD=minioadmin D:\db\minio\minio.exe server D:\minio\file --console-address ":9000" --address ":9001" |
MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。MinIO服务端中并没有自带客户端,所以我们需要安装配置完客户端后才能使用。
- ls 列出文件和文件夹。
- mb 创建一个存储桶或一个文件夹。
- cat 显示文件和对象内容。
- pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
- share 生成用于共享的URL。
- cp 拷贝文件和对象。
- mirror 给存储桶和文件夹做镜像。
- find 基于参数查找文件。
- diff 对两个文件夹或者存储桶比较差异。
- rm 删除文件和对象。
- events 管理对象通知。
- watch 监听文件和对象的事件。
- policy 管理访问策略。
- session 为cp命令管理保存的会话。
- config 管理mc配置文件。
- update 检查软件更新。
- version 输出版本信息。
添加一个云存储服务
添加一个或多个S3兼容的服务,请参考下面说明。mc将所有的配置信息都存储在~/.mc/config.json文件中。
1 2 | mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> [--api API-SIGNATURE] |
别名就是给你的云存储服务起了一个短点的外号。S3 endpoint,access key和secret key是你的云存储服务提供的。API签名是可选参数,默认情况下,它被设置为"S3v4"。
1 2 | mc config host add minio http://127.0.0.1:9090 admin 12345678 --api s3v4 |
其它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 2.查看别名下的bucket D:\minio>mc config host add minio http://127.0.0.1:9090 admin 12345678 --api s3v4 Added `minio` successfully. D:\minio>mc ls minio [2021-08-03 14:56:35 CST] 0B test1\ D:\minio>mc ls minio/test1 D:\minio>mc ls minio/test1 [2021-08-03 15:14:53 CST] 5.5KiB 01-log.png D:\minio> 3.创建bucket D:\minio>mc mb minio/test2 Bucket created successfully `minio/test2`. D:\minio>mc ls minio [2021-08-03 14:56:35 CST] 0B test1\ [2021-08-03 15:18:11 CST] 0B test2\ D:\minio> 4.显示文件和对象内容 D:\minio>mc cat minio/test1/新建文本文档.txt 123132132 lku 5.cp拷贝(上传)文件 D:\minio>mc cp test.txt minio/test1 test.txt: 10 B / 10 B [========================================================================] 143 B/s 0s D:\minio>mc ls minio/test1 [2021-08-03 15:14:53 CST] 5.5KiB 01-log.png [2021-08-03 15:24:02 CST] 10B test.txt [2021-08-03 15:21:03 CST] 22B 新建文本文档.txt 6.查找find D:\minio>mc find minio/test1 --name "*.txt" minio/test1/test.txt minio/test1/新建文本文档.txt |
Windows下分布式部署、单节点多磁盘、多节点模式
参考:https://blog.csdn.net/xixiyuguang/article/details/119456729
单节点多磁盘模拟
1 2 3 4 5 | set MINIO_ROOT_USER=minioadmin set MINIO_ROOT_PASSWORD=minioadmin D:\db\minio\minio.exe server --console-address ":9000" --address ":9001" F:\minio\data1 F:\minio\data2 F:\minio\data3 F:\minio\data4 |




