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. weex项目使用iconfont 字体图标

    一.使用本地字体图标 1.在 https://www.iconfont.cn/manage/index 注册自己的账号 2.创建自己的项目 3.添加自己需要的图标,并将其下载到本地 4.入口页面引入 ...

  2. .NET周报 【5月第3期 2023-05-21】

    国内文章 C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS) https://www.cnblogs.com/shawshank/p/17390248.html 信创是现阶段 ...

  3. 9.3. Hibernate框架

    Hibernate是一个开源的持久层框架,它可以帮助我们将Java对象映射到数据库表中,并实现对象的持久化操作.Hibernate提供了丰富的API,可以方便地进行CRUD(增删改查)操作,而无需手动 ...

  4. Python进行大文件的备份

    Python进行大文件的备份的思路:每次仅从原文件中读取指定字符的内容后写入新文件,然后循环操作. def copy_big_file(): # 接收用户输入的文件名 old_file = input ...

  5. selenium-wire简介

    一.简介 以下来自chatGPT回答: selenium-wire是一个基于selenium的Python库,它扩展了selenium的功能,使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和 ...

  6. .net 项目静态文件自动压缩打包

    打包工具选型 在 ASP.NET MVC 时代,我们常使用 BundleCollection 设置需要打包压缩的 js 和 css 文件,运行时框架会自动处理打包压缩过程并将最终结果传入响应. ASP ...

  7. 【C#/.NET】xUnit和Moq实现TDD

    ​  目录 前置条件 Moq xUnit TDD 实践 创建项目 红灯 绿灯 重构 单元测试一些最佳实践 总结 前置条件 Moq 安装Moq包 Install-Package Moq Moq是一个Mo ...

  8. pcie reset系列之 内核框架

    FLR是pci reset的一种. 关于FLR的寄存器操作比较简单, 相关的寄存器有: 配置空间里device cap里的FLR capability bit, 这个表示设备是否支持FLR. 配置空间 ...

  9. 编译器设计与实现:Java编译器并发编程模型实现多核CPU和Web应用程序

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  10. 2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1]。 请问

    2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m.n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1 ...