标签归档:minio

tips|MiniO拓展及安装

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

注意

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

GNU/Linux 和 macOS
Copyexport MINIO_ACCESS_KEY=
export MINIO_SECRET_KEY=
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
Windows
Copyset MINIO_ACCESS_KEY=
set MINIO_SECRET_KEY=
minio.exe server http://192.168.1.11/C:/data http://192.168.1.12/C:/data ^
http://192.168.1.13/C:/data http://192.168.1.14/C:/data ^
http://192.168.1.15/C:/data http://192.168.1.16/C:/data ^
http://192.168.1.17/C:/data http://192.168.1.18/C:/data
分布式Minio,8节点,每个节点一块盘

示例2: 启动分布式Minio实例,4节点,每节点4块盘,需要在4个节点上都运行下面的命令。

GNU/Linux 和 macOS
Copyexport MINIO_ACCESS_KEY=
export MINIO_SECRET_KEY=
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
Windows
Copyset MINIO_ACCESS_KEY=
set MINIO_SECRET_KEY=
minio.exe server http://192.168.1.11/C:/data1 http://192.168.1.11/C:/data2 ^
http://192.168.1.11/C:/data3 http://192.168.1.11/C:/data4 ^
http://192.168.1.12/C:/data1 http://192.168.1.12/C:/data2 ^
http://192.168.1.12/C:/data3 http://192.168.1.12/C:/data4 ^
http://192.168.1.13/C:/data1 http://192.168.1.13/C:/data2 ^
http://192.168.1.13/C:/data3 http://192.168.1.13/C:/data4 ^
http://192.168.1.14/C:/data1 http://192.168.1.14/C:/data2 ^
http://192.168.1.14/C:/data3 http://192.168.1.14/C:/data4
分布式Minio,4节点,每节点4块盘

扩展现有的分布式集群
例如我们是通过区的方式启动MinIO集群,命令行如下:

Copyexport MINIO_ACCESS_KEY=
export MINIO_SECRET_KEY=
minio server http://host{1…32}/export{1…32}
MinIO支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:

Copyexport MINIO_ACCESS_KEY=
export MINIO_SECRET_KEY=
minio server http://host{1…32}/export{1…32} http://host{33…64}/export{1…32}
现在整个集群就扩展了1024个磁盘,总磁盘变为2048个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。如上命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。

MC (mc)命令

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

http://docs.minio.org.cn/docs/master/distributed-minio-quickstart-guide

PHP链接亚马逊S3/MinIO

<?php

// 使用Composer autoloader引入SDK
date_default_timezone_set('America/Los_Angeles');
require 'vendor/autoload.php';

$s3 = new Aws\S3\S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1',
        'endpoint' => 'http://localhost:9000',
        'use_path_style_endpoint' => true,
        'credentials' => [
                'key'    => 'YOUR-ACCESSKEYID',
                'secret' => 'YOUR-SECRETACCESSKEY',
            ],
]);


// 发送PutObject请求并获得result对象
$insert = $s3->putObject([
     'Bucket' => 'testbucket',
     'Key'    => 'testkey',
     'Body'   => 'Hello from MinIO!!'
]);

// 下载文件的内容
$retrive = $s3->getObject([
     'Bucket' => 'testbucket',
     'Key'    => 'testkey',
     'SaveAs' => 'testkey_local'
]);

// 通过索引到结果对象来打印结果的body。
echo $retrive['Body'];
<?php
// 从client中获得一个commad对象
$command = $s3->getCommand('GetObject', [
            'Bucket' => 'testbucket',
            'Key'    => 'testkey'
        ]);

// 获得一个10分钟有效期的pre-signed URL
$presignedRequest = $s3->createPresignedRequest($command, '+10 minutes');

// 获得presigned-url
$presignedUrl =  (string)  $presignedRequest->getUri();

查看SDK Amazon S3

https://packagist.org/packages/aws/aws-sdk-php

https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_installation.html

MINIO Nginx配置 负载均衡

  1. 参考配置
server {
 listen 80;
 server_name example.com;
 location / {
   proxy_set_header Host $http_host;
   proxy_pass http://localhost:9000;
 }
}
  1. 添加存储处理
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
use_temp_path=off;
server {
    # ...
    location / {
        proxy_cache      my_cache;
        proxy_set_header Host $http_host;
        proxy_pass       http://localhost:9000;
    }
}
  1. loadbalance 配置
 upstream minio {
       server 127.0.0.1:9001 weight=20 max_fails=2 fail_timeout=30s;
       server 127.0.0.1:9002 weight=10 max_fails=2 fail_timeout=30s;
       server 127.0.0.1:9003 weight=10 max_fails=2 fail_timeout=30s;
       server 127.0.0.1:9004 weight=10 max_fails=2 fail_timeout=30s;
    }
location / {
           # proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_host;
                client_body_buffer_size 10M;
                client_max_body_size 10G;
                proxy_buffers 1024 4k;
                proxy_read_timeout 300;
                proxy_next_upstream error timeout http_404;
                proxy_pass http://minio;
        }

可以拷贝配置

