高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

news2024/9/24 7:23:06

详细介绍

MinIO 是一款流行的开源对象存储系统,设计上兼容 Amazon S3 API,主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点:

  1. 架构与特性:

    • 开源与跨平台:MinIO 开源免费(Apache v2.0许可),支持在Linux、Windows、macOS等多平台上部署。
    • 分布式存储:MinIO 可以以分布式方式部署,通过纠删码(Erasure Coding)技术实现数据冗余,即使部分硬盘故障也能恢复数据,通常配置为允许丢失N/2数量的磁盘而保持数据可恢复。
    • Amazon S3兼容性:全面兼容Amazon S3的v2和v4 API,使得基于S3的应用程序和服务可以无缝地切换到MinIO。
    • 高性能:设计用于大规模工作负载,能够处理极高的并发读写请求,并且在现代硬件上性能表现优异。
    • 安全性:提供多种安全措施,包括服务器端加密(SSE)、客户端加密、身份验证(使用JWT或自定义认证机制)以及访问策略控制。
  2. 优势:

    • 成本效益:相比商业对象存储解决方案,MinIO无需支付额外许可费用,降低了存储成本。
    • 简单易用:安装配置相对简单,用户界面友好,可通过命令行工具、Web UI或者SDK进行管理和操作。
    • 可扩展性:水平扩展能力出色,可以根据需要添加节点来增加容量和性能。
    • 数据保护:采用纠删码技术确保数据可靠性,同时支持校验和checksum保证数据完整性。
  3. 前端使用场景下的优缺点:

    • 优点
      • 对于Webpack工程化构建的项目,由于其运行环境包含Node.js,因此可以通过API直接上传文件至MinIO服务器。
      • 兼容AWS SDK,方便开发者调用已有的S3接口代码进行开发。
    • 缺点
      • 不适用于Vite这类纯浏览器模块加载器构建的项目,因为无法利用Node.js原生模块。
      • 前端直传时缺乏对上传进度的直观反馈,用户体验欠佳。
      • 配置信息如端口、账号密码等如果硬编码在前端,存在安全隐患,不易维护和扩展。
  4. 整体优缺点:

    • 优点
      • 高性能、高可靠性和易于扩展
      • 良好的兼容性,对于已经使用AWS S3生态系统的组织来说迁移成本较低
      • 开源社区活跃,不断更新和改进
    • 缺点
      • 相对于大型企业级存储解决方案,可能缺少一些高级功能和专业支持
      • 在某些特定应用场景下(比如前面提到的前端直接对接时的安全和体验问题),需要额外的开发工作来完善解决方案
      • 对于不熟悉S3 API的团队,可能存在一定的学习曲线。

MinIO是一个强大的、面向云原生应用的理想存储解决方案,尤其适合那些寻求低成本、高可用和灵活扩展的私有云存储需求的组织。不过,在实际使用中需注意权衡其优缺点,并根据具体业务场景采取合适的策略和技术手段来克服潜在挑战。

官网:MinIO | High Performance, Kubernetes Native Object Storage

MinIO的部署步骤

MinIO在不同系统和环境上的部署方式有一些差异,但基本理念是类似的,即通过容器化或直接安装的方式运行一个兼容S3 API的对象存储服务。下面将简要介绍如何在Kubernetes、Docker、CentOS、Windows及macOS等系统上部署MinIO的Server端,并提供一些关于Client端连接的基本指导。

Kubernetes (k8s) 部署 MinIO Server

  1. 创建MinIO StatefulSet或Deployment:

    Yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: minio-deployment
    spec:
      replicas: 4 # 根据需求设置副本数量以实现高可用性
      selector:
        matchLabels:
          app: minio
      template:
        metadata:
          labels:
            app: minio
        spec:
          containers:
          - name: minio
            image: minio/minio:latest
            args: ["server", "/data"]
            ports:
            - containerPort: 9000
            env:
            - name: MINIO_ACCESS_KEY
              value: "your-access-key"
            - name: MINIO_SECRET_KEY
              value: "your-secret-key"
            volumeMounts:
            - mountPath: /data
              name: minio-data
          volumes:
          - name: minio-data
            persistentVolumeClaim:
              claimName: minio-pvc # 需要预先创建并绑定到实际PV
  2. 使用kubectl apply命令应用YAML配置文件来创建StatefulSet或Deployment资源,该配置文件通常会指定镜像、持久卷(PV)和持久卷声明(PVC)、端口映射以及所需环境变量。
  3. 配置Service资源: 创建一个Service资源以暴露MinIO服务,并可以通过ClusterIP、NodePort或者LoadBalancer方式对外提供访问。

  4. 初始化MinIO集群(如果需要): 如果你打算部署分布式MinIO,需要确保正确配置了启动参数和环境变量,以便各个Pod能够相互发现并组成集群。

