分布式MinIO入门

 

一、简介

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

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

MinIO是一种高性能的分布式对象存储系统。它是软件定义的,可在行业标准硬件上运行,并且在Apache V2许可下是100%开放源代码。

MinIO的不同之处在于,它从一开始就被设计为私有云对象存储的标准。由于MinIO是专门为仅服务对象而构建的,因此单层体系结构可在不妥协的情况下实现所有必需的功能。结果是一个同时具有性能,可伸缩性和轻量级的云原生对象服务器。

尽管MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色,但在克服与机器学习,分析和云原生应用程序工作负载相关的私有云挑战方面却独树一帜。

更多请参考官方网站:https://min.io/

 

二、单机安装

  1.  二进制安装
# 下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio

# 授权
chmod 755 minio

#快速启动
./minio server ./data

#后台启动
nohup ./minio server --address 127.0.0.1:9001 ./data &

 

    2.docker 安装

docker pull minio/minio
docker run -p 9000:9000 --name minio1 \
  -e "MINIO_ACCESS_KEY=minio123" \
  -e "MINIO_SECRET_KEY=minio123" \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  minio/minio server /data

到这里直接 ip+端口 访问即可

了解基本安装后学习下分布式安装吧

三、分布式安装

分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。

1.分布式Minio有什么好处?

在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

2.数据保护

分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot。

分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

3.高可用

单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。

例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。

注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。

4.一致性

Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

分布式搭建的流程和单机搭建基本一样,Minio服务基于命令行传入的参数自动切换成单机模式还是分布式模式。

 

四、运行分布式Minio

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

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

二进制部署

这里我采用两个节点,每个节点两块硬盘

每个节点都要执行以下命令

1.数据存储目录

mkdir -p /minio/data1

mkdir -p /minio/data2

2.配置目录

默认的配置目录是 ${HOME}/.minio,可以使用 --config-dir命令行选项重写。MinIO server在首次启动时会生成一个新的config.json,里面带有自动生成的访问凭据。

mkdir -p /etc/minio

3.下载上传文件(下载请参考上面单机二进制安装链接),我这里上传到 /usr/local/minio/

mkdir -p /usr/local/minio/

4. 编写启动脚本

vim /usr/local/minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123

/usr/local/minio/minio server --config-dir /etc/minio \
http://192.168.80.230/minio/data1 \
http://192.168.80.230/minio/data2 \
http://192.168.80.231/minio/data1 \
http://192.168.80.231/minio/data2 \

5.编辑服务脚本

vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/usr/local/minio/
ExecStart=/usr/local/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

WorkingDirectory 为启动脚本目录

ExecStart 为启动脚本文件

 

6. 给这三个文件授权

chmod +x /usr/local/minio/minio

chmod +x /usr/local/minio/run.sh

chmod +x /usr/lib/systemd/system/minio.service

7. 启动停止一些命令

# 刷新服务文件
systemctl daemon-reload

systemctl start minio

systemctl stop minio

systemctl enable minio

重复7个步骤在其他节点再执行

 

docker-compose 部署

Docker Compose允许定义和运行单主机,多容器Docker应用程序。

使用Compose,您可以使用Compose文件来配置MinIO服务。 然后,使用单个命令,您可以通过你的配置创建并启动所有分布式MinIO实例。 分布式MinIO实例将部署在同一主机上的多个容器中。 这是建立基于分布式MinIO的开发,测试和分期环境的好方法。

新建docker-compose.yaml 文件(这里为了方便先在一个centos7 下运行部署多个minio)

version: '3.7'

# starts 4 docker containers running minio server instances. Each
# minio server's web interface will be accessible on the host at port
# 9001 through 9004.
services:
  minio1:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data1-1:/data1
      - data1-2:/data2
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data2-1:/data1
      - data2-2:/data2
    ports:
      - "9002:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data3-1:/data1
      - data3-2:/data2
    ports:
      - "9003:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:RELEASE.2020-04-23T00-58-49Z
    volumes:
      - data4-1:/data1
      - data4-2:/data2
    ports:
      - "9004:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2:

 

启动

 

可以使用 nginx  对着4台机器进行负载均衡,具体配置自行查阅

测试

在一台机器后创建bucket 或上传文件会自动同步到其他节点。以下上传一个图片,进行测试

 

五、java 操作minio

1.maven 引入依赖

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.0.2</version>
        </dependency>

2. demo

import java.io.*;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

import org.xmlpull.v1.XmlPullParserException;

import io.minio.MinioClient;
import io.minio.errors.MinioException;

/**
 * @author shuzhuo
 * @date 2020/4/28 17:11
 */
public class FileUploader {

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
        try {

            String endpoint = "http://127.0.0.1:9001/";

            String accessKey = "minio";

            String secretKey = "minio123";

            String bucketName = "test111";

            String uploadFilePath = "C:\\Bing壁纸\\AbuSimbel_ROW8423253975_1920x1080.jpg";

            MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);

            boolean isExist = minioClient.bucketExists(bucketName);
            if (isExist) {
                System.out.println("Bucket already exists.");
            } else {
                minioClient.makeBucket(bucketName);
            }


            File file = new File(uploadFilePath);
            if (!file.exists()) {
                System.out.println("上传文件不存在");
            }
//            上传到服务器
            minioClient.putObject(bucketName, file.getName(), uploadFilePath, null);

//            获取文件写入本地
            minioClient.getObject(bucketName, file.getName(), "D://" + file.getName());


        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    }

}

六、官方参考硬件

贴上官方说明 :建议以高密度和高容量形式使用以下服务器配置

 

 

更多配置请阅读 官方文档

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值