基于Docker的Minio分布式集群实践
以多节点的Docker容器方式实现minio存储集群,并配以nginx反向代理及负载均衡作为访问入口。软件配置:ubuntu22.04 + 宝塔面板 + nginx。服务器 (2 nodes)硬件配置:8核16G2T。
·
目录
1. 说明
以多节点的Docker容器方式实现minio存储集群,并配以nginx反向代理及负载均衡作为访问入口。
2. 配置表
服务器 (2 nodes) |
ip | 备注 |
---|---|---|
center01.dev.sb | 172.16.20.20 |
Minio 入口(http://minio01.dev.sb) 管理入口 (http://minio01-console.dev.sb) 硬件配置:8核16G2T 软件配置:ubuntu22.04 + 宝塔面板 + nginx |
node1 | 172.16.20.10 | ... |
3. 步骤
3.1 放行服务端口
- 9000,9001
3.2 docker-compose 编排
services:
minio0:
restart: always
image: 'bitnami/minio:latest'
container_name: minio-node{x}
hostname: minio{x}
ports:
- '9000:9000'
- '9001:9001'
environment:
- MINIO_API_PORT_NUMBER=9000
- MINIO_CONSOLE_PORT_NUMBER=9001
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=you know
- MINIO_DISTRIBUTED_MODE_ENABLED=yes
- MINIO_DISTRIBUTED_NODES=minio{0...1}/bitnami/minio/data{0...1}
- MINIO_SKIP_CLIENT=yes
extra_hosts:
- minio0:172.16.20.10
- minio1:172.16.20.20
volumes:
- /data0/Server/Db/minio/data0:/bitnami/minio/data0
- /data0/Server/Db/minio/data1:/bitnami/minio/data1
4. 入口反向代理与负载均衡配置
4.1 api入口
server {
listen 80;
listen [::]:80;
server_name minio01.dev.sb;
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_cache_convert_head off;
proxy_cache_key "$scheme$proxy_host$uri$is_args$args|$request_body";
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding on;
proxy_redirect off;
proxy_pass http://minio_s3; # This uses the upstream directive definition to load balance
}
}
upstream minio_s3 {
server 172.16.20.10:9000 weight=5;
server 172.16.20.20:9000 weight=1;
}
4.2 管理入口
server {
listen 80;
listen [::]:80;
server_name minio01-console.dev.sb;
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
rewrite ^/minio/ui/(.*) /$1 break;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# To support websockets in MinIO versions released after January 2023
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Some environments may encounter CORS errors (Kubernetes + Nginx Ingress)
# Uncomment the following line to set the Origin request to an empty string
# proxy_set_header Origin '';
chunked_transfer_encoding off;
proxy_pass http://minio_console; # This uses the upstream directive definition to load balance
}
}
upstream minio_console {
server 172.16.20.10:9001;
server 172.16.20.20:9001;
}
5. 用例
from minio import Minio
from minio.error import S3Error
def main():
# 创建 MinIO 客户端实例
client = Minio(
# "172.16.20.10:9000", # MinIO 服务器地址和端口
"minio01.dev.sb", # MinIO 服务器地址和端口
access_key="my key", # 替换为你的 MinIO 访问密钥
secret_key="you know it", # 替换为你的 MinIO 秘密密钥
secure=False, # 使用 False 如果是 HTTP 而非 HTTPS
)
# 创建一个名为 "mybucket" 的存储桶
bucket_name = "mybucket"
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
else:
print(f"Bucket '{bucket_name}' already exists")
# 上传文件
file_path = "D:/Temp/demo/videos/acfa586c0b3248ec95df81267a767258.mp4"
object_name = "acfa586c0b3248ec95df81267a767258.png"
client.fput_object(bucket_name, object_name, file_path)
print(
f"'{file_path}' is successfully uploaded as object '{object_name}' to bucket '{bucket_name}'."
)
# 下载文件
client.fget_object(bucket_name, object_name, "D:/Temp/tmp10/a2.mp4")
print(f"'{object_name}' is successfully downloaded.")
# 列出存储桶中的对象
objects = client.list_objects(bucket_name)
for obj in objects:
print(obj.object_name)
# 删除文件
# client.remove_object(bucket_name, object_name)
# print(f"'{object_name}' is successfully deleted.")
if __name__ == "__main__":
try:
main()
except S3Error as exc:
print("error occurred.", exc)
如图:
6. 参考
- Deploy MinIO: Multi-Node Multi-Drive — MinIO Object Storage for Linux
更多推荐
所有评论(0)