Docker部署 MinIO Server

  1. 拉取镜像

    docker pull minio/minio
  2. 运行容器: 单节点实例:

    docker run -p 9000:9000 -p 9001:9001 --name minio \
    -e "MINIO_ACCESS_KEY=youraccesskey" \
    -e "MINIO_SECRET_KEY=yoursecretkey" \
    -v /path/to/data:/data \          #新版目录已经更改为/mnt/data
    minio/minio server /data

    分布式模式下,需要额外的环境变量来定义集群模式和其他集群成员。

docker-compose.yaml

version: '3.9'  # 使用最新的Docker Compose版本以利用新特性

services:
  minio:
    image: minio/minio:RELEASE.2024-01-05T22-17-24Z.fips  # 使用最新稳定版镜像(或指定特定版本)
    container_name: minio
    ports:
      - "19000:9000"  # 根据实际需求决定是否暴露9001端口,用于HTTPS访问时需要
      - "19001:9001"  # 根据实际需求决定是否暴露9001端口,用于HTTPS访问时需要
    environment:
      MINIO_ROOT_USER: youradminaccount
      MINIO_ROOT_PASSWORD: youradminpassword
      #MINIO_BROWSER: off  # (可选)关闭Web浏览器界面,如果只通过API访问
      #MINIO_OPTS: server --address ":9000"  # (可选)自定义启动参数,比如启用多节点集群模式等
    volumes:
      - /your pathto/minio_data:/mnt/data  # 确保宿主机目录存在并有合适的权限
    command: server /data --console-address ":9001"  --address ":9000" # 指定控制台监听的静态端口为9001

 

podman

podman run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

podman run --name my-mc --hostname my-mc -it --entrypoint /bin/bash --rm minio/mc
[root@my-mc /]# mc alias set myminio/ https://my-minio-service MY-USER MY-PASSWORD
[root@my-mc /]# mc ls myminio/mybucket

CentOS 上直接安装 MinIO Server

  1. 安装依赖

    sudo yum install -y epel-release
    sudo yum install -y mc httpd-tools
  2. 下载并解压MinIO二进制包: 下载最新版本的MinIO二进制包,解压并移动至 /usr/local/bin 目录或自己指定目录,自定义目录时建议将目录加入系统环境的PATH。

  3. 运行MinIO: 类似于Docker中的数据卷挂载,你需要提供一个本地目录作为存储路径:

    mkdir -p /mnt/minio/data
    nohup minio server /mnt/minio/data &

Windows部署 MinIO Server

注意事项:

  1. 步骤1:下载MinIO Server

    访问MinIO官方下载页面获取适用于Windows操作系统的可执行文件:下载地址:MinIO | Code and downloads to create high performance object storage

  2. 步骤2:解压并安装

  3. 下载完成后,解压缩文件到你希望存放MinIO服务程序的位置,例如 C:\develop\minio

  4. 步骤3:创建数据存储目录

    为了持久化存储数据,需要在本地硬盘上创建一个目录用于保存上传的文件。比如,在 D:\minio-data 创建存储目录。

    步骤4:启动MinIO Server

    打开命令提示符(CMD)窗口,以管理员身份运行,并切换到MinIO可执行文件所在的目录:

    cd C:\develop\minio

    然后使用以下命令启动MinIO Server,将 <MINIO_ACCESS_KEY><MINIO_SECRET_KEY> 替换为自定义的访问密钥和私有密钥,并指定存储数据的目录:

    .\minio.exe server D:\minio-data --address ":9000" --access-key <MINIO_ACCESS_KEY> --secret-key <MINIO_SECRET_KEY>

    步骤5:环境配置(可选)

    如果需要设置域名或其他高级选项,可以使用环境变量进行配置。例如,设置MINIO_DOMAIN环境变量:

    set MINIO_DOMAIN=my-minio-server.local

    然后用包含环境变量的方式启动MinIO服务。

    步骤6:验证与访问

  5. MinIO Server默认监听9000端口,所以可以通过浏览器访问 http://localhost:9000 进入Web管理界面。
  6. 使用之前设定的访问密钥和私有密钥登录(初始默认值是 minioadmin 和 minioadmin)。
  7. 请确保防火墙或安全组规则允许9000端口的访问。在生产环境中,请务必更改默认的访问密钥和私有密钥,确保系统安全性。如果需要在分布式模式下部署MinIO,请参考官方文档关于集群部署的具体步骤。对于多节点部署,还需要额外的配置参数来定义集群成员以及纠删码等信息。

