Minio单机与集群部署并使用nginx进行负载均衡 集群版部署参考:gegewu_cloud
一、概述 MinIO
是一个开源的对象存储服务器 ,它兼容Amazon S3(Simple Storage Service)API
。它被设计用于构建分布式存储架构,提供高可用性、高性能和可扩展的对象存储解决方案。
下面是MinIO的一些主要特点和功能:
对象存储 :MinIO以对象为基本存储单元,可以存储和管理任意大小的文件、数据对象。它提供了标准的对象存储操作,如上传、下载、删除和元数据管理。分布式架构 :MinIO采用分布式架构,可以在多个节点上部署,并将数据分布和复制在不同的节点上。这提供了高可用性和数据冗余,确保数据的持久性和可靠性。高性能 :MinIO通过并行处理和分布式架构实现高性能的数据存取。它利用现代硬件和网络技术,充分利用多核处理器和高带宽网络,以实现快速的数据传输和处理。水平扩展 :MinIO可以水平扩展,通过添加更多的节点来增加存储容量和吞吐量。它支持自动数据分片和负载均衡,确保数据在各个节点上均匀分布和访问的负载均衡。数据保护 :MinIO提供了多种数据保护机制,包括数据冗余、故障转移和数据校验。它可以在不同的节点之间复制数据,以应对节点故障和数据损坏的情况。安全性 :MinIO支持数据加密和访问控制,保护存储在其中的数据的安全性和隐私性。它提供了传输层加密(TLS/SSL)和服务器端加密选项,以及身份验证和访问控制机制。总的来说,MinIO是一个开源的高性能对象存储服务器,适用于构建分布式存储系统。它具有高可用性、可扩展性和数据保护机制,兼容Amazon S3 API,使其与现有的S3生态系统和工具集成无缝。MinIO在大数据、云计算和容器化环境中广泛应用,为应用程序提供了可靠、高效的对象存储服务。
这里主要侧重使用docker快速部署环境,想了解更多,可以参考我以下几篇文章:
官方文档:https://docs.min.io/ 中文文档:http://docs.minio.org.cn/docs/
二、MinIO 与 Ceph 对比 MinIO和Ceph都是流行的开源存储解决方案,它们在对象存储领域有不同的特点和适用场景。下面是MinIO和Ceph的对比:
1)架构设计对比 **MinIO
**:MinIO
采用分布式架构,以水平扩展为基础。它通过多个独立的MinIO节点组成集群,每个节点都是独立的对象存储服务器。MinIO专注于提供简单、轻量级的对象存储服务,适用于小型到中等规模的部署。 **Ceph
**:Ceph
是一个分布式存储系统,由对象存储、块存储和文件系统组成。它使用RADOS(Reliable Autonomic Distributed Object Store)
作为底层存储系统,提供高可用性和数据冗余。Ceph适用于大规模的企业级部署,具有复杂的架构和丰富的功能。 2)数据一致性对比 MinIO
:MinIO
在默认配置下提供最终一致性,即写入操作返回成功后,数据可能会有一定的时间窗口内的延迟才能完全一致。这适用于许多应用场景,如数据备份、存档等。Ceph
:Ceph
提供强一致性,即写入操作在返回成功后,数据即刻就达到一致性。这对于需要强一致性保证的应用场景非常重要,如数据库和事务处理。3)部署和管理对比 MinIO
:MinIO
的部署和管理相对简单,可以通过单个二进制文件或容器进行快速安装和配置。它提供了直观的管理界面和易于使用的API,使得管理和监控变得简单。Ceph
:Ceph
的部署和管理相对复杂,涉及多个组件和配置。它需要更多的时间和专业知识来设置和维护,需要熟悉Ceph的架构和配置。4)生态系统和兼容性对比 MinIO
:MinIO与Amazon S3 API兼容,这意味着现有的S3工具和应用程序可以无缝地与MinIO集成。它还有一个活跃的社区,提供了各种客户端库和插件,扩展了其功能和兼容性。Ceph
:Ceph
具有广泛的生态系统和丰富的功能集。它可以与多个协议和接口(如RADOS、RBD、CephFS)进行集成,提供块存储、文件系统和对象存储的全面解决方案。综上所述,MinIO适用于简单、轻量级的对象存储需求 ,注重高性能和易用性。它适合中小规模部署,并且与Amazon S3兼容,易于与现有的S3生态系统集成。
Ceph
则适用于大规模、复杂的企业级存储需求 。它提供强一致性和丰富的功能集,适合需要高可用性、数据冗余和复杂数据操作的场景。Ceph的部署和管理相对复杂,需要更多的配置和管理工作。选择MinIO
还是Ceph取决于具体的需求和场景。如果你需要一个简单、易用、高性能的对象存储解决方案,并与S3兼容,那么MinIO是一个不错的选择。如果你需要一个功能强大、可扩展、支持块存储和文件系统的分布式存储系统,且具备强一致性的要求,那么Ceph是更适合的选择。 无论选择MinIO还是Ceph,都需要仔细评估其与特定应用和环境的兼容性、性能需求、管理复杂性和可扩展性,以确保选择的解决方案能够满足实际需求并提供可靠的存储服务
docker-compose部署(本教程使用最新镜像)
镜像可选
1 2 3 4 minio/minio minio/minio:RELEASE.2021-06-17T00-10-46Z registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-latest registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-RELEASE.2022-08-02T23-59-16Z
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 version: '3' services: minio: image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-latest restart: always privileged: true hostname: "minio" ports: - 9000 :9000 - 9001 :9001 environment: MINIO_ACCESS_KEY: admin MINIO_SECRET_KEY: admin123 volumes: - ./minio/data:/data - ./minio/config:/root/.minio/ command: server --console-address ':9001' /data
控制台创建密钥后 s3连接工具远程连接测试 api地址端口:9000(专门用于例如s3工具代码等连接) 控制台端口:9001 (不要混淆 ) 创建ak/sk填入 登录即可
备注:单机版没有数据冗余 数据只存放于挂载的唯一卷./minio/data中 文章首页教程 里面均为至少两磁盘冗余
三. 集群部署并使用nginx进行负载均衡 1. 简介 分布式 Minio 可以让你将多块硬盘或者多台服务器组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障。MinioMinio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。
# 2. Minio分布式部署的优势# 2.1 数据保护分布式 Minio 采用纠删码来防范多个节点宕机和位衰减。 分布式 Minio 至少需要 4 个节点(4台服务器),使用分布式 Minio 就 自动引入了纠删码功能。 纠删码是一种恢复丢失和损坏数据的数学算法, Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。 纠删码的工作原理和 RAID 或者复制不同,像 RAID6 可以在损失两块盘的情况下不丢数据,而 Minio 纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且 Minio 纠删码是作用在对象级别,可以一次恢复一个对象,而RAID 是作用在卷级别,数据恢复时间很长。 Minio 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio 纠删码的设计目标是为了性能和尽可能的使用硬件加速。 位衰减又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption ,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接故障还危险。 所以 Minio 纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。 # 2.2 高可用单机 Minio 服务存在单点故障,相反,如果是一个 N 节点的分布式 Minio ,只要有 N/2 节点在线,你的数据就是安全的。不过你需要至少有 N/2+1 个节点来创建新的对象。 例如,一个 8 节点的 Minio 集群,每个节点一块盘,就算 4 个节点宕机,这个集群仍然是可读的,不过你需要 5 个节点才能写数据。 # 2.3 限制分布式 Minio 单租户存在最少 4 个盘最多 16 个盘的限制(受限于纠删码)。这种限制确保了 Minio 的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。 注意,只要遵守分布式 Minio 的限制,你可以组合不同的节点和每个节点几块盘。比如,你可以使用 2 个节点,每个节点 4 块盘,也可以使用 4 个节点,每个节点两块盘,诸如此类。 # 2.4 一致性Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型。 2.5 搭建 本次搭建使用两节点(故障一个节点便只能读不能写)
节点 IP 备注 minio1 10.0.0.10 minio2 10.0.0.11
写入host配置文件:
1 2 3 4 echo " 10.0.0.10 minio1 10.0.0.11 minio2 " >> /etc/hosts
docker-compose配置文件
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 version: "3.7" services: minio: image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-latest restart: always hostname: minio1 container_name: minio1 environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: 123456789 MINIO_PROMETHEUS_AUTH_TYPE: public MINIO_PROMETHEUS_JOB_ID: minio-job TZ: Asia/Shanghai extra_hosts: - "minio1:10.0.0.10" - "minio2:10.0.0.11" ports: - 9000 :9000 - 9001 :9001 volumes: - /data:/data command: server --address ":9000" --console-address ":9001" http://minio{1...2}/data network_mode: "host"
备注: 只需要将hostname与container_name编写为对应节点 在不同节点分别启动docker-compose.yml文件即可
二个节点依次启动✌ : docker-compose up -d
成功后日志显示如下:
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 minio2 | MinIO Object Storage Server minio2 | Copyright: 2015 -2024 MinIO, Inc. minio2 | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html> minio2 | Version: RELEASE.2024-04-18T19-09-19Z (go1.21.9 linux/amd64) minio2 | minio2 | API: http://10.0.0.11:9001 http://172.17.0.1:9001 http://172.19.0.1:9001 http://172.20.0.1:9001 http://127.0.0.1:9001 minio2 | WebUI: http://10.0.0.11:50001 http://172.17.0.1:50001 http://172.19.0.1:50001 http://172.20.0.1:50001 http://127.0.0.1:50001 minio2 | minio2 | Docs: https://min.io/docs/minio/linux/index.html minio2 | Status: 2 Online, 0 Offline. minio2 | http://minio1:9001/minio/storage/data/v57%!(EXTRA time.Duration=14.132179253s) minio2 | Exiting on signal: TERMINATED minio2 | minio2 | You are running an older version of MinIO released 4 months before the latest release minio2 | Update: Run `mc admin update ALIAS` minio2 | minio2 | minio2 | Waiting for all MinIO sub-systems to be initialize... minio2 | Automatically configured API requests per node based on available memory on the system: 98 minio2 | All MinIO sub-systems initialized successfully in 5. 916121ms minio2 | MinIO Object Storage Server minio2 | Copyright: 2015 -2024 MinIO, Inc. minio2 | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html> minio2 | Version: RELEASE.2024-04-18T19-09-19Z (go1.21.9 linux/amd64) minio2 | minio2 | API: http://10.0.0.11:9001 http://172.17.0.1:9001 http://172.19.0.1:9001 http://172.20.0.1:9001 http://127.0.0.1:9001 minio2 | WebUI: http://10.0.0.11:50001 http://172.17.0.1:50001 http://172.19.0.1:50001 http://172.20.0.1:50001 http://127.0.0.1:50001 minio2 | minio2 | Docs: https://min.io/docs/minio/linux/index.html minio2 | Status: 2 Online, 0 Offline.
效果: 1.使用命令行验证:
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 root@k8s1:/opt/minio bash-5.1 Enter Access Key: admin Enter Secret Key: Added `minio` successfully. bash-5.1 ● minio1:9000 Uptime: 42 minutes Version: 2024-04-18T19:09:19Z Network: 2/2 OK Drives: 1/1 OK Pool: 1 ● minio2:9000 Uptime: 44 minutes Version: 2024-04-18T19:09:19Z Network: 2/2 OK Drives: 1/1 OK Pool: 1 Pools: 1st, Erasure sets: 1, Drives per erasure set : 2 165 MiB Used, 1 Bucket, 6 Objects 2 drives online, 0 drives offline
2.访问地址:
http://10.0.0.10:9001
http://10.0.0.11:9001
2.6 使用nginx进行负载均衡 拓补图:
在节点1部署nginx参考 使用脚本编译部署nginx部署
部署完成后遇到nginx转发访问端口访问存储桶一直loading…问题 参考:【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题_nginx 代理 minio websocket 大致信息如下
问题原因 按F12查看了一下,查看桶发起的是 websocket 请求。
解决方案: 在 nginx配置 上加上websocket支持
1 2 3 4 5 6 7 # 添加了websocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Nginx负载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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } upstream minio_cluster { server 10.0.0.10:9001; server 10.0.0.11:9001; } upstream minio_api { server 10.0.0.10:9000; server 10.0.0.11:9000; } server { listen 8088; server_name 10.0.0.10 localhost; ignore_invalid_headers off; client_max_body_size 100m; proxy_buffering off; location / { proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_connect_timeout 300; proxy_set_header Connection "" ; chunked_transfer_encoding off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection "upgrade" ; proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $http_host ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_pass http://minio_cluster; } } server { listen 8089; server_name 10.0.0.10 localhost; ignore_invalid_headers off; client_max_body_size 100m; proxy_buffering off; location / { proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_connect_timeout 300; proxy_set_header Connection "" ; chunked_transfer_encoding off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection "upgrade" ; proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $http_host ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_pass http://minio_api; } } }
systemctl restart nginx 生效🌹
此时在浏览器访问部署nginx的服务器:http://10.0.0.10:8088 输入yaml文件中定义的账户密码 即可实现负载均衡到不同的服务器
最后: 验证负载均衡是否成功(成功) 步骤:
本文参考:
【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程 - 大数据老司机 - 博客园 (cnblogs.com)
基于 docker-compose 部署 Minio 分布式集群-腾讯云开发者社区-腾讯云 (tencent.com)
【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程 - 大数据老司机 - 博客园 (cnblogs.com)
使用nginx对集群模式的minio做负载均衡_minio负载均衡
【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题_nginx 代理 minio websocket