storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/docs/zh_CN/bucket/notifications/README.md (about)

     1  # MinIO存储桶通知指南 [![Slack](https://slack.min.io/slack?type=svg)](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  ```