upstream minio_server {
    #以下4种均衡策略选一个
      # 1、默认轮询负载均衡least_conn;  
    # 2、最少连接负载均衡ip_hash;  
    # 3、会话持久化负载均衡
      # 4、带权重的负载均衡 
    server 192.168.8.110:9000 weight=3;
    server 192.168.8.110:9000;
    server 192.168.8.111:9000;
    server 192.168.8.112:9000;
    server 192.168.8.113:9000;
    }

server {
    listen 80;
    server_name example.com;
    #注意所有类型的location仅仅检验请求行(HTTP中的request line)中的URL部分,不带参数。这是因为请求字符串中的参数可以以多种方式给出
    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://minio_server;
    }
}

Minio部署

Minio部署

单机多节点部署docker(Docker Compose部署):

下载文件 https://github.com/minio/minio/blob/master/docs/orchestration/docker-compose/docker-compose.yaml?raw=true
到你的目录,然后在该目录下运行:
docker-compose pull
docker-compose up

即可启动,默认启动4个节点,127.0.0.1:9000到9003
每个都可以访问,账户minio,密码都是minio123,在每一个操作都是一样的。

Minio多节点部署必须时(时间戳)差在3秒内,记得使用NTP同步时间,而且在摧毁一半的节点的情况下任能保持读取,如果是要保证读写,摧毁节点必须小于1/2

Docker部署二:

https://docs.min.io/cn/deploy-minio-on-docker-swarm.html

部署三:

Minio启动设置,首先下载minio的可执行文件,具体步骤:http://el.psy.congroo.com/2020/05/03/minio%e5%ae%89%e8%a3%85/
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
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

前面设置环境变量用于设置密码和账号,然后把每个节点加入:
前面脚本中IP后面的为硬盘地址(存储地址,绝对路径,比如第一个IP新建一个mkdir /export1即可 )
可以参考该部署脚本(minio.sh):
minio二进制文件下载地址: https://dl.minio.io/server/minio/release/linux-amd64/minio

服务器资源:
172.16.1.101
/minio/data1 /minio/data2
172.16.1.102
/minio/data1 /minio/data2
本集群由2台服务器构成(官方推荐集群最小4台服务器),每个服务器上挂载两个磁盘目录,最小数据挂载点为4个
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456
/opt/minio/minio server --config-dir /etc/minio \
http://172.16.1.101/minio/data1 http://172.16.1.101/minio/data2 \
http://172.16.1.102/minio/data1 http://172.16.1.102/minio/data2 \

Minio安装

X86
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
ARM

wget https://dl.minio.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
注意启动显示的 appkey secretkey是默认登录账户,密码

docker X86
docker pull minio/minio
docker run -i -t -p 9000:9000 -e MINIO_ACCESS_KEY=admin -e MINIO_SECRET_KEY=123123123 -v /data:/data minio/minio server /data

docker arm jessestuart/minio
docker run -i -t -p 9000:9000 -e MINIO_ACCESS_KEY=admin -e MINIO_SECRET_KEY=123123123 -v /data:/data jessestuart/minio server /data

-p 80:9000 设置80外部访问端口

API文档:https://docs.min.io/docs/python-client-api-reference

from minio import Minio
from minio.error import ResponseError

mc = Minio('127.0.0.1:9000',
                  access_key='admin',
                  secret_key='123123123',
                  secure=False)
注意带上端口
mc.list_buckets()  列出所有bucket  
mc.make_bucket('lcl')  创建lcl的bucket;如果是多节点还可以考虑这个location="us-east-1"  

 mc.fput_object('loli','x.png','X_80.png') 第一个参数是bucket名,第二个为上传后的文件名,第三个为文件位置,返回一个etag的串码'f7b865265606c41b0e07779d3317e0a8'  

mc.remove_bucket('lcl')删除bucket  
列出说有bucket的文件对像:
c=mc.list_objects('lcl') 第一个参数为bucket名,第二为前前缀prefix='asda'可以省,第三个为recursive(True(递归列表)/False(目录列表 默认)),
c为迭代对象,c中每一个都含有:
bucket_name
object_name  (记得UTF8,object_name.encode('utf8'))
is_dir
size
etag
last_modified(修改时间戳)


z=mc.get_object('bucket名称','object_name文件保存名','request_headers','sse服务器端
返回:object   urllib3.response.HTTPResponse
加密标头(可选,默认为无)')
    with open('my-testfile', 'wb') as file_data:
        for d in z.stream(32*1024):
            file_data.write(d)

直接保持文件
z=mc.fget_object('lcl','x.png','本地文件路径',,'request_headers','sse服务器端加密标头(可选,默认为无)')
返回:szie etag content_type metadata last_miodified

reomve_object('bucketname','object_name') 单
reomve_objects('bucketname','object_name的列表') 多

生成url GET
from datetime import timedelta
#timedelta 最长7天,days,seconds,minutes,hours
presigned_get_object('bucketname','object_name',expires=timedelta(days=1))
生成一个一天时间的链接

PUT使用presigned_put_object  
from minio import Minio
from datetime import timedelta
mc = Minio('192.168.0.102:9000',access_key='admin',secret_key='a123xds456',secure=False)
c=mc.presigned_get_object('loli','ua.pdf',expires=timedelta(days=1),response_headers={"response-content-disposition":"attachment; filename=z.pdf"})
print(c)