powershell方式:

## 安装minio,先直接拉取exe
Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio.exe"
setx MINIO_ROOT_USER admin
setx MINIO_ROOT_PASSWORD password
C:\minio.exe server F:\Data --console-address ":9001"


## client
Invoke-WebRequest -Uri "https://dl.minio.io/client/mc/release/windows-amd64/mc.exe" -OutFile "C:\mc.exe"
C:\mc.exe alias set myminio/ http://MINIO-SERVER MYUSER MYPASSWORD

macOS部署 MinIO Server

  1. 安装Homebrew(如果尚未安装):

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. 使用Homebrew安装MinIO

    brew install minio/stable/minio
  3. 运行MinIO: 在终端中运行MinIO服务器指向一个本地目录:

    mkdir -p ~/minio-storage
    minio server ~/minio-storage
Client端连接与使用:

对于客户端连接,无论在哪种环境下部署的MinIO服务器,都可以使用以下步骤进行连接:

  1. 设置环境变量(可选,用于简化命令行操作):

    export MINIO_ENDPOINT=http://localhost:9000
    export MINIO_ACCESS_KEY=youraccesskey
    export MINIO_SECRET_KEY=yoursecretkey
  2. 使用MinIO客户端工具mc: 安装mc(minio/mc),然后使用以下命令连接到MinIO服务器:

    mc alias set myminio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
  3. 验证连接: 运行 mc ls myminio 来查看桶列表,如果一切正常,您应该能看到服务器上的存储桶信息。

请注意,在生产环境中,请务必替换上述示例中的“youraccesskey”和“yoursecretkey”为您的实际访问密钥和私有密钥,并且根据实际情况调整网络配置和持久化存储设置。同时,务必确保遵循最佳安全实践,如限制公网访问、启用SSL加密等。

 浏览器访问:

访问和管理MinIO服务器

启动MinIO服务器后,可以通过浏览器或通过S3 API来访问和管理MinIO服务器。

python示例代码:

以下是一个使用Python编写的示例代码,展示了如何使用MinIO的Python SDK与MinIO服务器进行交互。

import boto3

# 创建MinIO客户端
s3 = boto3.client('s3',
                  endpoint_url='http://localhost:9000',
                  aws_access_key_id='YOUR_ACCESS_KEY',
                  aws_secret_access_key='YOUR_SECRET_KEY')

# 列出所有桶
response = s3.list_buckets()
for bucket in response['Buckets']:
    print(bucket['Name'])

# 创建一个桶
s3.create_bucket(Bucket='mybucket')

# 上传文件
s3.upload_file('myfile.txt', 'mybucket', 'myfile.txt')

# 下载文件
s3.download_file('mybucket', 'myfile.txt', 'downloaded_file.txt')

# 删除文件
s3.delete_object(Bucket='mybucket', Key='myfile.txt')

# 删除桶
s3.delete_bucket(Bucket='mybucket')

以上代码使用了boto3库来与MinIO服务器进行交互。需要注意的是,endpoint_url参数应该指向正确的MinIO服务器地址,aws_access_key_idaws_secret_access_key参数应该设置为正确的访问密钥。

nodejs示例:

安装MinIO Node.js SDK

首先,在你的Node.js项目中安装MinIO SDK:

npm install minio

示例代码

