minio支持上传时对object打标签,查询时可以根据标签做筛选。但是有ftp上传文件的需求,导致无法给object打标签。并且也不清楚minio对于根据标签的筛选性能如何,因此我们打算将object的对象的数据放到数据库。在数据库中对object进行筛选。

docker部署

mkdir -p ~/minio/data

docker run \
-d \
--network=host \
--name minio \
-v /opt/minio/data:/data \
-e "MINIO_ROOT_USER=ROOTNAME" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
quay.io/minio/minio server /data --console-address ":9090" \
--address=":9002" \
--ftp="address=:8021" \
--ftp="passive-port-range=30000-40000"

9090端口是minio console网页的端口,登录此网页用户名密码就是我们设置的ROOTNAME CHANGEME123

9002是我们程序调用minio sdk的端口,根据自己机器的情况按需设置。

ftp参数表示我们开启ftp,并使用8021最为ftp服务器端口。

登录9090网页后,申请Access key,调用minio sdk时需要secret key、Access key等。

Bucket Notification

我们通过订阅minio的object events来做数据同步。

bucket notification

minio提供了多种方式,我们最终使用的webhook方式,但是我们暂时先说一下mysql方式:

docker run \
-d \
--network=host \
--name minio \
-v /opt/minio/data:/data \
-e "MINIO_ROOT_USER=ROOTNAME" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
-e MINIO_NOTIFY_MYSQL_ENABLE_PRIMARY="on" \
-e MINIO_NOTIFY_MYSQL_DSN_STRING_PRIMARY="root:root@tcp(192.168.16.46:3306)/cogent-admin" \
-e MINIO_NOTIFY_MYSQL_TABLE_PRIMARY="minio_events" \
-e MINIO_NOTIFY_MYSQL_FORMAT_PRIMARY="namespace" \
quay.io/minio/minio server /data --console-address ":9090" \
--address=":9002" \
--ftp="address=:8021" \
--ftp="passive-port-range=30000-40000"

MINIO_NOTIFY_MYSQL_DSN_STRING_PRIMARY 配置我们的mysql数据库,然后进入docker容器

docker exec -it minio bash
chmod 777 /opt/bin/mc
mc alias set myminio http://192.168.16.46:9002 ROOTNAME CHANGEME123
mc admin info --json myminio mc event add myminio/cogent arn:minio:sqs::PRIMARY:mysql \
--event put mc event add myminio/cogent arn:minio:sqs::PRIMARY:mysql \
--event delete mc event ls myminio/cogent arn:minio:sqs::PRIMARY:mysql

注意事项:我们必须先至少创建一个bucket才能mc event add。进入容器后,我们要给/opt/bin/mc 执行权限。mc event add 的配置好像会持久化,如果重新启动一个容器,event仍然在,这时就不用在执行mc event add命令了,当然我们可以mc event ls去确定一下evnet是否添加成功

最后我们的结果,minio发送给mysql中的数据:

value:

{
"Records": [
{
"s3": {
"bucket": {
"arn": "arn:aws:s3:::cogent",
"name": "cogent",
"ownerIdentity": {
"principalId": "ROOTNAME"
}
},
"object": {
"key": "jetbra.zip",
"eTag": "8943434aec7868e6e16d36209ca47fab",
"size": 172138,
"sequencer": "177F6C96E9864D53",
"contentType": "application/x-zip-compressed",
"userMetadata": {
"content-type": "application/x-zip-compressed"
}
},
"configurationId": "Config",
"s3SchemaVersion": "1.0"
},
"source": {
"host": "192.168.16.148",
"port": "",
"userAgent": "MinIO (linux; amd64) minio-go/v7.0.59 MinIO Console/(dev)"
},
"awsRegion": "",
"eventName": "s3:ObjectCreated:Put",
"eventTime": "2023-08-28T02:56:20.333Z",
"eventSource": "minio:s3",
"eventVersion": "2.0",
"userIdentity": {
"principalId": "ROOTNAME"
},
"responseElements": {
"x-amz-id-2": "fad4b3083214c3b0ad28cc0f83fd770a8fd5fb5e47b065bc7cae01b61e817e1a",
"x-amz-request-id": "177F6C96E763B761",
"x-minio-deployment-id": "d6a44a90-a62c-4605-8aa2-121a85f0d440",
"x-minio-origin-endpoint": "http://192.168.192.254:9002"
},
"requestParameters": {
"region": "",
"principalId": "ROOTNAME",
"sourceIPAddress": "192.168.16.148"
}
}
]
}

