minio简介

Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。Minio兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java,Python,Javacript, Golang语言。

Minio服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来.

minio server安装

Minio 基于 golang 开发,所以编译后只有一个可执行文件,启动一个 Minio 服务器极其简单,只需要使用 server 参数,并附带一个或多个存储目录即可

# 下载 Minio
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
# 赋予可执行权限
chmod +x minio
# 创建一个目录用于存放 minio 文件
mkdir -p /data
# 以后台方式启动一个 minio 服务器
nohup ./minio server /data &

启动后minio 默认监听所有网卡的 9000 端口,此时直接访问 http://ip:9000 即可查看 web ui 界面。

minio使用

minio官网提供了非常详细的客户端和各个语言的jdk的使用方法和例子,以客户端使用为例,minio的客户端为minio client,简称mc,使用方法和AWS CLI非常相似,也很简单。

  1. 客户端安装
chmod +x mc
./mc --help
  1. 添加server的秘钥信息,可以接入aws s3、Google Cloud Storage、和minio server,以minio server为例
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> <API-SIGNATURE>
  1. 进行bucket和对象的操作,支持的操作有
$ ./mc --help
NAME:
  mc - Minio Client for cloud storage and filesystems.

USAGE:
  mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]

COMMANDS:
  ls       List files and folders.
  mb       Make a bucket or a folder.
  cat      Display file and object contents.
  pipe     Redirect STDIN to an object or file or STDOUT.
  share    Generate URL for sharing.
  cp       Copy files and objects.
  mirror   Mirror buckets and folders.
  find     Search for files and objects.
  stat     Stat contents of objects and folders.
  diff     List objects with size difference or missing between two folders or buckets.
  rm       Remove files and objects.
  events   Manage object notifications.
  watch    Watch for file and object events.
  policy   Manage anonymous access to objects.
  admin    Manage Minio servers
  session  Manage saved sessions for cp command.
  config   Manage mc configuration file.
  update   Check for a new software update.
  version  Print version info.
  
GLOBAL FLAGS:
  --config-folder value, -C value  Path to configuration folder. (default: "/home/apps/.mc")
  --quiet, -q                      Disable progress bar display.
  --no-color                       Disable color theme.
  --json                           Enable JSON formatted output.
  --debug                          Enable debug output.
  --insecure                       Disable SSL certificate verification.
  --help, -h                       Show help.
  
VERSION:
  2018-01-18T21:18:56Z

上传:
./mc cp /local/file minioserver/bucket
下载:
./mc cp minioserver/bucket/object /local/file

minio优化

摘自官网。

调优网络参数

以下网络参数设置可帮助确保Minio服务器在生产环境负载上的最佳性能。

  • tcp_fin_timeout : 一个socket连接大约需要1.5KB的内存,关闭未使用的socket连接可以减少内存占用,避免出现内存泄露。即使另一方由于某种原因没有关闭socket连接,系统本身也会在到达超时时间时断开连接。 tcp_fin_timeout参数定义了内核保持sockets在FIN-WAIT-2状态的超时时间。我们建议设成20,你可以按下面的示例进行设置。
    sysctl -w net.ipv4.tcp_fin_timeout=30
  • tcp_keepalive_probes : 这个参数定义了经过几次无回应的探测之后,认为连接断开了。你可以按下面的示例进行设置。
    sysctl -w net.ipv4.tcp_keepalive_probes=5
  • wmem_max: 这个参数定义了针对所有类型的连接,操作系统的最大发送buffer大小。
    sysctl -w net.core.wmem_max=540000
  • rmem_max: 这个参数定义了针对所有类型的连接,操作系统最大接收buffer大小。
    sysctl -w net.core.rmem_max=540000

调优虚拟内存

下面是推荐的虚拟内存设置。

  • swappiness : 此参数控制了交换运行时内存的相对权重,而不是从page缓存中删除page。取值范围是[0,100],我们建议设成10。
    sysctl -w vm.swappiness=10
  • dirty_background_ratio: 这个是脏页可以占系统内存的百分比,内存页仍需要写到磁盘上。我们建议要尽早将数据写到磁盘上,越早越好。为了达到这个目的,将 dirty_background_ratio 设成1。
    sysctl -w vm.dirty_background_ratio=1
  • dirty_ratio: 这定义了在所有事务必须提交到磁盘之前,可以用脏页填充的系统内存的绝对最大数量。
    sysctl -w vm.dirty_ratio=5

调优调度程序

正确的调度程序配置确保Minio进程获得足够的CPU时间。 以下是推荐的调度程序设置。

  • sched_min_granularity_ns: 此参数定义了一个任务在被其它任务抢占时,可在CPU一次运行的最短时间,我们建议设成10ms。
    sysctl -w kernel.sched_min_granularity_ns=10000000
  • sched_wakeup_granularity_ns: 降低该参数值可以减少唤醒延迟,提高吞吐量。
    sysctl -w kernel.sched_wakeup_granularity_ns=15000000

Amazon S3 api接口

Amazon S3,也叫AWS S3全称是:Amazon Simple Storage Service。官网有详细的文档介绍。
Amazon S3 是专为从任意位置存储和检索任意数量的数据而构建的对象存储,我们可以通过程序对文件进行上传、下载、删除、遍历等操作。

Amazon S3的操作包括三部分:Service,Buckets和Objects。Service只包括GET操作,就是返回所有的Buckets的列表。Object顾名思义,是指存储的文件,值得注意的是,S3中并没有明确的文件夹的概念,而是通过指定object的路径来实现,比如说,object可以为“photos/1.jpg”。而Bucket拥有全局名,名称由用户定义,用来存放Object,由于是全局名,所以要确保名字是别人没用过的。

将aws s3和我们熟悉的ftp大致对比下比较容易理解:
8cfd4c26-a047-4fff-a4fb-4f5123d210bb.png
访问Web服务时,Http request headers可能需要一些参数。主要包括:

  • Date:当前UTC时间,形式为“ Wed, 01 Mar 2009 12:00:00 GMT ”。
  • Content-Length: 当对Object进行操作的时候,返回内容的长度,注意不要包括headers中的内容。
  • Content-MD5:用base64编码文件内容的MD5值。
  • Content-Type:资源的类型,比如:text/plain。
  • Host:Get Service时为“ s3.amazonaws.com ”。在对bucket和object进行操作时,例如bucket的名字是“bucketname”,那么Host就是“bucketname.s3.amazonaws.com”。
  • Authorization:这个是最重要的,主要作用是签名,Amazon根据的请求计算出一个签名值和这里计算的签名值进行比对,只有相同时,访问才是合法的。

例如,使用我们熟悉的curl来进行操作:

  • 创建bucket
curl -v -X PUT "http://${bucket}.s3.mydomain.com" \  
        -H "Host: ${bucket}.s3.mydomain.com" \  
        -H "Date: ${dateValue}"\  
        -H "Authorization: AWS ${s3Key}:${signature}" 
  • 上传对象到bucket
curl -X PUT -T "${file}" \  
  -H "Host: ${bucket}.${url}" \  
  -H "Date: ${dateValue}" \  
  -H "Content-Type: ${contentType}" \  
  -H "Authorization: AWS ${s3Key}:${signature}" "http://${bucket}.${url}/${objname}"  
  • 下载对象
curl -o ${file} -X GET \  
  -H "Host: ${bucket}.${url}" \  
  -H "Date: ${dateValue}" \  
  -H "Content-Type: ${contentType}" \  
  -H "Authorization: AWS ${s3Key}:${signature}" "http://${bucket}.${url}/${objname}"