1. 初始化MinIO客户端
const Minio = require('minio');

// 创建一个MinIO客户端实例
var minioClient = new Minio.Client({
    endPoint: 'your-minio-server-endpoint',
    port: 9000, // 默认端口为9000,如果自定义了端口,请修改
    useSSL: false, // 如果是https连接,则设置为true
    accessKey: 'your-access-key',
    secretKey: 'your-secret-key'
});

// 检查连接
minioClient.ping((err) => {
  if (err) throw err;
  console.log('Connected to MinIO server successfully.');
});
2. 创建一个存储桶
minioClient.makeBucket('my-bucket', 'us-west-1', function(err) {
  if (err) return console.log(err);
  console.log('Bucket created successfully');
});
3. 上传一个文件到存储桶
// 读取本地文件
const fs = require('fs');
fs.readFile('local-file.txt', (err, data) => {
  if (err) throw err;

  // 上传文件到MinIO
  minioClient.putObject('my-bucket', 'remote-file.txt', data, data.length, 'application/text', function(err, etag) {
    if (err) return console.log(err);
    console.log("File uploaded successfully.");
  });
});
4. 列出存储桶内的所有对象
minioClient.listObjectsV2('my-bucket', '', true, function(err, objects) {
  if (err) return console.log(err);
  
  for (let obj of objects) {
    console.log(obj.name);
  }
});

请确保替换上述代码中的your-minio-server-endpointyour-access-keyyour-secret-key为你实际的MinIO服务器地址、访问密钥和私有密钥。同时,根据需要调整存储桶名称、本地文件路径以及远程对象名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1364998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML---JavaScript操作DOM对象

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 了解DOM的分类和节点间的关系熟练使用JavaScript操作DOM节点 访问DOM节点 能够熟练的进行节点的创建、添加、删除、替换等 能够熟练的设置元素的样式 能够灵活运用JavaScript获取元素…

SpringBoot学习(八)-SpringBoot + Dubbo + zookeeper

分布式DubboZookeeper 1、分布式理论 1&#xff09;什么是分布式系统&#xff1f; 在《分布式系统原理与范型》一书中有如下定义&#xff1a;“分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统”&#xff1b; 分布式系统是由一组通过…

【AI视野·今日CV 计算机视觉论文速览 第284期】Fri, 5 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 5 Jan 2024 Totally 62 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning to Prompt with Text Only Supervision for Vision-Language Models Authors Muhammad Uzair Khattak, Muhammad F…

2024.1.7-实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功)

实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功) 目录 最终效果 原文链接 https://onedayxyy.cn/docs/prometheus-grafana-ecs 参考模板 https://i4t.com/ https://grafana.frps.cn &#x1f530; 额&#xff0c;注意哦: 他这个是通过frp来…

【Flutter 开发实战】Dart 基础篇:从了解背景开始

想要学会用 Flutter 开发 App&#xff0c;就不可避免的要学习另一门很有意思的编程语言 —— Dart。很多小伙伴可能在学习 Flutter 之前可能都没听说过这门编程语言&#xff0c;我也是一样&#xff0c;还以为 Dart 是为了 Flutter 而诞生的&#xff1b;然而&#xff0c;当我们去…

网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】

网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站&#xff08;HTML静态网页项目实战&#xff09;附源码】 https://www.bilibili.com/video/BV1Hp4y1o7RY/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

分布式系统架构设计之分布式消息队列基础知识

随着微服务、大数据和云计算的普及&#xff0c;分布式系统已经成为现代软件架构的核心。在分布式系统中&#xff0c;各个组件间的通信和数据交换尤其重要&#xff0c;而消息队列正是实现这一目标的关键技术之一。 在分布式架构设计过程中&#xff0c;架构师们需要对消息队列有…

爬虫瑞数4案例:网上房地产

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、瑞数简介 瑞数动态安全 Botgate&#xff08;机器人防火墙&#xff09;以“动态安全”技术为核心&#xff0c;通过动态封装…

深度解析基于模糊数学的C均值聚类算法

