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. Python生成器深度解析:构建强大的数据处理管道

    前言 生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素.它在处理大规模数据集.实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用 ...

  2. 原来kafka也有事务啊,再也不担心消息不一致了

    前言 现在假定这么一个业务场景,从kafka中的topic获取消息数据,经过一定加工处理后,发送到另外一个topic中,要求整个过程消息不能丢失,也不能重复发送,即实现端到端的Exactly-Once ...

  3. MySQL锁表解锁表

    CREATE TABLE t1 ( id int(11) NOT NULL, val varchar(10) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoD ...

  4. 从源码级深入剖析Tomcat类加载原理

    众所周知,Java中默认的类加载器是以父子关系存在的,实现了双亲委派机制进行类的加载,在前文中,我们提到了,双亲委派机制的设计是为了保证类的唯一性,这意味着在同一个JVM中是不能加载相同类库的不同版本 ...

  5. JVM之指针压缩

    做java开发的同学一般都比较熟悉JVM,那么关于指针压缩这块内容是不是也了解呢,不熟悉的小伙伴往下看吧. 首先说明,本文涉及的JDK版本是1.8,JVM虚拟机是64位的HotSpot实现为准. ja ...

  6. 1.7 完善自定位ShellCode后门

    在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实 ...

  7. UI自动化 --- UI Automation 基础详解

    引言 上一篇文章UI自动化 --- 微软UI Automation中,介绍了UI Automation能够做什么,且借助 Inspect.exe 工具完成了一个模拟点击操作的Demo,文章结尾也提出了 ...

  8. Hexo、Typecho博客添加旅行足迹网页

    本文部署的足迹地图,地址如下: http://www.aomanhao.top/index.php/archives/183/ jVectorMap JVectorMap 是一个优秀的.兼容性强的 j ...

  9. 从零玩转系列之SpringBoot3-核心原理

    一.简介 1.前置知识 ● Java17 ● Spring.SpringMVC.MyBatis ● Maven.IDEA 2.环境要求 环境&工具 版本(or later) SpringBoo ...

  10. PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open Fixed-lay ...