这种格式在mysql中不好查询。因此我使用webhook方式订阅event,这种方式更灵活,我可以提取任何我想要的数据存入数据库。

以下是webhook的方式:

docker run \
-d \
--network=host \
--name minio \
-v /opt/minio/data:/data \
-e MINIO_ROOT_USER=ROOTNAME \
-e MINIO_ROOT_PASSWORD=CHANGEME123 \
-e MINIO_NOTIFY_WEBHOOK_ENABLE_PRIMARY="on" \
-e MINIO_NOTIFY_WEBHOOK_ENDPOINT_PRIMARY="http://127.0.0.1:8080/buckets/event" \
quay.io/minio/minio server /data --console-address ":9090" \
--address=":9002" \
--ftp="address=:8021" \
--ftp="passive-port-range=30000-40000"
mc alias set myminio http://192.168.16.46:9002 ROOTNAME CHANGEME123

mc admin info --json myminio

mc event add myminio/cogent arn:minio:sqs::PRIMARY:webhook --event put

mc event add myminio/cogent arn:minio:sqs::PRIMARY:webhook --event delete

mc event ls myminio/cogent arn:minio:sqs::PRIMARY:webhook

进入容器后,记得要给 /opt/bin/mc 赋予执行权限

以下是我对minio中object进行删除和添加时收到的json:

删除时,webhook的参数:

{
"EventName": "s3:ObjectRemoved:Delete",
"Key": "cogent/jetbra (1).zip",
"Records": [
{
"eventVersion": "2.0",
"eventSource": "minio:s3",
"awsRegion": "",
"eventTime": "2023-08-28T05:55:05.275Z",
"eventName": "s3:ObjectRemoved:Delete",
"userIdentity": {
"principalId": "ROOTNAME"
},
"requestParameters": {
"principalId": "ROOTNAME",
"region": "",
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"content-length": "160",
"x-amz-id-2": "fad4b3083214c3b0ad28cc0f83fd770a8fd5fb5e47b065bc7cae01b61e817e1a",
"x-amz-request-id": "177F765801436093",
"x-minio-deployment-id": "d6a44a90-a62c-4605-8aa2-121a85f0d440",
"x-minio-origin-endpoint": "http://192.168.192.254:9002"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "Config",
"bucket": {
"name": "cogent",
"ownerIdentity": {
"principalId": "ROOTNAME"
},
"arn": "arn:aws:s3:::cogent"
},
"object": {
"key": "jetbra+%281%29.zip",
"sequencer": "177F765801E61109"
}
},
"source": {
"host": "127.0.0.1",
"port": "",
"userAgent": "MinIO (linux; amd64) minio-go/v7.0.59 MinIO Console/(dev)"
}
}
]
}

添加object时,webhook参数

{
"EventName": "s3:ObjectCreated:Put",
"Key": "cogent/jetbra (1).zip",
"Records": [
{
"eventVersion": "2.0",
"eventSource": "minio:s3",
"awsRegion": "",
"eventTime": "2023-08-28T05:56:00.485Z",
"eventName": "s3:ObjectCreated:Put",
"userIdentity": {
"principalId": "ROOTNAME"
},
"requestParameters": {
"principalId": "ROOTNAME",
"region": "",
"sourceIPAddress": "192.168.16.148"
},
"responseElements": {
"x-amz-id-2": "fad4b3083214c3b0ad28cc0f83fd770a8fd5fb5e47b065bc7cae01b61e817e1a",
"x-amz-request-id": "177F7664D9E2DAD5",
"x-minio-deployment-id": "d6a44a90-a62c-4605-8aa2-121a85f0d440",
"x-minio-origin-endpoint": "http://192.168.192.254:9002"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "Config",
"bucket": {
"name": "cogent",
"ownerIdentity": {
"principalId": "ROOTNAME"
},
"arn": "arn:aws:s3:::cogent"
},
"object": {
"key": "jetbra+%281%29.zip",
"size": 172138,
"eTag": "8943434aec7868e6e16d36209ca47fab",
"contentType": "application/x-zip-compressed",
"userMetadata": {
"content-type": "application/x-zip-compressed"
},
"sequencer": "177F7664DCA24B86"
}
},
"source": {
"host": "192.168.16.148",
"port": "",
"userAgent": "MinIO (linux; amd64) minio-go/v7.0.59 MinIO Console/(dev)"
}
}
]
}

漏洞:如果我们Java程序重启,或者说webhook的web程序重启后,这时我们对minio删除或添加修改对象数据,那么此时将监听不到这个事件。因此我们一种方式是停止web服务时,先停止minio。另一种方式是执行定时任务,同步数据,或者说在web程序启动后一分钟内,同步minio 的object数据。当然如果object非常多,web程序更新频繁,我们可以将minio的event放到MQ中,web程序再去消费MQ中event

