storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/docs/zh_CN/bucket/notifications/README.md (about) 1 # MinIO存储桶通知指南 [](https://slack.min.io) 2 3 可以使用存储桶事件通知来监视存储桶中对象上发生的事件。 MinIO服务器支持的事件类型是 4 5 | Supported Event Types | | | 6 | :---------------------- | ------------------------------------------ | ------------------------ | 7 | `s3:ObjectCreated:Put` | `s3:ObjectCreated:CompleteMultipartUpload` | `s3:ObjectAccessed:Head` | 8 | `s3:ObjectCreated:Post` | `s3:ObjectRemoved:Delete` | | 9 | `s3:ObjectCreated:Copy` | `s3:ObjectAccessed:Get` | | 10 11 使用诸如`mc`之类的客户端工具通过[`event`子命令](https://docs.min.io/cn/minio-client-complete-guide#events)设置和监听事件通知。也可以使用MinIO SDK [`BucketNotification` APIs](https://docs.min.io/cn/golang-client-api-reference#SetBucketNotification) 。MinIO发送的用于发布事件的通知消息是JSON格式的,JSON结构参考[这里](https://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html)。 12 13 存储桶事件可以发布到以下目标: 14 15 | 支持的通知目标 | | | 16 | :-------------------------------- | --------------------------- | ------------------------------- | 17 | [`AMQP`](#AMQP) | [`Redis`](#Redis) | [`MySQL`](#MySQL) | 18 | [`MQTT`](#MQTT) | [`NATS`](#NATS) | [`Apache Kafka`](#apache-kafka) | 19 | [`Elasticsearch`](#Elasticsearch) | [`PostgreSQL`](#PostgreSQL) | [`Webhooks`](#webhooks) | 20 | [`NSQ`](#NSQ) | | | 21 22 ## 前提条件 23 24 * 从[这里](https://docs.min.io/cn/minio-quickstart-guide)下载并安装MinIO Server。 25 * 从[这里](https://docs.min.io/cn/minio-client-quickstart-guide)下载并安装MinIO Client。 26 27 ``` 28 $ mc admin config get myminio | grep notify 29 notify_webhook publish bucket notifications to webhook endpoints 30 notify_amqp publish bucket notifications to AMQP endpoints 31 notify_kafka publish bucket notifications to Kafka endpoints 32 notify_mqtt publish bucket notifications to MQTT endpoints 33 notify_nats publish bucket notifications to NATS endpoints 34 notify_nsq publish bucket notifications to NSQ endpoints 35 notify_mysql publish bucket notifications to MySQL databases 36 notify_postgres publish bucket notifications to Postgres databases 37 notify_elasticsearch publish bucket notifications to Elasticsearch endpoints 38 notify_redis publish bucket notifications to Redis datastores 39 ``` 40 41 > 注意: 42 > - '\*' 结尾的参数是必填的. 43 > - '\*' 结尾的值,是参数的的默认值. 44 > - 当通过环境变量配置的时候, `:name` 可以通过这样 `MINIO_NOTIFY_WEBHOOK_ENABLE_<name>` 的格式指定. 45 46 <a name="AMQP"></a> 47 ## 使用AMQP发布MinIO事件 48 49 从[这里](https://www.rabbitmq.com/)下载安装RabbitMQ。 50 51 ### 第一步: 将AMQP endpoint添加到MinIO 52 53 AMQP的配置信息位于`notify_amqp`这个顶级的key下。在这里为你的AMQP实例创建配置信息键值对。key是你的AMQP endpoint的名称,value是下面表格中列列的键值对集合。 54 55 ``` 56 KEY: 57 notify_amqp[:name] 发布存储桶通知到AMQP endpoints 58 59 ARGS: 60 url* (url) AMQP server endpoint, 例如. `amqp://myuser:mypassword@localhost:5672` 61 exchange (string) AMQP exchange名称 62 exchange_type (string) AMQP exchange类型 63 routing_key (string) 发布用的routing key 64 mandatory (on|off) 当设置为'off'的时候,忽略未发送的消息(默默的),默认是 'on' 65 durable (on|off) 当设置为'on'的时候,表示持久化队列,broker重启后也会存在, 默认是 'off' 66 no_wait (on|off) 当设置为'on'的时候,传递非阻塞的消息, 默认是 'off' 67 internal (on|off) 设置为'on'表示exchange是rabbitmq内部使用 68 auto_deleted (on|off) 当没有使用者时,设置为'on'时自动删除队列 69 delivery_mode (number) '1'代表非持久队列,'2'代表持久队列 70 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 71 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 72 comment (sentence) 可选的注释 73 ``` 74 75 或者通过环境变量(配置说明参考上面) 76 77 ``` 78 KEY: 79 notify_amqp[:name] publish bucket notifications to AMQP endpoints 80 81 ARGS: 82 MINIO_NOTIFY_AMQP_ENABLE* (on|off) enable notify_amqp target, default is 'off' 83 MINIO_NOTIFY_AMQP_URL* (url) AMQP server endpoint e.g. `amqp://myuser:mypassword@localhost:5672` 84 MINIO_NOTIFY_AMQP_EXCHANGE (string) name of the AMQP exchange 85 MINIO_NOTIFY_AMQP_EXCHANGE_TYPE (string) AMQP exchange type 86 MINIO_NOTIFY_AMQP_ROUTING_KEY (string) routing key for publishing 87 MINIO_NOTIFY_AMQP_MANDATORY (on|off) quietly ignore undelivered messages when set to 'off', default is 'on' 88 MINIO_NOTIFY_AMQP_DURABLE (on|off) persist queue across broker restarts when set to 'on', default is 'off' 89 MINIO_NOTIFY_AMQP_NO_WAIT (on|off) non-blocking message delivery when set to 'on', default is 'off' 90 MINIO_NOTIFY_AMQP_INTERNAL (on|off) set to 'on' for exchange to be not used directly by publishers, but only when bound to other exchanges 91 MINIO_NOTIFY_AMQP_AUTO_DELETED (on|off) auto delete queue when set to 'on', when there are no consumers 92 MINIO_NOTIFY_AMQP_DELIVERY_MODE (number) set to '1' for non-persistent or '2' for persistent queue 93 MINIO_NOTIFY_AMQP_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 94 MINIO_NOTIFY_AMQP_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 95 MINIO_NOTIFY_AMQP_COMMENT (sentence) optionally add a comment to this setting 96 ``` 97 98 MinIO支持持久事件存储。持久存储将在AMQP broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 99 100 更新配置前, 可以使用`mc admin config get notify_amqp`命令获取`notify_amqp`的当前配置. 101 102 ```sh 103 $ mc admin config get myminio/ notify_amqp 104 notify_amqp:1 delivery_mode="0" exchange_type="" no_wait="off" queue_dir="" queue_limit="0" url="" auto_deleted="off" durable="off" exchange="" internal="off" mandatory="off" routing_key="" 105 ``` 106 107 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs::1:amqp`。 108 109 RabbitMQ的示例配置如下所示: 110 111 ```sh 112 $ mc admin config set myminio/ notify_amqp:1 exchange="bucketevents" exchange_type="fanout" mandatory="false" no_wait="false" url="amqp://myuser:mypassword@localhost:5672" auto_deleted="false" delivery_mode="0" durable="false" internal="false" routing_key="bucketlogs" 113 ``` 114 115 MinIO支持[RabbitMQ](https://www.rabbitmq.com/)中所有的exchange类型,这次我们采用 `fanout` exchange。 116 117 请注意, 根据你的需要,你可以添加任意多个AMQP server endpoint,只要提供AMQP实例的标识符(如上例中的“ 1”)和每个实例配置参数的信息即可。 118 119 ### 第二步: 使用MinIO客户端启用bucket通知 120 121 如果一个JPEG图片上传到`myminio` server里的`images` 存储桶或者从桶中删除,一个存储桶事件通知就会被触发。 这里ARN值是`arn:minio:sqs:us-east-1:1:amqp`,想了解更多关于ARN的信息,请参考[AWS ARN](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) 文档. 122 123 ``` 124 mc mb myminio/images 125 mc event add myminio/images arn:minio:sqs::1:amqp --suffix .jpg 126 mc event list myminio/images 127 arn:minio:sqs::1:amqp s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 128 ``` 129 130 ### 第三步:在RabbitMQ上进行验证 131 132 下面将要出场的python程序会在exchange `bucketevents` 上等待队列,并在控制台中输出事件通知。我们使用的是[Pika Python Client](https://www.rabbitmq.com/tutorials/tutorial-three-python.html) 来实现此功能。 133 134 ```py 135 #!/usr/bin/env python 136 import pika 137 138 connection = pika.BlockingConnection(pika.ConnectionParameters( 139 host='localhost')) 140 channel = connection.channel() 141 142 channel.exchange_declare(exchange='bucketevents', 143 exchange_type='fanout') 144 145 result = channel.queue_declare(exclusive=False) 146 queue_name = result.method.queue 147 148 channel.queue_bind(exchange='bucketevents', 149 queue=queue_name) 150 151 print(' [*] Waiting for logs. To exit press CTRL+C') 152 153 def callback(ch, method, properties, body): 154 print(" [x] %r" % body) 155 156 channel.basic_consume(callback, 157 queue=queue_name, 158 no_ack=False) 159 160 channel.start_consuming() 161 ``` 162 163 执行示例中的python程序来观察RabbitMQ事件。 164 165 ```py 166 python rabbit.py 167 ``` 168 169 另开一个terminal终端并上传一张JPEG图片到``images``存储桶。 170 171 ``` 172 mc cp myphoto.jpg myminio/images 173 ``` 174 175 一旦上传完毕,你应该会通过RabbitMQ收到下面的事件通知。 176 177 ```py 178 python rabbit.py 179 ‘{“Records”:[{“eventVersion”:”2.0",”eventSource”:”aws:s3",”awsRegion”:”us-east-1",”eventTime”:”2016–09–08T22:34:38.226Z”,”eventName”:”s3:ObjectCreated:Put”,”userIdentity”:{“principalId”:”minio”},”requestParameters”:{“sourceIPAddress”:”10.1.10.150:44576"},”responseElements”:{},”s3":{“s3SchemaVersion”:”1.0",”configurationId”:”Config”,”bucket”:{“name”:”images”,”ownerIdentity”:{“principalId”:”minio”},”arn”:”arn:aws:s3:::images”},”object”:{“key”:”myphoto.jpg”,”size”:200436,”sequencer”:”147279EAF9F40933"}}}],”level”:”info”,”msg”:””,”time”:”2016–09–08T15:34:38–07:00"}\n 180 ``` 181 182 <a name="MQTT"></a> 183 ## 使用MQTT发布MinIO事件 184 185 从 [这里](https://mosquitto.org/)安装MQTT Broker。 186 187 ### 第一步: 添加MQTT endpoint到MinIO 188 189 MQTT的配置信息位于`notify_mqtt`这个顶级的key下。在这里为你的MQTT实例创建配置信息键值对。key是你的MQTT endpoint的名称,value是下面表格中列的键值对集合。 190 191 ``` 192 KEY: 193 notify_mqtt[:name] 发布存储桶通知到MQTT endpoints 194 195 ARGS: 196 broker* (uri) MQTT服务 endpoint,例如 `tcp://localhost:1883` 197 topic* (string) 要发布的MQTT topic名称 198 username (string) MQTT 用户名 199 password (string) MQTT 密码 200 qos (number) 设置服务质量的级别, 默认是 '0' 201 keep_alive_interval (duration) MQTT连接的保持活动间隔(s,m,h,d) 202 reconnect_interval (duration) MQTT连接的重新连接间隔(s,m,h,d) 203 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 204 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 205 comment (sentence) 可选的注释 206 ``` 207 208 或者通过环境变量(配置说明参考上面) 209 210 ``` 211 KEY: 212 notify_mqtt[:name] publish bucket notifications to MQTT endpoints 213 214 ARGS: 215 MINIO_NOTIFY_MQTT_ENABLE* (on|off) enable notify_mqtt target, default is 'off' 216 MINIO_NOTIFY_MQTT_BROKER* (uri) MQTT server endpoint e.g. `tcp://localhost:1883` 217 MINIO_NOTIFY_MQTT_TOPIC* (string) name of the MQTT topic to publish 218 MINIO_NOTIFY_MQTT_USERNAME (string) MQTT username 219 MINIO_NOTIFY_MQTT_PASSWORD (string) MQTT password 220 MINIO_NOTIFY_MQTT_QOS (number) set the quality of service priority, defaults to '0' 221 MINIO_NOTIFY_MQTT_KEEP_ALIVE_INTERVAL (duration) keep-alive interval for MQTT connections in s,m,h,d 222 MINIO_NOTIFY_MQTT_RECONNECT_INTERVAL (duration) reconnect interval for MQTT connections in s,m,h,d 223 MINIO_NOTIFY_MQTT_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 224 MINIO_NOTIFY_MQTT_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 225 MINIO_NOTIFY_MQTT_COMMENT (sentence) optionally add a comment to this setting 226 ``` 227 228 MinIO支持持久事件存储。持久存储将在MQTT broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 229 230 更新配置前, 可以使用`mc admin config get`命令获取当前配置. 231 232 ```sh 233 $ mc admin config get myminio/ notify_mqtt 234 notify_mqtt:1 broker="" password="" queue_dir="" queue_limit="0" reconnect_interval="0s" keep_alive_interval="0s" qos="0" topic="" username="" 235 ``` 236 237 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs::1:mqtt`。 238 239 ```sh 240 $ mc admin config set myminio notify_mqtt:1 broker="tcp://localhost:1883" password="" queue_dir="" queue_limit="0" reconnect_interval="0s" keep_alive_interval="0s" qos="1" topic="minio" username="" 241 ``` 242 243 更新完配置文件后,重启MinIO Server让配置生效。如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs:us-east-1:1:mqtt`。 244 245 MinIO支持任何支持MQTT 3.1或3.1.1的MQTT服务器,并且可以使用`tcp://`, `tls://`, or `ws://`通过TCP,TLS或Websocket连接,作为代理URL的方案。 更多信息,请参考 [Go Client](http://www.eclipse.org/paho/clients/golang/)。 246 247 请注意, 根据你的需要,你可以添加任意多个MQTT server endpoint,只要提供MQTT实例的标识符(如上例中的“ 1”)和每个实例配置参数的信息即可。 248 249 ### 第二步: 使用MinIO客户端启用bucket通知 250 251 如果一个JPEG图片上传到`myminio` server里的`images` 存储桶或者从桶中删除,一个存储桶事件通知就会被触发。 这里ARN值是`arn:minio:sqs::1:mqtt`。 252 253 ``` 254 mc mb myminio/images 255 mc event add myminio/images arn:minio:sqs::1:mqtt --suffix .jpg 256 mc event list myminio/images 257 arn:minio:sqs::1:amqp s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 258 ``` 259 260 ### 第三步:验证MQTT 261 262 下面的python程序等待mqtt topic `/minio`,并在控制台上打印事件通知。 我们使用[paho-mqtt](https://pypi.python.org/pypi/paho-mqtt/)库来执行此操作。 263 264 ```py 265 #!/usr/bin/env python3 266 from __future__ import print_function 267 import paho.mqtt.client as mqtt 268 269 # This is the Subscriber 270 271 def on_connect(client, userdata, flags, rc): 272 print("Connected with result code "+str(rc)) 273 # qos level is set to 1 274 client.subscribe("minio", 1) 275 276 def on_message(client, userdata, msg): 277 print(msg.payload) 278 279 # client_id is a randomly generated unique ID for the mqtt broker to identify the connection. 280 client = mqtt.Client(client_id="myclientid",clean_session=False) 281 282 client.on_connect = on_connect 283 client.on_message = on_message 284 285 client.connect("localhost",1883,60) 286 client.loop_forever() 287 ``` 288 289 执行这个python示例程序来观察MQTT事件。 290 291 ```py 292 python mqtt.py 293 ``` 294 295 打开一个新的terminal终端并上传一张JPEG图片到``images`` 存储桶。 296 297 ``` 298 mc cp myphoto.jpg myminio/images 299 ``` 300 301 一旦上传完毕,你应该会通过MQTT收到下面的事件通知。 302 303 ```py 304 python mqtt.py 305 {“Records”:[{“eventVersion”:”2.0",”eventSource”:”aws:s3",”awsRegion”:”",”eventTime”:”2016–09–08T22:34:38.226Z”,”eventName”:”s3:ObjectCreated:Put”,”userIdentity”:{“principalId”:”minio”},”requestParameters”:{“sourceIPAddress”:”10.1.10.150:44576"},”responseElements”:{},”s3":{“s3SchemaVersion”:”1.0",”configurationId”:”Config”,”bucket”:{“name”:”images”,”ownerIdentity”:{“principalId”:”minio”},”arn”:”arn:aws:s3:::images”},”object”:{“key”:”myphoto.jpg”,”size”:200436,”sequencer”:”147279EAF9F40933"}}}],”level”:”info”,”msg”:””,”time”:”2016–09–08T15:34:38–07:00"} 306 ``` 307 308 <a name="Elasticsearch"></a> 309 ## 使用Elasticsearch发布MinIO事件 310 311 安装 [Elasticsearch](https://www.elastic.co/downloads/elasticsearch) 。 312 313 这个通知目标支持两种格式: _namespace_ 和 _access_。 314 315 如果使用的是 _namespace_ 格式, MinIO将桶中的对象与索引中的文档进行同步。对于MinIO中的每个事件,服务器都会使用事件中的存储桶和对象名称作为文档ID创建一个文档。事件的其他细节存储在document的正文中。因此,如果一个已经存在的对象在MinIO中被覆盖,在ES中的相对应的document也会被更新。如果一个对象被删除,相对应的document也会从index中删除。 316 317 如果使用的是 _access_ 格式,MinIO将事件作为document附加到ES的index中。对于每个事件,将带有事件详细信息的文档(文档的时间戳设置为事件的时间戳)附加到索引。这个文档的ID是由ES随机生成的。在 _access_ 格式下,不会有文档被删除或者修改。 318 319 下面的步骤展示的是在`namespace`格式下,如何使用通知目标。另一种格式和这个很类似,为了不让你们说我墨迹,就不再赘述了。 320 321 322 ### 第一步:确保至少满足最低要求 323 324 MinIO要求使用的是ES 5.X系统版本。如果使用的是低版本的ES,也没关系,ES官方支持升级迁移,详情请看[这里](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html)。 325 326 ### 第二步:把ES集成到MinIO中 327 328 Elasticsearch的配置信息位于`notify_elasticsearch`这个顶级的key下。在这里为你的Elasticsearch实例创建配置信息键值对。key是你的Elasticsearch endpoint的名称,value是下面表格中列列的键值对集合。 329 330 ``` 331 KEY: 332 notify_elasticsearch[:name] 发布存储桶通知到Elasticsearch endpoints 333 334 ARGS: 335 url* (url) Elasticsearch服务器的地址,以及可选的身份验证信息 336 index* (string) 存储/更新事件的Elasticsearch索引,索引是自动创建的 337 format* (namespace*|access) 是`namespace` 还是 `access`,默认是 'namespace' 338 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 339 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 340 comment (sentence) 可选的注释 341 ``` 342 343 或者通过环境变量(配置说明参考上面) 344 345 ``` 346 KEY: 347 notify_elasticsearch[:name] publish bucket notifications to Elasticsearch endpoints 348 349 ARGS: 350 MINIO_NOTIFY_ELASTICSEARCH_ENABLE* (on|off) enable notify_elasticsearch target, default is 'off' 351 MINIO_NOTIFY_ELASTICSEARCH_URL* (url) Elasticsearch server's address, with optional authentication info 352 MINIO_NOTIFY_ELASTICSEARCH_INDEX* (string) Elasticsearch index to store/update events, index is auto-created 353 MINIO_NOTIFY_ELASTICSEARCH_FORMAT* (namespace*|access) 'namespace' reflects current bucket/object list and 'access' reflects a journal of object operations, defaults to 'namespace' 354 MINIO_NOTIFY_ELASTICSEARCH_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 355 MINIO_NOTIFY_ELASTICSEARCH_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 356 MINIO_NOTIFY_ELASTICSEARCH_COMMENT (sentence) optionally add a comment to this setting 357 ``` 358 359 比如: `http://localhost:9200` 或者带有授权信息的 `http://elastic:MagicWord@127.0.0.1:9200` 360 361 MinIO支持持久事件存储。持久存储将在Elasticsearch broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 362 363 如果Elasticsearch启用了身份验证, 凭据可以通过格式为`PROTO://USERNAME:PASSWORD@ELASTICSEARCH_HOST:PORT`的`url`参数,提供给MinIO。 364 365 更新配置前,可以通过`mc admin config get`命令获取当前配置。 366 367 ```sh 368 $ mc admin config get myminio/ notify_elasticsearch 369 notify_elasticsearch:1 queue_limit="0" url="" format="namespace" index="" queue_dir="" 370 ``` 371 372 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似`SQS ARNs: arn:minio:sqs::1:elasticsearch`。 373 374 请注意, 根据你的需要,你可以添加任意多个ES server endpoint,只要提供ES实例的标识符(如上例中的“ 1”)和每个实例配置参数的信息即可。 375 376 ### 第三步:使用MinIO客户端启用bucket通知 377 378 我们现在可以在一个叫`images`的存储桶上开启事件通知。一旦有文件被创建或者覆盖,一个新的ES的document会被创建或者更新到之前咱配的index里。如果一个已经存在的对象被删除,这个对应的document也会从index中删除。因此,这个ES index里的行,就映射着`images`存储桶里的`.jpg`对象。 379 380 要配置这种存储桶通知,我们需要用到前面步骤MinIO输出的ARN信息。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 381 382 有了`mc`这个工具,这些配置信息很容易就能添加上。假设咱们的MinIO服务别名叫`myminio`,可执行下列脚本: 383 384 ``` 385 mc mb myminio/images 386 mc event add myminio/images arn:minio:sqs::1:elasticsearch --suffix .jpg 387 mc event list myminio/images 388 arn:minio:sqs::1:elasticsearch s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 389 ``` 390 391 ### 第四步:验证Elasticsearch 392 393 上传一张JPEG图片到`images` 存储桶。 394 395 ``` 396 mc cp myphoto.jpg myminio/images 397 ``` 398 399 使用curl查看`minio_events` index中的内容。 400 401 ``` 402 $ curl "http://localhost:9200/minio_events/_search?pretty=true" 403 { 404 "took" : 40, 405 "timed_out" : false, 406 "_shards" : { 407 "total" : 5, 408 "successful" : 5, 409 "failed" : 0 410 }, 411 "hits" : { 412 "total" : 1, 413 "max_score" : 1.0, 414 "hits" : [ 415 { 416 "_index" : "minio_events", 417 "_type" : "event", 418 "_id" : "images/myphoto.jpg", 419 "_score" : 1.0, 420 "_source" : { 421 "Records" : [ 422 { 423 "eventVersion" : "2.0", 424 "eventSource" : "minio:s3", 425 "awsRegion" : "", 426 "eventTime" : "2017-03-30T08:00:41Z", 427 "eventName" : "s3:ObjectCreated:Put", 428 "userIdentity" : { 429 "principalId" : "minio" 430 }, 431 "requestParameters" : { 432 "sourceIPAddress" : "127.0.0.1:38062" 433 }, 434 "responseElements" : { 435 "x-amz-request-id" : "14B09A09703FC47B", 436 "x-minio-origin-endpoint" : "http://192.168.86.115:9000" 437 }, 438 "s3" : { 439 "s3SchemaVersion" : "1.0", 440 "configurationId" : "Config", 441 "bucket" : { 442 "name" : "images", 443 "ownerIdentity" : { 444 "principalId" : "minio" 445 }, 446 "arn" : "arn:aws:s3:::images" 447 }, 448 "object" : { 449 "key" : "myphoto.jpg", 450 "size" : 6474, 451 "eTag" : "a3410f4f8788b510d6f19c5067e60a90", 452 "sequencer" : "14B09A09703FC47B" 453 } 454 }, 455 "source" : { 456 "host" : "127.0.0.1", 457 "port" : "38062", 458 "userAgent" : "MinIO (linux; amd64) minio-go/2.0.3 mc/2017-02-15T17:57:25Z" 459 } 460 } 461 ] 462 } 463 } 464 ] 465 } 466 } 467 ``` 468 469 这个输出显示在ES中为这个事件创建了一个document。 470 471 这里我们可以看到这个document ID就是存储桶和对象的名称。如果用的是`access`格式,这个document ID就是由ES随机生成的。 472 473 <a name="Redis"></a> 474 ## 使用Redis发布MinIO事件 475 476 安装 [Redis](http://redis.io/download)。为了演示,我们将数据库密码设为"yoursecret"。 477 478 这种通知目标支持两种格式: _namespace_ 和 _access_。 479 480 如果用的是 _namespacee_ 格式,MinIO将存储桶里的对象同步成Redis hash中的条目。对于每一个条目,对应一个存储桶里的对象,其key都被设为"存储桶名称/对象名称",value都是一个有关这个MinIO对象的JSON格式的事件数据。如果对象更新或者删除,hash中对象的条目也会相应的更新或者删除。 481 482 如果使用的是 _access_ ,MinIO使用[RPUSH](https://redis.io/commands/rpush)将事件添加到list中。这个list中每一个元素都是一个JSON格式的list,这个list中又有两个元素,第一个元素是时间戳的字符串,第二个元素是一个含有在这个存储桶上进行操作的事件数据的JSON对象。在这种格式下,list中的元素不会更新或者删除。 483 484 下面的步骤展示如何在`namespace`和`access`格式下使用通知目标。 485 486 ### 第一步:集成Redis到MinIO 487 488 The MinIO server的配置文件以json格式存储在后端。Redis的配置信息位于`notify_redis`这个顶级的key下。在这里为你的Redis实例创建配置信息键值对。key是你的Redis endpoint的名称,value是下面表格中列的键值对集合。 489 490 ``` 491 KEY: 492 notify_redis[:name] 发布存储桶通知到Redis 493 494 ARGS: 495 address* (address) Redis服务器的地址. 例如: `localhost:6379` 496 key* (string) 存储/更新事件的Redis key, key会自动创建 497 format* (namespace*|access) 是`namespace` 还是 `access`,默认是 'namespace' 498 password (string) Redis服务器的密码 499 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 500 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 501 comment (sentence) 可选的注释说明 502 ``` 503 504 或者通过环境变量(配置说明参考上面) 505 506 ``` 507 KEY: 508 notify_redis[:name] publish bucket notifications to Redis datastores 509 510 ARGS: 511 MINIO_NOTIFY_REDIS_ENABLE* (on|off) enable notify_redis target, default is 'off' 512 MINIO_NOTIFY_REDIS_KEY* (string) Redis key to store/update events, key is auto-created 513 MINIO_NOTIFY_REDIS_FORMAT* (namespace*|access) 'namespace' reflects current bucket/object list and 'access' reflects a journal of object operations, defaults to 'namespace' 514 MINIO_NOTIFY_REDIS_PASSWORD (string) Redis server password 515 MINIO_NOTIFY_REDIS_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 516 MINIO_NOTIFY_REDIS_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 517 MINIO_NOTIFY_REDIS_COMMENT (sentence) optionally add a comment to this setting 518 ``` 519 520 MinIO支持持久事件存储。持久存储将在Redis broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 521 522 更新配置前,可以通过`mc admin config get`命令获取当前配置。 523 524 ```sh 525 $ mc admin config get myminio/ notify_redis 526 notify_redis:1 address="" format="namespace" key="" password="" queue_dir="" queue_limit="0" 527 ``` 528 529 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似`SQS ARNs: arn:minio:sqs::1:redis`。 530 531 ```sh 532 $ mc admin config set myminio/ notify_redis:1 address="127.0.0.1:6379" format="namespace" key="bucketevents" password="yoursecret" queue_dir="" queue_limit="0" 533 ``` 534 535 请注意, 根据你的需要,你可以添加任意多个Redis server endpoint,只要提供Redis实例的标识符(如上例中的“ 1”)和每个实例配置参数的信息即可。 536 537 ### 第二步: 使用MinIO客户端启用bucket通知 538 539 我们现在可以在一个叫`images`的存储桶上开启事件通知。当一个JPEG文件被创建或者覆盖,一个新的key会被创建,或者一个已经存在的key就会被更新到之前配置好的redis hash里。如果一个已经存在的对象被删除,这个对应的key也会从hash中删除。因此,这个Redis hash里的行,就映射着`images`存储桶里的`.jpg`对象。 540 541 要配置这种存储桶通知,我们需要用到前面步骤MinIO输出的ARN信息。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 542 543 有了`mc`这个工具,这些配置信息很容易就能添加上。假设咱们的MinIO服务别名叫`myminio`,可执行下列脚本: 544 545 ``` 546 mc mb myminio/images 547 mc event add myminio/images arn:minio:sqs::1:redis --suffix .jpg 548 mc event list myminio/images 549 arn:minio:sqs::1:redis s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 550 ``` 551 552 ### 第三步:验证Redis 553 554 启动`redis-cli`这个Redis客户端程序来检查Redis中的内容. 运行`monitor`Redis命令将会输出在Redis上执行的每个命令的。 555 556 ``` 557 redis-cli -a yoursecret 558 127.0.0.1:6379> monitor 559 OK 560 ``` 561 562 打开一个新的terminal终端并上传一张JPEG图片到`images` 存储桶。 563 564 ``` 565 mc cp myphoto.jpg myminio/images 566 ``` 567 568 在上一个终端中,你将看到MinIO在Redis上执行的操作: 569 570 ``` 571 127.0.0.1:6379> monitor 572 OK 573 1490686879.650649 [0 172.17.0.1:44710] "PING" 574 1490686879.651061 [0 172.17.0.1:44710] "HSET" "minio_events" "images/myphoto.jpg" "{\"Records\":[{\"eventVersion\":\"2.0\",\"eventSource\":\"minio:s3\",\"awsRegion\":\"\",\"eventTime\":\"2017-03-28T07:41:19Z\",\"eventName\":\"s3:ObjectCreated:Put\",\"userIdentity\":{\"principalId\":\"minio\"},\"requestParameters\":{\"sourceIPAddress\":\"127.0.0.1:52234\"},\"responseElements\":{\"x-amz-request-id\":\"14AFFBD1ACE5F632\",\"x-minio-origin-endpoint\":\"http://192.168.86.115:9000\"},\"s3\":{\"s3SchemaVersion\":\"1.0\",\"configurationId\":\"Config\",\"bucket\":{\"name\":\"images\",\"ownerIdentity\":{\"principalId\":\"minio\"},\"arn\":\"arn:aws:s3:::images\"},\"object\":{\"key\":\"myphoto.jpg\",\"size\":2586,\"eTag\":\"5d284463f9da279f060f0ea4d11af098\",\"sequencer\":\"14AFFBD1ACE5F632\"}},\"source\":{\"host\":\"127.0.0.1\",\"port\":\"52234\",\"userAgent\":\"MinIO (linux; amd64) minio-go/2.0.3 mc/2017-02-15T17:57:25Z\"}}]}" 575 ``` 576 577 在这我们可以看到MinIO在`minio_events`这个key上执行了`HSET`命令。 578 579 如果用的是`access`格式,那么`minio_events`就是一个list,MinIO就会调用`RPUSH`添加到list中。这个list的消费者会使用`BLPOP`从list的最左端删除list元素。 580 581 <a name="NATS"></a> 582 ## 使用NATS发布MinIO事件 583 584 安装 [NATS](http://nats.io/). 585 586 ### 第一步:集成NATS到MinIO 587 588 MinIO支持持久事件存储。持久存储将在NATS broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 589 590 ``` 591 KEY: 592 notify_nats[:name] 发布存储桶通知到NATS endpoints 593 594 ARGS: 595 address* (address) NATS服务器地址,例如 '0.0.0.0:4222' 596 subject* (string) NATS 订阅的 subject 597 username (string) NATS 用户名 598 password (string) NATS 密码 599 token (string) NATS token 600 tls (on|off) 'on'代表启用TLS 601 tls_skip_verify (on|off) 跳过TLS证书验证, 默认是"on" (可信的) 602 ping_interval (duration) 客户端ping命令的时间间隔(s,m,h,d)。 默认禁止 603 streaming (on|off) 设置为'on', 代表用streaming NATS 服务器 604 streaming_async (on|off) 设置为'on', 代表启用异步发布 605 streaming_max_pub_acks_in_flight (number) 无需等待ACK即可发布的消息数 606 streaming_cluster_id (string) NATS streaming集群的唯一ID 607 cert_authority (string) 目标NATS服务器的证书链的路径 608 client_cert (string) NATS mTLS身份验证的客户端证书 609 client_key (string) NATS mTLS身份验证的客户端证书密钥 610 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 611 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 612 comment (sentence) 可选的注释说明 613 ``` 614 615 或者通过环境变量(配置说明参考上面) 616 ``` 617 KEY: 618 notify_nats[:name] publish bucket notifications to NATS endpoints 619 620 ARGS: 621 MINIO_NOTIFY_NATS_ENABLE* (on|off) enable notify_nats target, default is 'off' 622 MINIO_NOTIFY_NATS_ADDRESS* (address) NATS server address e.g. '0.0.0.0:4222' 623 MINIO_NOTIFY_NATS_SUBJECT* (string) NATS subscription subject 624 MINIO_NOTIFY_NATS_USERNAME (string) NATS username 625 MINIO_NOTIFY_NATS_PASSWORD (string) NATS password 626 MINIO_NOTIFY_NATS_TOKEN (string) NATS token 627 MINIO_NOTIFY_NATS_TLS (on|off) set to 'on' to enable TLS 628 MINIO_NOTIFY_NATS_TLS_SKIP_VERIFY (on|off) trust server TLS without verification, defaults to "on" (verify) 629 MINIO_NOTIFY_NATS_PING_INTERVAL (duration) client ping commands interval in s,m,h,d. Disabled by default 630 MINIO_NOTIFY_NATS_STREAMING (on|off) set to 'on', to use streaming NATS server 631 MINIO_NOTIFY_NATS_STREAMING_ASYNC (on|off) set to 'on', to enable asynchronous publish 632 MINIO_NOTIFY_NATS_STREAMING_MAX_PUB_ACKS_IN_FLIGHT (number) number of messages to publish without waiting for ACKs 633 MINIO_NOTIFY_NATS_STREAMING_CLUSTER_ID (string) unique ID for NATS streaming cluster 634 MINIO_NOTIFY_NATS_CERT_AUTHORITY (string) path to certificate chain of the target NATS server 635 MINIO_NOTIFY_NATS_CLIENT_CERT (string) client cert for NATS mTLS auth 636 MINIO_NOTIFY_NATS_CLIENT_KEY (string) client cert key for NATS mTLS auth 637 MINIO_NOTIFY_NATS_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 638 MINIO_NOTIFY_NATS_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 639 MINIO_NOTIFY_NATS_COMMENT (sentence) optionally add a comment to this setting 640 ``` 641 642 更新配置前, 使用`mc admin config get` 命令获取当前配置. 643 644 ```sh 645 $ mc admin config get myminio/ notify_nats 646 notify_nats:1 password="yoursecret" streaming_max_pub_acks_in_flight="10" subject="" address="0.0.0.0:4222" token="" username="yourusername" ping_interval="0" queue_limit="0" tls="off" tls_skip_verify="off" streaming_async="on" queue_dir="" streaming_cluster_id="test-cluster" streaming_enable="on" 647 ``` 648 649 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。`bucketevents` 是NATS在这个例子中使用的subject. 650 651 ```sh 652 $ mc admin config set myminio notify_nats:1 password="yoursecret" streaming_max_pub_acks_in_flight="10" subject="" address="0.0.0.0:4222" token="" username="yourusername" ping_interval="0" queue_limit="0" tls="off" streaming_async="on" queue_dir="" streaming_cluster_id="test-cluster" streaming_enable="on" 653 ``` 654 655 MinIO server还支持[NATS Streaming模式](http://nats.io/documentation/streaming/nats-streaming-intro/) ,该模式提供一些附加功能, 比如`At-least-once-delivery`, `Publisher rate limiting`。要配置MinIO server发送通知到NATS Streaming 服务器, 请参考上面的更新MinIO配置. 656 657 更多关于`cluster_id`, `client_id`的信息,请参考 [NATS documentation](https://github.com/nats-io/nats-streaming-server/blob/master/README.md). 点击[这里](https://github.com/nats-io/stan.go#publisher-rate-limiting)查看关于`maxPubAcksInflight`的说明. 658 659 ### 第二步: 使用MinIO客户端启用bucket通知 660 661 我们现在可以在一个叫`images`的存储桶上开启事件通知,一旦``myminio`` server上有文件 从``images``存储桶里删除或者上传到存储桶中,事件即被触发。在这里,ARN的值是`arn:minio:sqs::1:nats`。 更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 662 663 ``` 664 mc mb myminio/images 665 mc event add myminio/images arn:minio:sqs::1:nats --suffix .jpg 666 mc event list myminio/images 667 arn:minio:sqs::1:nats s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 668 ``` 669 670 ### 第三步:验证NATS 671 672 如果你用的是NATS server,请查看下面的示例程序来记录添加到NATS的存储桶通知。 673 674 ```go 675 package main 676 677 // Import Go and NATS packages 678 import ( 679 "log" 680 "runtime" 681 682 "github.com/nats-io/nats.go" 683 ) 684 685 func main() { 686 687 // Create server connection 688 natsConnection, _ := nats.Connect("nats://yourusername:yoursecret@localhost:4222") 689 log.Println("Connected") 690 691 // Subscribe to subject 692 log.Printf("Subscribing to subject 'bucketevents'\n") 693 natsConnection.Subscribe("bucketevents", func(msg *nats.Msg) { 694 695 // Handle the message 696 log.Printf("Received message '%s\n", string(msg.Data)+"'") 697 }) 698 699 // Keep the connection alive 700 runtime.Goexit() 701 } 702 ``` 703 704 ``` 705 go run nats.go 706 2016/10/12 06:39:18 Connected 707 2016/10/12 06:39:18 Subscribing to subject 'bucketevents' 708 ``` 709 710 打开一个新的terminal终端并上传一张JPEG图片到`images` 存储桶。 711 712 ``` 713 mc cp myphoto.jpg myminio/images 714 ``` 715 716 `nats.go`示例程序将事件通知打印到控制台。 717 718 ``` 719 go run nats.go 720 2016/10/12 06:51:26 Connected 721 2016/10/12 06:51:26 Subscribing to subject 'bucketevents' 722 2016/10/12 06:51:33 Received message '{"EventType":"s3:ObjectCreated:Put","Key":"images/myphoto.jpg","Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"","eventTime":"2016-10-12T13:51:33Z","eventName":"s3:ObjectCreated:Put","userIdentity":{"principalId":"minio"},"requestParameters":{"sourceIPAddress":"[::1]:57106"},"responseElements":{},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"images","ownerIdentity":{"principalId":"minio"},"arn":"arn:aws:s3:::images"},"object":{"key":"myphoto.jpg","size":56060,"eTag":"1d97bf45ecb37f7a7b699418070df08f","sequencer":"147CCD1AE054BFD0"}}}],"level":"info","msg":"","time":"2016-10-12T06:51:33-07:00"} 723 ``` 724 725 如果你用的是NATS Streaming server,请查看下面的示例程序来记录添加到NATS的存储桶通知。 726 727 ```go 728 package main 729 730 // Import Go and NATS packages 731 import ( 732 "fmt" 733 "runtime" 734 735 "github.com/nats-io/stan.go" 736 ) 737 738 func main() { 739 740 var stanConnection stan.Conn 741 742 subscribe := func() { 743 fmt.Printf("Subscribing to subject 'bucketevents'\n") 744 stanConnection.Subscribe("bucketevents", func(m *stan.Msg) { 745 746 // Handle the message 747 fmt.Printf("Received a message: %s\n", string(m.Data)) 748 }) 749 } 750 751 752 stanConnection, _ = stan.Connect("test-cluster", "test-client", stan.NatsURL("nats://yourusername:yoursecret@0.0.0.0:4222"), stan.SetConnectionLostHandler(func(c stan.Conn, _ error) { 753 go func() { 754 for { 755 // Reconnect if the connection is lost. 756 if stanConnection == nil || stanConnection.NatsConn() == nil || !stanConnection.NatsConn().IsConnected() { 757 stanConnection, _ = stan.Connect("test-cluster", "test-client", stan.NatsURL("nats://yourusername:yoursecret@0.0.0.0:4222"), stan.SetConnectionLostHandler(func(c stan.Conn, _ error) { 758 if c.NatsConn() != nil { 759 c.NatsConn().Close() 760 } 761 _ = c.Close() 762 })) 763 if stanConnection != nil { 764 subscribe() 765 } 766 767 } 768 } 769 770 }() 771 })) 772 773 // Subscribe to subject 774 subscribe() 775 776 // Keep the connection alive 777 runtime.Goexit() 778 } 779 780 ``` 781 782 ``` 783 go run nats.go 784 2017/07/07 11:47:40 Connected 785 2017/07/07 11:47:40 Subscribing to subject 'bucketevents' 786 ``` 787 788 打开一个新的terminal终端并上传一张JPEG图片到``images`` 存储桶。 789 790 ``` 791 mc cp myphoto.jpg myminio/images 792 ``` 793 794 `nats.go`示例程序将事件通知打印到控制台。 795 796 ``` 797 Received a message: {"EventType":"s3:ObjectCreated:Put","Key":"images/myphoto.jpg","Records":[{"eventVersion":"2.0","eventSource":"minio:s3","awsRegion":"","eventTime":"2017-07-07T18:46:37Z","eventName":"s3:ObjectCreated:Put","userIdentity":{"principalId":"minio"},"requestParameters":{"sourceIPAddress":"192.168.1.80:55328"},"responseElements":{"x-amz-request-id":"14CF20BD1EFD5B93","x-minio-origin-endpoint":"http://127.0.0.1:9000"},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"images","ownerIdentity":{"principalId":"minio"},"arn":"arn:aws:s3:::images"},"object":{"key":"myphoto.jpg","size":248682,"eTag":"f1671feacb8bbf7b0397c6e9364e8c92","contentType":"image/jpeg","userDefined":{"content-type":"image/jpeg"},"versionId":"1","sequencer":"14CF20BD1EFD5B93"}},"source":{"host":"192.168.1.80","port":"55328","userAgent":"MinIO (linux; amd64) minio-go/2.0.4 mc/DEVELOPMENT.GOGET"}}],"level":"info","msg":"","time":"2017-07-07T11:46:37-07:00"} 798 ``` 799 800 <a name="PostgreSQL"></a> 801 ## 使用PostgreSQL发布MinIO事件 802 803 > 注意:在版本RELEASE.2020-04-10T03-34-42Z之前的PostgreSQL通知用于支持以下选项: 804 > 805 > ``` 806 > host (hostname) Postgres server hostname (used only if `connection_string` is empty) 807 > port (port) Postgres server port, defaults to `5432` (used only if `connection_string` is empty) 808 > username (string) database username (used only if `connection_string` is empty) 809 > password (string) database password (used only if `connection_string` is empty) 810 > database (string) database name (used only if `connection_string` is empty) 811 > ``` 812 > 813 > 这些现在已经弃用, 如果你打算升级到*RELEASE.2020-04-10T03-34-42Z*之后的版本请确保 814 > 仅使用*connection_string*选项迁移.一旦所有服务器都升级完成,请使用以下命令更新现有的通知目标完成迁移。 815 > 816 > ``` 817 > mc admin config set myminio/ notify_postgres[:name] connection_string="host=hostname port=2832 username=psqluser password=psqlpass database=bucketevents" 818 > ``` 819 > 820 > 请确保执行此步骤,否则将无法执行PostgreSQL通知目标, 821 > 服务器升级/重启后,控制台上会显示一条错误消息,请务必遵循上述说明。 822 > 如有其他问题,请加入我们的 https://slack.min.io 823 824 安装 [PostgreSQL](https://www.postgresql.org/) 数据库。为了演示,我们将"postgres"用户的密码设为`password`,并且创建了一个`minio_events`数据库来存储事件信息。 825 826 这个通知目标支持两种格式: _namespace_ 和 _access_。 827 828 如果使用的是 _namespace_ 格式,MinIO将存储桶里的对象同步成数据库表中的行。每一行有两列:key和value。key是这个对象的存储桶名字加上对象名,value都是一个有关这个MinIO对象的JSON格式的事件数据。如果对象更新或者删除,表中相应的行也会相应的更新或者删除。 829 830 如果使用的是 _access_,MinIO将将事件添加到表里,行有两列:event_time 和 event_data。event_time是事件在MinIO server里发生的时间,event_data是有关这个MinIO对象的JSON格式的事件数据。在这种格式下,不会有行会被删除或者修改。 831 832 下面的步骤展示的是如何在`namespace`格式下使用通知目标,`_access_`差不多,不再赘述,我相信你可以触类旁通,举一反三,不要让我失望哦。 833 834 ### 第一步:确保确保至少满足最低要求 835 836 MinIO要求PostgresSQL9.5版本及以上。 MinIO用了PostgreSQL9.5引入的[`INSERT ON CONFLICT`](https://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT) (aka UPSERT) 特性,以及9.4引入的 [JSONB](https://www.postgresql.org/docs/9.4/static/datatype-json.html) 数据类型。 837 838 ### 第二步:集成PostgreSQL到MinIO 839 840 PostgreSQL的配置信息位于`notify_postgresql`这个顶级的key下。在这里为你的PostgreSQL实例创建配置信息键值对。key是你的PostgreSQL endpoint的名称,value是下面表格中列列的键值对集合。 841 842 ``` 843 KEY: 844 notify_postgres[:name] 发布存储桶通知到Postgres数据库 845 846 ARGS: 847 connection_string* (string) Postgres server的连接字符串,例如 "host=localhost port=5432 dbname=minio_events user=postgres password=password sslmode=disable" 848 table* (string) 存储/更新事件的数据库表名, 表会自动被创建 849 format* (namespace*|access) 'namespace'或者'access', 默认是'namespace' 850 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 851 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 852 comment (sentence) 可选的注释说明 853 ``` 854 855 或者通过环境变量(说明详见上面) 856 ``` 857 KEY: 858 notify_postgres[:name] publish bucket notifications to Postgres databases 859 860 ARGS: 861 MINIO_NOTIFY_POSTGRES_ENABLE* (on|off) enable notify_postgres target, default is 'off' 862 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" 863 MINIO_NOTIFY_POSTGRES_TABLE* (string) DB table name to store/update events, table is auto-created 864 MINIO_NOTIFY_POSTGRES_FORMAT* (namespace*|access) 'namespace' reflects current bucket/object list and 'access' reflects a journal of object operations, defaults to 'namespace' 865 MINIO_NOTIFY_POSTGRES_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 866 MINIO_NOTIFY_POSTGRES_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 867 MINIO_NOTIFY_POSTGRES_COMMENT (sentence) optionally add a comment to this setting 868 ``` 869 870 MinIO支持持久事件存储。持久存储将在PostgreSQL连接离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 871 872 注意这里为了演示, 我们禁止了SSL. 处于安全起见, 不推荐用于生产. 873 更新配置前, 使用`mc admin config get`命令获取当前配置。 874 875 ```sh 876 $ mc admin config get myminio notify_postgres 877 notify_postgres:1 queue_dir="" connection_string="" queue_limit="0" table="" format="namespace" 878 ``` 879 880 Use `mc admin config set`命令更新完配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs::1:postgresql`。 881 882 ```sh 883 $ mc admin config set myminio notify_postgres:1 connection_string="host=localhost port=5432 dbname=minio_events user=postgres password=password sslmode=disable" table="bucketevents" format="namespace" 884 ``` 885 886 请注意, 根据你的需要,你可以添加任意多个PostgreSQL server endpoint,只要提供PostgreSQL实例的标识符(如上例中的“ 1”)和每个实例配置参数的信息即可。 887 888 ### 第三步:使用MinIO客户端启用bucket通知 889 890 我们现在可以在一个叫`images`的存储桶上开启事件通知,一旦上有文件上传到存储桶中,PostgreSQL中会insert一条新的记录或者一条已经存在的记录会被update,如果一个存在对象被删除,一条对应的记录也会从PostgreSQL表中删除。因此,PostgreSQL表中的行,对应的就是存储桶里的一个对象。 891 892 要配置这种存储桶通知,我们需要用到前面步骤中MinIO输出的ARN信息。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 893 894 有了`mc`这个工具,这些配置信息很容易就能添加上。假设MinIO服务别名叫`myminio`,可执行下列脚本: 895 896 ``` 897 # Create bucket named `images` in myminio 898 mc mb myminio/images 899 # Add notification configuration on the `images` bucket using the MySQL ARN. The --suffix argument filters events. 900 mc event add myminio/images arn:minio:sqs::1:postgresql --suffix .jpg 901 # Print out the notification configuration on the `images` bucket. 902 mc event list myminio/images 903 mc event list myminio/images 904 arn:minio:sqs::1:postgresql s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 905 ``` 906 907 ### 第四步:验证PostgreSQL 908 909 打开一个新的terminal终端并上传一张JPEG图片到``images`` 存储桶。 910 911 ``` 912 mc cp myphoto.jpg myminio/images 913 ``` 914 915 打开一个PostgreSQL终端列出表 `bucketevents` 中所有的记录。 916 917 ``` 918 $ psql -h 127.0.0.1 -U postgres -d minio_events 919 minio_events=# select * from bucketevents; 920 921 key | value 922 --------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 923 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": "", "eventName": "s3:ObjectCreated:Put", "eventTime": "2016-10-12T21:18:20Z", "eventSource": "aws:s3", "eventVersion": "2.0", "userIdentity": {"principalId": "minio"}, "responseElements": {}, "requestParameters": {"sourceIPAddress": "[::1]:39706"}}]} 924 (1 row) 925 ``` 926 927 <a name="MySQL"></a> 928 929 ## 使用MySQL发布MinIO事件 930 931 > 注意:在版本RELEASE.2020-04-10T03-34-42Z之前的MySQL通知用于支持以下选项: 932 > 933 > ``` 934 > host (hostname) MySQL server hostname (used only if `dsn_string` is empty) 935 > port (port) MySQL server port (used only if `dsn_string` is empty) 936 > username (string) database username (used only if `dsn_string` is empty) 937 > password (string) database password (used only if `dsn_string` is empty) 938 > database (string) database name (used only if `dsn_string` is empty) 939 > ``` 940 > 941 > 这些现在已经弃用, 如果你打算升级到*RELEASE.2020-04-10T03-34-42Z*之后的版本请确保 942 > 仅使用*dsn_string*选项迁移. 一旦所有服务器都升级完成,请使用以下命令更新现有的通知目标完成迁移 943 > 944 > ``` 945 > mc admin config set myminio/ notify_mysql[:name] dsn_string="mysqluser:mysqlpass@tcp(localhost:2832)/bucketevents" 946 > ``` 947 > 948 > 请确保执行此步骤, 否则将无法执行MySQL通知目标, 949 > 服务器升级/重启后,控制台上会显示一条错误消息,请务必遵循上述说明。 950 > 如有其他问题,请加入我们的 https://slack.min.io 951 952 安装 [MySQL](https://dev.mysql.com/downloads/mysql/). 为了演示,我们将"root"用户的密码设为`password`,并且创建了一个`miniodb`数据库来存储事件信息。 953 954 这个通知目标支持两种格式: _namespace_ 和 _access_。 955 956 如果使用的是 _namespace_ 格式,MinIO将存储桶里的对象同步成数据库表中的行。每一行有两列:key_name和value。key_name是这个对象的存储桶名字加上对象名,value都是一个有关这个MinIO对象的JSON格式的事件数据。如果对象更新或者删除,表中相应的行也会相应的更新或者删除。 957 958 如果使用的是 _access_,MinIO将将事件添加到表里,行有两列:event_time 和 event_data。event_time是事件在MinIO server里发生的时间,event_data是有关这个MinIO对象的JSON格式的事件数据。在这种格式下,不会有行会被删除或者修改。 959 960 下面的步骤展示的是如何在`namespace`格式下使用通知目标,`_access_`差不多,不再赘述。 961 962 ### 第一步:确保确保至少满足最低要求 963 964 MinIO要求MySQL 版本 5.7.8及以上,MinIO使用了MySQL5.7.8版本引入的 [JSON](https://dev.mysql.com/doc/refman/5.7/en/json.html) 数据类型。我们使用的是MySQL5.7.17进行的测试。 965 966 ### 第二步:集成MySQL到MinIO 967 968 MySQL配置位于 `notify_mysql`key下. 在这里为你的PostgreSQL实例创建配置信息键值对。key是你的MySQL endpoint的名称,value是下面表格中列列的键值对集合。 969 970 ``` 971 KEY: 972 notify_mysql[:name] 发布存储桶通知到MySQL数据库. 当需要多个MySQL server endpoint时,可以为每个配置添加用户指定的“name”(例如"notify_mysql:myinstance"). 973 974 ARGS: 975 dsn_string* (string) MySQL数据源名称连接字符串,例如 "<user>:<password>@tcp(<host>:<port>)/<database>" 976 table* (string) 存储/更新事件的数据库表名, 表会自动被创建 977 format* (namespace*|access) 'namespace'或者'access', 默认是'namespace' 978 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 979 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 980 comment (sentence) 可选的注释说明 981 ``` 982 983 或者通过环境变量(说明详见上面) 984 ``` 985 KEY: 986 notify_mysql[:name] publish bucket notifications to MySQL databases 987 988 ARGS: 989 MINIO_NOTIFY_MYSQL_ENABLE* (on|off) enable notify_mysql target, default is 'off' 990 MINIO_NOTIFY_MYSQL_DSN_STRING* (string) MySQL data-source-name connection string e.g. "<user>:<password>@tcp(<host>:<port>)/<database>" 991 MINIO_NOTIFY_MYSQL_TABLE* (string) DB table name to store/update events, table is auto-created 992 MINIO_NOTIFY_MYSQL_FORMAT* (namespace*|access) 'namespace' reflects current bucket/object list and 'access' reflects a journal of object operations, defaults to 'namespace' 993 MINIO_NOTIFY_MYSQL_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 994 MINIO_NOTIFY_MYSQL_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 995 MINIO_NOTIFY_MYSQL_COMMENT (sentence) optionally add a comment to this setting 996 ``` 997 998 `dsn_string`是必须的,并且格式为 `"<user>:<password>@tcp(<host>:<port>)/<database>"` 999 1000 MinIO支持持久事件存储。持久存储将在MySQL连接离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 1001 1002 更新配置前, 可以使用`mc admin config get`命令获取当前配置. 1003 1004 ```sh 1005 $ mc admin config get myminio/ notify_mysql 1006 notify_mysql:myinstance enable=off format=namespace host= port= username= password= database= dsn_string= table= queue_dir= queue_limit=0 1007 ``` 1008 1009 使用带有`dsn_string`参数的`mc admin config set`的命令更新MySQL的通知配置: 1010 1011 ```sh 1012 $ mc admin config set myminio notify_mysql:myinstance table="minio_images" dsn_string="root:xxxx@tcp(172.17.0.1:3306)/miniodb" 1013 ``` 1014 1015 请注意, 根据你的需要,你可以添加任意多个MySQL server endpoint,只要提供MySQL实例的标识符(如上例中的"myinstance")和每个实例配置参数的信息即可。 1016 1017 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs::myinstance:mysql`。 1018 1019 ### 第三步:使用MinIO客户端启用bucket通知 1020 1021 我们现在可以在一个叫`images`的存储桶上开启事件通知,一旦上有文件上传到存储桶中,MySQL中会insert一条新的记录或者一条已经存在的记录会被update,如果一个存在对象被删除,一条对应的记录也会从MySQL表中删除。因此,MySQL表中的行,对应的就是存储桶里的一个对象。 1022 1023 要配置这种存储桶通知,我们需要用到前面步骤MinIO输出的ARN信息。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 1024 1025 有了`mc`这个工具,这些配置信息很容易就能添加上。假设咱们的MinIO服务别名叫`myminio`,可执行下列脚本: 1026 1027 ``` 1028 # Create bucket named `images` in myminio 1029 mc mb myminio/images 1030 # Add notification configuration on the `images` bucket using the MySQL ARN. The --suffix argument filters events. 1031 mc event add myminio/images arn:minio:sqs::myinstance:mysql --suffix .jpg 1032 # Print out the notification configuration on the `images` bucket. 1033 mc event list myminio/images 1034 arn:minio:sqs::myinstance:mysql s3:ObjectCreated:*,s3:ObjectRemoved:*,s3:ObjectAccessed:* Filter: suffix=”.jpg” 1035 ``` 1036 1037 ### 第四步:验证MySQL 1038 1039 打开一个新的terminal终端并上传一张JPEG图片到`images` 存储桶。 1040 1041 ``` 1042 mc cp myphoto.jpg myminio/images 1043 ``` 1044 1045 打开一个MySQL终端列出表 `minio_images` 中所有的记录。 1046 1047 ``` 1048 $ mysql -h 172.17.0.1 -P 3306 -u root -p miniodb 1049 mysql> select * from minio_images; 1050 +--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1051 | key_name | value | 1052 +--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1053 | images/myphoto.jpg | {"Records": [{"s3": {"bucket": {"arn": "arn:aws:s3:::images", "name": "images", "ownerIdentity": {"principalId": "minio"}}, "object": {"key": "myphoto.jpg", "eTag": "467886be95c8ecfd71a2900e3f461b4f", "size": 26, "sequencer": "14AC59476F809FD3"}, "configurationId": "Config", "s3SchemaVersion": "1.0"}, "awsRegion": "", "eventName": "s3:ObjectCreated:Put", "eventTime": "2017-03-16T11:29:00Z", "eventSource": "aws:s3", "eventVersion": "2.0", "userIdentity": {"principalId": "minio"}, "responseElements": {"x-amz-request-id": "14AC59476F809FD3", "x-minio-origin-endpoint": "http://192.168.86.110:9000"}, "requestParameters": {"sourceIPAddress": "127.0.0.1:38260"}}]} | 1054 +--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1055 1 row in set (0.01 sec) 1056 1057 ``` 1058 1059 <a name="apache-kafka"></a> 1060 1061 ## 使用Kafka发布MinIO事件 1062 1063 安装[ Apache Kafka](http://kafka.apache.org/). 1064 1065 ### 第一步:确保确保至少满足最低要求 1066 1067 MinIO要求Kafka版本0.10或者0.9.MinIO内部使用了 [Shopify/sarama](https://github.com/Shopify/sarama/) 库,因此需要和该库有同样的版本兼容性。 1068 1069 ###第二步:集成Kafka到MinIO 1070 1071 MinIO支持持久事件存储。持久存储将在kafka broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 1072 1073 ``` 1074 KEY: 1075 notify_kafka[:name] 发布存储桶通知到Kafka endpoints 1076 1077 ARGS: 1078 brokers* (csv) 逗号分隔的Kafka broker地址列表 1079 topic (string) 用于存储桶通知的Kafka topic 1080 sasl_username (string) SASL/PLAIN或者SASL/SCRAM身份验证的用户名 1081 sasl_password (string) SASL/PLAIN或者SASL/SCRAM身份验证的密码 1082 sasl_mechanism (string) sasl认证机制, 默认是'PLAIN' 1083 tls_client_auth (string) clientAuth确定TLS客户端身份验证的Kafka服务器策略 1084 sasl (on|off) 设置为'on'代表启用 SASL身份验证 1085 tls (on|off) 设置为'on'代表启用TLS 1086 tls_skip_verify (on|off) 跳过TLS证书验证, 默认是"on" (可信的) 1087 client_tls_cert (path) 用于mTLS身份验证的客户端证书的路径 1088 client_tls_key (path) mTLS身份验证的客户端密钥的路径 1089 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 1090 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 1091 version (string) 指定 Kafka集群的版本, 例如 '2.2.0' 1092 comment (sentence) 可选的注释说明 1093 ``` 1094 1095 或者通过环境变量(说明详见上面) 1096 ``` 1097 KEY: 1098 notify_kafka[:name] publish bucket notifications to Kafka endpoints 1099 1100 ARGS: 1101 MINIO_NOTIFY_KAFKA_ENABLE* (on|off) enable notify_kafka target, default is 'off' 1102 MINIO_NOTIFY_KAFKA_BROKERS* (csv) comma separated list of Kafka broker addresses 1103 MINIO_NOTIFY_KAFKA_TOPIC (string) Kafka topic used for bucket notifications 1104 MINIO_NOTIFY_KAFKA_SASL_USERNAME (string) username for SASL/PLAIN or SASL/SCRAM authentication 1105 MINIO_NOTIFY_KAFKA_SASL_PASSWORD (string) password for SASL/PLAIN or SASL/SCRAM authentication 1106 MINIO_NOTIFY_KAFKA_SASL_MECHANISM (plain*|sha256|sha512) sasl authentication mechanism, default 'plain' 1107 MINIO_NOTIFY_KAFKA_TLS_CLIENT_AUTH (string) clientAuth determines the Kafka server's policy for TLS client auth 1108 MINIO_NOTIFY_KAFKA_SASL (on|off) set to 'on' to enable SASL authentication 1109 MINIO_NOTIFY_KAFKA_TLS (on|off) set to 'on' to enable TLS 1110 MINIO_NOTIFY_KAFKA_TLS_SKIP_VERIFY (on|off) trust server TLS without verification, defaults to "on" (verify) 1111 MINIO_NOTIFY_KAFKA_CLIENT_TLS_CERT (path) path to client certificate for mTLS auth 1112 MINIO_NOTIFY_KAFKA_CLIENT_TLS_KEY (path) path to client key for mTLS auth 1113 MINIO_NOTIFY_KAFKA_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 1114 MINIO_NOTIFY_KAFKA_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 1115 MINIO_NOTIFY_KAFKA_COMMENT (sentence) optionally add a comment to this setting 1116 MINIO_NOTIFY_KAFKA_VERSION (string) specify the version of the Kafka cluster e.g. '2.2.0' 1117 ``` 1118 1119 更新配置前, 使用`mc admin config get`命令获取当前配置 1120 1121 ```sh 1122 $ mc admin config get myminio/ notify_kafka 1123 notify_kafka:1 tls_skip_verify="off" queue_dir="" queue_limit="0" sasl="off" sasl_password="" sasl_username="" tls_client_auth="0" tls="off" brokers="" topic="" client_tls_cert="" client_tls_key="" version="" 1124 ``` 1125 1126 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs::1:kafka`。`bucketevents`是kafka在此示例中使用的主题。 1127 1128 ```sh 1129 $ mc admin config set myminio notify_kafka:1 tls_skip_verify="off" queue_dir="" queue_limit="0" sasl="off" sasl_password="" sasl_username="" tls_client_auth="0" tls="off" client_tls_cert="" client_tls_key="" brokers="localhost:9092,localhost:9093" topic="bucketevents" version="" 1130 ``` 1131 1132 ### 第三步:使用MinIO客户端启用bucket通知 1133 1134 1135 我们现在可以在一个叫`images`的存储桶上开启事件通知,一旦上有文件上传到存储桶中,事件将被触发。在这里,ARN的值是``arn:minio:sqs:us-east-1:1:kafka``。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 1136 1137 ``` 1138 mc mb myminio/images 1139 mc event add myminio/images arn:minio:sqs::1:kafka --suffix .jpg 1140 mc event list myminio/images 1141 arn:minio:sqs::1:kafka s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 1142 ``` 1143 1144 ### 第四步:验证Kafka 1145 1146 我们使用 [kafkacat](https://github.com/edenhill/kafkacat) 将所有的通知输出到控制台。 1147 1148 ``` 1149 kafkacat -C -b localhost:9092 -t bucketevents 1150 ``` 1151 1152 打开一个新的terminal终端并上传一张JPEG图片到``images`` 存储桶。 1153 1154 ``` 1155 mc cp myphoto.jpg myminio/images 1156 ``` 1157 1158 `kafkacat` 输出事件通知到控制台。 1159 1160 ``` 1161 kafkacat -b localhost:9092 -t bucketevents 1162 { 1163 "EventName": "s3:ObjectCreated:Put", 1164 "Key": "images/myphoto.jpg", 1165 "Records": [ 1166 { 1167 "eventVersion": "2.0", 1168 "eventSource": "minio:s3", 1169 "awsRegion": "", 1170 "eventTime": "2019-09-10T17:41:54Z", 1171 "eventName": "s3:ObjectCreated:Put", 1172 "userIdentity": { 1173 "principalId": "AKIAIOSFODNN7EXAMPLE" 1174 }, 1175 "requestParameters": { 1176 "accessKey": "AKIAIOSFODNN7EXAMPLE", 1177 "region": "", 1178 "sourceIPAddress": "192.168.56.192" 1179 }, 1180 "responseElements": { 1181 "x-amz-request-id": "15C3249451E12784", 1182 "x-minio-deployment-id": "751a8ba6-acb2-42f6-a297-4cdf1cf1fa4f", 1183 "x-minio-origin-endpoint": "http://192.168.97.83:9000" 1184 }, 1185 "s3": { 1186 "s3SchemaVersion": "1.0", 1187 "configurationId": "Config", 1188 "bucket": { 1189 "name": "images", 1190 "ownerIdentity": { 1191 "principalId": "AKIAIOSFODNN7EXAMPLE" 1192 }, 1193 "arn": "arn:aws:s3:::images" 1194 }, 1195 "object": { 1196 "key": "myphoto.jpg", 1197 "size": 6474, 1198 "eTag": "430f89010c77aa34fc8760696da62d08-1", 1199 "contentType": "image/jpeg", 1200 "userMetadata": { 1201 "content-type": "image/jpeg" 1202 }, 1203 "versionId": "1", 1204 "sequencer": "15C32494527B46C5" 1205 } 1206 }, 1207 "source": { 1208 "host": "192.168.56.192", 1209 "port": "", 1210 "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" 1211 } 1212 } 1213 ] 1214 } 1215 ``` 1216 1217 <a name="webhooks"></a> 1218 1219 ## 使用Webhook发布MinIO事件 1220 1221 [Webhooks](https://en.wikipedia.org/wiki/Webhook) 采用推的方式获取数据,而不是一直去拉取。 1222 1223 ### 第一步:集成Webhook到MinIO 1224 1225 MinIO支持持久事件存储。持久存储将在webhook离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 1226 1227 ``` 1228 KEY: 1229 notify_webhook[:name] 发布存储桶通知到webhook endpoints 1230 1231 ARGS: 1232 endpoint* (url) webhook server endpoint,例如 http://localhost:8080/minio/events 1233 auth_token (string) opaque token或者JWT authorization token 1234 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 1235 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 1236 client_cert (string) Webhook的mTLS身份验证的客户端证书 1237 client_key (string) Webhook的mTLS身份验证的客户端证书密钥 1238 comment (sentence) 可选的注释说明 1239 ``` 1240 1241 或者通过环境变量(说明参见上面) 1242 ``` 1243 KEY: 1244 notify_webhook[:name] publish bucket notifications to webhook endpoints 1245 1246 ARGS: 1247 MINIO_NOTIFY_WEBHOOK_ENABLE* (on|off) enable notify_webhook target, default is 'off' 1248 MINIO_NOTIFY_WEBHOOK_ENDPOINT* (url) webhook server endpoint e.g. http://localhost:8080/minio/events 1249 MINIO_NOTIFY_WEBHOOK_AUTH_TOKEN (string) opaque string or JWT authorization token 1250 MINIO_NOTIFY_WEBHOOK_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 1251 MINIO_NOTIFY_WEBHOOK_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 1252 MINIO_NOTIFY_WEBHOOK_COMMENT (sentence) optionally add a comment to this setting 1253 MINIO_NOTIFY_WEBHOOK_CLIENT_CERT (string) client cert for Webhook mTLS auth 1254 MINIO_NOTIFY_WEBHOOK_CLIENT_KEY (string) client cert key for Webhook mTLS auth 1255 ``` 1256 1257 ```sh 1258 $ mc admin config get myminio/ notify_webhook 1259 notify_webhook:1 endpoint="" auth_token="" queue_limit="0" queue_dir="" client_cert="" client_key="" 1260 ``` 1261 1262 用`mc admin config set` 命令更新配置. 在这endpoint是监听webhook通知的服务. 保存配置文件并重启MinIO服务让配配置生效. 注意一下,在重启MinIO时,这个endpoint必须是启动并且可访问到。 1263 1264 ```sh 1265 $ mc admin config set myminio notify_webhook:1 queue_limit="0" endpoint="http://localhost:3000" queue_dir="" 1266 ``` 1267 1268 ### 第二步:使用MinIO客户端启用bucket通知 1269 1270 我们现在可以在一个叫`images`的存储桶上开启事件通知,一旦上有文件上传到存储桶中,事件将被触发。在这里,ARN的值是`arn:minio:sqs::1:webhook`。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 1271 1272 ``` 1273 mc mb myminio/images 1274 mc mb myminio/images-thumbnail 1275 mc event add myminio/images arn:minio:sqs::1:webhook --event put --suffix .jpg 1276 ``` 1277 1278 验证事件通知是否配置正确: 1279 1280 ``` 1281 mc event list myminio/images 1282 ``` 1283 1284 你应该可以收到如下的响应: 1285 1286 ``` 1287 arn:minio:sqs::1:webhook s3:ObjectCreated:* Filter: suffix=".jpg" 1288 ``` 1289 1290 ### 第三步:采用Thumbnailer进行验证 1291 1292 我们使用 [Thumbnailer](https://github.com/minio/thumbnailer) 来监听MinIO通知。如果有文件上传于是MinIO服务,Thumnailer监听到该通知,生成一个缩略图并上传到MinIO服务。 1293 安装Thumbnailer: 1294 1295 ``` 1296 git clone https://github.com/minio/thumbnailer/ 1297 npm install 1298 ``` 1299 1300 然后打开Thumbnailer的``config/webhook.json``配置文件,添加有关MinIO server的配置,使用下面的方式启动Thumbnailer: 1301 1302 ``` 1303 NODE_ENV=webhook node thumbnail-webhook.js 1304 ``` 1305 1306 Thumbnailer运行在``http://localhost:3000/``。下一步,配置MinIO server,让其发送消息到这个URL(第一步提到的),并使用 ``mc`` 来设置存储桶通知(第二步提到的)。然后上传一张图片到MinIO server: 1307 1308 ``` 1309 mc cp ~/images.jpg myminio/images 1310 .../images.jpg: 8.31 KB / 8.31 KB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 59.42 KB/s 0s 1311 ``` 1312 1313 稍等片刻,然后使用mc ls检查存储桶的内容 -,你将看到有个缩略图出现了。 1314 1315 ``` 1316 mc ls myminio/images-thumbnail 1317 [2017-02-08 11:39:40 IST] 992B images-thumbnail.jpg 1318 ``` 1319 1320 1321 <a name="NSQ"></a> 1322 1323 ## 发布MinIO事件到NSQ 1324 1325 从[这儿](https://nsq.io/)安装一个NSQ. 或者使用Docker命令启动一个nsq daemon: 1326 1327 ``` 1328 docker run --rm -p 4150-4151:4150-4151 nsqio/nsq /nsqd 1329 ``` 1330 1331 ### 第一步: 添加NSQ endpoint到MinIO 1332 1333 MinIO支持持久事件存储。持久存储将在NSQ broker离线时备份事件,并在broker恢复在线时重播事件。事件存储的目录可以通过`queue_dir`字段设置,存储的最大限制可以通过`queue_limit`设置。例如, `queue_dir`可以设置为`/home/events`, 并且`queue_limit`可以设置为`1000`. 默认情况下 `queue_limit` 是100000. 1334 1335 更新配置前, 使用`mc admin config get`命令获取`notify_nsq`的当前配置. 1336 1337 ``` 1338 KEY: 1339 notify_nsq[:name] 发布存储桶通知到NSQ endpoints 1340 1341 ARGS: 1342 nsqd_address* (address) NSQ server地址,例如 '127.0.0.1:4150' 1343 topic* (string) NSQ topic 1344 tls (on|off) 设为'on'代表启用TLS 1345 tls_skip_verify (on|off) 跳过TLS证书验证, 默认是"on" (可信的) 1346 queue_dir (path) 未发送消息的暂存目录 例如 '/home/events' 1347 queue_limit (number) 未发送消息的最大限制, 默认是'100000' 1348 comment (sentence) 可选的注释说明 1349 ``` 1350 1351 或者通过环境变量(说明参见上面) 1352 ``` 1353 KEY: 1354 notify_nsq[:name] publish bucket notifications to NSQ endpoints 1355 1356 ARGS: 1357 MINIO_NOTIFY_NSQ_ENABLE* (on|off) enable notify_nsq target, default is 'off' 1358 MINIO_NOTIFY_NSQ_NSQD_ADDRESS* (address) NSQ server address e.g. '127.0.0.1:4150' 1359 MINIO_NOTIFY_NSQ_TOPIC* (string) NSQ topic 1360 MINIO_NOTIFY_NSQ_TLS (on|off) set to 'on' to enable TLS 1361 MINIO_NOTIFY_NSQ_TLS_SKIP_VERIFY (on|off) trust server TLS without verification, defaults to "on" (verify) 1362 MINIO_NOTIFY_NSQ_QUEUE_DIR (path) staging dir for undelivered messages e.g. '/home/events' 1363 MINIO_NOTIFY_NSQ_QUEUE_LIMIT (number) maximum limit for undelivered messages, defaults to '100000' 1364 MINIO_NOTIFY_NSQ_COMMENT (sentence) optionally add a comment to this setting 1365 ``` 1366 1367 ```sh 1368 $ mc admin config get myminio/ notify_nsq 1369 notify_nsq:1 nsqd_address="" queue_dir="" queue_limit="0" tls_enable="off" tls_skip_verify="off" topic="" 1370 ``` 1371 1372 使用`mc admin config set`命令更新配置后,重启MinIO Server让配置生效。 如果一切顺利,MinIO Server会在启动时输出一行信息,类似 `SQS ARNs: arn:minio:sqs::1:nsq`。 1373 1374 ```sh 1375 $ mc admin config set myminio notify_nsq:1 nsqd_address="127.0.0.1:4150" queue_dir="" queue_limit="0" tls_enable="off" tls_skip_verify="on" topic="minio" 1376 ``` 1377 1378 请注意, 根据你的需要,你可以添加任意多个NSQ daemon endpoint,只要提供NSQ实例的标识符(如上例中的"1")和每个实例配置参数的信息即可。 1379 1380 ### 第二步:使用MinIO客户端启用bucket通知 1381 1382 我们现在可以在一个叫`images`的存储桶上开启事件通知,一旦上有文件上传到存储桶中,事件将被触发。在这里,ARN的值是`arn:minio:sqs::1:nsq`。更多有关ARN的资料,请参考[这里](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。 1383 1384 ``` 1385 mc mb myminio/images 1386 mc event add myminio/images arn:minio:sqs::1:nsq --suffix .jpg 1387 mc event list myminio/images 1388 arn:minio:sqs::1:nsq s3:ObjectCreated:*,s3:ObjectRemoved:* Filter: suffix=”.jpg” 1389 ``` 1390 1391 ### 第三步: 验证NSQ 1392 1393 最简单的测试是从[nsq github](https://github.com/nsqio/nsq/releases)下载`nsq_tail`。 1394 1395 ``` 1396 ./nsq_tail -nsqd-tcp-address 127.0.0.1:4150 -topic minio 1397 ``` 1398 1399 打开另一个终端,上传一个JPEG图片到`images`存储桶. 1400 1401 ``` 1402 mc cp gopher.jpg myminio/images 1403 ``` 1404 1405 上传完成后,您应该通过NSQ收到以下事件通知。 1406 1407 ``` 1408 {"EventName":"s3:ObjectCreated:Put","Key":"images/gopher.jpg","Records":[{"eventVersion":"2.0","eventSource":"minio:s3","awsRegion":"","eventTime":"2018-10-31T09:31:11Z","eventName":"s3:ObjectCreated:Put","userIdentity":{"principalId":"21EJ9HYV110O8NVX2VMS"},"requestParameters":{"sourceIPAddress":"10.1.1.1"},"responseElements":{"x-amz-request-id":"1562A792DAA53426","x-minio-origin-endpoint":"http://10.0.3.1:9000"},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"images","ownerIdentity":{"principalId":"21EJ9HYV110O8NVX2VMS"},"arn":"arn:aws:s3:::images"},"object":{"key":"gopher.jpg","size":162023,"eTag":"5337769ffa594e742408ad3f30713cd7","contentType":"image/jpeg","userMetadata":{"content-type":"image/jpeg"},"versionId":"1","sequencer":"1562A792DAA53426"}},"source":{"host":"","port":"","userAgent":"MinIO (linux; amd64) minio-go/v6.0.8 mc/DEVELOPMENT.GOGET"}}]} 1409 ```