• 分布式文件存储系统Minio实战


    分布式文件系统应用场景

    • 互联网海量非结构化数据的存储需求
    • 电商网站:海量商品图片
    • 视频网站:海量视频文件
    • 网盘 : 海量文件
    • 社交网站:海量图片

    1. Minio介绍

    • MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
    • MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

    官网地址 中文官网地址

    • 对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

    • 对于中小型企业,如果不选择存储在云,那么 Minio 是个不错的选择,麻雀虽小,五脏俱全。当然Minio 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到 Amazon S3、MicroSoft Azure。

    • 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品。

    2. Minio优点

    • 部署简单: 一个single二进制文件即是一切,还可支持各种平台。

    • minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB;

    • 兼容Amazon S3接口,充分考虑开发人员的需求和体验;

    • 低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用
      磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠删码集合(Erasure Coding Set)中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。

    • 读写性能优异
      在这里插入图片描述

    2. MiNiO的基础概念

    • Object:存储到 Minio 的基本对象,如文件、字节流,Anything…
    • Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹
    • Drive:即存储数据的磁盘,在 MinIO 启动时,以参数的方式传入。Minio 中所有的对象数据都会存储在 Drive 里。
    • Set :即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的Drive 分布在不同位置。一个对象存储在一个 Set 上。(For example: {1…64} is divided into 4 sets each of size 16.)
    • 一个对象存储在一个Set上
    • 一个集群划分为多个Set
    • 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
    • 一个SET中的Drive尽可能分布在不同的节点上

    3. 纠删码EC(Erasure Code)

    • MinIO 使用纠删码机制来保证高可靠性,使用 highwayhash 来处理数据损坏( Bit Rot Protection )。
    • 关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。

    4. 存储形式:

    • 文件对象上传到 MinIO ,会在对应的数据存储磁盘中,以 Bucket 名称为目录,文件名称为下一级目录,文件名下是 part.1 和 xl.meta(老版本,最新版本如下图),前者是编码数据块及检验块,后者是元数据文件。
      在这里插入图片描述

    5. 存储方案

    在这里插入图片描述

    Minio环境搭建

    1. 单机部署

    • minio serverstandalone模式,即要管理的磁盘都在host本地。该启动模式一般仅用于实验环境、测试环境的验证和学习使用。在standalone模式下,还可以分为non-erasure code mode和erasure code mode。
    1. non-erasure code mode
      在此启动模式下,对于每一份对象数据,minio直接在data下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏就表示数据丢失。
    2. erasure code mode
      此模式为minio server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server会自动启用erasure code modeerasure code对磁盘的个数是有要求的,如不满足要求,实例启动将失败。erasure code启用后,要求传给minio serverendpoint(standalone模式下,即本地磁盘上的目录)至少为4个。
    • 基于centos7
    操作系统CPU架构地址
    GNU/Linux64-bit Intelhttp://dl.minio.org.cn/server/minio/release/linux-amd64/minio
    cd  /usr/local/soft/
    #下载minio二进制文件
    wget  http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
    #添加执行权限
    chmod +x minio
    #启动minio server服务,指定数据存储目录/data/minio
    mkdir -p /data/minio
    ./minio server /data/minio
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    1.1. 默认用户名密码minioadmin:minioadmin,修改默认用户名密码可以使用:

    export MINIO_ROOT_USER=admin    ---指定用户名
    export MINIO_ROOT_PASSWORD=admin1234    --指定用户名密码
    #启动minio
    ./minio server /data/minio
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    1.2. 默认的配置目录是${HOME}/.minio,可以通过–config-dir命令自定义配置目录:

     ./minio server --config-dir /data/minio/config  /data/minio/
    
    • 1

    1.3. 修改api端口号和web端口号启动

    ./minio server --address ":7810"  --console-address ":7811"  /data/minio/
    #如果想后台运行可以用下面命令:
    nohup  ./minio server --address ":7810"  --console-address ":7811"  /data/minio/ > /data/minio/minio.log  &
    
    --address    ----指定api端口号
    --console-address   ----指定web端口号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    1.4. 访问minio的web界面: http://192.168.2.10:7811

    在这里插入图片描述

    • 登录进入如下:
      在这里插入图片描述

    2. 基于docker部署minio

    docker run -itd --name=minio -p 7810:7810 -p 7811:7811 \
    -e "MINIO_ROOT_USER=admin" \
    -e "MINIO_ROOT_PASSWORD=admin1234"  \
    -v /data/minio:/data/  \
    -v /data/minio/config:/root/.minio/  \
    minio/minio:latest  server  --address ":7810"  --console-address ":7811" /data
    
    #参数解释
    docker run 命令中使用的各个参数的详细解释:
    
    -itd:以交互式、终端和后台运行的方式启动容器。
    
    --name=minio:给容器指定一个名称,这里将容器命名为 minio。
    
    -p 7810:7810 -p 7811:7811:将容器的 78107811 端口映射到主机的同样端口,这样可以通过主机的这两个端口访问 MinIO。
    
    -e "MINIO_ROOT_USER=admin":设置 MinIO 的根用户(管理员)的用户名为 admin。
    
    -e "MINIO_ROOT_PASSWORD=admin1234":设置 MinIO 的根用户(管理员)的密码为 admin1234。
    
    -v /data/minio:/data/:将主机的 /data/minio 目录挂载到容器内部的 /data 目录,用于持久化存储 MinIO 的数据。可以根据实际需求修改主机上的目录路径。
    
    -v /data/minio/config:/root/.minio/:将主机的 /data/minio/config 目录挂载到容器内部的 /root/.minio/ 目录,用于持久化存储 MinIO 的配置文件。可以根据实际需求修改主机上的目录路径。
    
    minio/minio:latest:指定要使用的 MinIO Docker 镜像
    
    server --address ":7810" --console-address ":7811" /data:在容器启动后,运行 MinIO 的 server 模式,并将 /data 目录作为数据存储路径。--address 参数指定 MinIO API端口,这里使用的是主机的 7810 端口;--console-address 参数指定 MinIO的web端口,这里使用的是主机的 7811 端口
    
    • 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

    2.1. 访问测试:

    在这里插入图片描述

    2.2 minio纠删码模式

    • Minio使用纠删码 erasure code 和校验和 checksum 来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
    • 纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。
    • 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。

    在这里插入图片描述

    docker run -itd -p 7810:7810 -p 7811:7811 --name minio \
    -e "MINIO_ROOT_USER=admin" \
    -e "MINIO_ROOT_PASSWORD=admin1234"  \
    -v /data/minio1:/data1 \
    -v /data/minio2:/data2 \
    -v /data/minio3:/data3 \
    -v /data/minio4:/data4 \
    -v /data/minio5:/data5 \
    -v /data/minio6:/data6 \
    -v /data/minio7:/data7 \
    -v /data/minio8:/data8 \
    minio/minio:latest server /data{1...8} --address ":7810" --console-address ":7811"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3. 分布式集群部署:

    • 分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。
    • 分布式集群建议最少4个节点。
      在这里插入图片描述

    3.1. 分布式存储可靠性常用方法

    • 分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。

      1. 冗余:冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本 备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如 Hadoop 的文件系统(3个副本),Redis 的集群,MySQL 的主备模式等。
      2. 校验:校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如 TCP 协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的 RAID技术,纠删码(Erasure Code)技术等。MinIO 采用的就是纠删码技术。

    3.2. 分布式Minio优势

    • 数据保护
    • 分布式Minio采用 纠删码来防范多个节点宕机和位衰减 bit rot
    • 分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
    • 高可用
    • 单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
    • 例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。
    • 一致性
    • Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

    3.3. 运行分布式Minio

    • 启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。

      1. 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。新版本使用MINIO_ROOT_USER&MINIO_ROOT_PASSWORD。
      2. 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
      3. 在分布式部署中,建议最少使用4个节点,以确保数据的冗余性和可靠性
      4. 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
      5. 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
      6. 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。

    3.4. 8个节点,每节点1块盘

    • 启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令:
    export MINIO_ROOT_USER=admin
    export MINIO_ROOT_PASSWORD=admin1234
    minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
    http://192.168.1.13/export3 http://192.168.1.14/export4 \
    http://192.168.1.15/export5 http://192.168.1.16/export6 \
    http://192.168.1.17/export7 http://192.168.1.18/export8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    3.5. 4节点,每节点4块盘

    • 启动分布式Minio实例,4节点,每节点4块盘,需要在4个节点上都运行下面的命令
    export MINIO_ROOT_USER=admin
    export MINIO_ROOT_PASSWORD=admin1234
    minio server http://192.168.1.11/export1 http://192.168.1.11/export2 \
    http://192.168.1.11/export3 http://192.168.1.11/export4 \
    http://192.168.1.12/export1 http://192.168.1.12/export2 \
    http://192.168.1.12/export3 http://192.168.1.12/export4 \
    http://192.168.1.13/export1 http://192.168.1.13/export2 \
    http://192.168.1.13/export3 http://192.168.1.13/export4 \
    http://192.168.1.14/export1 http://192.168.1.14/export2 \
    http://192.168.1.14/export3 http://192.168.1.14/export4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    3.6. 测试上传:

    在这里插入图片描述

    3.7. 存储结构

    [root@localhost minio]# tree
    .
    └── yangshuang
        └── Notepad_downloader.8.5.3.exe
            ├── 973c3b87-ca52-4520-9bb1-f64db88308d2
            │   └── part.1
            └── xl.meta
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Minio客户端使用

    • MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。

    1. 部署客户端mc

    平台CPU架构URL
    GNU/Linux64-bit Intelhttp://dl.minio.org.cn/client/mc/release/linux-amd64/mc
    wget -P /usr/local/sbin/  http://dl.minio.org.cn/client/mc/release/linux-amd64/mc
    #添加权限:
    chmod +x /usr/local/sbin/mc
    
    • 1
    • 2
    • 3

    2. 配置mc

    • mc 将所有的配置信息都存储在 ~/.mc/config.json 文件中
    #查询mc host配置
    mc config host ls
    #添加minio服务
    mc config host add minio-server http://192.168.2.20:9000 admin admin1234
    Added `minio-server` successfully.
    
    # 删除host
    mc config host remove minio-server
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. mc 命令使用

    参数说明
    ls列出存储桶和对象
    mb创建存储桶
    cat显示文件和对象内容。
    pipe将一个STDIN重定向到一个对象或者文件或者STDOUT。
    share生成用于共享的URL。
    cp拷贝文件和对象。
    mirror给存储桶和文件夹做镜像。
    find基于参数查找文件。
    diff对两个文件夹或者存储桶比较差异。
    rm删除文件和对象。
    events管理对象通知。
    watch监视文件和对象的事件。
    policy管理访问策略。
    config管理mc配置文件。
    update检查软件更新。
    version输出版本信息。

    3.1. 上传下载

    # 查询minio服务上的所有buckets(文件和文件夹)
    mc ls minio-server
    # 下载文件
    mc cp minio-server/tulingmall/fox/fox.jpg /tmp/
    #删除文件
    mc rm minio-server/tulingmall/fox/fox.jpg
    #上传文件
    mc cp zookeeper.out minio-server/tulingmall/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2. Bucket管理

    # 创建bucket
    mc mb minio-server/bucket01
    # 删除bucket
    mc rb minio-server/bucket02
    # bucket不为空,可以强制删除 慎用
    mc rb --force minio-server/bucket01
    
    #查询bucket03磁盘使用情况
    mc du minio-server/bucket03
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. mc admin使用

    • MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务。
    参数说明
    service服务重启并停止所有MinIO服务器
    update更新更新所有MinIO服务器
    info信息显示MinIO服务器信息
    user用户管理用户
    group小组管理小组
    policyMinIO服务器中定义的策略管理策略
    config配置管理MinIO服务器配置
    heal修复MinIO服务器上的磁盘,存储桶和对象
    profile概要文件生成概要文件数据以进行调试
    top顶部提供MinIO的顶部统计信息
    trace跟踪显示MinIO服务器的http跟踪
    console控制台显示MinIO服务器的控制台日志
    prometheusPrometheus管理Prometheus配置
    kmskms执行KMS管理操作

    4.1. 用户管理

    mc admin user --help
    #新建用户
    mc admin user add minio-server fox
    mc admin user add minio-server fox02 12345678
    #查看用户
    mc admin user list minio-server
    #禁用用户
    mc admin user disable minio-server fox02
    #启用用户
    mc admin user disable minio-server fox02
    #查看用户信息
    mc admin user info minio-server fox
    #删除用户
    mc admin user remove minio-server fox02
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.2. 策略管理

    • policy命令,用于添加,删除,列出策略,获取有关策略的信息并为MinIO服务器上的用户设置策略。
    mc admin policy --help
    #列出MinIO上的所有固定策略
    mc admin policy list minio-server
    # 查看plicy信息
    mc admin policy info minio-server readwrite
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    金九银十,给大家一点面试方面的建议
    如何使用 UltraEdit 加密和解密您的文本文件
    elasticsearch-head 连接ES出现401问题解决
    TDengine3.0流式计算引擎语法规则介绍
    SPI 机制详解
    less使用(入门)
    Blender vs 3ds Max:谁才是3D软件的未来
    HTML静态网页成品作业(HTML+CSS)——图书出版社介绍设计制作(6个页面)
    淘宝/天猫API:custom-自定义API操作
    只出现一次的数字
  • 原文地址:https://blog.csdn.net/weixin_45625174/article/details/133418346