minio 支持object搜索方案的更多相关文章

  1. 微信不支持Object.assign

    微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  2. 咏南IOCP中间件支持海量并发方案(集群)

    咏南IOCP中间件支持海量并发方案(集群) 支持D7~XE10.1.1开发 支持负载均衡,自动故障转移 可以在不停机的状态下,根据负载情况灵活增加中间件机器 中间件使用IOCP通信,单中间件支持并发数 ...

  3. linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg)

     linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg) 2013-11-10 16:51:14 分类: 系统运维 为什么要写这篇文章? 答:通过常规的三大步(./confi ...

  4. Android 自定义支持快速搜索筛选的选择控件(一)

    Android 自定义支持快速搜索筛选的选择控件 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz ...

  5. Raneto部署知识库平台&支持中文搜索

    目录 环境 更新软件包 部署 Raneto 知识库平台 安装 Node 环境 安装 node 管理工具 查看 node 列表 安装需要的Node版本 使用 淘宝NPM源 git 使用代理设置,大陆地区 ...

  6. 基于Solr和Zookeeper的分布式搜索方案的配置

    1.1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...

  7. helm-mode打开文件支持中文搜索

    helm-mode打开文件支持中文搜索 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #83949 ...

  8. nginx配置pathinfo支持,最佳方案 - chunyu

    〇. 前言 pathinfo有两个,1 pathinfo()函数,2 $_SERVER['PATH_INFO'].pathinfo()是php的库函数,原生支持不需要nginx配置,$_SERVER[ ...

  9. Docker 如何支持多种日志方案?- 每天5分钟玩转 Docker 容器技术(88)

    将容器日志发送到 STDOUT 和 STDERR 是 Docker 的默认日志行为.实际上,Docker 提供了多种日志机制帮助用户从运行的容器中提取日志信息.这些机制被称作 logging driv ...

  10. 088、Docker 如何支持多种日志方案 (2019-05-10 周五)

    参考https://www.cnblogs.com/CloudMan6/p/7762369.html   将容器日志发送到 STDOUT 和 STDERR 是Docker 的默认日志行为.实际上,Do ...

随机推荐

  1. 【QCustomPlot】性能提升之修改源码(版本 V2.x.x)

    说明 使用 QCustomPlot 绘图库的过程中,有时候觉得原生的功能不太够用,比如它没有曲线平滑功能:有时候又觉得更新绘图数据时逐个赋值效率太低,如果能直接操作内存就好了:还有时候希望减轻 CPU ...

  2. Python网页开发神器fac 0.2.9、fuc 0.1.29新版本更新内容介绍

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components fuc项目地址:https://github.com/CNFeffery/fe ...

  3. 混合编程python与C++

    上个版本: 只是用到ctypes进行传输, 这次将python服务端更改为C++服务端,方便后续维护. 本文实现功能: python传输图片给C++, C++接受图片后对图片进行处理,并将结果返回给p ...

  4. 全同态(Fully Homomorphic Encryption, FHE)和半同态(Partially Homomorphic Encryption, PHE)介绍

    全同态(Fully Homomorphic Encryption, FHE)和半同态(Partially Homomorphic Encryption, PHE) 全同态加密(FHE)是指一种加密方案 ...

  5. 「有问必答」Go如何优雅的对时间进行格式化?

    昨天 交流群 关于「Go如何优雅的对时间进行格式化?」展开了讨论: 咋搞捏? 如何在不循环的情况下,把列表数据结构体的时间修改为咱们习惯的格式,而不是UTC模式 我们要实现的效果如下: created ...

  6. prometheus安装和使用记录

    Getting started | Prometheus Configuration | Prometheus Download | Prometheus Download Grafana | Gra ...

  7. 国产MCU兆易GD32实现矩阵按键扫描

    一.矩阵键盘     为了减少I/O口的占用,通常将按键排列成矩阵形式.在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接.使用8个io口来进行16个按键的控制读取,可以减 ...

  8. C++ 核心指南之资源管理(中)

    C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup.Herb Sutter 等顶尖 C++ 专家创建的一份 C++ 指南.规则及最佳实践.旨在帮助大家正 ...

  9. selenium实战学习--定位元素

    from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.common import ...

  10. 如何在docker中创建postgresql数据库并使用prisma进行连接

    在docker中创建postgresql # docker 创建 postgres docker pull postgres # 创建容器 # ~/study/db/postgres 是本地的文件映射 ...