update license change for MinIO
Signed-off-by: Harshavardhana <harsha@minio.io>
@@ -1,18 +1,19 @@
|
||||
/*
|
||||
* MinIO Cloud Storage, (C) 2020 MinIO, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
// Copyright (c) 2015-2021 MinIO, Inc.
|
||||
//
|
||||
// This file is part of MinIO Object Storage stack
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package main
|
||||
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
// +build ignore
|
||||
|
||||
/*
|
||||
* MinIO Cloud Storage, (C) 2019,2020 MinIO, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
// Copyright (c) 2015-2021 MinIO, Inc.
|
||||
//
|
||||
// This file is part of MinIO Object Storage stack
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package main
|
||||
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
// +build ignore
|
||||
|
||||
/*
|
||||
* MinIO Cloud Storage, (C) 2019 MinIO, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
// Copyright (c) 2015-2021 MinIO, Inc.
|
||||
//
|
||||
// This file is part of MinIO Object Storage stack
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
// +build ignore
|
||||
|
||||
/*
|
||||
* MinIO Cloud Storage, (C) 2019,2020 MinIO, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
// Copyright (c) 2015-2021 MinIO, Inc.
|
||||
//
|
||||
// This file is part of MinIO Object Storage stack
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package main
|
||||
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
# MinIO FreeBSD 快速入门 [](https://slack.min.io)
|
||||
|
||||
### MinIO with ZFS backend - FreeBSD
|
||||
此示例假设你已经有正在运行的FreeBSD 11.x。
|
||||
|
||||
#### 启动 ZFS service
|
||||
```sh
|
||||
sysrc zfs_enable="YES"
|
||||
```
|
||||
|
||||
启动 ZFS service
|
||||
```sh
|
||||
service zfs start
|
||||
```
|
||||
|
||||
在 `/zfs` 文件上配置一个回环设备`loopback device `。
|
||||
```sh
|
||||
dd if=/dev/zero of=/zfs bs=1M count=4000
|
||||
mdconfig -a -t vnode -f /zfs
|
||||
```
|
||||
|
||||
创建zfs池
|
||||
```sh
|
||||
zpool create minio-example /dev/md0
|
||||
```
|
||||
|
||||
```sh
|
||||
df /minio-example
|
||||
Filesystem 512-blocks Used Avail Capacity Mounted on
|
||||
minio-example 7872440 38 7872402 0% /minio-example
|
||||
```
|
||||
|
||||
验证其是否可写
|
||||
```sh
|
||||
touch /minio-example/testfile
|
||||
ls -l /minio-example/testfile
|
||||
-rw-r--r-- 1 root wheel 0 Apr 26 00:51 /minio-example/testfile
|
||||
```
|
||||
|
||||
现在您已经成功创建了一个ZFS池,了解更多,请参考 [ZFS 快速入门](https://www.freebsd.org/doc/handbook/zfs-quickstart.html)
|
||||
|
||||
不过,这个池并没有利用ZFS的任何特性。我们可以在这个池上创建一个带有压缩功能的ZFS文件系统,ZFS支持多种压缩算法: [`lzjb`, `gzip`, `zle`, `lz4`]。`lz4` 在数据压缩和系统开销方面通常是最最优的算法。
|
||||
```sh
|
||||
zfs create minio-example/compressed-objects
|
||||
zfs set compression=lz4 minio-example/compressed-objects
|
||||
```
|
||||
|
||||
监控池是否健康
|
||||
```sh
|
||||
zpool status -x
|
||||
all pools are healthy
|
||||
```
|
||||
|
||||
#### 启动MinIO服务
|
||||
从FreeBSD port安装 [MinIO](https://min.io)。
|
||||
```sh
|
||||
pkg install minio
|
||||
```
|
||||
|
||||
配置MinIO,让其使用挂载在`/minio-example/compressed-objects`的ZFS卷。
|
||||
```
|
||||
sysrc minio_enable=yes
|
||||
sysrc minio_disks=/minio-example/compressed-objects
|
||||
```
|
||||
|
||||
启动Mino。
|
||||
```
|
||||
service minio start
|
||||
```
|
||||
|
||||
现在你已经成功的让MinIO运行在ZFS上,你上传的对象都获得了磁盘级别的压缩功能,访问 http://localhost:9000。
|
||||
|
||||
#### 关闭MinIO服务
|
||||
```sh
|
||||
service minio stop
|
||||
```
|
||||
@@ -1,57 +0,0 @@
|
||||
# 存储桶生命周期配置快速入门指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
在存储桶上启用对象的生命周期配置,可以设置在指定天数或指定日期后自动删除对象。
|
||||
|
||||
## 1. 前提条件
|
||||
- 安装MinIO - [MinIO快速入门指南](https://docs.min.io/cn/minio-quickstart-guide).
|
||||
- 安装`mc` - [mc快速入门指南](https://docs.minio.io/cn/minio-client-quickstart-guide.html)
|
||||
|
||||
## 2. 启用存储桶生命周期配置
|
||||
|
||||
- 创建一个存储桶的生命周期配置,该配置让前缀`old/`下的对象在`2020-01-01T00:00:00.000Z`过期,同时前缀`temp/`下的对象在7天后过期。
|
||||
- 使用`mc`启用存储桶的生命周期配置:
|
||||
|
||||
```sh
|
||||
$ mc ilm import play/testbucket
|
||||
{
|
||||
"Rules": [
|
||||
{
|
||||
"Expiration": {
|
||||
"Date": "2020-01-01T00:00:00.000Z"
|
||||
},
|
||||
"ID": "OldPictures",
|
||||
"Filter": {
|
||||
"Prefix": "old/"
|
||||
},
|
||||
"Status": "Enabled"
|
||||
},
|
||||
{
|
||||
"Expiration": {
|
||||
"Days": 7
|
||||
},
|
||||
"ID": "TempUploads",
|
||||
"Filter": {
|
||||
"Prefix": "temp/"
|
||||
},
|
||||
"Status": "Enabled"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Lifecycle configuration imported successfully to `play/testbucket`.
|
||||
```
|
||||
|
||||
- 列出当前的设置
|
||||
```
|
||||
$ mc ilm list play/testbucket
|
||||
ID | Prefix | Enabled | Expiry | Date/Days | Transition | Date/Days | Storage-Class | Tags
|
||||
------------|----------|------------|--------|--------------|--------------|------------------|------------------|------------------
|
||||
OldPictures | old/ | ✓ | ✓ | 1 Jan 2020 | ✗ | | |
|
||||
------------|----------|------------|--------|--------------|--------------|------------------|------------------|------------------
|
||||
TempUploads | temp/ | ✓ | ✓ | 7 day(s) | ✗ | | |
|
||||
------------|----------|------------|--------|--------------|--------------|------------------|------------------|------------------
|
||||
```
|
||||
|
||||
## 进一步探索
|
||||
- [MinIO | Golang Client API文档](https://docs.min.io/cn/golang-client-api-reference.html#SetBucketLifecycle)
|
||||
- [对象生命周期管理](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html)
|
||||
@@ -1,40 +0,0 @@
|
||||
# 存储桶配额配置快速入门指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||

|
||||
|
||||
存储桶有两种配额类型可供选择,分别是FIFO和Hard。
|
||||
|
||||
- `Hard` 表示达到配置的配额限制后,禁止向存储桶写入数据。
|
||||
- `FIFO` 会自动删除最旧的内容,直到存储桶的空间使用在限制范围内,同时允许写入。
|
||||
|
||||
> 注意:网关或独立单磁盘模式下不支持存储桶配额。
|
||||
|
||||
## 前置条件
|
||||
- 安装MinIO - [MinIO快速入门指南](https://docs.min.io/cn/minio-quickstart-guide).
|
||||
- [`mc`和MinIO Server一起使用](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
|
||||
## 设置存储桶配额
|
||||
|
||||
### 在MinIO对象存储上,设置存储桶`mybucket`的额度为1GB,配额类型为hard:
|
||||
|
||||
```sh
|
||||
$ mc admin bucket quota myminio/mybucket --hard 1gb
|
||||
```
|
||||
|
||||
### 将MinIO上的存储桶"mybucket"的额度设置为5GB,配额类型为FIFO,这样就会自动删除较旧的内容,以确保存储桶的空间使用保持在5GB以内
|
||||
|
||||
```sh
|
||||
$ mc admin bucket quota myminio/mybucket --fifo 5gb
|
||||
```
|
||||
|
||||
### 验证MinIO上的存储桶`mybucket`的配额设置
|
||||
|
||||
```sh
|
||||
$ mc admin bucket quota myminio/mybucket
|
||||
```
|
||||
|
||||
### 清除MinIO上的存储桶`mybucket`的配额设置
|
||||
|
||||
```sh
|
||||
$ mc admin bucket quota myminio/mybucket --clear
|
||||
```
|
||||
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 89 KiB |
@@ -1,84 +0,0 @@
|
||||
# 存储桶复制指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
Bucket replication is designed to replicate selected objects in a bucket to a destination bucket.
|
||||
存储桶复制功能可以把存储桶中选中的对象复制到目标存储桶。
|
||||
|
||||
要想复制一个存储桶上的对象,到同一集群或者不同集群的目标站点上的目标存储桶中,首先要为源存储桶和目标存储桶启用[版本控制功能](https://docs.minio.io/docs/minio-bucket-versioning-guide.html)。最后,需要在源MinIO服务器上配置目标站点和目标存储桶。
|
||||
|
||||
## 强调
|
||||
- 和AWS S3不同,MinIO的源存储桶和目标存储桶名字可以一样,可处理各种情况,例如*Splunk*,*Veeam*站点到站点*DR*。
|
||||
- 与AWS S3不同,MinIO纯天然支持跨源桶和目标桶的对象锁定保留。
|
||||
- 比[AWS S3 Bucket Replication Config](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html)实现更简单,像IAM Role, AccessControlTranslation, Metrics and SourceSelectionCriteria这些功能在MinIO中不需要.
|
||||
|
||||
## 如何使用?
|
||||
如下所示在源群集上创建复制目标:
|
||||
|
||||
```
|
||||
mc admin bucket remote add myminio/srcbucket https://accessKey:secretKey@replica-endpoint:9000/destbucket --service replication --region us-east-1
|
||||
Role ARN = 'arn:minio:replication:us-east-1:c5be6b16-769d-432a-9ef1-4567081f3566:destbucket'
|
||||
```
|
||||
|
||||
请注意,admin需要具有源集群上的*s3:GetReplicationConfigurationAction*权限。在目标上使用的凭据需要具有*s3:ReplicateObject*权限. 成功创建并授权后,将生成复制目标ARN。下面的命令列出了所有当前授权的复制目标::
|
||||
|
||||
```
|
||||
mc admin bucket remote ls myminio/srcbucket --service "replication"
|
||||
Role ARN = 'arn:minio:replication:us-east-1:c5be6b16-769d-432a-9ef1-4567081f3566:destbucket'
|
||||
```
|
||||
|
||||
现在可以使用带有复制配置JSON文件,把复制配置添加到源存储桶。上面的角色ARN作为配置中的json元素传入。
|
||||
|
||||
```json
|
||||
{
|
||||
"Role" :"arn:minio:replication:us-east-1:c5be6b16-769d-432a-9ef1-4567081f3566:destbucket",
|
||||
"Rules": [
|
||||
{
|
||||
"Status": "Enabled",
|
||||
"Priority": 1,
|
||||
"DeleteMarkerReplication": { "Status": "Disabled" },
|
||||
"Filter" : {
|
||||
"And": {
|
||||
"Prefix": "Tax",
|
||||
"Tags": [
|
||||
{
|
||||
"Key": "Year",
|
||||
"Value": "2019"
|
||||
},
|
||||
{
|
||||
"Key": "Company",
|
||||
"Value": "AcmeCorp"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Destination": {
|
||||
"Bucket": "arn:aws:s3:::destbucket",
|
||||
"StorageClass": "STANDARD"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
mc replicate add myminio/srcbucket/Tax --priority 1 --arn "arn:minio:replication:us-east-1:c5be6b16-769d-432a-9ef1-4567081f3566:destbucket" --tags "Year=2019&Company=AcmeCorp" --storage-class "STANDARD"
|
||||
Replication configuration applied successfully to myminio/srcbucket.
|
||||
```
|
||||
|
||||
复制配置遵循[AWS S3规范](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html). 现在,上传到源存储桶中符合复制条件的任何对象都将被MinIO服务器自动复制到远程目标存储桶中。通过禁用配置中的特定规则或者删除复制配置,都可以随时禁用复制。
|
||||
|
||||
|
||||
按照S3规范,当从源存储桶中删除一个对象后,副本不会被删除。
|
||||
|
||||

|
||||
|
||||
当对象锁定与复制结合使用时,源桶和目标桶都需要启用对象锁定。同理,如果目标也支持加密,则服务器端将复制加密的对象。
|
||||
|
||||
复制状态可以在源和目标对象的元数据中看到。在源端,根据复制的结果是成功还是失败,`X-Amz-Replication-Status`会从`PENDING`变更为`COMPLETED`或者 `FAILED`状态。 在目标端,对象成功复制,`X-Amz-Replication-Status`会被设置为`REPLICA`状态。在定期的磁盘扫描周期中,任何复制失败都将自动重新尝试。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 进一步探索
|
||||
- [MinIO存储桶版本控制实现](https://docs.minio.io/docs/minio-bucket-versioning-guide.html)
|
||||
- [MinIO客户端快速入门指南](https://docs.minio.io/cn/minio-client-quickstart-guide.html)
|
||||
@@ -1,60 +0,0 @@
|
||||
# 对象锁定指南 [](https://slack.min.io)
|
||||
|
||||
MinIO服务器允许针对特定的对象一次写入,多次读取 (WORM),或者通过使用默认的对象锁定配置设置存储桶,该配置将默认的保留模式和保留期限应用于所有对象。这将使存储桶中的对象不可改变,也就是说,直到存储桶的对象锁定配置或对象保留中指定的时间到期后,才允许删除版本。
|
||||
|
||||
对象锁定要求在创建存储桶时启用锁定,而且还会自动在存储桶上启用版本控制。此外,可以在存储桶上配置默认保留期限和保留模式,以应用于该存储桶中创建的对象。
|
||||
|
||||
和保留期限无关,一个对象也可以被依法保留。依法保留的对象将一直有效(不可变),直到通过API调用删除依法保留为止。
|
||||
|
||||
## 开始使用
|
||||
|
||||
### 1. 前置条件
|
||||
|
||||
- 安装 MinIO - [MinIO快速入门指南](https://docs.min.io/cn/minio-quickstart-guide)
|
||||
- 安装 `awscli` - [Installing AWS Command Line Interface](https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-install.html)
|
||||
|
||||
### 2. 设置存储桶WORM配置
|
||||
|
||||
通过设置对象锁定配置可以启用存储桶的一次写入,多次读取 (WORM)模式。此配置将应用于存储桶中的现有对象和新对象。下面的例子设置了`Governance`模式,并且`mybucket`里的所有对象自创建时起,保留一天的时间。
|
||||
|
||||
```sh
|
||||
$ awscli s3api put-object-lock-configuration --bucket mybucket --object-lock-configuration 'ObjectLockEnabled=\"Enabled\",Rule={DefaultRetention={Mode=\"GOVERNANCE\",Days=1}}'
|
||||
```
|
||||
|
||||
### 设置对象锁定
|
||||
|
||||
PutObject API 可以通过`x-amz-object-lock-mode`和`x-amz-object-lock-retain-until-date`请求头设置每一个对象的保留模式和保留期限。这要比存储桶上设置的对象锁定配置优先级高。
|
||||
|
||||
```sh
|
||||
aws s3api put-object --bucket testbucket --key lockme --object-lock-mode GOVERNANCE --object-lock-retain-until-date "2019-11-20" --body /etc/issue
|
||||
```
|
||||
|
||||
请参阅 https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/object-lock-overview.html 以获取有关对象锁定、governance bypass所需权限的AWS S3规范。
|
||||
|
||||
### 设置依法保留对象
|
||||
|
||||
PutObject API 可以通过 `x-amz-object-lock-legal-hold` 请求头设置依法保留.
|
||||
|
||||
```sh
|
||||
aws s3api put-object --bucket testbucket --key legalhold --object-lock-legal-hold-status ON --body /etc/issue
|
||||
```
|
||||
|
||||
请参阅 https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/object-lock-overview.html 以获取有关对象锁定、指定依法保留所需的权限。
|
||||
|
||||
## 概念
|
||||
- 如果一个对象被依法保留,除非明确删除各个版本ID的依法保留,否则无法删除该对象。 DeleteObjectVersion() 会失败。
|
||||
- 在 `Compliance` 模式中, 在各个版本ID的保留期限到期之前,任何人都无法删除对象。如果用户具有必需的governance bypass权限,则可以在`Compliance`模式下延长对象的保留期限。
|
||||
- 一旦在一个存储桶上设置对象锁定设置后
|
||||
- 新对象会自动继承存储桶对象锁定配置的保留设置
|
||||
- 上传对象时可以选择是否设置保留头信息
|
||||
- 会对对象调用PutObjectRetention API
|
||||
- 如果不需要系统时间来设置保留日期,则可以将*MINIO_NTP_SERVER*环境变量设置为远程NTP server endpoint。
|
||||
- **对象锁定功能仅在纠删码和分布式纠删码模式下可用**。
|
||||
|
||||
## 进一步探索
|
||||
|
||||
- [使用`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [使用`aws-cli`](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [使用`s3cmd`](https://docs.min.io/cn/s3cmd-with-minio)
|
||||
- [使用`minio-go`](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
- [MinIO文档](https://docs.min.io/cn)
|
||||
@@ -1,79 +0,0 @@
|
||||
# 存储桶版本控制设计指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
## `xl.meta` 文件描述
|
||||
|
||||
`xl.meta`是MinIO用于支持AWS S3兼容版本控制的一种新的自描述后端格式文件. 该文件记录了每个静态`version`的真实描述信息。`xl.meta`是一个定义好的数据结构序列化的`msgpack`文件。可以通过以下几部分内容更好的了解`xl.meta`文件。
|
||||
|
||||
`xl.meta`文件的前8个字节是XL文件头,该头信息描述了当前文件的格式和相应的格式版本,从而使解析器能够自动使用正确的数据结构来解析流中的后续内容。
|
||||
|
||||
当前文件头信息
|
||||
```go
|
||||
var (
|
||||
// XL header specifies the format
|
||||
// one extra byte left for future use
|
||||
xlHeader = [4]byte{'X', 'L', '2', ' '}
|
||||
|
||||
// XLv2 version 1 specifies the current
|
||||
// version of the XLv2 format, 3 extra bytes
|
||||
// left for future use.
|
||||
xlVersionV1 = [4]byte{'1', ' ', ' ', ' '}
|
||||
)
|
||||
```
|
||||
|
||||
了解文件头后,我们接着看`xl.meta`文件的实际数据结构。`xl.meta`带有三种类型的对象条目,用于指定存储的版本对象的类型。
|
||||
|
||||
- ObjectType (默认)
|
||||
- LegacyObjectType (遗留的现有部署和较旧的xl.json格式)
|
||||
- DeleteMarker (一个versionId,主要是为了实现AWS规范兼容的DELETE序列)
|
||||
|
||||
以下是个msgpack格式的`xl.meta`转为JSON后的样例,你可以通过 [xl-meta-to-json.go](https://github.com/minio/minio/blob/master/docs/zh_CN/bucket/versioning/xl-meta-to-json.go) 这个小程序把`xl.meta`转成JSON,查看里面的内容。
|
||||
```json
|
||||
{
|
||||
"Versions": [
|
||||
{
|
||||
"Type": 1,
|
||||
"V2Obj": {
|
||||
"ID": "KWUs8S+8RZq4Vp5TWy6KFg==",
|
||||
"DDir": "X3pDAFu8Rjyft7QD6t7W5g==",
|
||||
"EcAlgo": 1,
|
||||
"EcM": 2,
|
||||
"EcN": 2,
|
||||
"EcBSize": 10485760,
|
||||
"EcIndex": 3,
|
||||
"EcDist": [
|
||||
3,
|
||||
4,
|
||||
1,
|
||||
2
|
||||
],
|
||||
"CSumAlgo": 1,
|
||||
"PartNums": [
|
||||
1
|
||||
],
|
||||
"PartETags": [
|
||||
""
|
||||
],
|
||||
"PartSizes": [
|
||||
314
|
||||
],
|
||||
"PartASizes": [
|
||||
282
|
||||
],
|
||||
"Size": 314,
|
||||
"MTime": 1591820730,
|
||||
"MetaSys": {
|
||||
"X-Minio-Internal-Server-Side-Encryption-S3-Kms-Key-Id": "bXktbWluaW8ta2V5",
|
||||
"X-Minio-Internal-Server-Side-Encryption-S3-Kms-Sealed-Key": "ZXlKaFpXRmtJam9pUVVWVExUSTFOaTFIUTAwdFNFMUJReTFUU0VFdE1qVTJJaXdpYVhZaU9pSkJMMVZzZFVnelZYVjZSR2N6UkhGWUwycEViRmRCUFQwaUxDSnViMjVqWlNJNklpdE9lbkJXVWtseFlWSlNVa2t2UVhNaUxDSmllWFJsY3lJNklrNDBabVZsZG5WU1NWVnRLMFoyUWpBMVlYTk9aMU41YVhoU1RrNUpkMDlhTkdKa2RuaGpLMjFuVDNnMFFYbFJhbE15V0hkU1pEZzNRMk54ZUN0SFFuSWlmUT09",
|
||||
"X-Minio-Internal-Server-Side-Encryption-Seal-Algorithm": "REFSRXYyLUhNQUMtU0hBMjU2",
|
||||
"X-Minio-Internal-Server-Side-Encryption-Iv": "bW5YRDhRUGczMVhkc2pJT1V1UVlnbWJBcndIQVhpTUN1dnVBS0QwNUVpaz0=",
|
||||
"X-Minio-Internal-Server-Side-Encryption-S3-Sealed-Key": "SUFBZkFPeUo5ZHVVSEkxYXFLU0NSRkJTTnM0QkVJNk9JWU1QcFVTSXFhK2dHVThXeE9oSHJCZWwwdnRvTldUNE8zS1BtcWluR0cydmlNNFRWa0N0Mmc9PQ=="
|
||||
},
|
||||
"MetaUsr": {
|
||||
"content-type": "application/octet-stream",
|
||||
"etag": "20000f00f58c508b40720270929bd90e9f07b9bd78fb605e5432a67635fc34722e4fc53b1d5fab9ff8400eb9ded4fba2"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -1,166 +0,0 @@
|
||||
# 存储桶版本控制指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
MinIO的版本控制,可以让一个存储通里的某个对象具有多个版本。例如,你可以存储`spark.csv` (版本为 `ede336f2`) 和 `spark.csv` (版本为 `fae684da`)在一个存储通中。版本控制保护你免受意外覆盖、删除、应用保留策略和存档对象的影响。
|
||||
|
||||
要自定义数据保留和存储使用情况,请在对象生命周期管理中使用对象版本控制。如果你在不受版本控制的存储桶中具有对象到期生命周期策略,并且希望在启用版本控制时保持相同的永久删除行为,则必须添加非当前版本到期策略。非当前版本到期生命周期策略将管理在受版本控制的存储桶中删除非当前对象版本的行为。(启用版本控制的存储桶会维护一个当前对象版本,以及零个或零个以上非当前对象版本。)
|
||||
|
||||
必须在存储桶上显式启用版本控制,默认情况下不启用版本控制。启用对象锁定的存储桶会自动启用版本控制。启用和暂停版本控制是在存储桶级别完成的。
|
||||
|
||||
只有MinIO能生成版本ID,并且无法对其进行编辑。版本ID是`DCE 1.1 v4 UUID 4`(基于随机数据),UUID是128位数字,旨在在空间和时间上具有很高的唯一性,并且难以通过计算猜测。它们是全局唯一的,可以在不联网一个全局注册服务器的情况下在本地生成。UUID旨在用作生命周期非常短的大量标记对象的唯一标识符,并可以可靠地标识整个网络上非常持久的对象。
|
||||
|
||||
当您在启用版本控制的存储桶中PUT一个对象时,非当前版本不会被覆盖。下图显示,当将新版本的`spark.csv`放入已经包含相同名称对象的存储桶中时,原始对象(ID = `ede336f2`)保留在存储桶中,MinIO生成新版本(ID = `fae684da`),并将新版本添加到存储桶中。
|
||||
|
||||

|
||||
|
||||
这意味着对对象的意外覆盖或删除进行了保护,允许检索对象的先前版本。
|
||||
|
||||
删除对象时,所有版本都保留在存储桶中,MinIO添加删除标记,如下所示:
|
||||
|
||||

|
||||
|
||||
现在,删除标记成为对象的当前版本。默认情况下,GET请求始终检索最新的存储版本。因此,当当前版本为删除标记时,执行简单的GET对象请求将返回`404` `The specified key does not exist`,如下所示:
|
||||
|
||||

|
||||
|
||||
通过指定如下所示的版本ID进行GET请求,你可以检索特定的对象版本`fae684da`。
|
||||
|
||||

|
||||
|
||||
要永久删除对象,你需要指定要删除的版本,只有具有适当权限的用户才能永久删除版本。如下所示,使用特定版本ID调用的DELETE请求从存储桶中永久删除一个对象。带版本id的DELETE请求不会添加删除标记。
|
||||
|
||||

|
||||
|
||||
## 概念
|
||||
- MinIO上的所有存储桶始终处于以下状态之一:无版本控制(默认),启用版本控制或暂停版本控制。
|
||||
- 版本控制状态应用于启用版本控制的存储桶中的所有对象。首次启用存储桶版本控制后,将始终对存储桶中的对象进行版本控制并为其指定唯一的版本ID。
|
||||
- 现存或者新建的存储通都能启用版本控制,最终也可以将其暂停。 对象的现有版本保持不变,并且仍可以使用版本ID进行访问。
|
||||
- 在删除存储桶之前,应删除所有版本,包括删除标记。
|
||||
- **版本控制功能仅在纠删码和分布式纠删码模式下可用**。
|
||||
|
||||
## 如何在存储桶上配置版本控制
|
||||
创建的每个存储桶都有与其关联的版本控制配置。默认情况下,存储桶是无版本控制的,如下所示
|
||||
```
|
||||
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
||||
</VersioningConfiguration>
|
||||
```
|
||||
|
||||
要启用版本控制,你可以发送一个Status为`Enabled`的版本控制配置请求到MinIO。
|
||||
```
|
||||
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
||||
<Status>Enabled</Status>
|
||||
</VersioningConfiguration>
|
||||
```
|
||||
|
||||
同样的,要暂停版本控制,把Status配置设置为`Suspended`即可。
|
||||
```
|
||||
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
||||
<Status>Suspended</Status>
|
||||
</VersioningConfiguration>
|
||||
```
|
||||
|
||||
只有具有相应的权限或者root用户才能配置任何存储桶的版本控制状态。
|
||||
|
||||
## 使用MinIO Java SDK启用存储通版本控制的示例
|
||||
|
||||
### EnableVersioning() API
|
||||
|
||||
```
|
||||
import io.minio.EnableVersioningArgs;
|
||||
import io.minio.MinioClient;
|
||||
import io.minio.errors.MinioException;
|
||||
import java.io.IOException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
public class EnableVersioning {
|
||||
/** MinioClient.enableVersioning() example. */
|
||||
public static void main(String[] args)
|
||||
throws IOException, NoSuchAlgorithmException, InvalidKeyException {
|
||||
try {
|
||||
/* play.min.io for test and development. */
|
||||
MinioClient minioClient =
|
||||
MinioClient.builder()
|
||||
.endpoint("https://play.min.io")
|
||||
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
|
||||
.build();
|
||||
|
||||
/* Amazon S3: */
|
||||
// MinioClient minioClient =
|
||||
// MinioClient.builder()
|
||||
// .endpoint("https://s3.amazonaws.com")
|
||||
// .credentials("YOUR-ACCESSKEY", "YOUR-SECRETACCESSKEY")
|
||||
// .build();
|
||||
|
||||
// Enable versioning on 'my-bucketname'.
|
||||
minioClient.enableVersioning(EnableVersioningArgs.builder().bucket("my-bucketname").build());
|
||||
|
||||
System.out.println("Bucket versioning is enabled successfully");
|
||||
|
||||
} catch (MinioException e) {
|
||||
System.out.println("Error occurred: " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### isVersioningEnabled() API
|
||||
|
||||
```
|
||||
public class IsVersioningEnabled {
|
||||
/** MinioClient.isVersioningEnabled() example. */
|
||||
public static void main(String[] args)
|
||||
throws IOException, NoSuchAlgorithmException, InvalidKeyException {
|
||||
try {
|
||||
/* play.min.io for test and development. */
|
||||
MinioClient minioClient =
|
||||
MinioClient.builder()
|
||||
.endpoint("https://play.min.io")
|
||||
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
|
||||
.build();
|
||||
|
||||
/* Amazon S3: */
|
||||
// MinioClient minioClient =
|
||||
// MinioClient.builder()
|
||||
// .endpoint("https://s3.amazonaws.com")
|
||||
// .credentials("YOUR-ACCESSKEY", "YOUR-SECRETACCESSKEY")
|
||||
// .build();
|
||||
|
||||
// Create bucket 'my-bucketname' if it doesn`t exist.
|
||||
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket("my-bucketname").build())) {
|
||||
minioClient.makeBucket(MakeBucketArgs.builder().bucket("my-bucketname").build());
|
||||
System.out.println("my-bucketname is created successfully");
|
||||
}
|
||||
|
||||
boolean isVersioningEnabled =
|
||||
minioClient.isVersioningEnabled(
|
||||
IsVersioningEnabledArgs.builder().bucket("my-bucketname").build());
|
||||
if (isVersioningEnabled) {
|
||||
System.out.println("Bucket versioning is enabled");
|
||||
} else {
|
||||
System.out.println("Bucket versioning is disabled");
|
||||
}
|
||||
// Enable versioning on 'my-bucketname'.
|
||||
minioClient.enableVersioning(EnableVersioningArgs.builder().bucket("my-bucketname").build());
|
||||
System.out.println("Bucket versioning is enabled successfully");
|
||||
|
||||
isVersioningEnabled =
|
||||
minioClient.isVersioningEnabled(
|
||||
IsVersioningEnabledArgs.builder().bucket("my-bucketname").build());
|
||||
if (isVersioningEnabled) {
|
||||
System.out.println("Bucket versioning is enabled");
|
||||
} else {
|
||||
System.out.println("Bucket versioning is disabled");
|
||||
}
|
||||
|
||||
} catch (MinioException e) {
|
||||
System.out.println("Error occurred: " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 进一步探索
|
||||
- [使用`minio-java` SDK](https://docs.minio.io/cn/java-client-quickstart-guide.html)
|
||||
- [对象锁定指南](https://docs.minio.io/docs/minio-bucket-object-lock-guide.html)
|
||||
- [MinIO管理指南](https://docs.min.io/docs/minio-admin-complete-guide.html)
|
||||
- [MinIO官方文档](https://docs.min.io/cn/)
|
||||
|
Before Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 103 KiB |
@@ -1,121 +0,0 @@
|
||||
/*
|
||||
* MinIO Cloud Storage, (C) 2020 MinIO, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/minio/cli"
|
||||
"github.com/tinylib/msgp/msgp"
|
||||
)
|
||||
|
||||
var xlHeader = [4]byte{'X', 'L', '2', ' '}
|
||||
|
||||
func main() {
|
||||
app := cli.NewApp()
|
||||
app.Copyright = "MinIO, Inc."
|
||||
app.Usage = "xl.meta to JSON"
|
||||
app.HideVersion = true
|
||||
app.CustomAppHelpTemplate = `NAME:
|
||||
{{.Name}} - {{.Usage}}
|
||||
|
||||
USAGE:
|
||||
{{.Name}} {{if .VisibleFlags}}[FLAGS]{{end}} METAFILES...
|
||||
{{if .VisibleFlags}}
|
||||
GLOBAL FLAGS:
|
||||
{{range .VisibleFlags}}{{.}}
|
||||
{{end}}{{end}}
|
||||
`
|
||||
|
||||
app.HideHelpCommand = true
|
||||
|
||||
app.Flags = []cli.Flag{
|
||||
cli.BoolFlag{
|
||||
Usage: "Print each file as a separate line without formatting",
|
||||
Name: "ndjson",
|
||||
},
|
||||
}
|
||||
|
||||
app.Action = func(c *cli.Context) error {
|
||||
if !c.Args().Present() {
|
||||
cli.ShowAppHelp(c)
|
||||
return nil
|
||||
}
|
||||
for _, file := range c.Args() {
|
||||
var r io.Reader
|
||||
switch file {
|
||||
case "-":
|
||||
r = os.Stdin
|
||||
default:
|
||||
f, err := os.Open(file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
r = f
|
||||
}
|
||||
|
||||
// Read header
|
||||
var tmp [4]byte
|
||||
_, err := io.ReadFull(r, tmp[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !bytes.Equal(tmp[:], xlHeader[:]) {
|
||||
return fmt.Errorf("xlMeta: unknown XLv2 header, expected %v, got %v", xlHeader[:4], tmp[:4])
|
||||
}
|
||||
// Skip version check for now
|
||||
_, err = io.ReadFull(r, tmp[:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
_, err = msgp.CopyToJSON(&buf, r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if c.Bool("ndjson") {
|
||||
fmt.Println(buf.String())
|
||||
continue
|
||||
}
|
||||
var msi map[string]interface{}
|
||||
dec := json.NewDecoder(&buf)
|
||||
// Use number to preserve integers.
|
||||
dec.UseNumber()
|
||||
err = dec.Decode(&msi)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b, err := json.MarshalIndent(msi, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println(string(b))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
err := app.Run(os.Args)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
## 对象缓存
|
||||
|
||||
默认情况下,对象缓存处于以下设置状态
|
||||
|
||||
- 缓存大小是你内存大小的一半,不过如果你的内存小于8G的话,缓存是不开启的。
|
||||
|
||||
- 缓存对象的过期时间是72小时。
|
||||
|
||||
- 每次过期时间的1/4时间点(每18小时)触发一次过期对象垃圾回收清理。
|
||||
|
||||
注意:上述配置不支持手动修改。
|
||||
|
||||
### 特性
|
||||
|
||||
GET和PUT操作都会进行缓存。
|
||||
|
||||
- GET 如果缓存中没有,则将新对象进行缓存,否则直接取缓存中的对象返回。
|
||||
|
||||
- PUT/POST 对所有上传成功的对象进行缓存,如果之前存在同名(同一个bucket下同名)对象的缓存,则替换之。
|
||||
注意:缓存会按之前阐述的过期配置在一定周期后自动过期,经常访问的对象会因为每次缓存命中而延长生命,在缓存中活的很久很久。
|
||||
@@ -1,40 +0,0 @@
|
||||
# 在Chrooted环境中运行MinIO [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
Chroot允许在标准的Linux上基于用户的namespace隔离。
|
||||
|
||||
## 1. 前置条件
|
||||
* 熟悉 [chroot](http://man7.org/linux/man-pages/man2/chroot.2.html)
|
||||
* 系统上已经安装Chroot
|
||||
|
||||
## 2. 在Chroot中安装MinIO
|
||||
```sh
|
||||
mkdir -p /mnt/export/${USER}/bin
|
||||
wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /mnt/export/${USER}/bin/minio
|
||||
chmod +x /mnt/export/${USER}/bin/minio
|
||||
```
|
||||
|
||||
将你的`proc`挂载绑定到目标chroot目录
|
||||
```
|
||||
sudo mount --bind /proc /mnt/export/${USER}/proc
|
||||
```
|
||||
|
||||
## 3.在Chroot中运行单节点MinIO
|
||||
### GNU/Linux
|
||||
```sh
|
||||
sudo chroot --userspec username:group /mnt/export/${USER} /bin/minio --config-dir=/.minio server /data
|
||||
|
||||
Endpoint: http://192.168.1.92:9000 http://65.19.167.92:9000
|
||||
AccessKey: MVPSPBW4NP2CMV1W3TXD
|
||||
SecretKey: X3RKxEeFOI8InuNWoPsbG+XEVoaJVCqbvxe+PTOa
|
||||
...
|
||||
...
|
||||
```
|
||||
|
||||
现在可以在主机的9000端口访问实例,在浏览器中输入http://127.0.0.1:9000/即可访问
|
||||
|
||||
## 进一步探索
|
||||
- [Minio纠删码快速入门](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
- [使用`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [使用`aws-cli`](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [使用`s3cmd`](https://docs.min.io/cn/s3cmd-with-minio)
|
||||
- [使用`minio-go`SDK](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
@@ -1,91 +0,0 @@
|
||||
# 压缩指南 [](https://slack.min.io)
|
||||
|
||||
MinIO Server 允许压缩流以确保有效使用磁盘空间。压缩是在传输中做的,也就是说,对象在写入磁盘之前已被压缩。MinIO使用 [`klauspost/compress/s2`](https://github.com/klauspost/compress/tree/master/s2) 进行流压缩,因为它高效稳定。
|
||||
|
||||
该算法专门针对机器生成的内容进行了优化。每个CPU核心的写入吞吐量至少为300MB/s。 解压缩速度通常至少为1GB/s。
|
||||
这意味着在原始IO低于这些数字的情况下,压缩不仅会减少磁盘使用量,而且有助于提高系统吞吐量。
|
||||
通常,当内容可以压缩时,在机械硬盘系统上启用压缩将提高速度。
|
||||
|
||||
## 开始使用
|
||||
|
||||
### 1. 前置条件
|
||||
|
||||
安装MinIO - [MinIO快速入门指南](https://docs.min.io/cn/minio-quickstart-guide).
|
||||
|
||||
### 2. 为MinIO启用压缩
|
||||
|
||||
可以通过更新MinIO Server配置的`compress`设置来启用压缩。`compress`设置可以配置哪些扩展名和mime-types可以被压缩。
|
||||
|
||||
```
|
||||
$ mc admin config get myminio compression
|
||||
compression extensions=".txt,.log,.csv,.json,.tar,.xml,.bin" mime_types="text/*,application/json,application/xml"
|
||||
```
|
||||
|
||||
默认配置包括最常见的高度可压缩的内容扩展名和mime类型。
|
||||
|
||||
```
|
||||
$ mc admin config set myminio compression extensions=".pdf" mime_types="application/pdf"
|
||||
```
|
||||
|
||||
显示有关设置压缩配置的帮助。
|
||||
```
|
||||
~ mc admin config set myminio compression
|
||||
```
|
||||
|
||||
使用默认的扩展名和mime-types对所有内容启用压缩。
|
||||
```
|
||||
~ mc admin config set myminio compression enable="on"
|
||||
```
|
||||
|
||||
压缩设置也可以通过环境变量来设置。设置后,环境变量将覆盖服务器配置中定义的`compress`配置设置。
|
||||
|
||||
```bash
|
||||
export MINIO_COMPRESS="on"
|
||||
export MINIO_COMPRESS_EXTENSIONS=".pdf,.doc"
|
||||
export MINIO_COMPRESS_MIME_TYPES="application/pdf"
|
||||
```
|
||||
|
||||
### 3. 注意
|
||||
|
||||
- 已压缩的对象不具有可压缩的模式,因此不适合再压缩。 此类对象无法产生有效的 [`LZ 压缩`](https://en.wikipedia.org/wiki/LZ77_and_LZ78)。以下是不适合压缩的常见文件和内容类型列表。
|
||||
|
||||
- 扩展名
|
||||
|
||||
| `gz` | (GZIP)
|
||||
| `bz2` | (BZIP2)
|
||||
| `rar` | (WinRAR)
|
||||
| `zip` | (ZIP)
|
||||
| `7z` | (7-Zip)
|
||||
| `xz` | (LZMA)
|
||||
| `mp4` | (MP4)
|
||||
| `mkv` | (MKV media)
|
||||
| `mov` | (MOV)
|
||||
|
||||
- 内容类型
|
||||
|
||||
| `video/*` |
|
||||
| `audio/*` |
|
||||
| `application/zip` |
|
||||
| `application/x-gzip` |
|
||||
| `application/zip` |
|
||||
| `application/x-bz2` |
|
||||
| `application/x-compress` |
|
||||
| `application/x-xz` |
|
||||
|
||||
即使所有类型都启用了压缩,具有以上这些扩展名和mime类型的文件也不会被压缩。
|
||||
|
||||
- MinIO不支持压缩加密,因为压缩和加密一起可能为[`CRIME 和 BREACH`](https://blog.minio.io/c-e-compression-encryption-cb6b7f04a369)等信道攻击留出空间。
|
||||
|
||||
- MinIO不支持网关(Azure/GCS/NAS)压缩。
|
||||
|
||||
## 测试设置
|
||||
|
||||
要测试设置, 使用`mc`PUT一个文件到服务器,然后在数据目录上使用 `mc ls`查看对象的大小。
|
||||
|
||||
## 进一步探索
|
||||
|
||||
- [使用`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [使用`aws-cli`](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [使用`s3cmd`](https://docs.min.io/cn/s3cmd-with-minio)
|
||||
- [使用`minio-go`](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
- [MinIO官方文档](https://docs.min.io/cn)
|
||||
@@ -1,312 +0,0 @@
|
||||
# MinIO Server 配置指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
## 配置目录
|
||||
|
||||
默认的配置目录是 `${HOME}/.minio`,你可以使用`--config-dir`命令行选项重写之。MinIO server在首次启动时会生成一个新的`config.json`,里面带有自动生成的访问凭据。
|
||||
|
||||
```sh
|
||||
minio server --config-dir /etc/minio /data
|
||||
```
|
||||
|
||||
截止到 MinIO `RELEASE.2018-08-02T23-11-36Z` 版本, MinIO server 的配置文件(`config.json`) 被存储在通过 `--config-dir` 指定的目录或者默认的 `${HOME}/.minio` 目录。 但是从 `RELEASE.2018-08-18T03-49-57Z` 版本之后, 配置文件 (仅仅), 已经被迁移到存储后端 (存储后端指的是启动一个服务器的时候,传递给MinIO server的目录)。
|
||||
|
||||
您可以使用`--config-dir`指定现有配置的位置, MinIO 会迁移 `config.json` 配置到你的存储后端。 迁移成功后,你当前 `--config-dir` 目录中的 `config.json` 将被重命名为 `config.json.deprecated`。 迁移后,所有现有配置都将得到保留。
|
||||
|
||||
此外,`--config-dir`现在是一个旧配置,计划在将来删除,因此请相应地更新本地startup和ansible脚本。
|
||||
|
||||
```sh
|
||||
minio server /data
|
||||
```
|
||||
|
||||
MinIO还使用管理员凭据对所有配置,IAM和策略内容进行加密。
|
||||
|
||||
### 证书目录
|
||||
TLS证书存在``${HOME}/.minio/certs``目录下,你需要将证书放在该目录下来启用`HTTPS` 。如果你是一个乐学上进的好青年,这里有一本免费的秘籍传授一你: [如何使用TLS安全的访问minio](https://docs.min.io/cn/how-to-secure-access-to-minio-server-with-tls).
|
||||
|
||||
以下是一个具有TLS证书的MinIO server的目录结构。
|
||||
|
||||
```sh
|
||||
$ mc tree --files ~/.minio
|
||||
/home/user1/.minio
|
||||
└─ certs
|
||||
├─ CAs
|
||||
├─ private.key
|
||||
└─ public.crt
|
||||
```
|
||||
|
||||
你可以使用`--certs-dir`命令行选项提供自定义certs目录。
|
||||
|
||||
#### 凭据
|
||||
只能通过环境变量`MINIO_ROOT_USER` 和 `MINIO_ROOT_PASSWORD` 更改MinIO的admin凭据和root凭据。使用这两个值的组合,MinIO加密存储在后端的配置
|
||||
|
||||
```
|
||||
export MINIO_ROOT_USER=minio
|
||||
export MINIO_ROOT_PASSWORD=minio13
|
||||
minio server /data
|
||||
```
|
||||
|
||||
##### 使用新的凭据轮换加密
|
||||
|
||||
另外,如果您想更改管理员凭据,则MinIO将自动检测到该凭据,并使用新凭据重新加密,如下所示。一次只需要设置如下所示的环境变量即可轮换加密配置。
|
||||
|
||||
> 旧的环境变量永远不会在内存中被记住,并且在使用新凭据迁移现有内容后立即销毁。在服务器再次成功重启后,你可以安全的删除它们。
|
||||
|
||||
```
|
||||
export MINIO_ROOT_USER=newminio
|
||||
export MINIO_ROOT_PASSWORD=newminio123
|
||||
export MINIO_ROOT_USER_OLD=minio
|
||||
export MINIO_ROOT_PASSWORD_OLD=minio123
|
||||
minio server /data
|
||||
```
|
||||
|
||||
迁移完成后, 服务器会自动的取消进程空间中的`MINIO_ROOT_USER_OLD` and `MINIO_ROOT_PASSWORD_OLD`设置。
|
||||
|
||||
> **注意: 在下一次服务重新启动前,要确保移除脚本或者服务文件中的 `MINIO_ROOT_USER_OLD` and `MINIO_ROOT_PASSWORD_OLD`, 避免现有的内容被双重加密**
|
||||
|
||||
#### 区域
|
||||
```
|
||||
KEY:
|
||||
region 服务器的物理位置标记
|
||||
|
||||
ARGS:
|
||||
name (string) 服务器的物理位置名字,例如 "us-west-rack2"
|
||||
comment (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
或者通过环境变量
|
||||
```
|
||||
KEY:
|
||||
region 服务器的物理位置标记
|
||||
|
||||
ARGS:
|
||||
MINIO_REGION_NAME (string) 服务器的物理位置名字,例如 "us-west-rack2"
|
||||
MINIO_REGION_COMMENT (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```sh
|
||||
export MINIO_REGION_NAME="my_region"
|
||||
minio server /data
|
||||
```
|
||||
|
||||
### 存储类型
|
||||
默认情况下,标准存储类型的奇偶校验值设置为N/2,低冗余的存储类型奇偶校验值设置为2。在[此处](https://github.com/minio/minio/blob/master/docs/zh_CN/erasure/storage-class/README.md)了解有关MinIO服务器存储类型的更多信息。
|
||||
|
||||
```
|
||||
KEY:
|
||||
storage_class 定义对象级冗余
|
||||
|
||||
ARGS:
|
||||
standard (string) 设置默认标准存储类型的奇偶校验计数,例如"EC:4"
|
||||
rrs (string) 设置默认低冗余存储类型的奇偶校验计数,例如"EC:2"
|
||||
comment (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
或者通过环境变量
|
||||
```
|
||||
KEY:
|
||||
storage_class 定义对象级冗余
|
||||
|
||||
ARGS:
|
||||
MINIO_STORAGE_CLASS_STANDARD (string) 设置默认标准存储类型的奇偶校验计数,例如"EC:4"
|
||||
MINIO_STORAGE_CLASS_RRS (string) 设置默认低冗余存储类型的奇偶校验计数,例如"EC:2"
|
||||
MINIO_STORAGE_CLASS_COMMENT (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
### 缓存
|
||||
MinIO为主要的网关部署提供了缓存存储层,使您可以缓存内容以实现更快的读取速度,并节省从云中重复下载的成本。
|
||||
|
||||
```
|
||||
KEY:
|
||||
cache 添加缓存存储层
|
||||
|
||||
ARGS:
|
||||
drives* (csv) 逗号分隔的挂载点,例如 "/optane1,/optane2"
|
||||
expiry (number) 缓存有效期限(天),例如 "90"
|
||||
quota (number) 以百分比限制缓存驱动器的使用,例如 "90"
|
||||
exclude (csv) 逗号分隔的通配符排除模式,例如 "bucket/*.tmp,*.exe"
|
||||
after (number) 缓存对象之前的最小可访问次数
|
||||
comment (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
或者通过环境变量
|
||||
```
|
||||
KEY:
|
||||
cache 添加缓存存储层
|
||||
|
||||
ARGS:
|
||||
MINIO_CACHE_DRIVES* (csv) 逗号分隔的挂载点,例如 "/optane1,/optane2"
|
||||
MINIO_CACHE_EXPIRY (number) 缓存有效期限(天),例如 "90"
|
||||
MINIO_CACHE_QUOTA (number) 以百分比限制缓存驱动器的使用,例如 "90"
|
||||
MINIO_CACHE_EXCLUDE (csv) 逗号分隔的通配符排除模式,例如 "bucket/*.tmp,*.exe"
|
||||
MINIO_CACHE_AFTER (number) 缓存对象之前的最小可访问次数
|
||||
MINIO_CACHE_COMMENT (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
#### Etcd
|
||||
MinIO支持在etcd上存储加密的IAM assets和Bucket DNS记录。
|
||||
|
||||
> NOTE: if *path_prefix* is set then MinIO will not federate your buckets, namespaced IAM assets are assumed as isolated tenants, only buckets are considered globally unique but performing a lookup with a *bucket* which belongs to a different tenant will fail unlike federated setups where MinIO would port-forward and route the request to relevant cluster accordingly. This is a special feature, federated deployments should not need to set *path_prefix*.
|
||||
|
||||
```
|
||||
KEY:
|
||||
etcd 为IAM and Bucket DNS联合多个集群
|
||||
|
||||
ARGS:
|
||||
endpoints* (csv) 以逗号分隔的etcd endpoint列表,例如 "http://localhost:2379"
|
||||
path_prefix (path) 为隔离租户提供的命名控件前缀,例如 "customer1/"
|
||||
coredns_path (path) 共享bucket DNS记录, 默认是 "/skydns"
|
||||
client_cert (path) 用于mTLS身份验证的客户端证书
|
||||
client_cert_key (path) 用于mTLS身份验证的客户端证书密钥
|
||||
comment (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
或者通过环境变量
|
||||
```
|
||||
KEY:
|
||||
etcd 为IAM and Bucket DNS联合多个集群
|
||||
|
||||
ARGS:
|
||||
MINIO_ETCD_ENDPOINTS* (csv) 以逗号分隔的etcd endpoint列表,例如 "http://localhost:2379"
|
||||
MINIO_ETCD_PATH_PREFIX (path) 为隔离租户提供的命名控件前缀,例如 "customer1/"
|
||||
MINIO_ETCD_COREDNS_PATH (path) 共享bucket DNS记录, 默认是 "/skydns"
|
||||
MINIO_ETCD_CLIENT_CERT (path) 用于mTLS身份验证的客户端证书
|
||||
MINIO_ETCD_CLIENT_CERT_KEY (path) 用于mTLS身份验证的客户端证书密钥
|
||||
MINIO_ETCD_COMMENT (sentence) 为这个设置添加一个可选的注释
|
||||
```
|
||||
|
||||
### API
|
||||
默认情况下,服务器/集群同时处理的并发请求数没有限制。 但是,可以使用API子系统强加这种限制。 在[此处](https://github.com/minio/minio/blob/master/docs/zh_CN/throttle/README.md)阅读有关MinIO服务器中限制限制的更多信息。
|
||||
|
||||
```
|
||||
KEY:
|
||||
api 管理全局HTTP API调用的特定功能,例如限制,身份验证类型等.
|
||||
|
||||
ARGS:
|
||||
requests_max (number) 设置并发请求的最大数量,例如 "1600"
|
||||
requests_deadline (duration) 设置等待处理的API请求的期限,例如 "1m"
|
||||
ready_deadline (duration) 设置健康检查API /minio/health/ready的期限,例如 "1m"
|
||||
cors_allow_origin (csv) 设置CORS请求允许的来源列表,以逗号分割,例如 "https://example1.com,https://example2.com"
|
||||
```
|
||||
|
||||
或者通过环境变量
|
||||
|
||||
```
|
||||
MINIO_API_REQUESTS_MAX (number) 设置并发请求的最大数量,例如 "1600"
|
||||
MINIO_API_REQUESTS_DEADLINE (duration) 设置等待处理的API请求的期限,例如 "1m"
|
||||
MINIO_API_CORS_ALLOW_ORIGIN (csv) 设置CORS请求允许的来源列表,以逗号分割,例如 "https://example1.com,https://example2.com"
|
||||
```
|
||||
|
||||
#### 通知
|
||||
MinIO支持如下列表中的通知。要配置单个目标,请参阅[此处](https://docs.min.io/cn/minio-bucket-notification-guide.html)的更多详细文档
|
||||
|
||||
```
|
||||
notify_webhook 发布 bucket 通知到 webhook endpoints
|
||||
notify_amqp 发布 bucket 通知到 AMQP endpoints
|
||||
notify_kafka 发布 bucket 通知到 Kafka endpoints
|
||||
notify_mqtt 发布 bucket 通知到 MQTT endpoints
|
||||
notify_nats 发布 bucket 通知到 NATS endpoints
|
||||
notify_nsq 发布 bucket 通知到 NSQ endpoints
|
||||
notify_mysql 发布 bucket 通知到 MySQL databases
|
||||
notify_postgres 发布 bucket 通知到 Postgres databases
|
||||
notify_elasticsearch 发布 bucket 通知到 Elasticsearch endpoints
|
||||
notify_redis 发布 bucket 通知到 Redis datastores
|
||||
```
|
||||
|
||||
### 访问配置
|
||||
可以使用[`mc admin config` get/set/reset/export/import commands](https://github.com/minio/mc/blob/master/docs/minio-admin-complete-guide.md)命令应用所有配置的更改.
|
||||
|
||||
#### 列出所有可用的配置key
|
||||
```
|
||||
~ mc admin config set myminio/
|
||||
```
|
||||
|
||||
#### 获取每个key的帮助
|
||||
```
|
||||
~ mc admin config set myminio/ <key>
|
||||
```
|
||||
|
||||
例如: `mc admin config set myminio/ etcd` 会返回 `etcd` 可用的配置参数
|
||||
|
||||
```
|
||||
~ mc admin config set play/ etcd
|
||||
KEY:
|
||||
etcd federate multiple clusters for IAM and Bucket DNS
|
||||
|
||||
ARGS:
|
||||
endpoints* (csv) comma separated list of etcd endpoints e.g. "http://localhost:2379"
|
||||
path_prefix (path) namespace prefix to isolate tenants e.g. "customer1/"
|
||||
coredns_path (path) shared bucket DNS records, default is "/skydns"
|
||||
client_cert (path) client cert for mTLS authentication
|
||||
client_cert_key (path) client cert key for mTLS authentication
|
||||
comment (sentence) optionally add a comment to this setting
|
||||
```
|
||||
|
||||
要获取每个配置参数的等效ENV,请使用`--env`标志
|
||||
```
|
||||
~ mc admin config set play/ etcd --env
|
||||
KEY:
|
||||
etcd federate multiple clusters for IAM and Bucket DNS
|
||||
|
||||
ARGS:
|
||||
MINIO_ETCD_ENDPOINTS* (csv) comma separated list of etcd endpoints e.g. "http://localhost:2379"
|
||||
MINIO_ETCD_PATH_PREFIX (path) namespace prefix to isolate tenants e.g. "customer1/"
|
||||
MINIO_ETCD_COREDNS_PATH (path) shared bucket DNS records, default is "/skydns"
|
||||
MINIO_ETCD_CLIENT_CERT (path) client cert for mTLS authentication
|
||||
MINIO_ETCD_CLIENT_CERT_KEY (path) client cert key for mTLS authentication
|
||||
MINIO_ETCD_COMMENT (sentence) optionally add a comment to this setting
|
||||
```
|
||||
|
||||
此行为在所有key中都是一致的,每个key都带有可用的示例文档。
|
||||
|
||||
## 环境变量仅有的配置 (配置文件中没有)
|
||||
|
||||
#### 使用情况采集器
|
||||
> 注意: 数据使用情况采集器不支持网关部署模式。
|
||||
|
||||
数据使用情况采集器默认是启用的,通过Envs可以设置更多的交错延迟。
|
||||
|
||||
采集器能适应系统速度,并在系统负载时完全暂停。 可以调整采集器的速度,从而达到延迟更新的效果。 每次采集操作之间的延迟都可以通过环境变量`MINIO_SCANNER_DELAY`来调整。 默认情况下,该值为10。 这意味着采集每次操作都将休眠*10x*的时间。
|
||||
|
||||
大多数设置要让采集器足够慢,这样不会影响整体的系统性能。
|
||||
设置 `MINIO_SCANNER_DELAY` 为一个 *较低* 的值可以让采集器更快,并且设置为0的时候,可以让采集器全速运行(不推荐)。 设置一个较高的值可以让采集器变慢,进一步减少资源的消耗。
|
||||
|
||||
示例: 如下设置将使采集器的速度降低三倍, 减少了系统资源的使用,但是反映到更新的延迟会增加。
|
||||
|
||||
```sh
|
||||
export MINIO_SCANNER_DELAY=30
|
||||
minio server /data
|
||||
```
|
||||
|
||||
### 浏览器
|
||||
|
||||
开启或关闭浏览器访问,默认是开启的,你可以通过``MINIO_BROWSER``环境变量进行修改。
|
||||
|
||||
示例:
|
||||
|
||||
```sh
|
||||
export MINIO_BROWSER=off
|
||||
minio server /data
|
||||
```
|
||||
|
||||
### 域名
|
||||
|
||||
默认情况下,MinIO支持格式为 http://mydomain.com/bucket/object 的路径类型请求。
|
||||
`MINIO_DOMAIN` 环境变量被用来启用虚拟主机类型请求。 如果请求的`Host`头信息匹配 `(.+).mydomain.com`,则匹配的模式 `$1` 被用作 bucket, 并且路径被用作object. 更多路径类型和虚拟主机类型的信息参见[这里](http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAPI.html)
|
||||
示例:
|
||||
|
||||
```sh
|
||||
export MINIO_DOMAIN=mydomain.com
|
||||
minio server /data
|
||||
```
|
||||
|
||||
`MINIO_DOMAIN`环境变量支持逗号分隔的多域名配置
|
||||
```sh
|
||||
export MINIO_DOMAIN=sub1.mydomain.com,sub2.mydomain.com
|
||||
minio server /data
|
||||
```
|
||||
|
||||
## 进一步探索
|
||||
* [MinIO快速入门指南](https://docs.min.io/cn/minio-quickstart-guide)
|
||||
* [使用TLS安全的访问Minio服务](https://docs.min.io/cn/how-to-secure-access-to-minio-server-with-tls.html)
|
||||
@@ -1,59 +0,0 @@
|
||||
# MinIO Server 调试教程 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
### HTTP Trace
|
||||
可以通过 [`mc admin trace`](https://github.com/minio/mc/blob/master/docs/minio-admin-complete-guide.md#command-trace---display-minio-server-http-trace) 命令启用HTTP跟踪。
|
||||
|
||||
示例:
|
||||
```sh
|
||||
minio server /data
|
||||
```
|
||||
|
||||
默认只跟踪API调用操作和HTTP响应状态。
|
||||
```sh
|
||||
mc admin trace myminio
|
||||
```
|
||||
|
||||
跟踪整个HTTP请求
|
||||
```sh
|
||||
mc admin trace --verbose myminio
|
||||
```
|
||||
|
||||
跟踪整个HTTP请求和节点间通信
|
||||
```sh
|
||||
mc admin trace --all --verbose myminio
|
||||
```
|
||||
|
||||
|
||||
### 诊断工具
|
||||
诊断工具有助于确保运行MinIO的底层基础设施配置正确,并且运行正常。 此测试是一次长时间运行的测试,建议在首次配置集群时立即运行,并且每次遇到故障时都要运行该测试。 请注意,测试会占用系统上的大部分可用资源. 在使用这个来调试故障场景时必须小心,以防止更大的中断。 可以使用`mc admin subnet health` 命令触发Health测试.
|
||||
|
||||
示例:
|
||||
```sh
|
||||
minio server /data
|
||||
```
|
||||
|
||||
该命令不带标志
|
||||
```sh
|
||||
mc admin subnet health myminio
|
||||
```
|
||||
|
||||
使用如下格式打印结果输出
|
||||
```sh
|
||||
● Admin Info ... ✔
|
||||
● CPU ... ✔
|
||||
● Disk Hardware ... ✔
|
||||
● Os Info ... ✔
|
||||
● Mem Info ... ✔
|
||||
● Process Info ... ✔
|
||||
● Config ... ✔
|
||||
● Drive ... ✔
|
||||
● Net ... ✔
|
||||
*********************************************************************************
|
||||
WARNING!!
|
||||
** THIS FILE MAY CONTAIN SENSITIVE INFORMATION ABOUT YOUR ENVIRONMENT **
|
||||
** PLEASE INSPECT CONTENTS BEFORE SHARING IT ON ANY PUBLIC FORUM **
|
||||
*********************************************************************************
|
||||
mc: Health data saved to dc-11-health_20200321053323.json.gz
|
||||
```
|
||||
|
||||
gzip输出包含系统的调试信息
|
||||
@@ -1,96 +0,0 @@
|
||||
# Linux服务器上MinIO生产环境的内核调优 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
这儿有一份针对MinIO服务器内核调优的建议, 你可以拷贝这个[脚本](https://github.com/minio/minio/blob/master/docs/deployment/kernel-tuning/sysctl.sh)到你的服务器上使用。
|
||||
|
||||
> 注意: 这是Linux服务器上的通用建议,不过在使用前也要非常小心。这些设置不是强制性的,而且也不能解决硬件的问题,所以不要使用它们提高
|
||||
> 性能掩盖硬件本身的问题。在任何情况下,都应该先进行硬件基准测试,达到预期结果后才真正的执行优化。
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
cat > sysctl.conf <<EOF
|
||||
# maximum number of open files/file descriptors
|
||||
fs.file-max = 4194303
|
||||
|
||||
# use as little swap space as possible
|
||||
vm.swappiness = 1
|
||||
|
||||
# prioritize application RAM against disk/swap cache
|
||||
vm.vfs_cache_pressure = 50
|
||||
|
||||
# minimum free memory
|
||||
vm.min_free_kbytes = 1000000
|
||||
|
||||
# follow mellanox best practices https://community.mellanox.com/s/article/linux-sysctl-tuning
|
||||
# the following changes are recommended for improving IPv4 traffic performance by Mellanox
|
||||
|
||||
# disable the TCP timestamps option for better CPU utilization
|
||||
net.ipv4.tcp_timestamps = 0
|
||||
|
||||
# enable the TCP selective acks option for better throughput
|
||||
net.ipv4.tcp_sack = 1
|
||||
|
||||
# increase the maximum length of processor input queues
|
||||
net.core.netdev_max_backlog = 250000
|
||||
|
||||
# increase the TCP maximum and default buffer sizes using setsockopt()
|
||||
net.core.rmem_max = 4194304
|
||||
net.core.wmem_max = 4194304
|
||||
net.core.rmem_default = 4194304
|
||||
net.core.wmem_default = 4194304
|
||||
net.core.optmem_max = 4194304
|
||||
|
||||
# increase memory thresholds to prevent packet dropping:
|
||||
net.ipv4.tcp_rmem = "4096 87380 4194304"
|
||||
net.ipv4.tcp_wmem = "4096 65536 4194304"
|
||||
|
||||
# enable low latency mode for TCP:
|
||||
net.ipv4.tcp_low_latency = 1
|
||||
|
||||
# the following variable is used to tell the kernel how much of the socket buffer
|
||||
# space should be used for TCP window size, and how much to save for an application
|
||||
# buffer. A value of 1 means the socket buffer will be divided evenly between.
|
||||
# TCP windows size and application.
|
||||
net.ipv4.tcp_adv_win_scale = 1
|
||||
|
||||
# maximum number of incoming connections
|
||||
net.core.somaxconn = 65535
|
||||
|
||||
# maximum number of packets queued
|
||||
net.core.netdev_max_backlog = 10000
|
||||
|
||||
# queue length of completely established sockets waiting for accept
|
||||
net.ipv4.tcp_max_syn_backlog = 4096
|
||||
|
||||
# time to wait (seconds) for FIN packet
|
||||
net.ipv4.tcp_fin_timeout = 15
|
||||
|
||||
# disable icmp send redirects
|
||||
net.ipv4.conf.all.send_redirects = 0
|
||||
|
||||
# disable icmp accept redirect
|
||||
net.ipv4.conf.all.accept_redirects = 0
|
||||
|
||||
# drop packets with LSR or SSR
|
||||
net.ipv4.conf.all.accept_source_route = 0
|
||||
|
||||
# MTU discovery, only enable when ICMP blackhole detected
|
||||
net.ipv4.tcp_mtu_probing = 1
|
||||
|
||||
EOF
|
||||
|
||||
echo "Enabling system level tuning params"
|
||||
sysctl --quiet --load sysctl.conf && rm -f sysctl.conf
|
||||
|
||||
# `Transparent Hugepage Support`*: This is a Linux kernel feature intended to improve
|
||||
# performance by making more efficient use of processor’s memory-mapping hardware.
|
||||
# But this may cause https://blogs.oracle.com/linux/performance-issues-with-transparent-huge-pages-thp
|
||||
# for non-optimized applications. As most Linux distributions set it to `enabled=always` by default,
|
||||
# we recommend changing this to `enabled=madvise`. This will allow applications optimized
|
||||
# for transparent hugepages to obtain the performance benefits, while preventing the
|
||||
# associated problems otherwise. Also, set `transparent_hugepage=madvise` on your kernel
|
||||
# command line (e.g. in /etc/default/grub) to persistently set this value.
|
||||
|
||||
echo "Enabling THP madvise"
|
||||
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
|
||||
```
|
||||
@@ -1,81 +0,0 @@
|
||||
# 磁盘缓存设计 [](https://slack.min.io)
|
||||
|
||||
本文档介绍了一些基本假设和设计方法,以及磁盘缓存功能的限制。如果您希望入门使用磁盘缓存,建议您先阅读[入门文档](https://github.com/minio/minio/blob/master/docs/zh_CN/disk-caching/README.md)。
|
||||
|
||||
## 命令行
|
||||
|
||||
```
|
||||
minio gateway <name> -h
|
||||
...
|
||||
...
|
||||
CACHE:
|
||||
MINIO_CACHE_DRIVES: List of mounted cache drives or directories delimited by ","
|
||||
MINIO_CACHE_EXCLUDE: List of cache exclusion patterns delimited by ","
|
||||
MINIO_CACHE_QUOTA: Maximum permitted usage of the cache in percentage (0-100).
|
||||
MINIO_CACHE_AFTER: Minimum number of access before caching an object.
|
||||
MINIO_CACHE_WATERMARK_LOW: % of cache quota at which cache eviction stops
|
||||
MINIO_CACHE_WATERMARK_HIGH: % of cache quota at which cache eviction starts
|
||||
MINIO_CACHE_RANGE: set to "on" or "off" caching of independent range requests per object, defaults to "on"
|
||||
|
||||
|
||||
...
|
||||
...
|
||||
|
||||
Start MinIO gateway to s3 with edge caching enabled on '/mnt/drive1', '/mnt/drive2' and '/mnt/export1 ... /mnt/export24',
|
||||
exclude all objects under 'mybucket', exclude all objects with '.pdf' as extension. Cache only those objects accessed atleast 3 times. Garbage collection triggers in at high water mark (i.e. cache disk usage reaches 90% of cache quota) or at 72% and evicts oldest objects by access time until low watermark is reached ( 70% of cache quota) , i.e. 63% of disk usage.
|
||||
$ export MINIO_CACHE_DRIVES="/mnt/drive1,/mnt/drive2,/mnt/export{1..24}"
|
||||
$ export MINIO_CACHE_EXCLUDE="mybucket/*,*.pdf"
|
||||
$ export MINIO_CACHE_QUOTA=80
|
||||
$ export MINIO_CACHE_AFTER=3
|
||||
$ export MINIO_CACHE_WATERMARK_LOW=70
|
||||
$ export MINIO_CACHE_WATERMARK_HIGH=90
|
||||
|
||||
$ minio gateway s3
|
||||
```
|
||||
|
||||
### 在Docker容器上运行具有缓存的MinIO网关
|
||||
### Stable
|
||||
缓存驱动器需要为磁盘缓存功能启用`strictatime` 或者 `relatime`。在此示例中,在启用了`strictatime`或者`relatime`的情况下,将xfs文件系统挂载在/mnt/cache上。
|
||||
|
||||
```
|
||||
truncate -s 4G /tmp/data
|
||||
mkfs.xfs /tmp/data # build xfs filesystem on /tmp/data
|
||||
sudo mkdir /mnt/cache # create mount dir
|
||||
sudo mount -o relatime /tmp/data /mnt/cache # mount xfs on /mnt/cache with atime.
|
||||
docker pull minio/minio
|
||||
docker run --net=host -e MINIO_ROOT_USER={s3-access-key} -e MINIO_ROOT_PASSWORD={s3-secret-key} -e MINIO_CACHE_DRIVES=/cache -e MINIO_CACHE_QUOTA=99 -e MINIO_CACHE_AFTER=0 -e MINIO_CACHE_WATERMARK_LOW=90 -e MINIO_CACHE_WATERMARK_HIGH=95 -v /mnt/cache:/cache minio/minio:latest gateway s3
|
||||
|
||||
```
|
||||
|
||||
## 假设
|
||||
|
||||
- 磁盘缓存配额默认为驱动器容量的80%。
|
||||
- 缓存驱动器必须是启用[`atime`](http://kerolasa.github.io/filetimes.html)支持的文件系统挂载点。另外,可以在MINIO_CACHE_DRIVES中指定具有atime支持的可写目录。
|
||||
- 每当缓存磁盘使用率相对于配置的缓存配额达到高水位线时,就会发生垃圾收集扫描,GC会清理最近访问最少的对象,直到达到相对于配置的缓存配额的低水位线为止。垃圾收集每隔30分钟运行一次缓存清理扫描。
|
||||
- 仅在驱动器具有足够的磁盘空间时才缓存对象。
|
||||
|
||||
## 行为
|
||||
|
||||
磁盘缓存为**下载的**对象缓存,即
|
||||
|
||||
- 下载时如果在缓存中找不到的该条目,则缓存为新对象,否则从缓存中获取。
|
||||
- 当从缓存中获取对象时,也会将Bitrot保护添加到缓存的内容中并进行验证。
|
||||
- 删除对象时,也会删除缓存中的相应条目(如果有)。
|
||||
- 后端离线时,缓存可继续用于诸如GET,HEAD之类的只读操作。
|
||||
- Cache-Control和Expires头信息可用于控制对象在缓存中保留的时间。直到满足Cache-Control或Expires的到期时间,才会使用后端验证缓存对象的ETag。
|
||||
- 默认情况下,所有range GET请求都会单独缓存 ,但是这并不适用于所有情形,比如当缓存存储受到限制时,因为这种情形下一次性下载整个对象才是最佳选择。 可以选择通过`export MINIO_CACHE_RANGE=off`关闭此功能,以便可以在后台下载整个对象。
|
||||
- 为了确保安全性,通常不缓存加密对象。但是,如果希望加密磁盘上的缓存内容,则可以通过MINIO_CACHE_ENCRYPTION_MASTER_KEY环境变量设置一个缓存KMS主密钥,以自动加密所有缓存内容。
|
||||
|
||||
请注意,不建议将缓存KMS主密钥用于生产部署中。如果MinIO server/gateway 机器曾经遭到破解,则缓存KMS主密钥也必须被视为受到破解。
|
||||
支持外部KMS来管理缓存KMS密钥已经在计划中,这对于生产部署而言将是理想的选择。
|
||||
|
||||
> 注意:根据上述配置的间隔,过期会自动发生,经常访问的对象在缓存中的存活时间会更长。
|
||||
|
||||
### Crash 恢复
|
||||
|
||||
minio进程被杀死或者崩溃后重启minio网关,磁盘缓存将自动恢复。垃圾回收周期将恢复,并且任何先前缓存的条目都可以正常使用。
|
||||
|
||||
## 限制
|
||||
|
||||
- 存储桶策略未缓存,因此后端离线时不支持匿名操作。
|
||||
- 使用确定性的散列,对象会被分配到已配置的缓存驱动器上。如果一个或多个驱动器离线,或者更改了缓存驱动器配置,则性能可能会降低到线性查找时间,具体取决于缓存中的磁盘数量。
|
||||
@@ -1,42 +0,0 @@
|
||||
# 磁盘缓存快速入门 [](https://slack.min.io)
|
||||
|
||||
这里的磁盘缓存功能是指使用缓存磁盘将内容存储在更靠近租户的地方。例如,假设你通过`gateway azure`设置访问一个对象并下载下来进行缓存,那接下来的请求都会直接访问缓存磁盘上的对象,直至其过期失效。此功能允许MinIO用户:
|
||||
- 对象的读取速度性能最佳。
|
||||
- 任何对象的首字节时间得到显著改善。
|
||||
|
||||
## 开始
|
||||
|
||||
### 1. 前置条件
|
||||
安装MinIO - [MinIO快速入门](https://docs.min.io/cn/minio-quickstart-guide)。
|
||||
|
||||
### 2. 运行带缓存的MinIO网关
|
||||
可以通过设置`cache`环境变量为MinIO网关启用磁盘缓存。配置`cache`环境变量需要指定磁盘路径、使用通配符方式指定的不需要进行缓存的对象、用于缓存垃圾回收的高低水位线以及缓存一个对象前的最小访问次数(译者注:就是对象被访问多少次后才缓存它)。
|
||||
|
||||
下面示例使用`/mnt/drive1`, `/mnt/drive2` ,`/mnt/cache1` ... `/mnt/cache3`来做缓存,并且`mybucket`下的所有对象以及后缀名为`.pdf`的对象不做缓存。如果对象被访问过三次及以上,则将其缓存。在此示例中,缓存最大使用量限制为磁盘容量的80%。当达到高水位线的时候垃圾回收会被触发(即缓存磁盘使用率达到72%的时候),这时候会清理最近最少使用的条目直到磁盘使用率降到低水位线为止(即缓存磁盘使用率降到56%)。
|
||||
|
||||
```bash
|
||||
export MINIO_CACHE="on"
|
||||
export MINIO_CACHE_DRIVES="/mnt/drive1,/mnt/drive2,/mnt/cache{1...3}"
|
||||
export MINIO_CACHE_EXCLUDE="*.pdf,mybucket/*"
|
||||
export MINIO_CACHE_QUOTA=80
|
||||
export MINIO_CACHE_AFTER=3
|
||||
export MINIO_CACHE_WATERMARK_LOW=70
|
||||
export MINIO_CACHE_WATERMARK_HIGH=90
|
||||
|
||||
minio gateway s3
|
||||
```
|
||||
|
||||
`CACHE_WATERMARK`的值是`CACHE_QUOTA`的百分比。
|
||||
在上面的示例中,`MINIO_CACHE_WATERMARK_LOW`实际上是磁盘总空间的`0.8 * 0.7 * 100 = 56%`,`MINIO_CACHE_WATERMARK_LOW`实际上是磁盘总空间的`0.8 * 0.9 * 100 = 72%`。
|
||||
|
||||
|
||||
### 3. 验证设置是否成功
|
||||
要验证是否部署成功,你可以通过浏览器或者[`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)来访问刚刚部署的MinIO网关。你应该可以看到上传的文件在所有MinIO节点上都可以访问。
|
||||
|
||||
# 了解更多
|
||||
- [磁盘缓存设计](https://github.com/minio/minio/blob/master/docs/zh_CN/disk-caching/DESIGN.md)
|
||||
- [`mc`快速入门](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [使用 `aws-cli`](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [使用 `s3cmd`](https://docs.min.io/cn/s3cmd-with-minio)
|
||||
- [使用 `minio-go` SDK](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
- [MinIO文档](https://docs.min.io/cn/)
|
||||
@@ -1,154 +0,0 @@
|
||||
# 分布式服务器设计指南 [](https://slack.min.io)
|
||||
该文档介绍了分布式MinIO服务器的设计、架构和高级用法。
|
||||
|
||||
## 命令行
|
||||
```
|
||||
NAME:
|
||||
minio server - start object storage server
|
||||
|
||||
USAGE:
|
||||
minio server [FLAGS] DIR1 [DIR2..]
|
||||
minio server [FLAGS] DIR{1...64}
|
||||
minio server [FLAGS] DIR{1...64} DIR{65...128}
|
||||
|
||||
DIR:
|
||||
DIR points to a directory on a filesystem. When you want to combine
|
||||
multiple drives into a single large system, pass one directory per
|
||||
filesystem separated by space. You may also use a '...' convention
|
||||
to abbreviate the directory arguments. Remote directories in a
|
||||
distributed setup are encoded as HTTP(s) URIs.
|
||||
```
|
||||
|
||||
## 常用用法
|
||||
|
||||
具有4个纠删码集合,每个集合带有16块硬盘的独立纠删码模式部署配置。
|
||||
```
|
||||
minio server dir{1...64}
|
||||
```
|
||||
|
||||
具有64个纠删码集合,每个集合16块硬盘的分布式纠删码模式部署配置。
|
||||
|
||||
```
|
||||
minio server http://host{1...16}/export{1...64}
|
||||
```
|
||||
|
||||
## 架构
|
||||
|
||||
MinIO可以基于省略号这种扩展方式自动的选择纠删集合的大小。下面是我们的纠删码行为的一些底层实现细节。
|
||||
|
||||
- MinIO采用的是 [Reed-Solomon](https://github.com/klauspost/reedsolomon) 纠删码方案, 该方案最大分片数为256个,也就是128个数据片和128个奇偶校验片。 基于一些实用的架构考虑,MinIO的设计超越了这个限制。
|
||||
|
||||
- 在MinIO部署中,纠删集合是一个独立的纠删码单元。 一个对象会被分片在一个纠删集合中。纠删集合的大小是根据磁盘的数量自动计算的。 MinIO支持无限数量的磁盘,但每个纠删集合最多有16个磁盘,最少有4个磁盘。
|
||||
|
||||
- 我们将纠删集合的磁盘数量限制为16个,是因为超过16个纠删码分片会变得混乱,并且没有任何性能优势。此外,由于16个磁盘的纠删集合默认情况下为每个对象提供8个磁盘的容量,因此在任何实际情况下都足够使用。
|
||||
|
||||
- 纠删集合的大小是根据可用的磁盘数量自动选择的,比如说如果有32台服务器,每台服务器有32块磁盘,总共是1024块磁盘。在这种情况下,纠删集合大小是16。这是由可接受的纠删集合大小的最大公因子(GCD)决定的,公因子取值范围从*4到16*。
|
||||
|
||||
- *如果磁盘总数有许多共同的除数,那么算法就会为这任意N个纠删集合大小选择最小的纠删集合数量*。例如1024个磁盘 - 4, 8, 16 是公因子. 16个磁盘一组会得到64个纠删集合,8个磁盘一组会得到128个纠删集合, 4个磁盘一组会得到256个纠删集合. 所以算法会自动选择最小的64个集合,也就是 *16 * 64=1024* 个磁盘的总和。
|
||||
|
||||
- *如果纠删集合中的磁盘总数是奇数,那么GCD算法提供了对奇数纠删集合的亲和力,以便节点可以均匀分布*。 这是为了确保参与任何纠删集合的磁盘数量相同。例如,如果你有2个主机节点,共有180个磁盘,那么GCD是15(奇数),但这将导致磁盘分配不均匀,其中一个节点将会有更多的磁盘。为了避免这种情况,对节点给予亲和力,使用次优的GCD系数为12,提供均匀的分布。
|
||||
|
||||
- 在这个算法中,我们还确保了将磁盘均匀的分布。MinIO服务器会对传递的省略号参数进行扩展。下面是一个示例来演示这个过程。
|
||||
|
||||
```
|
||||
minio server http://host{1...2}/export{1...8}
|
||||
```
|
||||
|
||||
预期扩展
|
||||
```
|
||||
> http://host1/export1
|
||||
> http://host2/export1
|
||||
> http://host1/export2
|
||||
> http://host2/export2
|
||||
> http://host1/export3
|
||||
> http://host2/export3
|
||||
> http://host1/export4
|
||||
> http://host2/export4
|
||||
> http://host1/export5
|
||||
> http://host2/export5
|
||||
> http://host1/export6
|
||||
> http://host2/export6
|
||||
> http://host1/export7
|
||||
> http://host2/export7
|
||||
> http://host1/export8
|
||||
> http://host2/export8
|
||||
```
|
||||
|
||||
*这种扩展的一个显着特征是它选择了唯一的主机,因此该设置可提供最大的保护和可用性。*
|
||||
|
||||
- 为对象选择纠删集合是在`PutObject()`的过程中决定的,通过以下伪代码使用对象名称查找正确的纠删集合。
|
||||
```go
|
||||
// hashes the key returning an integer.
|
||||
func sipHashMod(key string, cardinality int, id [16]byte) int {
|
||||
if cardinality <= 0 {
|
||||
return -1
|
||||
}
|
||||
sip := siphash.New(id[:])
|
||||
sip.Write([]byte(key))
|
||||
return int(sip.Sum64() % uint64(cardinality))
|
||||
}
|
||||
```
|
||||
在`PutObject()`输入的key是对象的名字, 返回一个唯一索引。该索引是对象将存储的纠删集合中的一个。 该函数根据给定的对象名字返回一致Hash,也就是说对于相同的对象名称,返回的索引总是相同的。
|
||||
|
||||
- 仅在对象的纠删集合中需要满足读写仲裁。还可以在包含对象的纠删集合中对每个对象进行修复。
|
||||
|
||||
- 与其他对象存储不同,MinIO的纠删编码是在对象级别而不是卷级别。这允许应用程序通过为每个上传的对象设置`x-amz-storage-class=STANDARD/REDUCED_REDUNDANCY`来选择不同的存储类型,从而有效地利用集群的容量。
|
||||
|
||||
- MinIO还支持通过扩展区域的方式扩展现有集群。每个区域都是一个独立的实体,每个对象具有与原有群集相同的SLA(读/写仲裁)。通过使用现有的命名控件进行查询验证,MinIO确保不会创建冲突的对象。如果不存在这样的对象,那么MinIO只会选择使用量最少的区域存储该对象。
|
||||
|
||||
__可以组合很多个区域成一个集群,区域数量没有限制__
|
||||
|
||||
```
|
||||
minio server http://host{1...32}/export{1...32} http://host{5...6}/export{1...8}
|
||||
```
|
||||
|
||||
以上示例有两个区域
|
||||
|
||||
- 32 * 32 = 1024 drives pool1
|
||||
- 2 * 8 = 16 drives pool2
|
||||
|
||||
> 注意这里对通用SLA的要求,原来的集群有1024个磁盘,每个纠删集合有16个磁盘,第二个区域至少要有16个磁盘才能符合原来集群的SLA,或者应该是16的倍数。
|
||||
|
||||
|
||||
MinIO根据每个区域的可用空间比例将新对象放置在区域中。以下伪代码演示了此行为。
|
||||
```go
|
||||
func getAvailablePoolIdx(ctx context.Context) int {
|
||||
serverPools := z.getServerPoolsAvailableSpace(ctx)
|
||||
total := serverPools.TotalAvailable()
|
||||
// choose when we reach this many
|
||||
choose := rand.Uint64() % total
|
||||
atTotal := uint64(0)
|
||||
for _, pool := range serverPools {
|
||||
atTotal += pool.Available
|
||||
if atTotal > choose && pool.Available > 0 {
|
||||
return pool.Index
|
||||
}
|
||||
}
|
||||
// Should not happen, but print values just in case.
|
||||
panic(fmt.Errorf("reached end of serverPools (total: %v, atTotal: %v, choose: %v)", total, atTotal, choose))
|
||||
}
|
||||
```
|
||||
|
||||
## 其他用法
|
||||
|
||||
### 具有多个省略号的高级用法
|
||||
|
||||
一个独立的纠删模式配置,通过controller组合生成,它有4个纠删集合,每个集合有16个磁盘。
|
||||
```
|
||||
minio server /mnt/controller{1...4}/data{1...16}
|
||||
```
|
||||
|
||||
一个独立的纠删模式配置,通过mounts和controller组合生成,它有16个纠删集合,每个集合有16个磁盘。
|
||||
```
|
||||
minio server /mnt{1...4}/controller{1...4}/data{1...16}
|
||||
```
|
||||
|
||||
一个分布式的纠删模式配置,通过host组合生成,它有2个纠删集合,每个集合有16个磁盘。
|
||||
```
|
||||
minio server http://host{1...32}/disk1
|
||||
```
|
||||
|
||||
一个机柜级别冗余的分布式纠删模式配置,它有32个纠删集合,每个集合有16个磁盘。
|
||||
```
|
||||
minio server http://rack{1...4}-host{1...8}.example.net/export{1...16}
|
||||
```
|
||||
@@ -1,102 +0,0 @@
|
||||
# 分布式MinIO快速入门 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。
|
||||
|
||||
## 分布式Minio有什么好处?
|
||||
|
||||
在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。
|
||||
|
||||
### 数据保护
|
||||
|
||||
|
||||
分布式Minio采用 [纠删码](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)来防范多个节点宕机和[位衰减`bit rot`](https://github.com/minio/minio/blob/master/docs/zh_CN/erasure/README.md#what-is-bit-rot-protection)。
|
||||
|
||||
分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
|
||||
|
||||
### 高可用
|
||||
|
||||
单机Minio服务存在单点故障,相反,如果是一个有 _m_ 台服务器, _n_ 块硬盘的分布式Minio,只要有 _m/2_ 台服务器或者 _m*n_/2 及更多硬盘在线,你的数据就是安全的。
|
||||
|
||||
例如,一个16节点的Minio集群,每个节点200块硬盘,就算8台服務器宕机,即大概有1600块硬盘,这个集群仍然是可读的,不过你需要9台服務器在线才能写数据。
|
||||
|
||||
你还可以使用[存储类型](https://github.com/minio/minio/tree/master/docs/zh_CN/erasure/storage-class)自定义每个对象的奇偶分布。
|
||||
|
||||
### 一致性
|
||||
|
||||
Minio在分布式和单机模式下,所有读写操作都严格遵守**read-after-write**和**list-after-write**一致性模型。
|
||||
|
||||
# 开始吧
|
||||
|
||||
如果你了解Minio单机模式的搭建的话,分布式搭建的流程基本一样,Minio服务基于命令行传入的参数自动切换成单机模式还是分布式模式。
|
||||
|
||||
## 1. 前提条件
|
||||
|
||||
安装Minio - [Minio快速入门](https://docs.min.io/cn/minio-quickstart-guide).
|
||||
|
||||
## 2. 运行分布式Minio
|
||||
|
||||
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。
|
||||
|
||||
*注意*
|
||||
|
||||
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,__建议__ 在执行minio server命令之前,在所有节点上先将access秘钥和secret秘钥export成环境变量`MINIO_ROOT_USER` 和 `MINIO_ROOT_PASSWORD`。
|
||||
- __MinIO 可创建每组4到16个磁盘组成的纠删码集合。所以你提供的磁盘总数必须是其中一个数字的倍数。__
|
||||
- MinIO会根据给定的磁盘总数或者节点总数选择最大的纠删码集合大小,确保统一分布,即每个节点参与每个集合的磁盘数量相等。
|
||||
- __每个对象被写入一个EC集合中,因此该对象分布在不超过16个磁盘上。__
|
||||
- __建议运行分布式MinIO设置的所有节点都是同构的,即相同的操作系统,相同数量的磁盘和相同的网络互连。__
|
||||
- 分布式Minio使用干净的目录,里面没有数据。你也可以与其他程序共享磁盘,这时候只需要把一个子目录单独给MinIO使用即可。例如,你可以把磁盘挂在到`/export`下, 然后把`/export/data`作为参数传给MinIO server即可。
|
||||
- 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
|
||||
- 分布式Minio里的节点时间差不能超过15分钟,你可以使用[NTP](http://www.ntp.org/) 来保证时间一致。
|
||||
- `MINIO_DOMAIN`环境变量应该定义并且导出,以支持bucket DNS style。
|
||||
- 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
|
||||
|
||||
示例1: 启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令。
|
||||
示例1: 在n个节点上启动分布式MinIO实例,每个节点有m个磁盘,分别挂载在`/export1` 到 `/exportm` (如下图所示), 在所有n个节点上运行此命令:
|
||||
|
||||

|
||||
|
||||
#### GNU/Linux 和 macOS
|
||||
|
||||
```shell
|
||||
export MINIO_ROOT_USER=<ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<SECRET_KEY>
|
||||
minio server http://host{1...n}/export{1...m}
|
||||
```
|
||||
|
||||
> __注意:__ 在以上示例中`n`和`m`代表正整数, *不要直接复制粘贴它们,你应该在部署的时候改成你期望的值*.
|
||||
|
||||
> __注意:__ `{1...n}` 是有3个点的! 用2个点`{1..n}`的话会被shell解析导致不能传给MinIO server, 影响纠删码的顺序, 进而影响性能和高可用性. __所以要始终使用省略号 `{1...n}` (3个点!) 以获得最佳的纠删码分布__
|
||||
|
||||
#### 扩展现有的分布式集群
|
||||
MinIO支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:
|
||||
|
||||
```sh
|
||||
export MINIO_ROOT_USER=<ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<SECRET_KEY>
|
||||
minio server http://host{1...n}/export{1...m} http://host{o...z}/export{1...m}
|
||||
```
|
||||
|
||||
例如:
|
||||
```
|
||||
minio server http://host{1...4}/export{1...16} http://host{5...12}/export{1...16}
|
||||
```
|
||||
|
||||
现在整个集群就扩展了 _(newly_added_servers\*m)_ 个磁盘,总磁盘变为 _(existing_servers\*m)+(newly_added_servers\*m)_ 个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。如上命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。
|
||||
|
||||
> __说明:__ __您添加的每个区域必须具有与原始区域相同的磁盘数量(纠删码集)大小,以便维持相同的数据冗余SLA。__
|
||||
> 例如,第一个区有8个磁盘,您可以将集群扩展为16个、32个或1024个磁盘的区域,您只需确保部署的SLA是原始区域的倍数即可。
|
||||
|
||||
|
||||
## 3. 验证
|
||||
|
||||
验证是否部署成功,使用浏览器访问Minio服务或者使用 [`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)。多个节点的存储容量和就是分布式Minio的存储容量。
|
||||
|
||||
## 了解更多
|
||||
|
||||
- [Minio纠删码快速入门](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
- [使用 `mc`](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [使用 `aws-cli`](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [使用 `s3cmd`](https://docs.min.io/cn/s3cmd-with-minio)
|
||||
- [使用 `minio-go` SDK ](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
|
||||
- [minio官方文档](https://docs.min.io)
|
||||
@@ -1,167 +0,0 @@
|
||||
# MinIO Docker 快速入门 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
## 前提条件
|
||||
您的机器已经安装docker. 从 [这里](https://www.docker.com/community-edition#/download)下载相关软件。
|
||||
|
||||
## 在Docker中运行MinIO单点模式。
|
||||
MinIO 需要一个持久卷来存储配置和应用数据。不过, 如果只是为了测试一下, 您可以通过简单地传递一个目录(在下面的示例中为`/ data`)启动MinIO。这个目录会在容器启动时在容器的文件系统中创建,不过所有的数据都会在容器退出时丢失。
|
||||
|
||||
```sh
|
||||
docker run -p 9000:9000 \
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
要创建具有永久存储的MinIO容器,您需要将本地持久目录从主机操作系统映射到虚拟配置`~/.minio` 并导出`/data`目录。 为此,请运行以下命令
|
||||
|
||||
#### GNU/Linux 和 macOS
|
||||
```sh
|
||||
docker run -p 9000:9000 \
|
||||
--name minio1 \
|
||||
-v /mnt/data:/data \
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
#### Windows
|
||||
```sh
|
||||
docker run -p 9000:9000 \
|
||||
--name minio1 \
|
||||
-v D:\data:/data \
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
## 在Docker中运行MinIO分布式模式
|
||||
分布式MinIO可以通过 [Docker Compose](https://docs.min.io/cn/deploy-minio-on-docker-compose) 或者 [Swarm mode](https://docs.min.io/cn/deploy-minio-on-docker-swarm)进行部署。这两者之间的主要区别是Docker Compose创建了单个主机,多容器部署,而Swarm模式创建了一个多主机,多容器部署。
|
||||
|
||||
这意味着Docker Compose可以让你快速的在你的机器上快速使用分布式MinIO-非常适合开发,测试环境;而Swarm模式提供了更健壮,生产级别的部署。
|
||||
|
||||
## MinIO Docker提示
|
||||
|
||||
### MinIO自定义Access和Secret密钥
|
||||
要覆盖MinIO的自动生成的密钥,您可以将Access和Secret密钥设为环境变量。 MinIO允许常规字符串作为Access和Secret密钥。
|
||||
|
||||
#### GNU/Linux 和 macOS
|
||||
```sh
|
||||
docker run -p 9000:9000 --name minio1 \
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
|
||||
-v /mnt/data:/data \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
#### Windows
|
||||
```powershell
|
||||
docker run -p 9000:9000 --name minio1 \
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
|
||||
-v D:\data:/data \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
### 以普通用户身份运行MinIO Docker
|
||||
Docker提供了标准化的机制,可以以非root用户身份运行docker容器。
|
||||
|
||||
#### GNU/Linux 和 macOS
|
||||
在 Linux 和 macOS 上, 你可以使用 `--user` 以普通用户身份来运行容器。
|
||||
|
||||
> 注意: 在使用`--user`前,一定要确保--user指定的用户具备 *${HOME}/data* 的写入权限。
|
||||
```sh
|
||||
mkdir -p ${HOME}/data
|
||||
docker run -p 9000:9000 \
|
||||
--user $(id -u):$(id -g) \
|
||||
--name minio1 \
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMIK7MDENGbPxRfiCYEXAMPLEKEY" \
|
||||
-v ${HOME}/data:/data \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
#### Windows
|
||||
在windows上, 你需要用到 [Docker集成Windows身份验证](https://success.docker.com/article/modernizing-traditional-dot-net-applications#integratedwindowsauthentication) 和 [创建具有Active Directory支持的容器](https://blogs.msdn.microsoft.com/containerstuff/2017/01/30/create-a-container-with-active-directory-support/) 的能力
|
||||
|
||||
> 注意: 在使用`credentialspec=`时,要确保你的AD/Windows用户具备 *D:\data* 的写入权限。
|
||||
|
||||
```powershell
|
||||
docker run -p 9000:9000 \
|
||||
--name minio1 \
|
||||
--security-opt "credentialspec=file://myuser.json"
|
||||
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
|
||||
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMIK7MDENGbPxRfiCYEXAMPLEKEY" \
|
||||
-v D:\data:/data \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
### 使用Docker secrets进行MinIO Access和Secret密钥自定义
|
||||
要覆盖MinIO的自动生成的密钥,你可以把secret和access秘钥创建成[Docker secrets](https://docs.docker.com/engine/swarm/secrets/). MinIO允许常规字符串作为Access和Secret密钥。
|
||||
|
||||
```
|
||||
echo "AKIAIOSFODNN7EXAMPLE" | docker secret create access_key -
|
||||
echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" | docker secret create secret_key -
|
||||
```
|
||||
|
||||
使用`docker service`创建MinIO服务,并读取Docker secrets。
|
||||
```
|
||||
docker service create --name="minio-service" --secret="access_key" --secret="secret_key" minio/minio server /data
|
||||
```
|
||||
|
||||
更多 `docker service`信息,请访问 [这里](https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/)
|
||||
|
||||
#### 自定义MinIO Access和Secret密钥文件
|
||||
要使用其他密钥名称,请把上面的`access_key` 和 `secret_key`替换为你自定义的名称(比如`my_secret_key`,`my_custom_key`)。使用如下命令运行服务
|
||||
```
|
||||
docker service create --name="minio-service" \
|
||||
--secret="my_access_key" \
|
||||
--secret="my_secret_key" \
|
||||
--env="MINIO_ROOT_USER_FILE=my_access_key" \
|
||||
--env="MINIO_ROOT_PASSWORD_FILE=my_secret_key" \
|
||||
minio/minio server /data
|
||||
```
|
||||
|
||||
### 获取容器ID
|
||||
在容器中使用Docker命令, 你需要知道这个容器的 `容器ID` 。 为了获取 `Container ID`, 运行
|
||||
|
||||
```sh
|
||||
docker ps -a
|
||||
```
|
||||
|
||||
`-a` flag 确保你获取所有的容器(创建的,正在运行的,退出的),然后从输出中识别`Container ID`。
|
||||
|
||||
### 启动和停止容器
|
||||
启动容器,你可以使用 [`docker start`](https://docs.docker.com/engine/reference/commandline/start/) 命令。
|
||||
|
||||
```sh
|
||||
docker start <container_id>
|
||||
```
|
||||
|
||||
停止一下正在运行的容器, 使用 [`docker stop`](https://docs.docker.com/engine/reference/commandline/stop/) 命令。
|
||||
```sh
|
||||
docker stop <container_id>
|
||||
```
|
||||
|
||||
### MinIO容器日志
|
||||
获取MinIO日志,使用 [`docker logs`](https://docs.docker.com/engine/reference/commandline/logs/) 命令。
|
||||
|
||||
```sh
|
||||
docker logs <container_id>
|
||||
```
|
||||
|
||||
### 监控MinioDocker容器
|
||||
监控MinIO容器使用的资源,使用 [`docker stats`](https://docs.docker.com/engine/reference/commandline/stats/) 命令.
|
||||
|
||||
```sh
|
||||
docker stats <container_id>
|
||||
```
|
||||
|
||||
## 了解更多
|
||||
|
||||
|
||||
* [在Docker Compose上部署MinIO](https://docs.min.io/cn/deploy-minio-on-docker-compose)
|
||||
* [在Docker Swarm上部署MinIO](https://docs.min.io/cn/deploy-minio-on-docker-swarm)
|
||||
* [分布式MinIO快速入门](https://docs.min.io/cn/distributed-minio-quickstart-guide)
|
||||
* [MinIO纠删码模式快速入门](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
# Minio纠删码快速入门 [](https://slack.min.io)
|
||||
|
||||
Minio使用纠删码`erasure code`和`checksum`来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
|
||||
|
||||
## 什么是纠删码`erasure code`?
|
||||
|
||||
纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用里德-所罗门码将对象分片为数据和奇偶校验块。 这就意味着如果是12块盘,一个对象可被分片的范围是:6个数据块和6个奇偶校验块 到 10个数据块和2个奇偶校验块之间。
|
||||
|
||||
默认情况下, MinIO 将对象拆分成N/2数据和N/2 奇偶校验盘. 虽然你可以通过 [存储类型](https://github.com/minio/minio/tree/master/docs/zh_CN/erasure/storage-class) 自定义配置, 但是我们还是推荐N/2个数据和奇偶校验块, 因为它可以确保对硬盘故障提供最佳保护。
|
||||
|
||||
比如上面12个盘的例子,通过默认配置运行MinIO服务的话,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复,是不是很NB,感兴趣的同学请翻墙google。
|
||||
|
||||
## 为什么纠删码有用?
|
||||
|
||||
纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。
|
||||
|
||||

|
||||
|
||||
## 什么是位衰减`bit rot`保护?
|
||||
|
||||
位衰减又被称为数据腐化`Data Rot`、无声数据损坏`Silent Data Corruption`,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 [HighwayHash](https://github.com/minio/highwayhash) 基于哈希的校验和来防范位衰减。
|
||||
|
||||
## 驱动器(盘)如何使用纠删码?
|
||||
|
||||
MinIO会把你提供的所有驱动器,按照*4 到 16*个一组划分为多个纠删码集合,因此,你提供的驱动器数量必须是以上这些数字(4到16)的倍数。每个对象都会被写入一个单独的纠删码集合中。
|
||||
|
||||
Minio会尽可能使用最大的纠删码集合大小(EC set size)进行划分.比如 *18个盘*会被划分为2个纠删码集合,每个集合有9个盘;*24个盘*也会被划分为2个纠删码集合,每个集合有12个盘。对于将MinIO作为独立的纠删码部署运行的场景而言,这是正确的。然而,在 [分布式部署](https://docs.minio.io/cn/distributed-minio-quickstart-guide.html) 时,选择的是基于节点(亲和力)的纠删条带大小.
|
||||
|
||||
驱动器的大小应当都差不多。
|
||||
|
||||
## Minio纠删码快速入门
|
||||
|
||||
### 1. 前提条件:
|
||||
|
||||
安装Minio- [Minio快速入门](https://docs.min.io/cn/minio-quickstart-guide)
|
||||
|
||||
### 2. 以纠删码模式运行Minio
|
||||
|
||||
示例: 使用Minio,在12个盘中启动Minio服务。
|
||||
|
||||
```sh
|
||||
minio server /data{1...12}
|
||||
```
|
||||
|
||||
示例: 使用Minio Docker镜像,在8块盘中启动Minio服务。
|
||||
|
||||
```sh
|
||||
docker run -p 9000:9000 --name minio \
|
||||
-v /mnt/data1:/data1 \
|
||||
-v /mnt/data2:/data2 \
|
||||
-v /mnt/data3:/data3 \
|
||||
-v /mnt/data4:/data4 \
|
||||
-v /mnt/data5:/data5 \
|
||||
-v /mnt/data6:/data6 \
|
||||
-v /mnt/data7:/data7 \
|
||||
-v /mnt/data8:/data8 \
|
||||
minio/minio server /data{1...8}
|
||||
```
|
||||
|
||||
### 3. 验证是否设置成功
|
||||
|
||||
你可以随意拔掉硬盘,看Minio是否可以正常读写。
|
||||
@@ -1,103 +0,0 @@
|
||||
# MinIO 存储类型快速入门 [](https://slack.min.io)
|
||||
|
||||
在纠删码模式下,MinIO server支持存储类型. 这可以指定每个对象的数据和奇偶校验盘,其实就是可以为对象选择不同的存储类型.
|
||||
|
||||
## 概述
|
||||
|
||||
MinIO 支持两种存储类型, 低冗余存储和标准存储。 这些存储类型可以在MinIO服务器启动之前通过环境变量定义。 在通过环境变量定义了每个存储类型的数据和奇偶校验盘的数量后,
|
||||
你可以通过请求中的元数据字段`x-amz-storage-class`来设置一个对象的存储类型。然后,MinIO服务器通过将对象保存在特定数量的数据和奇偶校验盘中来兑现存储类型。
|
||||
|
||||
## 可用存储空间
|
||||
|
||||
选择不同的数据和奇偶校验盘的数量会直接影响到存储空间的使用。通过存储类型,你能优化以实现高冗余或者是更好的空间利用率。
|
||||
|
||||
让我们以在16个盘的MinIO部署中存储100M文件为例,来了解数据和奇偶校验盘数量的不同组合是如何影响可用存储空间的。如果你使用8个数据盘和8个奇偶校验盘,文件空间使用量约为两倍,
|
||||
即100M文件将占用200M空间。但是,如果你是用10个数据盘和6个奇偶校验盘,则同样的100M文件大约需要160M的空间。如果你是用14个数据盘和2个奇偶校验盘,100M文件仅仅需要约114M空间。
|
||||
|
||||
以下是一张16盘的MinIO部署,数据/奇偶校验盘数量和相应的 _近似_ 存储储空间使用情况列表。_空间使用率_ 约等于纠删编码下的使用空间除以文件的实际大小。
|
||||
|
||||
| 盘总个数 (N) | 数据盘个数 (D) | 奇偶校验码个数 (P) | 空间使用率 |
|
||||
|------------------|-----------------|-------------------|---------------------|
|
||||
| 16 | 8 | 8 | 2.00 |
|
||||
| 16 | 9 | 7 | 1.79 |
|
||||
| 16 | 10 | 6 | 1.60 |
|
||||
| 16 | 11 | 5 | 1.45 |
|
||||
| 16 | 12 | 4 | 1.34 |
|
||||
| 16 | 13 | 3 | 1.23 |
|
||||
| 16 | 14 | 2 | 1.14 |
|
||||
|
||||
你可以使用公式: `盘总个数 (N)/数据盘个数 (D)`来计算 _大概的_ 空间使用率。
|
||||
|
||||
### 标准(STANDARD)存储类型的允许值
|
||||
|
||||
`STANDARD`存储类型意味着奇偶校验盘比`REDUCED_REDUNDANCY`多。 所以, `STANDARD`的奇偶校验盘数量应该
|
||||
|
||||
- 如果`REDUCED_REDUNDANCY`的奇偶校验盘未设置的话,应该大于等于2。
|
||||
- 如果已设置的话,应该大于`REDUCED_REDUNDANCY`的奇偶校验盘数量。
|
||||
|
||||
奇偶校验块不能大于数据块,所以`STANDARD`存储类型的奇偶校验块不能大于N/2。(N是盘总个数)
|
||||
|
||||
`STANDARD`存储类型的默认值是`N/2`(N是盘总个数)。
|
||||
|
||||
### 低冗余(REDUCED_REDUNDANCY)存储类型的允许值
|
||||
|
||||
`REDUCED_REDUNDANCY`存储类型意味着奇偶校验盘比`REDUCED_REDUNDANCY`少。 所以, `REDUCED_REDUNDANCY`的奇偶校验盘数量应该
|
||||
|
||||
- 如果`STANDARD`的奇偶校验盘未设置的话,应该小于2。
|
||||
- 如果设置的话,应该小于`STANDARD`的奇偶校验盘数量。
|
||||
|
||||
因为不建议奇偶校验盘数量低于2, 所以4个盘组成的纠删码模式部署是不支持`REDUCED_REDUNDANCY`存储类型的。
|
||||
|
||||
`REDUCED_REDUNDANCY`存储类型的默认值是`2`。
|
||||
|
||||
## 存储类型入门
|
||||
|
||||
### 设置存储类型
|
||||
|
||||
设置存储类型环境变量的格式如下
|
||||
|
||||
`MINIO_STORAGE_CLASS_STANDARD=EC:parity`
|
||||
`MINIO_STORAGE_CLASS_RRS=EC:parity`
|
||||
|
||||
例如, 设置 `MINIO_STORAGE_CLASS_RRS` 奇偶校验盘为2 以及设置 `MINIO_STORAGE_CLASS_STANDARD` 奇偶校验盘为3
|
||||
|
||||
```sh
|
||||
export MINIO_STORAGE_CLASS_STANDARD=EC:3
|
||||
export MINIO_STORAGE_CLASS_RRS=EC:2
|
||||
```
|
||||
|
||||
也可以通过`mc admin config` get/set 命令来设置存储类型。参考 [存储类型](https://github.com/minio/minio/tree/master/docs/zh_CN/config#存储类型) 获取更多详细信息。
|
||||
|
||||
|
||||
*注意*
|
||||
|
||||
- 如果通过环境变量或`mc admin config` get/set命令设置了`STANDARD`存储类型,并且请求元数据中不存在`x-amz-storage-class`,则MinIO服务器会将`STANDARD`存储类型应用于该对象。这意味着将按照`STANDARD`存储类型中的设置使用数据和奇偶校验盘数量。
|
||||
|
||||
- 如果在启动MinIO服务器之前未定义存储类型,并且随后的PutObject元数据字段中存在`x-amz-storage-class`,其值为`REDUCED_REDUNDANCY`或`STANDARD`,则MinIO服务器将使用默认的奇偶校验值。
|
||||
|
||||
### 设置元数据
|
||||
|
||||
如下`minio-go`的示例中,存储类型被设置为`REDUCED_REDUNDANCY`。这意味着对象被拆分为6个数据块和2个奇偶校验块(按照上一步骤中的存储类型设置)。
|
||||
|
||||
```go
|
||||
s3Client, err := minio.New("localhost:9000", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", true)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
object, err := os.Open("my-testfile")
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
defer object.Close()
|
||||
objectStat, err := object.Stat()
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
n, err := s3Client.PutObject("my-bucketname", "my-objectname", object, objectStat.Size(), minio.PutObjectOptions{ContentType: "application/octet-stream", StorageClass: "REDUCED_REDUNDANCY"})
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
log.Println("Uploaded", "my-objectname", " of size: ", n, "Successfully.")
|
||||
```
|
||||
@@ -1,9 +0,0 @@
|
||||
# MinIO 网关 [](https://slack.min.io)
|
||||
MinIO网关将Amazon S3兼容性添加到第三方云存储提供者。
|
||||
- [Microsoft Azure Blob Storage](https://github.com/minio/minio/blob/master/docs/gateway/azure.md)
|
||||
- [Google Cloud Storage](https://github.com/minio/minio/blob/master/docs/gateway/gcs.md) _Alpha release_
|
||||
|
||||
## 路线图
|
||||
* MinIO & AWS S3
|
||||
* Edge Caching - 基于磁盘的代理缓存
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
## MinIO Azure网关限制
|
||||
|
||||
网关继承了下列Azure限制:
|
||||
|
||||
- 最大的Multipart part size是100MB.
|
||||
- 最大的对象大小是10000*100 MB = 1TB
|
||||
- 不支持针对前缀的存储桶策略,仅支持顶层存储桶策略。
|
||||
- 网关重启意味着正在进行的multipart上传也需要重新启动,即客户端必须再一次运行NewMultipartUpload。
|
||||
这是因为S3客户端在NewMultipartUpload中发送元数据,但Azure希望在CompleteMultipartUpload(Azure术语中的PutBlockList)中设置元数据。
|
||||
This is because S3 clients send metadata in NewMultipartUpload but Azure expects metadata to
|
||||
be set during CompleteMultipartUpload (PutBlockList in Azure terminology). 在NewMultipartUpload期间,我们将客户端发送的元数据存储在内存中,以便以后可以在CompleteMultipartUpload中将其设置在Azure上。如果网关穗启,这些信息也会丢失。
|
||||
- 存储桶名称不支持以 "."开始。
|
||||
- 调用DeleteBucket() 可删除非空存储桶。
|
||||
|
||||
其它限制:
|
||||
- 目前ListMultipartUploads实现不完整,只要存在任意上传的parts,就会返回。
|
||||
- 不支持存储桶通知。
|
||||
@@ -1,43 +0,0 @@
|
||||
|
||||
# MinIO Azure 网关 [](https://slack.min.io)
|
||||
MinIO网关将亚马逊S3兼容性添加到微软Azure Blob存储。
|
||||
|
||||
## 运行支持微软Azure Blob存储的MinIO网关
|
||||
### 使用Docker
|
||||
```
|
||||
docker run -p 9000:9000 --name azure-s3 \
|
||||
-e "MINIO_ROOT_USER=azureaccountname" \
|
||||
-e "MINIO_ROOT_PASSWORD=azureaccountkey" \
|
||||
minio/minio gateway azure
|
||||
```
|
||||
|
||||
### 使用二进制
|
||||
```
|
||||
export MINIO_ROOT_USER=azureaccountname
|
||||
export MINIO_ROOT_PASSWORD=azureaccountkey
|
||||
minio gateway azure
|
||||
```
|
||||
## 使用MinIO浏览器验证
|
||||
MinIO Gateway配有嵌入式网络对象浏览器。 将您的Web浏览器指向http://127.0.0.1:9000确保您的服务器已成功启动。
|
||||
|
||||

|
||||
## 使用MinIO客户端 `mc`验证
|
||||
`mc` 提供了诸如ls,cat,cp,mirror,diff等UNIX命令的替代方案。它支持文件系统和Amazon S3兼容的云存储服务。
|
||||
|
||||
### 配置 `mc`
|
||||
```
|
||||
mc alias set myazure http://gateway-ip:9000 azureaccountname azureaccountkey
|
||||
```
|
||||
|
||||
### 列出微软Azure上的容器
|
||||
```
|
||||
mc ls myazure
|
||||
[2017-02-22 01:50:43 PST] 0B ferenginar/
|
||||
[2017-02-26 21:43:51 PST] 0B my-container/
|
||||
[2017-02-26 22:10:11 PST] 0B test-container1/
|
||||
```
|
||||
|
||||
## 了解更多
|
||||
- [`mc` 命令行接口](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [`aws` 命令行接口](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [`minio-go` Go SDK](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
@@ -1,9 +0,0 @@
|
||||
## MinIO GCS 网关限制
|
||||
|
||||
网关继承了以下GCS限制:
|
||||
|
||||
- 每次上传最多parts数量是1024。
|
||||
- 暂不支持存储桶策略。
|
||||
- 暂不支持存储桶通知。
|
||||
- _List Multipart Uploads_ 和 _List Object parts_ 会一直返回空List,即客户端需要记住已经上传的parts,并使用它用于 _Complete Multipart Upload_。
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
# MinIO GCS 网关 [](https://slack.min.io)
|
||||
MinIO GCS网关将亚马逊S3兼容性添加到Google云存储。
|
||||
|
||||
## 运行支持GCS的MinIO 网关
|
||||
### 为GCS创建服务帐户密钥,并获取凭据文件
|
||||
1. 访问 [API控制台凭证页面](https://console.developers.google.com/project/_/apis/credentials).
|
||||
2. 选择您的项目或创建一个新项目, 记下你的项目ID。
|
||||
3. 在凭据页面,选择 __Create credentials__ 下拉项,然后选择 __Service account key__。
|
||||
4. 从 __Service account__下拉项, 选择 __New service account__
|
||||
5. 填写 __Service account name__ 和 __Service account ID__
|
||||
6. 对于 __Role__, 点击下拉项,选择 __Storage__ -> __Storage Admin__ _(完全控制GCS资源)_
|
||||
7. 点击 __Create__ 按钮,下载凭据文件到你的桌面,文件名咱们就叫 credentials.json
|
||||
|
||||
注意: 设置 *Application Default Credentials*的替代方案 在 [这里](https://developers.google.com/identity/protocols/application-default-credentials)进行了描述。
|
||||
|
||||
### 使用 Docker
|
||||
```
|
||||
docker run -p 9000:9000 --name gcs-s3 \
|
||||
-v /path/to/credentials.json:/credentials.json \
|
||||
-e "GOOGLE_APPLICATION_CREDENTIALS=/credentials.json" \
|
||||
-e "MINIO_ROOT_USER=minioaccountname" \
|
||||
-e "MINIO_ROOT_PASSWORD=minioaccountkey" \
|
||||
minio/minio gateway gcs yourprojectid
|
||||
```
|
||||
|
||||
### 使用二进制
|
||||
```
|
||||
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json
|
||||
export MINIO_ROOT_USER=minioaccesskey
|
||||
export MINIO_ROOT_PASSWORD=miniosecretkey
|
||||
minio gateway gcs yourprojectid
|
||||
```
|
||||
|
||||
## 使用MinIO Browser验证
|
||||
MinIO Gateway配有嵌入式网络对象浏览器。 将您的Web浏览器指向http://127.0.0.1:9000确保您的服务器已成功启动。
|
||||
|
||||

|
||||
|
||||
## 使用MinIO客户端 `mc`验证
|
||||
`mc` 提供了诸如ls,cat,cp,mirror,diff等UNIX命令的替代方案。它支持文件系统和Amazon S3兼容的云存储服务。
|
||||
|
||||
### 配置 `mc`
|
||||
```
|
||||
mc alias set mygcs http://gateway-ip:9000 minioaccesskey miniosecretkey
|
||||
```
|
||||
|
||||
### 列出GCS上的容器
|
||||
```
|
||||
mc ls mygcs
|
||||
[2017-02-22 01:50:43 PST] 0B ferenginar/
|
||||
[2017-02-26 21:43:51 PST] 0B my-container/
|
||||
[2017-02-26 22:10:11 PST] 0B test-container1/
|
||||
```
|
||||
|
||||
## 了解更多
|
||||
- [`mc` 命令行接口](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [`aws` 命令行接口](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [`minio-go` Go SDK](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
# MinIO NAS网关 [](https://slack.min.io)
|
||||
MinIO网关使用NAS存储支持Amazon S3。你可以在同一个共享NAS卷上运行多个minio实例,作为一个分布式的对象网关。
|
||||
|
||||
## 为NAS存储运行MinIO网关
|
||||
### 使用Docker
|
||||
```
|
||||
docker run -p 9000:9000 --name nas-s3 \
|
||||
-e "MINIO_ROOT_USER=minio" \
|
||||
-e "MINIO_ROOT_PASSWORD=minio123" \
|
||||
minio/minio gateway nas /shared/nasvol
|
||||
```
|
||||
|
||||
### 使用二进制
|
||||
```
|
||||
export MINIO_ROOT_USER=minioaccesskey
|
||||
export MINIO_ROOT_PASSWORD=miniosecretkey
|
||||
minio gateway nas /shared/nasvol
|
||||
```
|
||||
## 使用浏览器进行验证
|
||||
使用你的浏览器访问`http://127.0.0.1:9000`,如果能访问,恭喜你,启动成功了。
|
||||
|
||||

|
||||
|
||||
## 使用`mc`进行验证
|
||||
`mc`为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。
|
||||
|
||||
### 设置`mc`
|
||||
```
|
||||
mc alias set mynas http://gateway-ip:9000 access_key secret_key
|
||||
```
|
||||
|
||||
### 列举nas上的存储桶
|
||||
```
|
||||
mc ls mynas
|
||||
[2017-02-22 01:50:43 PST] 0B ferenginar/
|
||||
[2017-02-26 21:43:51 PST] 0B my-bucket/
|
||||
[2017-02-26 22:10:11 PST] 0B test-bucket1/
|
||||
```
|
||||
|
||||
## 了解更多
|
||||
- [`mc`快速入门](https://docs.min.io/docs/minio-client-quickstart-guide)
|
||||
- [使用 aws-cli](https://docs.min.io/docs/aws-cli-with-minio)
|
||||
- [使用 minio-go SDK](https://docs.min.io/docs/golang-client-quickstart-guide)
|
||||
@@ -1,47 +0,0 @@
|
||||
# 超大存储桶快速入门 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
MinIO的纠删码功能限制了最多只能使用16块磁盘。这就限制了一个租户的数据可以用多少存储空间。不过,为了满足需要大量磁盘或者是超大容量存储空间的需求,我们引入了超大存储桶的支持。
|
||||
|
||||
如果一个MinIO存储桶可以扩展到多个纠删码部署集合,我们就称之为超大存储桶。不需要做任何特殊设置,它就可以帮助你创建PB级的存储系统。为了超大存储桶支持,你就可以在部署MinIO服务时使用超过16块磁盘。MinIO在内部创建了多个纠删码集合,这些集合又进一步组合成一个命名空间。本文将对超大存储桶的部署做一个简单的介绍。想了解更多,请参考[设计文档](https://github.com/minio/minio/blob/master/docs/large-bucket/DESIGN.md)。
|
||||
|
||||
## 开始
|
||||
安装和部署方式和分布式MinIO一样。只不过是在输入参数的语法上,用`...`来做为磁盘参数的简写。分布式设置中的远程磁盘被编码为HTTP(s)URI,它也可以被同样的缩写。
|
||||
|
||||
### 1. 前提条件
|
||||
安装MinIO - [MinIO快速入门](https://docs.min.io/docs/minio-quickstart-guide)。
|
||||
|
||||
### 2. 在多个磁盘上运行MinIO
|
||||
我们将在下面的章节中看到如何做到这一点的例子。
|
||||
|
||||
*注意*
|
||||
|
||||
- 运行分布式MinIO的所有节点都需要具有相同的access key和secret key。为此,我们在执行MinIO服务器命令之前将access key和secret key导出为所有节点上的环境变量。
|
||||
- 下面的驱动器路径仅用于演示目的,你需要将其替换为实际的路径/文件夹。
|
||||
|
||||
#### 多磁盘下的MinIO超大存储桶 (独立模式)
|
||||
你需要有多块磁盘,例如 `/export1, /export2 .... /export24`。 然后在你想要启动MinIO的所有节点上运行以下命令。
|
||||
|
||||
```sh
|
||||
export MINIO_ROOT_USER=<ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<SECRET_KEY>
|
||||
minio server /export{1...24}
|
||||
```
|
||||
|
||||
#### 多磁盘下的MinIO超大存储桶 (分布式模式)
|
||||
你需要有多块在不同服务器上的磁盘,例如`http://host1/export1, http://host2/export2 .... http://host4/export16`。 然后在你想要启动MinIO的所有节点上运行以下命令。
|
||||
|
||||
```sh
|
||||
export MINIO_ROOT_USER=<ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<SECRET_KEY>
|
||||
minio server http://host{1...4}/export{1...16}
|
||||
```
|
||||
|
||||
### 3. 验证设置是否成功
|
||||
要验证是否部署成功,你可以通过浏览器或者[`mc`](https://docs.min.io/docs/minio-client-quickstart-guide)来访问刚刚部署的MinIO服务。你应该可以看到上传的文件在所有MinIO节点上都可以访问。
|
||||
|
||||
## 了解更多
|
||||
- [mc快速入门](https://docs.min.io/docs/minio-client-quickstart-guide)
|
||||
- [使用 aws-cli](https://docs.min.io/docs/aws-cli-with-minio)
|
||||
- [使用 s3cmd](https://docs.min.io/docs/s3cmd-with-minio)
|
||||
- [使用 minio-go SDK](https://docs.min.io/docs/golang-client-quickstart-guide)
|
||||
- [MinIO文档](https://docs.min.io)
|
||||
@@ -1,56 +0,0 @@
|
||||
## 每个租户的MinIO服务器限制
|
||||
|
||||
### 纠删码 (多块 硬盘/服务器)
|
||||
|
||||
|条目|限制|
|
||||
|:---|:---|
|
||||
|每个群集的最大服务器数| 不限|
|
||||
|联盟集群的最大数量 | no-limit|
|
||||
|最小服务器数| 02|
|
||||
|服务器数为1时,每台服务器的最小硬盘数 | 04 |
|
||||
|服务器数为2或3时,每台服务器的最小硬盘数 | 02|
|
||||
|服务器数为4时,每台服务器的最小硬盘数 | 01|
|
||||
|每台服务器的最大硬盘数| 不限|
|
||||
|读仲裁|N / 2|
|
||||
|写仲裁|N / 2+1 |
|
||||
|
||||
|
||||
### 浏览器访问
|
||||
|
||||
|条目|限制|
|
||||
|:---|:---|
|
||||
|Web浏览器上传大小限制| 5GB|
|
||||
|
||||
### S3 API的限制
|
||||
|
||||
|条目|限制|
|
||||
|:---|:---|
|
||||
|最大存储桶数|不限|
|
||||
|每个存储桶的最大对象数|不限|
|
||||
|最大对象大小| 5 TB |
|
||||
|最小对象大小| 0 B |
|
||||
|每次PUT操作的最大对象大小| 5 GB |
|
||||
|每次上传的最大分片数量| 10,000|
|
||||
|分片大小 |5MB到5GB. 最后一个分片可以从0B到5GB|
|
||||
|每次list分片请求可返回的最大分片数量| 10000|
|
||||
|每次list 对象请求可返回的最大对象数量| 10000|
|
||||
|每次list multipart uploads请求可返回的multipart uploads最大数量| 1000|
|
||||
|
||||
### MinIO不支持的Amazon S3 API
|
||||
我们认为下列AWS S3的API有些冗余或者说用处不大,因此我们在minio中没有实现这些接口。如果您有不同意见,欢迎在[github](https://github.com/minio/minio/issues)上提issue。
|
||||
|
||||
#### MinIO不支持的Amazon S3 Bucket API
|
||||
|
||||
- BucketACL (可以用 [存储桶策略](https://docs.min.io/cn/minio-client-complete-guide#policy))
|
||||
- BucketCORS (所有HTTP方法的所有存储桶都默认启用CORS)
|
||||
- BucketWebsite (可以用 [`caddy`](https://github.com/mholt/caddy) or [`nginx`](https://www.nginx.com/resources/wiki/))
|
||||
- BucketAnalytics, BucketMetrics, BucketLogging (可以用 [存储桶通知](https://docs.min.io/cn/minio-client-complete-guide#events) API)
|
||||
- BucketRequestPayment
|
||||
|
||||
#### MinIO不支持的Amazon S3 Object API.
|
||||
|
||||
- ObjectACL (可以用 [存储桶策略](https://docs.min.io/cn/minio-client-complete-guide#policy))
|
||||
- ObjectTorrent
|
||||
|
||||
### MinIO上的对象名称限制
|
||||
在Windows上对象名称不能包含`^*|\/&";`这些特殊字符,如果其他系统文件名不支持这些特殊字符,那么在这些系统上对象名称也不能使用这些特殊字符。请注意,此列表并不详尽,并且取决于文件系统本身的维护者。
|
||||
@@ -1,54 +0,0 @@
|
||||
# MinIO多租户(Multi-tenant)部署指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
## 单机部署
|
||||
|
||||
要在单台机器上托管多个租户,为每个租户运行一个MinIO server,使用不同的HTTPS端口、配置和数据目录。
|
||||
|
||||
#### 示例1:单主机,单磁盘
|
||||
|
||||
以下示例在一块磁盘上托管三个租户。
|
||||
```sh
|
||||
minio --config-dir ~/tenant1 server --address :9001 /data/tenant1
|
||||
minio --config-dir ~/tenant2 server --address :9002 /data/tenant2
|
||||
minio --config-dir ~/tenant3 server --address :9003 /data/tenant3
|
||||
```
|
||||
|
||||

|
||||
|
||||
#### 示例2:单主机,多块磁盘 (erasure code)
|
||||
|
||||
以下示例在多块磁盘上托管三个租户。
|
||||
```sh
|
||||
minio --config-dir ~/tenant1 server --address :9001 /disk1/data/tenant1 /disk2/data/tenant1 /disk3/data/tenant1 /disk4/data/tenant1
|
||||
minio --config-dir ~/tenant2 server --address :9002 /disk1/data/tenant2 /disk2/data/tenant2 /disk3/data/tenant2 /disk4/data/tenant2
|
||||
minio --config-dir ~/tenant3 server --address :9003 /disk1/data/tenant3 /disk2/data/tenant3 /disk3/data/tenant3 /disk4/data/tenant3
|
||||
```
|
||||

|
||||
|
||||
## 分布式部署
|
||||
要在分布式环境中托管多个租户,同时运行多个分布式MinIO实例。
|
||||
|
||||
#### 示例3 : 多主机,多块磁盘 (erasure code)
|
||||
|
||||
以下示例在一个4节点集群中托管三个租户。在4个节点里都执行下列命令:
|
||||
|
||||
```sh
|
||||
export MINIO_ROOT_USER=<TENANT1_ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<TENANT1_SECRET_KEY>
|
||||
minio --config-dir ~/tenant1 server --address :9001 http://192.168.10.11/data/tenant1 http://192.168.10.12/data/tenant1 http://192.168.10.13/data/tenant1 http://192.168.10.14/data/tenant1
|
||||
|
||||
export MINIO_ROOT_USER=<TENANT2_ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<TENANT2_SECRET_KEY>
|
||||
minio --config-dir ~/tenant2 server --address :9002 http://192.168.10.11/data/tenant2 http://192.168.10.12/data/tenant2 http://192.168.10.13/data/tenant2 http://192.168.10.14/data/tenant2
|
||||
|
||||
export MINIO_ROOT_USER=<TENANT3_ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<TENANT3_SECRET_KEY>
|
||||
minio --config-dir ~/tenant3 server --address :9003 http://192.168.10.11/data/tenant3 http://192.168.10.12/data/tenant3 http://192.168.10.13/data/tenant3 http://192.168.10.14/data/tenant3
|
||||
```
|
||||
|
||||

|
||||
|
||||
## 云端可伸缩部署
|
||||
对于大型多租户MinIO部署,我们建议使用一个流行的容器编排平台,比如Kubernetes、DC/OS,或者是Docker Swarm.参考 [这个文档](https://docs.min.io/cn/minio-deployment-quickstart-guide) ,学习如何在编排平台中使用MinIO。
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
# MinIO部署快速入门 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
MinIO是一个[云原生](https://baike.baidu.com/item/Cloud%20Native/19865304?fr=aladdin)的应用程序,旨在在多租户环境中以可持续的方式进行扩展。编排(orchestration)平台为MinIO的扩展提供了非常好的支撑。以下是各种编排平台的MinIO部署文档:
|
||||
|
||||
| Orchestration平台|
|
||||
|:---|
|
||||
| [`Docker Swarm`](https://docs.min.io/cn/deploy-minio-on-docker-swarm) |
|
||||
| [`Docker Compose`](https://docs.min.io/cn/deploy-minio-on-docker-compose) |
|
||||
| [`Kubernetes`](https://docs.min.io/cn/deploy-minio-on-kubernetes) |
|
||||
| [`DC/OS`](https://docs.min.io/cn/deploy-minio-on-dc-os) |
|
||||
|
||||
## 为什么说MinIO是云原生的(cloud-native)?
|
||||
云原生这个词代表的是一些思想的集合,比如微服务部署,可伸缩,而不是说把一个单体应用改造成容器部署。一个云原生的应用在设计时就考虑了移植性和可伸缩性,而且可以通过简单的复制即可实现水平扩展。现在兴起的编排平台,像Swarm、Kubernetes以及DC/OS,让大规模集群的复制和管理变得前所未有的简单,哪里不会点哪里。
|
||||
|
||||
容器提供了隔离的应用执行环境,编排平台通过容器管理以及复制功能提供了无缝的扩展。MinIO继承了这些,针对每个租户提供了存储环境的隔离。
|
||||
|
||||
MinIO是建立在云原生的基础上,有纠删码、分布式和共享存储这些特性。MinIO专注于并且只专注于存储,而且做的还不错。它可以通过编排平台复制一个MinIO实例就实现了水平扩展。
|
||||
|
||||
> 在一个云原生环境中,伸缩性不是应用的一个功能而是编排平台的功能。
|
||||
|
||||
现在的应用、数据库,key-store这些,很多都已经部署在容器中,并且通过编排平台进行管理。MinIO提供了一个健壮的、可伸缩、AWS S3兼容的对象存储,这是MinIO的立身之本,凭此在云原生应用中占据一席之地。
|
||||
|
||||

|
||||
@@ -1,44 +0,0 @@
|
||||
# 在 DC/OS上部署minio [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
要在DC/OS上部署MinIO,可以使用我们的 [official universe package](https://github.com/mesosphere/universe/tree/version-3.x/repo/packages/M/minio/6).
|
||||
|
||||
## 1. 前提条件
|
||||
|
||||
- DC/OS 1.9或更新版本
|
||||
- [Marathon-LB](https://dcos.io/docs/1.9/usage/service-discovery/marathon-lb/usage/) 必须安装并启动。
|
||||
- 识别Marathon-LB或者一个指向Marathon-LB的public agent(s)的可用主机名的 [IP of the public agent](https://dcos.io/docs/1.9/administration/locate-public-agent/) 。
|
||||
|
||||
|
||||
## 2. 设置MinIO
|
||||
|
||||
你可以使用DC/OS GUI或者CLI安装MinIO Universe package。
|
||||
|
||||
### 使用DC/OS GUI安装MinIO
|
||||
- 访问DC/OS admin页面,然后点击左边栏的Universe,然后点击Packages页签,搜索MinIO,点击左边栏的```Install```按钮。
|
||||
|
||||
- 点击按钮`Install Package`进行一键安装。你可以通过`host:9000`访问你的MinIO server,其中`host`是Marathon-LB所在服务器的IP或者主机名。 `minio` 和 `minio123` 分别是默认的access key和secret key。
|
||||
|
||||
- 更多关于自定义安装的内容,请看[这里](https://github.com/dcos/zh_CN/examples/blob/master/minio/1.9/README.md#minio-installation-using-gui).
|
||||
|
||||
### 使用DC/OS CLI安装MinIO
|
||||
|
||||
使用命令行安装, 输入
|
||||
|
||||
```bash
|
||||
$ dcos package install minio
|
||||
```
|
||||
|
||||
## 3. 卸载MinIO
|
||||
|
||||
你确定要这么做吗,如果你真要这么做,我们也不会像国内的软件那么无赖。如需卸载,请输入
|
||||
|
||||
```bash
|
||||
$ dcos package uninstall minio
|
||||
```
|
||||
|
||||
### 了解更多
|
||||
|
||||
- [MinIO Erasure Code QuickStart Guide](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
|
||||
- [DC/OS Project](https://docs.mesosphere.com/)
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
# 使用Docker Compose部署MinIO [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
Docker Compose允许定义和运行单主机,多容器Docker应用程序。
|
||||
|
||||
使用Compose,您可以使用Compose文件来配置MinIO服务。 然后,使用单个命令,您可以通过你的配置创建并启动所有分布式MinIO实例。 分布式MinIO实例将部署在同一主机上的多个容器中。 这是建立基于分布式MinIO的开发,测试和预发布环境的好方法。
|
||||
|
||||
## 1. 前提条件
|
||||
|
||||
* 熟悉 [Docker Compose](https://docs.docker.com/compose/overview/).
|
||||
* Docker已经在本机安装,从[这里](https://www.docker.com/community-edition#/download)下载相关的安装器。
|
||||
|
||||
## 2. 在Docker Compose上运行分布式MinIO
|
||||
|
||||
在Docker Compose上部署分布式MinIO,请下载[docker-compose.yaml](https://github.com/minio/minio/blob/master/docs/orchestration/docker-compose/docker-compose.yaml?raw=true)到你的当前工作目录。Docker Compose会pull MinIO Docker Image,所以你不需要手动去下载MinIO binary。然后运行下面的命令
|
||||
|
||||
### GNU/Linux and macOS
|
||||
|
||||
```sh
|
||||
docker-compose pull
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
```sh
|
||||
docker-compose.exe pull
|
||||
docker-compose.exe up
|
||||
```
|
||||
|
||||
现在每个实例都可以访问,端口从9001到9004,请在浏览器中访问http://127.0.0.1:9001/
|
||||
|
||||
### 注意事项
|
||||
|
||||
* 默认情况下Docker Compose file使用的是最新版的MinIO server的Docker镜像,你可以修改image tag来拉取指定版本的[MinIO Docker image](https://hub.docker.com/r/minio/minio/).
|
||||
|
||||
* 默认情况下会创建4个minio实例,你可以添加更多的MinIO服务(最多总共16个)到你的MinIO Compose deployment。添加一个服务
|
||||
* 复制服务定义并适当地更改新服务的名称。
|
||||
* 更新每个服务中的命令部分。
|
||||
* 更新要为新服务公开的端口号。 另外,请确保分配给新服务的端口尚未使用。
|
||||
|
||||
关于分布式MinIO的更多资料,请访问[这里](https://docs.min.io/cn/distributed-minio-quickstart-guide).
|
||||
|
||||
* Docker compose file中的MinIO服务使用的端口是9001到9004,这允许多个服务在主机上运行。
|
||||
|
||||
### 了解更多
|
||||
- [Docker Compose概述](https://docs.docker.com/compose/overview/)
|
||||
- [MinIO Docker快速入门](https://docs.min.io/cn/minio-docker-quickstart-guide)
|
||||
- [使用Docker Swarm部署MinIO](https://docs.min.io/cn/deploy-minio-on-docker-swarm)
|
||||
- [MinIO纠删码快速入门](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
@@ -1,86 +0,0 @@
|
||||
# 使用Docker Swarm部署MinIO [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
Docker Engine在Swarm模式下提供集群管理和编排功能。 MinIO服务器可以在Swarm的分布式模式下轻松部署,创建一个多租户,高可用性和可扩展的对象存储。
|
||||
|
||||
从[Docker Engine v1.13.0](https://blog.docker.com/2017/01/whats-new-in-docker-1-13/) (Docker Compose v3.0)开始, Docker Swarm和Compose 二者[cross-compatible](https://docs.docker.com/compose/compose-file/#version-3)。这允许将Compose file用作在Swarm上部署服务的模板。 我们使用Docker Compose file创建分布式MinIO设置。
|
||||
|
||||
## 1. 前提条件
|
||||
|
||||
* 熟悉[Swarm mode key concepts](https://docs.docker.com/engine/swarm/key-concepts/).
|
||||
* Docker engine v1.13.0运行在[networked host machines]集群上(https://docs.docker.com/engine/swarm/swarm-tutorial/#/three-networked-host-machines).
|
||||
|
||||
## 2. 创建Swarm
|
||||
在管理节点上创建一个swarm,请运行下面的命令
|
||||
|
||||
```shell
|
||||
docker swarm init --advertise-addr <MANAGER-IP>
|
||||
```
|
||||
一旦swarm初使化了,你可以看到下面的响应信息
|
||||
|
||||
```shell
|
||||
docker swarm join \
|
||||
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
|
||||
192.168.99.100:2377
|
||||
```
|
||||
|
||||
你现在可以运行上述命令[添加worker节点](https://docs.docker.com/engine/swarm/swarm-tutorial/add-nodes/)到swarm。更多关于创建swarm的细节步骤,请访问[Docker documentation site](https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/).
|
||||
|
||||
## 3. 为MinIO创建Docker secret
|
||||
|
||||
```shell
|
||||
echo "AKIAIOSFODNN7EXAMPLE" | docker secret create access_key -
|
||||
echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" | docker secret create secret_key -
|
||||
```
|
||||
|
||||
## 4. 部署分布式minio服务
|
||||
|
||||
在你的Swarm master上下载[Docker Compose file](https://github.com/minio/minio/blob/master/docs/orchestration/docker-swarm/docker-compose-secrets.yaml?raw=true) ,然后运行下面的命令
|
||||
|
||||
```shell
|
||||
docker stack deploy --compose-file=docker-compose-secrets.yaml minio_stack
|
||||
```
|
||||
|
||||
这将把Compose file里描述的服务部署为Docker stack`minio_stack`。 更多 `docker stack` [命令参考](https://docs.docker.com/engine/reference/commandline/stack/)。
|
||||
|
||||
在stack成功部署之后,你可以通过[MinIO Client](https://docs.min.io/cn/minio-client-complete-guide) `mc` 或者浏览器访问http://[Node_Public_IP_Address]:[Expose_Port_on_Host]来访问你的MinIO server。
|
||||
|
||||
## 4. 删除分布式MinIO services
|
||||
|
||||
删除分布式MinIO services以及相关的网络,请运行下面的命令
|
||||
|
||||
```shell
|
||||
docker stack rm minio_stack
|
||||
```
|
||||
Swarm不会自动删除为MinIO服务创建的host volumes,如果下次新的MinIO服务不熟到swarm上,可能会导致损坏。因此,我们建议手动删除所有MinIO使用的volumes。为此,到每一个swarm的节点上,列出所有的volumes
|
||||
|
||||
```shell
|
||||
docker volume ls
|
||||
```
|
||||
然后删除`minio_stack` volumes
|
||||
|
||||
```shell
|
||||
docker volume rm volume_name
|
||||
```
|
||||
|
||||
### 注意事项
|
||||
|
||||
* 默认情况下Docker Compose file使用的是最新版的MinIO server的Docker镜像,你可以修改image tag来拉取指定版本的[MinIO Docker image](https://hub.docker.com/r/minio/minio/).
|
||||
|
||||
* 默认情况下会创建4个minio实例,你可以添加更多的MinIO服务(最多总共16个)到你的MinIO Comose deployment。添加一个服务
|
||||
* 复制服务定义并适当地更改新服务的名称。
|
||||
* 更新每个服务中的命令部分。
|
||||
* 更新要为新服务公开的端口号。 另外,请确保分配给新服务的端口尚未使用。
|
||||
|
||||
关于分布式MinIO的更多资料,请访问[这里](https://docs.min.io/cn/distributed-minio-quickstart-guide).
|
||||
|
||||
* 默认情况下,MinIO服务使用的是`local` volume driver. 更多配置选项,请访问[Docker documentation](https://docs.docker.com/compose/compose-file/#/volume-configuration-reference) 。
|
||||
|
||||
* Docker compose file中的MinIO服务使用的端口是9001到9004,这允许多个服务在主机上运行。更多配置选项,请访问[Docker documentation](https://docs.docker.com/compose/compose-file/#/ports).
|
||||
|
||||
* Docker Swarm默认使用的是ingress做负载均衡,你可以跟据需要配置[external load balancer based](https://docs.docker.com/engine/swarm/ingress/#/configure-an-external-load-balancer)。
|
||||
|
||||
### 了解更多
|
||||
- [Docker Swarm mode概述](https://docs.docker.com/engine/swarm/)
|
||||
- [MinIO Docker快速入门](https://docs.min.io/cn/minio-docker-quickstart-guide)
|
||||
- [使用Docker Compose部署MinIO](https://docs.min.io/cn/deploy-minio-on-docker-compose)
|
||||
- [MinIO纠删码快速入门](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
@@ -1,540 +0,0 @@
|
||||
# 使用Kubernetes做MinIO的云原生部署 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
## 目录
|
||||
- [前提条件](#前提条件)
|
||||
- [MinIO独立模式部署](#MinIO-Standalone模式部署)
|
||||
- [MinIO独立模式快速入门](#MinIO独立模式快速入门)
|
||||
- [创建持久卷声明](#MinIO独立模式快速入门)
|
||||
- [创建MinIO的部署](#创建MinIO的部署)
|
||||
- [创建Miniio服务](#创建Miniio服务)
|
||||
- [更新已有的MinIO部署](#更新已有的MinIO部署)
|
||||
- [独立模式资源清理](#独立模式资源清理)
|
||||
|
||||
- [MinIO分布式服务部署](#MinIO分布式服务部署)
|
||||
- [分布式快速入门](#分布式快速入门)
|
||||
- [创建MinIO Headless服务](#创建MinIO-Headless服务)
|
||||
- [创建MinIO Statefulset](#创建MinIO-Statefulset)
|
||||
- [创建负载均衡服务](#创建负载均衡服务)
|
||||
- [更新已存在的MinIO StatefulSet](#更新已存在的MinIO-StatefulSet)
|
||||
- [分布式模式资源清理](#分布式模式资源清理)
|
||||
|
||||
- [MinIO GCS 网关部署](#MinIO-GCS网关部署)
|
||||
- [GCS 网关快速入门](#GCS-网关快速入门)
|
||||
- [创建GCS凭据](#创建GCS凭据)
|
||||
- [创建MinIO GCS Gateway部署](#创建MinIO-GCS-Gateway部署)
|
||||
- [创建MinIO LoadBalancer服务](#创建MinIO-LoadBalancer服务)
|
||||
- [更新现有的MinIO GCS部署](#更新现有的MinIO-GCS部署)
|
||||
- [GCS网关资源清理](#GCS网关资源清理)
|
||||
|
||||
## 前提条件
|
||||
|
||||
运行该示例,你需要安装并运行Kubernetes版本>=1.4的集群,而且已经安装 [`kubectl`](https://kubernetes.io/docs/tasks/kubectl/install/) 命令行工具。请访问
|
||||
[getting started guides](https://kubernetes.io/docs/getting-started-guides/)获取响应平台的安装指导。
|
||||
## MinIO Standalone模式部署
|
||||
|
||||
以下部分描述了如何在Kubernetes上部署一个独立的 [MinIO](https://min.io/) 服务。部署使用的是Docker Hub上的 [官方MinIO Docker image](https://hub.docker.com/r/minio/minio/~/dockerfile/) 。
|
||||
|
||||
此部分使用了以下Kubernetes的核心组件:
|
||||
|
||||
- [_Pods_](https://kubernetes.io/docs/user-guide/pods/)
|
||||
- [_Services_](https://kubernetes.io/docs/user-guide/services/)
|
||||
- [_Deployments_](https://kubernetes.io/docs/user-guide/deployments/)
|
||||
- [_Persistent Volume Claims_](https://kubernetes.io/docs/user-guide/persistent-volumes/#persistentvolumeclaims)
|
||||
|
||||
### MinIO独立模式快速入门
|
||||
|
||||
运行下面的命令快速启动
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-standalone-pvc.yaml?raw=true
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-standalone-deployment.yaml?raw=true
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-standalone-service.yaml?raw=true
|
||||
```
|
||||
|
||||
### 创建持久卷声明
|
||||
|
||||
MinIO需要持久卷来存储对象。如果没有持久卷,MinIO实例中的数据将会存到容器的文件系统中,而且在容器重启时会被清除的干干净净。
|
||||
创建一个持久卷声明(PVC),为MinIO实例请求存储。Kubernetes寻找与群集中的PVC请求匹配的PV,并自动将其绑定到PVC。
|
||||
|
||||
这是一个PVC的描述
|
||||
|
||||
```sh
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
# 此名称唯一标识PVC。 将在以下部署中使用。
|
||||
name: minio-pv-claim
|
||||
annotations:
|
||||
volume.alpha.kubernetes.io/storage-class: anything
|
||||
labels:
|
||||
app: minio-storage-claim
|
||||
spec:
|
||||
# 关于 access modes的更多细节,访问这里: http://kubernetes.io/docs/user-guide/persistent-volumes/#access-modes
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
# This is the request for storage. Should be available in the cluster.
|
||||
requests:
|
||||
storage: 10Gi
|
||||
```
|
||||
|
||||
创建一个持久卷声明
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-standalone-pvc.yaml?raw=true
|
||||
persistentvolumeclaim "minio-pv-claim" created
|
||||
```
|
||||
|
||||
### 创建MinIO的部署
|
||||
|
||||
部署封装了副本集和pod - 因此,如果pod掉线,复制控制器会确保另一个pod自动出现。 这样,您就不必担心pod失败,并且可以提供稳定的MinIO服务。
|
||||
|
||||
这是一个部署的描述
|
||||
|
||||
```sh
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
# This name uniquely identifies the Deployment
|
||||
name: minio-deployment
|
||||
spec:
|
||||
strategy:
|
||||
type: Recreate
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
# Label is used as selector in the service.
|
||||
app: minio
|
||||
spec:
|
||||
# Refer to the PVC created earlier
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
# Name of the PVC created earlier
|
||||
claimName: minio-pv-claim
|
||||
containers:
|
||||
- name: minio
|
||||
# Pulls the default MinIO image from Docker Hub
|
||||
image: minio/minio:RELEASE.2017-05-05T01-14-51Z
|
||||
args:
|
||||
- server
|
||||
- /data
|
||||
env:
|
||||
# MinIO access key and secret key
|
||||
- name: MINIO_ROOT_USER
|
||||
value: "minio"
|
||||
- name: MINIO_ROOT_PASSWORD
|
||||
value: "minio123"
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
# Mount the volume into the pod
|
||||
volumeMounts:
|
||||
- name: data # must match the volume name, above
|
||||
mountPath: "/data"
|
||||
```
|
||||
|
||||
创建一个部署
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-standalone-deployment.yaml?raw=true
|
||||
deployment "minio-deployment" created
|
||||
```
|
||||
|
||||
### 创建Miniio服务
|
||||
|
||||
现在您正在运行MinIO部署,您可能希望在内部(集群内)访问它,或者将其作为服务暴露在外部(集群外部,也可能是公共Internet)IP地址,具体取决于用例。 您可以使用服务来实现此目的。 有三种主要的服务类型 - 默认类型是ClusterIP,它将集群内部的连接暴露给服务。 NodePort和LoadBalancer是向外部流量提供服务的两种类型。
|
||||
|
||||
在此示例中,我们通过创建LoadBalancer服务来公开MinIO部署。
|
||||
这是服务描述。
|
||||
|
||||
```sh
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: minio-service
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
- port: 9000
|
||||
targetPort: 9000
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: minio
|
||||
```
|
||||
创建MinIO服务
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-standalone-service.yaml?raw=true
|
||||
service "minio-service" created
|
||||
```
|
||||
|
||||
`LoadBalancer` 服务需要几分钟才能启动。 要检查服务是否已成功创建,请运行命令
|
||||
|
||||
```sh
|
||||
kubectl get svc minio-service
|
||||
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
minio-service 10.55.248.23 104.199.249.165 9000:31852/TCP 1m
|
||||
```
|
||||
|
||||
### 更新已有的MinIO部署
|
||||
|
||||
您可以更新现有的MinIO部署以使用较新的MinIO版本。 为此,请使用`kubectl set image`命令:
|
||||
|
||||
```sh
|
||||
kubectl set image deployment/minio-deployment minio=<replace-with-new-minio-image>
|
||||
```
|
||||
|
||||
Kubernetes将重新启动部署以更新镜像。 成功更新后,您将收到以下消息:
|
||||
|
||||
```
|
||||
deployment "minio-deployment" image updated
|
||||
```
|
||||
|
||||
### 独立模式资源清理
|
||||
|
||||
你可以清理集群占用的资源,请运行:
|
||||
|
||||
```sh
|
||||
kubectl delete deployment minio-deployment \
|
||||
&& kubectl delete pvc minio-pv-claim \
|
||||
&& kubectl delete svc minio-service
|
||||
```
|
||||
|
||||
## MinIO分布式服务部署
|
||||
|
||||
以下文档介绍了在Kubernetes上部署[分布式MinIO](https://docs.min.io/cn/distributed-minio-quickstart-guide)服务器的过程。 本示例使用Docker Hub的[官方MinIO Docker镜像](https://hub.docker.com/r/minio/minio/~/dockerfile/)。
|
||||
|
||||
此示例使用以下Kubernetes的核心组件:
|
||||
|
||||
- [_Pods_](https://kubernetes.io/docs/concepts/workloads/pods/pod/)
|
||||
- [_Services_](https://kubernetes.io/docs/concepts/services-networking/service/)
|
||||
- [_Statefulsets_](https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/)
|
||||
|
||||
### 分布式快速入门
|
||||
|
||||
运行下面的命令快速启动
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-distributed-headless-service.yaml?raw=true
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-distributed-statefulset.yaml?raw=true
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-distributed-service.yaml?raw=true
|
||||
```
|
||||
|
||||
###创建MinIO Headless服务
|
||||
|
||||
Headless服务控制在其中创建StatefulSets的域。此服务管理的域采用以下格式:`$(service name).$(namespace).svc.cluster.local`(其中“cluster.local”是集群域),此域中的pod采用形式: `$(pod-name-{i}).$(service name).$(namespace).svc.cluster.local`。这里需要DNS来解析在Statefulset中创建的每个pods的URL。
|
||||
|
||||
这是Headless service的描述。
|
||||
|
||||
```sh
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: minio
|
||||
labels:
|
||||
app: minio
|
||||
spec:
|
||||
clusterIP: None
|
||||
ports:
|
||||
- port: 9000
|
||||
name: minio
|
||||
selector:
|
||||
app: minio
|
||||
```
|
||||
|
||||
创建Headless服务
|
||||
|
||||
```sh
|
||||
$ kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-distributed-headless-service.yaml?raw=true
|
||||
service "minio" created
|
||||
```
|
||||
|
||||
###创建MinIO Statefulset
|
||||
|
||||
StatefulSet为每个pod提供确定性名称和唯一身份,从而轻松部署有状态的分布式应用程序。 要启动分布式MinIO,您需要将驱动器位置作为参数传递到minio服务的命令。 然后,您需要在所有参与的pod上运行相同的命令。 StatefulSets提供了一个完美的方式来处理这个要求。
|
||||
|
||||
这是Statefulset的描述。
|
||||
|
||||
```sh
|
||||
apiVersion: apps/v1beta1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: minio
|
||||
spec:
|
||||
serviceName: minio
|
||||
replicas: 4
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
pod.alpha.kubernetes.io/initialized: "true"
|
||||
labels:
|
||||
app: minio
|
||||
spec:
|
||||
containers:
|
||||
- name: minio
|
||||
env:
|
||||
- name: MINIO_ROOT_USER
|
||||
value: "minio"
|
||||
- name: MINIO_ROOT_PASSWORD
|
||||
value: "minio123"
|
||||
image: minio/minio:RELEASE.2017-05-05T01-14-51Z
|
||||
args:
|
||||
- server
|
||||
- http://minio-0.minio.default.svc.cluster.local/data
|
||||
- http://minio-1.minio.default.svc.cluster.local/data
|
||||
- http://minio-2.minio.default.svc.cluster.local/data
|
||||
- http://minio-3.minio.default.svc.cluster.local/data
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
# These volume mounts are persistent. Each pod in the PetSet
|
||||
# gets a volume mounted based on this field.
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /data
|
||||
# These are converted to volume claims by the controller
|
||||
# and mounted at the paths mentioned above.
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: data
|
||||
annotations:
|
||||
volume.alpha.kubernetes.io/storage-class: anything
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
```
|
||||
|
||||
创建Statefulset
|
||||
|
||||
```sh
|
||||
$ kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-distributed-statefulset.yaml?raw=true
|
||||
statefulset "minio" created
|
||||
```
|
||||
|
||||
### 创建负载均衡服务
|
||||
|
||||
现在您已经运行了MinIO statefulset,您可能希望在内部(集群内)访问它,或将其作为服务暴露在外部(集群外,也可能是公用Internet)的IP地址,具体取决于用例。 您可以使用服务来实现此目的。 有三种主要的服务类型 - 默认类型是ClusterIP,它将集群内部的连接暴露给服务。 NodePort和LoadBalancer是向外部流量提供服务的两种类型。
|
||||
|
||||
在此示例中,我们通过创建LoadBalancer服务来公开MinIO部署。
|
||||
这是服务描述。
|
||||
|
||||
```sh
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: minio-service
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
- port: 9000
|
||||
targetPort: 9000
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: minio
|
||||
```
|
||||
创建MinIO service
|
||||
|
||||
```sh
|
||||
$ kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-distributed-service.yaml?raw=true
|
||||
service "minio-service" created
|
||||
```
|
||||
|
||||
`LoadBalancer` 服务需要几分钟才能启动。 要检查服务是否已成功创建,请运行命令
|
||||
|
||||
```sh
|
||||
$ kubectl get svc minio-service
|
||||
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
minio-service 10.55.248.23 104.199.249.165 9000:31852/TCP 1m
|
||||
```
|
||||
|
||||
###更新已经存在的MinIO StatefulSet
|
||||
您可以更新现有的MinIO StatefulSet以使用较新的MinIO版本。 为此,请使用`kubectl patch statefulset`命令:
|
||||
|
||||
```sh
|
||||
kubectl patch statefulset minio --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"<replace-with-new-minio-image>"}]'
|
||||
```
|
||||
|
||||
成功更新后,您应该会看到下面的输出
|
||||
|
||||
```
|
||||
statefulset "minio" patched
|
||||
```
|
||||
|
||||
然后如下所示,逐一删除StatefulSet中的所有pod。 Kubernetes将使用新的镜像为您重新启动那些pod。
|
||||
|
||||
```sh
|
||||
kubectl delete minio-0
|
||||
```
|
||||
|
||||
### 分布式模式资源清理
|
||||
|
||||
你可以使用以下命令清理集群
|
||||
```sh
|
||||
kubectl delete statefulset minio \
|
||||
&& kubectl delete svc minio \
|
||||
&& kubectl delete svc minio-service
|
||||
```
|
||||
|
||||
## MinIO GCS网关部署
|
||||
|
||||
以下部分介绍在Kubernetes上部署[MinIO](https://min.io/)GCS Gateway的过程。 部署使用Docker Hub的[官方MinIO Docker映像](https://hub.docker.com/r/minio/minio/~/dockerfile/)。
|
||||
|
||||
此示例使用以下Kubernetes的核心组件:
|
||||
|
||||
- [_Secrets_](https://kubernetes.io/docs/concepts/configuration/secret/)
|
||||
- [_Services_](https://kubernetes.io/docs/user-guide/services/)
|
||||
- [_Deployments_](https://kubernetes.io/docs/user-guide/deployments/)
|
||||
|
||||
### GCS 网关快速入门
|
||||
|
||||
按照 [这里](https://github.com/minio/minio/blob/master/docs/gateway/gcs.md#create-service-account-key-for-gcs-and-get-the-credentials-file)描述的步骤创建Google云服务认证凭据文件。
|
||||
|
||||
使用上面生成的文件来创建一个Kubernetes`secret`。
|
||||
|
||||
```sh
|
||||
kubectl create secret generic gcs-credentials --from-file=/path/to/gcloud/credentials/application_default_credentials.json
|
||||
```
|
||||
|
||||
下载 `minio-gcs-gateway-deployment.yaml`
|
||||
|
||||
```sh
|
||||
wget https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-gcs-gateway-deployment.yaml?raw=true
|
||||
```
|
||||
|
||||
使用你的GCS project ID更新 `gcp_project_id`部分的内容,然后运行
|
||||
|
||||
```sh
|
||||
kubectl create -f minio-gcs-gateway-deployment.yaml
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-gcs-gateway-service.yaml?raw=true
|
||||
```
|
||||
|
||||
### 创建GCS凭据
|
||||
|
||||
`凭据`旨在保存敏感信息,例如密码,OAuth令牌和ssh密钥。 将这些信息放在一个凭据中比将其逐字地放在pod定义或docker镜像中更安全,更灵活。
|
||||
|
||||
按照 [这里](https://github.com/minio/minio/blob/master/docs/gateway/gcs.md#create-service-account-key-for-gcs-and-get-the-credentials-file)描述的步骤创建Google云服务认证凭据文件。
|
||||
|
||||
使用上面生成的文件来创建一个Kubernetes`secret`。
|
||||
|
||||
```sh
|
||||
kubectl create secret generic gcs-credentials --from-file=/path/to/gcloud/credentials/application_default_credentials.json
|
||||
```
|
||||
|
||||
### 创建MinIO GCS Gateway部署
|
||||
|
||||
部署封装了副本集和pod - 因此,如果pod掉线,复制控制器会确保另一个pod自动出现。 这样,您就不必担心pod失败,并且可以提供稳定的MinIO服务。
|
||||
|
||||
MinIO Gateway使用GCS作为其存储后端,需要使用GCP“projectid”来识别您的凭据。 使用GCS项目ID更新“gcp_project_id”部分。 这是部署描述。
|
||||
|
||||
```sh
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
# This name uniquely identifies the Deployment
|
||||
name: minio-deployment
|
||||
spec:
|
||||
strategy:
|
||||
type: Recreate
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
# Label is used as selector in the service.
|
||||
app: minio
|
||||
spec:
|
||||
# Refer to the secret created earlier
|
||||
volumes:
|
||||
- name: gcs-credentials
|
||||
secret:
|
||||
# Name of the Secret created earlier
|
||||
secretName: gcs-credentials
|
||||
containers:
|
||||
- name: minio
|
||||
# Pulls the default MinIO image from Docker Hub
|
||||
image: minio/minio:RELEASE.2017-08-05T00-00-53Z
|
||||
args:
|
||||
- gateway
|
||||
- gcs
|
||||
- gcp_project_id
|
||||
env:
|
||||
# MinIO access key and secret key
|
||||
- name: MINIO_ROOT_USER
|
||||
value: "minio"
|
||||
- name: MINIO_ROOT_PASSWORD
|
||||
value: "minio123"
|
||||
# Google Cloud Service uses this variable
|
||||
- name: GOOGLE_APPLICATION_CREDENTIALS
|
||||
value: "/etc/credentials/application_default_credentials.json"
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
# Mount the volume into the pod
|
||||
volumeMounts:
|
||||
- name: gcs-credentials
|
||||
mountPath: "/etc/credentials"
|
||||
readOnly: true
|
||||
```
|
||||
|
||||
创建部署
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-gcs-gateway-deployment.yaml?raw=true
|
||||
deployment "minio-deployment" created
|
||||
```
|
||||
|
||||
### 创建MinIO LoadBalancer服务
|
||||
|
||||
现在您正在运行MinIO,您可能希望在内部(集群内)访问它,或者将其作为服务暴露在外部(集群外部,也可能是公共Internet)IP地址,具体取决于用例。 您可以使用服务来实现此目的。 有三种主要的服务类型 - 默认类型是ClusterIP,它将集群内部的连接暴露给服务。 NodePort和LoadBalancer是向外部流量提供服务的两种类型。
|
||||
|
||||
在此示例中,我们通过创建LoadBalancer服务来暴露MinIO。 这是服务描述。
|
||||
|
||||
```sh
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: minio-service
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
- port: 9000
|
||||
targetPort: 9000
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: minio
|
||||
```
|
||||
创建MinIO服务
|
||||
|
||||
```sh
|
||||
kubectl create -f https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes-yaml/minio-gcs-gateway-service.yaml?raw=true
|
||||
service "minio-service" created
|
||||
```
|
||||
|
||||
`LoadBalancer`服务需要几分钟才能启动。 要检查服务是否已成功创建,请运行命令
|
||||
|
||||
```sh
|
||||
kubectl get svc minio-service
|
||||
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
minio-service 10.55.248.23 104.199.249.165 9000:31852/TCP 1m
|
||||
```
|
||||
|
||||
### 更新现有的MinIO GCS部署
|
||||
|
||||
您可以更新现有的MinIO部署以使用较新的MinIO版本。 为此,请使用`kubectl set image`命令:
|
||||
|
||||
```sh
|
||||
kubectl set image deployment/minio-deployment minio=<replace-with-new-minio-image>
|
||||
```
|
||||
|
||||
Kubernetes将重新启动部署以更新镜像。 成功更新后,您将收到以下消息:
|
||||
```
|
||||
deployment "minio-deployment" image updated
|
||||
```
|
||||
|
||||
### GCS网关资源清理
|
||||
|
||||
你可以使用下面的命令清理集群
|
||||
|
||||
```sh
|
||||
kubectl delete deployment minio-deployment \
|
||||
&& kubectl delete secret gcs-credentials
|
||||
```
|
||||
@@ -1,154 +0,0 @@
|
||||
# 使用Kubernetes部署MinIO [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
Kubernetes的部署和状态集提供了在独立,分布式或共享模式下部署MinIO服务器的完美平台。 在Kubernetes上部署MinIO有多种选择,您可以选择最适合您的。
|
||||
|
||||
- MinIO [Helm](https://helm.sh) Chart通过一个简单的命令即可提供自定义而且简单的MinIO部署。更多关于MinIO Helm部署的资料,请访问[这里](#prerequisites).
|
||||
|
||||
- 你也可以浏览Kubernetes [MinIO示例](https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes/README.md) ,通过`.yaml`文件来部署MinIO。
|
||||
|
||||
<a name="prerequisites"></a>
|
||||
## 1. 前提条件
|
||||
|
||||
* 默认standalone模式下,需要开启Beta API的Kubernetes 1.4+。
|
||||
* [distributed 模式](#distributed-minio),需要开启Beta API的Kubernetes 1.5+。
|
||||
* 底层支持PV provisioner。
|
||||
* 你的K8s集群里需要有Helm package manager [installed](https://github.com/kubernetes/helm#install)。
|
||||
|
||||
## 2. 使用Helm Chart部署MinIO
|
||||
|
||||
安装 MinIO chart
|
||||
|
||||
```bash
|
||||
$ helm install stable/minio
|
||||
```
|
||||
以上命令以默认配置在Kubernetes群集上部署MinIO。 以下部分列出了MinIO图表的所有可配置参数及其默认值。
|
||||
|
||||
### 配置
|
||||
|
||||
| 参数 | 描述 | 默认值 |
|
||||
|----------------------------|-------------------------------------|---------------------------------------------------------|
|
||||
| `image` | MinIO镜像名称 | `minio/minio` |
|
||||
| `imageTag` | MinIO镜像tag. 可选值在 [这里](https://hub.docker.com/r/minio/minio/tags/).| `RELEASE.2017-08-05T00-00-53Z`|
|
||||
| `imagePullPolicy` | Image pull policy | `Always` |
|
||||
| `mode` | MinIO server模式 (`standalone`, `shared` 或者 `distributed`)| `standalone` |
|
||||
| `numberOfNodes` | 节点数 (仅对分布式模式生效). 可选值 4 <= x <= 16 | `4` |
|
||||
| `accessKey` | 默认access key | `AKIAIOSFODNN7EXAMPLE` |
|
||||
| `secretKey` | 默认secret key | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` |
|
||||
| `configPath` | 默认配置文件路径 | `~/.minio` |
|
||||
| `mountPath` | 默认挂载路径| `/export` |
|
||||
| `serviceType` | Kubernetes service type | `LoadBalancer` |
|
||||
| `servicePort` | Kubernetes端口 | `9000` |
|
||||
| `persistence.enabled` | 是否使用持久卷存储数据 | `true` |
|
||||
| `persistence.size` | 持久卷大小 | `10Gi` |
|
||||
| `persistence.storageClass` | 持久卷类型 | `generic` |
|
||||
| `persistence.accessMode` | ReadWriteOnce 或者 ReadOnly | `ReadWriteOnce` |
|
||||
| `resources` | CPU/Memory 资源需求/限制 | Memory: `256Mi`, CPU: `100m` |
|
||||
|
||||
你可以通过`--set key=value[,key=value]`给`helm install`。 比如,
|
||||
|
||||
```bash
|
||||
$ helm install --name my-release \
|
||||
--set persistence.size=100Gi \
|
||||
stable/minio
|
||||
```
|
||||
|
||||
上述命令部署了一个带上100G持久卷的MinIO服务。
|
||||
|
||||
或者,您可以提供一个YAML文件,用于在安装chart时指定参数值。 例如,
|
||||
|
||||
```bash
|
||||
$ helm install --name my-release -f values.yaml stable/minio
|
||||
```
|
||||
|
||||
### 分布式MinIO
|
||||
|
||||
默认情况下,此图表以独立模式提供MinIO服务器。 要在[分布式模式](https://docs.min.io/cn/distributed-minio-quickstart-guide)中配置MinIO服务器,请将`mode`字段设置为`distributed`,
|
||||
|
||||
```bash
|
||||
$ helm install --set mode=distributed stable/minio
|
||||
```
|
||||
|
||||
上述命令部署了个带有4个节点的分布式MinIO服务器。 要更改分布式MinIO服务器中的节点数,请设置`numberOfNodes`属性。
|
||||
|
||||
|
||||
```bash
|
||||
$ helm install --set mode=distributed,numberOfNodes=8 stable/minio
|
||||
```
|
||||
|
||||
上述命令部署了个带有8个节点的分布式MinIO服务器。注意一下,`numberOfNodes`取值范围是[4,16]。
|
||||
|
||||
#### StatefulSet [限制](http://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/#limitations),适用于分布式MinIO
|
||||
|
||||
* StatefulSets需要持久化存储,所以如果 `mode`设成 `distributed`的话,`persistence.enabled`参数不生效。
|
||||
* 卸载分布式MinIO版本时,需要手动删除与StatefulSet关联的卷。
|
||||
|
||||
### Shared MinIO
|
||||
|
||||
如需采用[shared mode](https://github.com/minio/minio/blob/master/docs/shared-backend/README.md)部署MinIO, 将`mode` 设为`shared`,
|
||||
|
||||
```bash
|
||||
$ helm install --set mode=shared stable/minio
|
||||
```
|
||||
|
||||
上述命令规定了4个MinIO服务器节点,一个存储。 要更改共享的MinIO部署中的节点数,请设置`numberOfNodes`字段,
|
||||
|
||||
```bash
|
||||
$ helm install --set mode=shared,numberOfNodes=8 stable/minio
|
||||
```
|
||||
|
||||
上述命令规定了MinIO服务有8个节点,采用shared模式。
|
||||
|
||||
### 持久化
|
||||
|
||||
这里规定了PersistentVolumeClaim并将相应的持久卷挂载到默认位置`/export`。 您需要Kubernetes集群中的物理存储才能使其工作。 如果您宁愿使用`emptyDir`,请通过以下方式禁用PersistentVolumeClaim:
|
||||
|
||||
```bash
|
||||
$ helm install --set persistence.enabled=false stable/minio
|
||||
```
|
||||
|
||||
> *"当Pod分配给节点时,首先创建一个emptyDir卷,只要该节点上的Pod正在运行,它就会存在。 当某个Pod由于任何原因从节点中删除时,emptyDir中的数据将永久删除。"*
|
||||
|
||||
## 3. 使用Helm更新MinIO版本
|
||||
|
||||
您可以更新现有的MinIO Helm Release以使用较新的MinIO Docker镜像。 为此,请使用`helm upgrade`命令:
|
||||
|
||||
```bash
|
||||
$ helm upgrade --set imageTag=<replace-with-minio-docker-image-tag> <helm-release-name> stable/minio
|
||||
```
|
||||
|
||||
如果更新成功,你可以看到下面的输出信息
|
||||
|
||||
```bash
|
||||
Release "your-helm-release" has been upgraded. Happy Helming!
|
||||
```
|
||||
|
||||
## 4. 卸载Chart
|
||||
|
||||
假设你的版本被命名为`my-release`,使用下面的命令删除它:
|
||||
|
||||
```bash
|
||||
$ helm delete my-release
|
||||
```
|
||||
|
||||
该命令删除与chart关联的所有Kubernetes组件,并删除该release。
|
||||
|
||||
### 提示
|
||||
|
||||
* 在Kubernetes群集中运行的chart的实例称为release。 安装chart后,Helm会自动分配唯一的release名称。 你也可以通过下面的命令设置你心仪的名称:
|
||||
|
||||
```bash
|
||||
$ helm install --name my-release stable/minio
|
||||
```
|
||||
|
||||
* 为了覆盖默认的秘钥,可在运行helm install时将access key和secret key做为参数传进去。
|
||||
|
||||
```bash
|
||||
$ helm install --set accessKey=myaccesskey,secretKey=mysecretkey \
|
||||
stable/minio
|
||||
```
|
||||
|
||||
### 了解更多
|
||||
|
||||
- [MinIO纠删码快速入门](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)
|
||||
- [Kubernetes文档](https://kubernetes.io/docs/home/)
|
||||
- [Helm package manager for kubernetes](https://helm.sh/)
|
||||
@@ -1,141 +0,0 @@
|
||||
介绍 [](https://slack.min.io)
|
||||
------------
|
||||
|
||||
该特性可以让多个Minio实例使用一个共享的NAS存储,而且不需要做什么特殊的设置。文件默认已经做了同步以及加锁。
|
||||
|
||||
目的
|
||||
----------
|
||||
|
||||
由于Minio的设计理念是为单租户场景服务,所以用户希望采用在一个存储后端上运行多个Minio实例,这个存储后端可能是一个已有的NAS。Minio支持这种共享存储后端的特性,而且不需要用户做额外的设置。
|
||||
|
||||
|
||||
限制
|
||||
------------
|
||||
|
||||
* 如果正在执行GetObject(),则PutObject()会阻塞并等待。
|
||||
* 如果正在执行PutObject()或者GetObject(),则CompleteMultipartUpload()会阻塞并等待。
|
||||
* 无法
|
||||
* A CompleteMultipartUpload() is blocked and waits if another PutObject() or GetObject() is in progress.
|
||||
* 无法运行FS模式作为remote disk RPC。
|
||||
|
||||
## 如何运行?
|
||||
|
||||
运行共享存储后端的Minio和直接运行在一块独立磁盘的Minio没有啥区别,不需要做额外设置来开启这个特性。访问NAS上的文件默认就会加锁和同步。以下示例将对您选择的每个操作系统上的操作进行阐述:
|
||||
|
||||
### Ubuntu 16.04 LTS
|
||||
|
||||
示例1: 运行Minio实例在持载在`/path/to/nfs-volume`路径下的共享后端存储。
|
||||
|
||||
On linux server1
|
||||
```shell
|
||||
minio server /path/to/nfs-volume
|
||||
```
|
||||
|
||||
On linux server2
|
||||
```shell
|
||||
minio server /path/to/nfs-volume
|
||||
```
|
||||
|
||||
### Windows 2012 Server
|
||||
|
||||
示例1: 运行Minio实例在持载在`\\remote-server\cifs`路径下的共享后端存储。
|
||||
|
||||
On windows server1
|
||||
```cmd
|
||||
minio.exe server \\remote-server\cifs\data
|
||||
```
|
||||
|
||||
On windows server2
|
||||
```cmd
|
||||
minio.exe server \\remote-server\cifs\data
|
||||
```
|
||||
|
||||
或者共享存储挂载在`D:\`盘.
|
||||
|
||||
On windows server1
|
||||
```cmd
|
||||
minio.exe server D:\data
|
||||
```
|
||||
|
||||
On windows server2
|
||||
```cmd
|
||||
minio.exe server D:\data
|
||||
```
|
||||
|
||||
架构
|
||||
------------------
|
||||
|
||||
## POSIX/Win32 Locks
|
||||
|
||||
### Lock process
|
||||
|
||||
在同一个Minio实例中,lock由现有的内存命名空间锁(** sync.RWMutex **等)处理。 为了在许多Minio实例之间同步锁,我们利用Unix上的POSIX`fcntl()`锁定和Windows`LockFileEx()`Win32 API)。 如果相邻Minio实例在同一路径上有任何读锁,则写锁请求会被阻塞。 如果有正在进行的写锁,读锁也是如此。
|
||||
|
||||
### Unlock process
|
||||
|
||||
|
||||
关闭文件描述符(fd)就会将之前获得的锁释放。关闭fd将告诉内核放弃当前进程在路径上保留的所有锁。当相同进程在同一路径上有多个读操作时,这会变得更加棘手,这意味着关闭一个fd也会为所有并发读释放锁。 为了正确地处理这种情况,实现了简单的fd引用计数,多个读操作之间共享相同的fd。 当读操作开始关闭fd时,我们开始减少引用计数,一旦引用计数达到零,我们可以确保没有更多的活跃读操作。 所以我们继续关闭底层文件描述符,这将放弃在路径上保留的读锁。
|
||||
|
||||
这个不适用于写操作,因为对于每个对象总是有一个写和多个读。
|
||||
|
||||
## 处理并发。
|
||||
|
||||
这里的一个例子显示了如何使用GetObject()处理争用。
|
||||
|
||||
GetObject()持有`fs.json`的一个读锁。
|
||||
|
||||
```go
|
||||
fsMetaPath := pathJoin(fs.fsPath, minioMetaBucket, bucketMetaPrefix, bucket, object, fsMetaJSONFile)
|
||||
rlk, err := fs.rwPool.Open(fsMetaPath)
|
||||
if err != nil {
|
||||
return toObjectErr(err, bucket, object)
|
||||
}
|
||||
defer rlk.Close()
|
||||
|
||||
... you can perform other operations here ...
|
||||
|
||||
_, err = io.Copy(writer, reader)
|
||||
|
||||
... after successful copy operation unlocks the read lock ...
|
||||
```
|
||||
|
||||
对同一个对象的并发PutObject操作
|
||||
在同一个对象上请求一个并发的PutObject, PutObject()尝试获取一个`fs.json`上的写锁。
|
||||
|
||||
```go
|
||||
fsMetaPath := pathJoin(fs.fsPath, minioMetaBucket, bucketMetaPrefix, bucket, object, fsMetaJSONFile)
|
||||
wlk, err := fs.rwPool.Create(fsMetaPath)
|
||||
if err != nil {
|
||||
return ObjectInfo{}, toObjectErr(err, bucket, object)
|
||||
}
|
||||
// This close will allow for locks to be synchronized on `fs.json`.
|
||||
defer wlk.Close()
|
||||
```
|
||||
|
||||
现在从上面的代码片段可以看到,直到GetObject()返回。 以下部分代码将被阻塞。
|
||||
|
||||
```go
|
||||
wlk, err := fs.rwPool.Create(fsMetaPath)
|
||||
```
|
||||
|
||||
这咱限制是必须的,以避免给客户端返回损坏的数据。反之亦然,PutObject(),GetObject()也会等待PutObject()完成之后再执行。
|
||||
|
||||
### 警告 (并发)
|
||||
|
||||
假设有3个Minio服务共享一个存储后端
|
||||
|
||||
minio1
|
||||
|
||||
- DeleteObject(object1) --> 在object1删除操作时持有`fs.json`的锁。
|
||||
|
||||
minio2
|
||||
|
||||
- PutObject(object1) --> 等DeleteObject完毕后进行锁定。
|
||||
|
||||
minio3
|
||||
|
||||
- PutObject(object1) --> (concurrent request during PutObject minio2 checking if `fs.json` exists)
|
||||
|
||||
一旦获取到锁之后,minio2验证文件是否真的存在,以避免获得已被删除的fd的锁。但是这种情况与minio3存在竞争,因为minio3也在尝试写同一个文件。这就存在一种可能,`fs.json`已经被创建了,所以minio2获得的锁就无效,这样就可能会导致数据不一致。
|
||||
|
||||
这是一种已知的问题,而且没办法通过POSIX fcntl锁来解决。这种情况是共享存储后端的限制,请你知晓。
|
||||
@@ -1,71 +0,0 @@
|
||||
# MinIO共享后端存储快速入门[](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
MinIO共享模式可以让你使用一个[NAS](https://en.wikipedia.org/wiki/Network-attached_storage) 做为多个MinIO服务的存储后端。我我们在设计时已经对多个MinIO服务之间的同步做了很多的处理。更多MinIO共享模式的设计文档,请访问[这里](https://github.com/minio/minio/blob/master/docs/shared-backend/DESIGN.md).
|
||||
|
||||
MinIO共享模式是为了解决在真实场景中存在的一些问题,而且不需要做额外的配置。
|
||||
如果你有下列需求,则可以考虑MinIO共享模式
|
||||
|
||||
- 你已经买了NAS设备,并想在存储层使用MinIO来增加S3兼容。
|
||||
- 你的应用架构要求你使用带有S3接口的NAS。
|
||||
- 你的应用存在亚历山大的流量,你想给你的NAS设备增加一个有负载均衡能力的S3兼容的服务。
|
||||
|
||||
在多个共享模式的MinIO服务前面加一层代理,你很容易就能获得一个高可用,负载均衡,AWS S3兼容的存储系统。
|
||||
|
||||
# 开始
|
||||
|
||||
如果你知道怎么部署单机MinIO,共享模式的部署和运行也是一样一样的。
|
||||
|
||||
## 1. 前提条件
|
||||
|
||||
安装MinIO - [MinIO快速入门](https://docs.min.io/cn/).
|
||||
|
||||
## 2. 在共享后端存储上运行MinIO
|
||||
|
||||
为了让MinIO在共享后端上运行起来,你需要启动多个MinIO服务,这些服务指向同一个后端存储。下面我们就来讲解如何设置。
|
||||
|
||||
*注意*
|
||||
|
||||
- 使用共享存储的所有MinIO节点需要有相同的access key和secret key。为了做到这一点,我们在所有节点上将access key和secret key export成环境变量,然后再去启动MinIO服务。
|
||||
- 下面出现的存储路径都是为了演示目的,在真实环境中使用时,你应该替换成你真实要用的路径。
|
||||
|
||||
#### MinIO shared mode on Ubuntu 16.04 LTS.
|
||||
|
||||
你需要将文件夹指向共享存储,比如`/path/to/nfs-volume`,然后在所有MinIO节点上运行下面的命令。
|
||||
|
||||
```sh
|
||||
export MINIO_ROOT_USER=<ACCESS_KEY>
|
||||
export MINIO_ROOT_PASSWORD=<SECRET_KEY>
|
||||
minio gateway nas /path/to/nfs-volume
|
||||
```
|
||||
|
||||
#### MinIO shared mode on Windows 2012 Server
|
||||
|
||||
你需要将文件夹指向共享存储,比如`\\remote-server\smb`. 然后在所有MinIO节点上运行下面的命令。
|
||||
|
||||
```cmd
|
||||
set MINIO_ROOT_USER=my-username
|
||||
set MINIO_ROOT_PASSWORD=my-password
|
||||
minio.exe gateway nas \\remote-server\smb\export
|
||||
```
|
||||
|
||||
*Windows提示*
|
||||
|
||||
如果一个远程的volume, 比如`\\remote-server\smb`挂载成一个硬盘, 比如`M:\`. 你可以使用[`net use`](https://technet.microsoft.com/en-us/library/bb490717.aspx)命令将这块盘映射到一个文件夹。
|
||||
|
||||
```cmd
|
||||
set MINIO_ROOT_USER=my-username
|
||||
set MINIO_ROOT_PASSWORD=my-password
|
||||
net use m: \\remote-server\smb\export /P:Yes
|
||||
minio.exe gateway nas M:\export
|
||||
```
|
||||
|
||||
## 3. 验证
|
||||
|
||||
为了验证部署是否成功,可能通过浏览器或者[`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)访问MinIO。你应该可以从各个MinIO节点访问上传的文件。
|
||||
|
||||
## 了解更多
|
||||
- [使用`mc`](https://docs.min.io/cn/minio-client-quickstart-guide)
|
||||
- [使用`aws-cli`](https://docs.min.io/cn/aws-cli-with-minio)
|
||||
- [使用`s3cmd`](https://docs.min.io/cn/s3cmd-with-minio)
|
||||
- [使用`minio-go` SDK](https://docs.min.io/cn/golang-client-quickstart-guide)
|
||||
- [MinIO文档](https://docs.min.io)
|
||||
@@ -1,53 +0,0 @@
|
||||
# MinIO服务器限制设置指南 [](https://slack.min.io) [](https://hub.docker.com/r/minio/minio/)
|
||||
|
||||
MinIO服务器允许限制传入的请求:
|
||||
|
||||
- 限制整个集群中允许的活动请求数
|
||||
- 限制队列中每个请求的等待时间
|
||||
|
||||
这些值可以通过服务器的配置或者环境变量启用。
|
||||
|
||||
## 示例
|
||||
### 配置连接限制
|
||||
如果您使用传统的机械(hdd)硬盘,则某些具有高并发性的应用程序可能需要调整MinIO群集,以避免驱动器上出现随机I/O。将高并发I/O转换为顺序I/O的方法是通过减少每个集群允许的并发操作数。这使MinIO集群在操作上可以应对此类工作负载,同时还可以确保驱动器具有最佳效率和响应能力。
|
||||
|
||||
示例:限制MinIO群集在群集的所有节点上最多接受1600个S3兼容的API请求。
|
||||
|
||||
```sh
|
||||
export MINIO_API_REQUESTS_MAX=1600
|
||||
export MINIO_ROOT_USER=your-access-key
|
||||
export MINIO_ROOT_PASSWORD=your-secret-key
|
||||
minio server http://server{1...8}/mnt/hdd{1...16}
|
||||
```
|
||||
|
||||
或者
|
||||
|
||||
```sh
|
||||
mc admin config set myminio/ api requests_max=1600
|
||||
mc admin service restart myminio/
|
||||
```
|
||||
|
||||
> 注意: `requests_max`为零意味着无限制,这也是默认的行为。
|
||||
|
||||
### 配置连接(等待)期限
|
||||
此值与最大连接设置一起使用,设置此值可允许长时间等待的请求,在没有可用空间执行请求时快速超时。
|
||||
|
||||
当客户端未配置超时时,这将减少等待请求的堆积。如果启用了*MINIO_API_REQUESTS_MAX*,则默认等待时间为*10秒*。根据您的应用程序需求,这可能需要进行调整。
|
||||
|
||||
示例: 限制MinIO群集在8个服务器上,最多可以接受1600个S3兼容API并发请求,并将每个API操作的等待期限设置为*2分钟*。
|
||||
|
||||
```sh
|
||||
export MINIO_API_REQUESTS_MAX=1600
|
||||
export MINIO_API_REQUESTS_DEADLINE=2m
|
||||
export MINIO_ROOT_USER=your-access-key
|
||||
export MINIO_ROOT_PASSWORD=your-secret-key
|
||||
minio server http://server{1...8}/mnt/hdd{1...16}
|
||||
```
|
||||
|
||||
或者
|
||||
|
||||
```sh
|
||||
mc admin config set myminio/ api requests_max=1600 requests_deadline=2m
|
||||
mc admin service restart myminio/
|
||||
```
|
||||
|
||||
@@ -1,131 +0,0 @@
|
||||
# 使用TLS安全的访问Minio服务[](https://slack.min.io)
|
||||
|
||||
本文,我们讲介绍如何在Linux和Windows上配置Minio服务使用TLS。
|
||||
|
||||
## 1. 前提条件
|
||||
|
||||
* 下载Minio server [这里](https://docs.min.io/docs/minio-quickstart-guide)
|
||||
|
||||
## 2. 配置已存在的证书
|
||||
|
||||
如果你已经有私钥和公钥证书,你需要将它们拷贝到Minio的config/`certs`文件夹,分别取名为`private.key` 和 `public.crt`。
|
||||
|
||||
如果这个证书是被证书机构签发的,`public.crt`应该是服务器的证书,任何中间体的证书以及CA的根证书的级联。
|
||||
|
||||
## 3. 生成证书
|
||||
|
||||
### Linux
|
||||
|
||||
Minio在Linux只支持使用PEM格式的key/certificate。
|
||||
|
||||
#### 使用 Let's Encrypt
|
||||
|
||||
更多信息,请访问 [这里](https://docs.min.io/cn/generate-let-s-encypt-certificate-using-concert-for-minio)
|
||||
|
||||
#### 使用 generate_cert.go (self-signed certificate)
|
||||
|
||||
你需要下载 [generate_cert.go](https://golang.org/src/crypto/tls/generate_cert.go?m=text),它是一个简单的go工具,可以生成自签名的证书,不过大多数情况下用着都是木有问题的。
|
||||
|
||||
`generate_cert.go` 已经提供了带有DNS和IP条目的SAN证书:
|
||||
|
||||
```sh
|
||||
go run generate_cert.go -ca --host "10.10.0.3"
|
||||
```
|
||||
|
||||
#### 使用 OpenSSL:
|
||||
|
||||
生成私钥:
|
||||
|
||||
```sh
|
||||
openssl genrsa -out private.key 2048
|
||||
```
|
||||
|
||||
生成自签名证书:
|
||||
|
||||
```sh
|
||||
openssl req -new -x509 -days 3650 -key private.key -out public.crt -subj "/C=US/ST=state/L=location/O=organization/CN=domain"
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Minio在Windows上只支持PEM格式的key/certificate,目前不支持PFX证书。
|
||||
|
||||
#### 安装 GnuTLS
|
||||
|
||||
下载并解压[GnuTLS](http://www.gnutls.org/download.html)
|
||||
|
||||
确保将解压后的binary路径加入到系统路径中。
|
||||
|
||||
```
|
||||
setx path "%path%;C:\Users\MyUser\Downloads\gnutls-3.4.9-w64\bin"
|
||||
```
|
||||
|
||||
你可能需要重启powershell控制台来使其生效。
|
||||
|
||||
#### 生成private.key
|
||||
|
||||
运行下面的命令来生成 `private.key`
|
||||
|
||||
```
|
||||
certtool.exe --generate-privkey --outfile private.key
|
||||
```
|
||||
|
||||
#### 生成public.crt
|
||||
|
||||
创建文件`cert.cnf`,填写必要信息来生成证书。
|
||||
|
||||
```
|
||||
# X.509 Certificate options
|
||||
#
|
||||
# DN options
|
||||
|
||||
# The organization of the subject.
|
||||
organization = "Example Inc."
|
||||
|
||||
# The organizational unit of the subject.
|
||||
#unit = "sleeping dept."
|
||||
|
||||
# The state of the certificate owner.
|
||||
state = "Example"
|
||||
|
||||
# The country of the subject. Two letter code.
|
||||
country = "EX"
|
||||
|
||||
# The common name of the certificate owner.
|
||||
cn = "Sally Certowner"
|
||||
|
||||
# In how many days, counting from today, this certificate will expire.
|
||||
expiration_days = 365
|
||||
|
||||
# X.509 v3 extensions
|
||||
|
||||
# DNS name(s) of the server
|
||||
dns_name = "localhost"
|
||||
|
||||
# (Optional) Server IP address
|
||||
ip_address = "127.0.0.1"
|
||||
|
||||
# Whether this certificate will be used for a TLS server
|
||||
tls_www_server
|
||||
|
||||
# Whether this certificate will be used to encrypt data (needed
|
||||
# in TLS RSA ciphersuites). Note that it is preferred to use different
|
||||
# keys for encryption and signing.
|
||||
encryption_key
|
||||
```
|
||||
|
||||
生成公钥证书
|
||||
|
||||
```
|
||||
certtool.exe --generate-self-signed --load-privkey private.key --template cert.cnf --outfile public.crt
|
||||
```
|
||||
|
||||
## 4. 安装第三方CAs
|
||||
|
||||
Minio可以配置成连接其它服务,不管是Minio节点还是像NATs、Redis这些。如果这些服务用的不是在已知证书机构注册的证书,你可以让Minio服务信任这些CA,怎么做呢,将这些证书放到Minio配置路径下
|
||||
* **Linux:** `~/.minio/certs/CAs/`
|
||||
* **Windows**: `C:\Users\<Username>\.minio\certs\CAs`
|
||||
|
||||
# 了解更多
|
||||
* [Minio快速入门](https://docs.min.io/cn/minio-quickstart-guide)
|
||||
* [Minio客户端权威指南](https://docs.min.io/cn/minio-client-complete-guide)
|
||||