深度解析基于模糊数学的C均值聚类算法 模糊C均值聚类 (FCM)聚类步骤&#xff1a;FCM Python代码&#xff1a; 模糊C均值聚类 (FCM) 在数据挖掘和聚类分析领域&#xff0c;C均值聚类是一种广泛应用的方法。模糊C均值聚类&#xff08;FCM&#xff09;是C均值聚类的自然升级版。相…

创建Vue3项目

介绍 使用命令创建vue3项目 示例 第一步&#xff1a;执行创建项目命令 npm create vuelatest第二步&#xff1a;填写输入项 第三步&#xff1a;进入study-front-vue3文件夹 cd study-front-vue3第四步&#xff1a;执行npm命令安装依赖 npm install第五步&#xff1a;运行…

Vue中Vuex的环境搭建和原理分析及使用

Vuex的环境搭建 Vuex是Vue实现集中式数据管理的Vue的一个插件&#xff0c;集中式可以理解为一个老师给多个学生讲课。 Vue2.0版本的安装&#xff1a; npm i vuex3 使用Vuex需要在store中的index.js引入Vuex和main.js中引入store,目的是让vm和vc都能看到$store。实现多个组件…

2024--Django平台开发-Django知识点(三)

day03 django知识点 项目相关路由相关 urls.py视图相关 views.py模版相关 templates资源相关 static/media 1.项目相关 新项目 开发时&#xff0c;可能遇到使用其他的版本。虚拟环境 老项目 打开项目虚拟环境 1.1 关于新项目 1.系统解释器命令行【学习】 C:/python38- p…

大模型LLM训练的数据集

引言 2021年以来&#xff0c;大预言模型的开发和生产使用呈现出爆炸式增长。除了李开复、王慧文、王小川等“退休”再创业的互联网老兵&#xff0c;在阿里巴巴、腾讯、快手等互联网大厂的中高层也大胆辞职&#xff0c;加入这波创业浪潮。 通用大模型初创企业MiniMax完成了新一…

目标检测-One Stage-YOLOv4

文章目录 前言一、目标检测网络组成二、BoF&#xff08;Bag of Freebies&#xff09;1. 数据增强2.语义分布偏差问题3.损失函数IoUGIoUDIoUCIoU 三、BoS(Bag of Specials)增强感受野注意力机制特征融合激活函数后处理 四、YOLO v4的网络结构和创新点1.缓解过拟合&#xff08;Bo…

基础数据结构

1. 单链表 #include<iostream>using namespace std; const int N 1e5 10;int n; // 分别存储当前节点的值&#xff0c;当前节点下一个节点的值&#xff0c;头结点&#xff0c;id号 int value[N], nepoint[N], head, idx;void init(){head -1;idx 0;}// 1.H 将某个x插…

Docker学习与应用(三)-Docker镜像理解

1、Docker镜像讲解 1&#xff09;镜像是什么 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;他包含运行某个软件所需的所有内容&#xff0c;包括代码、运行时库、环境变量和配置文件。 所有的应用&#xff0c;…

在 PyCharm 中高效使用 GitHub Copilot

对于每一个developer来说&#xff0c;工具和插件对于提高开发效率至关重要。GitHub Copilot&#xff0c;作为一款先进的人工智能编程助手&#xff0c;能够在编写代码时提供实时建议和自动补全功能。结合 PyCharm 这一强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c…

web期末个人引导页透明版

效果图 代码 css代码 * {box-sizing: border-box; }body {color: #2b2c48;font-family: "Jost", sans-serif;background-image: url(../img/bg.jpg);background-repeat: no-repeat;background-size: cover;background-position: center;background-attachment: fix…

Windows系统任务栏应用图标显示成空白的解决方案

背景 任务栏应用图标为空白&#xff1a; 原因 Windows系统为了加快系统响应速度&#xff0c;在安装完应用第一次显示完应用图标后&#xff0c;会将应用的图标放入缓存中&#xff0c;以后每次显示应用直接在缓存中获取&#xff0c;如果缓存中的图标信息发生错误&#xff0c;…

OpenCV | 光流估计

光流估计 光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”&#xff0c;根据各个像素点的速度的速度矢量特征&#xff0c;可以对图像进行动态分析&#xff0c;例如目标跟踪 高度恒定&#xff1a;同一点随着时间的变化&#xff0c;其亮度不会发生改变。小运动&…