Minio环境搭建
1. 说明
1.1 简介
MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。
MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。
MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。
2. Minio使用与环境搭建
2.1 Docker运行Minio
version: "3"
services:
portainer:
image: reg.ji.com/portainer/portainer:1.21.0
restart: always
ports:
- 29000:9000
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "$VOLUME_PATH/portainer/data:/data"
minio:
image: reg.ji.com/minio:2021-05-27
hostname: minio
volumes:
- "$VOLUME_PATH/minio/data:/data"
- "$VOLUME_PATH/minio/config:/root/.minio"
expose:
- "9000"
ports:
- 9000:9000
environment:
- MINIO_ROOT_USER=minio
- MINIO_ROOT_PASSWORD=minio123
- MINIO_NOTIFY_WEBHOOK_ENABLE=ON
- MINIO_NOTIFY_WEBHOOK_ENDPOINT=http://localhost:8090/webhooks
- MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE
- MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
#- MINIO_ROOT_USER_FILE=access_key
#- MINIO_ROOT_PASSWORD_FILE=secret_key
#- MINIO_KMS_SECRET_KEY_FILE=kms_master_key
- MINIO_UPDATE_MINISIGN_PUBKEY=RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav
command: server /data
healthcheck:
test: ["CMD", "curl", "-f", "http://minio:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio_mc:
image: reg.ji.com/minio_mc:2021-05-26
depends_on:
- minio
entrypoint: >
/bin/sh -c "
/usr/bin/mc config host rm local;
/usr/bin/mc config host add --quiet --api s3v4 local http://minio:9000 minio minio123;"
服务运行起来后可访问 http://localhost:9000,使用 用户:minio 密码:minio123 登录进行操作
2.2 Minio 存储桶通知
存储桶(Bucket)如果发生改变,比如上传对象和删除对象,可以使用存储桶事件通知机制进行监控,并通过以下方式发布出去:
Notification Targets |
---|
AMQP |
MQTT |
Elasticsearch |
Redis |
NATS |
PostgreSQL |
MySQL |
Apache Kafka |
Webhooks |
以下列出Minio通过postgresql、webhooks进行通知的相关配置,其他信息可访问minio官网查看。
前提条件
- 部署并运行Minio Server
- 部署Minio Client
2.2.1 使用Postgresql 发布Minio事件
安装 PostgreSQL 数据库。为了演示,我们将"postgres"用户的密码设为password
,并且创建了一个minio_events
数据库来存储事件信息。
这个通知目标支持两种格式: namespace and access。
如果使用的是_namespace_格式,MinIO将存储桶里的对象同步成数据库表中的行。每一行有两列:key和value。key是这个对象的存储桶名字加上对象名,value都是一个有关这个MinIO对象的JSON格式的事件数据。如果对象更新或者删除,表中相应的行也会相应的更新或者删除。
如果使用的是access,MinIO将将事件添加到表里,行有两列:event_time 和 event_data。event_time是事件在MinIO server里发生的时间,event_data是有关这个MinIO对象的JSON格式的事件数据。在这种格式下,不会有行会被删除或者修改。
下面的步骤展示的是如何在namespace
格式下使用通知目标,_access_
差不多,不再赘述,我相信你可以触类旁通,举一反三,不要让我失望哦。
第一步:确保确保至少满足第低要求
MinIO要求PostgresSQL9.5版本及以上。 MinIO用了PostgreSQL9.5引入的INSERT ON CONFLICT
(aka UPSERT) 特性,以及9.4引入的 JSONB 数据类型。
第二步:集成PostgreSQL到MinIO
下面是一个PostgreSQL配置示例:
KEY:
notify_postgres[:name] publish bucket notifications to Postgres databases
ARGS:
MINIO_NOTIFY_POSTGRES_ENABLE* (on|off) enable notify_postgres target, default is 'off'
MINIO_NOTIFY_POSTGRES_CONNECTION_STRING* (string) Postgres server connection-string e.g. "host=localhost port=5432 dbname=minio_events user=postgres password=password sslmode=disable"
MINIO_NOTIFY_POSTGRES_TABLE* (string) DB table name to store/update events, table is auto-created
MINIO_NOTIFY_POSTGRES_FORMAT* (namespace*|access) 'namespace' reflects current bucket/object list and 'access' reflects a journal of object operations, defaults to 'namespace'
MINIO_NOTIFY_POSTGRES_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events'
MINIO_NOTIFY_POSTGRES_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000'
MINIO_NOTIFY_POSTGRES_COMMENT (sentence) optionally add a comment to this setting
MINIO_NOTIFY_POSTGRES_MAX_OPEN_CONNECTIONS (number) maximum number of open connections to the database, defaults to '2'
注意一下,为了演示,咱们这把SSL禁掉了,但是为了安全起见,不建议在生产环境这么弄。
更新完配置文件后,重启MinIO Server让配置生效。如果一切顺利,MinIO Server会在启动时输出一行信息,类似 SQS ARNs: arn:minio:sqs:us-east-1:1:postgresql
。
和之前描述的一样,你也可以添加多个PostreSQL实例,只要ID不重复就行。
第三步:使用MinIO客户端启用bucket通知
我们现在可以在一个叫images
的存储桶上开启事件通知,一旦上有文件上传到存储桶中,PostgreSQL中会insert一条新的记录或者一条已经存在的记录会被update,如果一个存在对象被删除,一条对应的记录也会从PostgreSQL表中删除。因此,PostgreSQL表中的行,对应的就是存储桶里的一个对象。
要配置这种存储桶通知,我们需要用到前面步骤中MinIO输出的ARN信息。更多有关ARN的资料,请参考这里。
有了mc
这个工具,这些配置信息很容易就能添加上。假设MinIO服务别名叫minio
,可执行下列脚本:
//使用MC Client连接服务
mc config host add minio http://minio:9000
Enter Access Key:
Enter Secret Key:
mc admin config get minio/ notify_postgres
mc admin config set minio notify_postgres:1 connection_string="host=localhost port=5432 dbname=minio_events user=postgres password=password sslmode=disable" table="bucketevents" format="namespace"
//重启服务
mc admin service restart minio
//创建桶
mc mb minio/images
//开启桶通知
mc event add minio/images arn:minio:sqs:us-east-1:1:postgresql --events put --suffix .jpg
mc event add minio/images arn:minio:sqs:us-east-1:1:postgresql --events put --suffix .bmp
//查看桶开启的通知
mc event list minio/images
第四步:验证PostgreSQL
打开一个新的terminal终端并上传一张JPEG图片到images
存储桶。
mc cp myphoto.jpg minio/images
打开一个PostgreSQL终端列出表 bucketevents
中所有的记录。
$ psql -h 127.0.0.1 -U postgres -d minio_events
minio_events=# select * from bucketevents;
key | value
--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
images/myphoto.jpg | {"Records": [{"s3": {"bucket": {"arn": "arn:aws:s3:::images", "name": "images", "ownerIdentity": {"principalId": "minio"}}, "object": {"key": "myphoto.jpg", "eTag": "1d97bf45ecb37f7a7b699418070df08f", "size": 56060, "sequencer": "147CE57C70B31931"}, "configurationId": "Config", "s3SchemaVersion": "1.0"}, "awsRegion": "us-east-1", "eventName": "s3:ObjectCreated:Put", "eventTime": "2016-10-12T21:18:20Z", "eventSource": "aws:s3", "eventVersion": "2.0", "userIdentity": {"principalId": "minio"}, "responseElements": {}, "requestParameters": {"sourceIPAddress": "[::1]:39706"}}]}
(1 row)
2.2.2 使用Webhook发布Minio事件
Webhooks 采用推的方式获取数据,而不是一直去拉取。
第一步:集成Webhook到MinIO
在docker-compose文件中,可以使用以下参数配置webhook。
KEY:
notify_webhook[:name] publish bucket notifications to webhook endpoints
ARGS:
MINIO_NOTIFY_WEBHOOK_ENABLE* (on|off) enable notify_webhook target, default is 'off'
MINIO_NOTIFY_WEBHOOK_ENDPOINT* (url) webhook server endpoint e.g. http://localhost:8080/minio/events
MINIO_NOTIFY_WEBHOOK_AUTH_TOKEN (string) opaque string or JWT authorization token
MINIO_NOTIFY_WEBHOOK_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events'
MINIO_NOTIFY_WEBHOOK_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000'
MINIO_NOTIFY_WEBHOOK_COMMENT (sentence) optionally add a comment to this setting
MINIO_NOTIFY_WEBHOOK_CLIENT_CERT (string) client cert for Webhook mTLS auth
MINIO_NOTIFY_WEBHOOK_CLIENT_KEY (string) client cert key for Webhook mTLS auth
endpoint是监听webhook通知的服务。注意一下,在重启MinIO时,这个endpoint必须是启动并且可访问到。
第二步:使用MinIO客户端启用bucket通知
我们现在可以在一个叫images
的存储桶上开启事件通知,一旦上有文件上传到存储桶中,事件将被触发。在这里,ARN的值是arn:minio:sqs:us-east-1:1:webhook
。服务配置完webhook,在log中可查看到ARN信息。
//使用MC Client连接服务
mc config host add minio http://minio:9000
Enter Access Key:
Enter Secret Key:
mc admin config get minio/ notify_webhook
mc admin config set minio notify_webhook:1 queue_limit="0" endpoint="http://localhost:8090/webhooks" queue_dir=""
//重启服务
mc admin service restart minio
//创建桶
mc mb minio/images
mc mb minio/images-thumbnail
//开启桶通知
mc event add minio/images arn:minio:sqs:us-east-1:1:webhook --events put --suffix .jpg
mc event add minio/images arn:minio:sqs:us-east-1:1:webhook --events put --suffix .bmp
//查看桶开启的通知
mc event list minio/images
验证事件通知是否配置正确:
mc event list minio/images
你应该可以收到如下的响应:
arn:minio:sqs:us-east-1:1:webhook s3:ObjectCreated:* Filter: suffix=".jpg"
第三步:采用Thumbnailer进行验证
我们使用 Thumbnailer 来监听MinIO通知。如果有文件上传于是MinIO服务,Thumnailer监听到该通知,生成一个缩略图并上传到MinIO服务。 安装Thumbnailer:
git clone https://github.com/minio/thumbnailer/npm install
然后打开Thumbnailer的config/webhook.json
配置文件,添加有关MinIO server的配置,使用下面的方式启动Thumbnailer:
NODE_ENV=webhook node thumbnail-webhook.js
Thumbnailer运行在http://localhost:3000/
。下一步,配置MinIO server,让其发送消息到这个URL(第一步提到的),并使用 mc
来设置存储桶通知(第二步提到的)。然后上传一张图片到MinIO server:
mc cp ~/images.jpg minio/images.../images.jpg: 8.31 KB / 8.31 KB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 59.42 KB/s 0s
稍等片刻,然后使用mc ls检查存储桶的内容 -,你将看到有个缩略图出现了。
mc ls minio/images-thumbnail[2017-02-08 11:39:40 IST] 992B images-thumbnail.jpg
注意 如果你用的是 distributed MinIO,请修改所有节点的 ~/.minio/config.json
。