首页 > 其他分享 >minio 支持object搜索方案

minio 支持object搜索方案

时间:2023-09-08 11:46:33浏览次数:38  
标签:minio mc -- object ROOTNAME cogent 搜索 event

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中的数据:

image-20230908110237965

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,mc,--,object,ROOTNAME,cogent,搜索,event
From: https://www.cnblogs.com/keboom/p/17687178.html

相关文章

  • 罗技M720删除蓝牙连接后,蓝牙搜索列表找不到设备
    原因因误删蓝牙鼠标(罗技M720)设备,再次添加蓝牙设备时蓝牙列表找不到设备(罗技M720)。蓝牙配对1、确保 M720已开启2、按住显示屏下方的切换按钮3秒钟(所选通道上的LED将开始快速闪烁)3、此时再打开蓝牙列表就可以发现鼠标了 找不到设备或连接不上的问题有很多种,具体情况要具体分析......
  • 关于 Google 搜索运作方式的解析
    Google搜索是一款全自动搜索引擎,会使用名为“网页抓取工具”的软件定期探索网络,找出可添加到Google索引中的网页。实际上,Google搜索结果中收录的大多数网页都不是手动提交的,而是我们的网页抓取工具在探索网络时找到并自动添加的。本文档从网站的角度介绍了Google搜索运作方式......
  • a different object with the same identifier value was already associated with th
    数据库更新记录报错:adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession:[com.miracle.dm.sysmgr.user.model.OrgUserProInfo#4028800b269cc2f301269cc959960007];nestedexceptionisorg.hibernate.NonUniqueObjectException:adiffe......
  • 《自己动手建搜索引擎》日志分析类代码解析与修正为兼容lucene3.0.2
    搜索日志是用来分析用户搜索行为和信息需求的重要依据。一般记录如下信息:搜索关键字用户来源IP本次搜索返回结果数量搜索时间其他需要记录的应用相关信息  例如:搜索时间|日志类型|搜索类型|搜索关键字|IP地址|本次搜索返回结果数量, 存放日志文件内容如下:2008-04......
  • ElasticSearch系列——查询、Python使用、Django/Flask集成、集群搭建,数据分片、位置
    @目录Elasticsearch之-查询一基本查询1.1match查询1.2term查询1.3terms查询1.4控制查询的返回数量(分页)1.5match_all查询1.6match_phrase查询1.7multi_match1.8指定返回的字段1.9sort结果排序1.10range范围查询1.11wildcard查询二组合查询2.1bool查询2.2简单过滤......
  • 阿里巴巴API接口解析,实现按关键字搜索商品
    要解析阿里巴巴API接口并实现按关键字搜索商品,你需要进行以下步骤:了解阿里巴巴API接口文档:访问阿里巴巴开放平台,找到API文档,了解阿里巴巴提供的API接口以及相关的参数、返回值等信息。注册开发者账号:在阿里巴巴开放平台上注册一个开发者账号,并创建一个应用,获取到API权限。获取API密......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列
    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:5/\26/\13示例1:输入:[1,6,3,2,5]输出:false示例2:输入:[1,3,2,6,5]输出:truec......
  • DRF----限流、序列化、视图、条件搜索
    1.4djangorestframework(中)drf内置了很多便捷的功能,在接下来的课程中会给大家依次讲解下面的内容:快速上手请求的封装版本管理认证权限限流序列化视图条件搜索分页路由解析器 6.限流限流,限制用户访问频率,例如:用户1分钟最多访问100次......
  • 黑客利用 MinIO 存储系统漏洞危害服务器
    据观察,未知威胁行为者利用MinIO高性能对象存储系统中的高严重性安全漏洞进行武器化,以在受影响的服务器上实现未经授权的代码执行。国际知名白帽黑客、东方联盟创始人郭盛华表示,此次入侵利用了公开可用的漏洞利用链对MinIO实例进行后门处理,其中包括CVE-2023-28432(CVSS分数:7.5......
  • YOLOV5 训练好模型测试时出现问题:AttributeError: ‘Upsample‘ object has no attrib
    在使用YOLOV5训练好模型测试时出现问题:AttributeError:‘Upsample’objecthasnoattribute'recompute_scale_factor’的快速解决方法。解决方法一:有些博主说降低torchhe和torchvision版本,比如上图所示我的torch版本1.11.0torchvision版本0.10.2,torch版本降低到版本1.9.1,torc......