From 0c125f3596a298e6e1d151eb8526d570667d3aa4 Mon Sep 17 00:00:00 2001 From: koolhead17 Date: Mon, 8 Aug 2016 19:39:01 -0700 Subject: [PATCH] Doc: This patch new guides with titles mentioned below (#2382) --- ...inio-server-instances-on-single-machine.md | 80 ++++++++++++ .../minio-server-configuration-files-guide.md | 110 +++++++++++++++++ docs/screenshots/miniomirror.jpeg | Bin 0 -> 21362 bytes docs/screenshots/multiport.jpeg | Bin 0 -> 29487 bytes ...ication-between-two-sites-running-minio.md | 116 ++++++++++++++++++ 5 files changed, 306 insertions(+) create mode 100644 docs/how-to-run-multiple-minio-server-instances-on-single-machine.md create mode 100644 docs/minio-server-configuration-files-guide.md create mode 100644 docs/screenshots/miniomirror.jpeg create mode 100644 docs/screenshots/multiport.jpeg create mode 100644 docs/setup-replication-between-two-sites-running-minio.md diff --git a/docs/how-to-run-multiple-minio-server-instances-on-single-machine.md b/docs/how-to-run-multiple-minio-server-instances-on-single-machine.md new file mode 100644 index 000000000..b096feca3 --- /dev/null +++ b/docs/how-to-run-multiple-minio-server-instances-on-single-machine.md @@ -0,0 +1,80 @@ +# How to run multiple Minio server instances on single machine. [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minio/minio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +![minio_MULTISERVER](https://github.com/minio/blob/master/docs/screenshots/multiport.jpeg?raw=true) + + +In this document we will illustrate how to set up multiple Minio server instances on single machine. These Minio servers are running on thier own port, data directory & configuration directory. + +## 1. Prerequisites + +* Download Minio server from [here](https://docs.minio.io/docs/minio) +* Download & Install mc from [here](https://docs.minio.io/docs/minio-client-quickstart-guide) +* Ports should be available for Minio server's use + +## 2. Install and Configure Minio Server + +Minio server is running on port 9002, 9003, 9004 with associated data directory and configuration file directory. + +**Minio server on port ``9002``** + +```sh +$ ./minio -C /home/minio/minio1/.minio server --address 192.168.1.11:9002 minio1/data1/ + +Endpoint: http://192.168.1.11:9002 +AccessKey: XTW9SWKRWYKWE9M9K9RG +SecretKey: pZehbS5UNrA9BAhYHnWC/QVvQ7vGVge48WGHzG9t +Region: us-east-1 +``` + +**Minio server on port ``9003``** + +```sh +$ ./minio -C /home/minio/minio2/.minio server --address 192.168.1.11:9003 minio1/data2/ + +Endpoint: http://192.168.1.11:9003 +AccessKey: UTD2WWPJOK754KMZKHWF +SecretKey: DbikDIY4+wItcexJa4nyrwQC0V2r7kLsK5SsRgHb +Region: us-east-1 +``` + +**Minio server on port ``9004``** + +```sh +$ ./minio -C /home/minio/minio3/.minio server --address 192.168.1.11:9004 minio1/data3/ + +Endpoint: http://192.168.1.11:9004 +AccessKey: KXLOJ908VEJ2K9RGUFHQ +SecretKey: LpkeePMtEWAa6payiCovfrNKiFHhABsJhMwGynF8 +Region: us-east-1 +``` + +This is how directory structure will look like for ``minio1``, replace it with your local setup. + +```sh +$ tree -la minio1/ +minio1/ +├── data1 +└── .minio + ├── certs + ├── config.json + └── config.json.old + +3 directories, 2 files + +``` +**Testing it all** + +Using terminal comamnd ``netstat`` we can see ``Minio Server`` is running on different ports on same machine. + +```sh +$ netstat -ntlp | grep minio +tcp 0 0 192.168.1.11:9002 0.0.0.0:* LISTEN 29573/minio +tcp 0 0 192.168.1.11:9003 0.0.0.0:* LISTEN 29597/minio +tcp 0 0 192.168.1.11:9004 0.0.0.0:* LISTEN 29631/minio +``` + + +# Explore Further +* [Minio Quickstart Guide](https://docs.minio.io/docs/minio-quickstart-guide) +* [Minio Client Complete Guide](https://docs.minio.io/docs/minio-client-complete-guide) + diff --git a/docs/minio-server-configuration-files-guide.md b/docs/minio-server-configuration-files-guide.md new file mode 100644 index 000000000..bc446b328 --- /dev/null +++ b/docs/minio-server-configuration-files-guide.md @@ -0,0 +1,110 @@ +# Minio Server configuration files Guide [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minio/minio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +In this document we will walk through the configuration files of Minio Server. + +## Minio Server configuration directory +Minio Server configurations are stored in file name ``.minio``. It's a hidden file which resides on user's home directory. + +**This how the structure of the directory looks like:** + +```sh +$ tree ~/.minio/ +/Users/supernova/.minio/ +├── certs +├── config.json +└── config.json.old + +1 directory, 2 files +``` +### Files and directories. + +##### ``certs`` directory +``certs`` directory stores key & cert information, which are needed to run Minio in ``HTTPS``. You can read more on running Minio with ``HTTPS`` with Let's Encrypt cert with Concert [here](https://docs.minio.io/docs/generate-let-s-encypt-certificate-using-concert-for-minio) + +##### ``config.json`` +config.json is the configuration file for Minio, it gets generated after you install and start Minio. + +```sh + +$ cat config.json +{ + "version": "6", + "credential": { + "accessKey": "YI7S1CKXB76RGOGT6R8W", + "secretKey": "FJ9PWUVNXGPfiI72WMRFepN3LsFgW3MjsxSALroV" + }, + "region": "us-east-1", + "logger": { + "console": { + "enable": true, + "level": "fatal" + }, + "file": { + "enable": false, + "fileName": "", + "level": "error" + }, + "syslog": { + "enable": false, + "address": "", + "level": "debug" + } + }, + "notify": { + "amqp": { + "1": { + "enable": false, + "url": "", + "exchange": "", + "routineKey": "", + "exchangeType": "", + "mandatory": false, + "immediate": false, + "durable": false, + "internal": false, + "noWait": false, + "autoDeleted": false + } + }, + "elasticsearch": { + "1": { + "enable": false, + "url": "", + "index": "" + } + }, + "redis": { + "1": { + "enable": false, + "address": "", + "password": "", + "key": "" + } + } + } +} + + +``` + +``version`` : Represents `version` number of current configuration file. + +``credential`` : Represents authentication credentials for the server, value is automatically generated upon first server start. + +``region`` : Represents deployment region for the server, value defaults to `us-east-1`. + +``logger `` : Represents various logging types supported for server error logs, console logger is enabled by default. + +``notify``: Represents various notification types supported. These notification types should be configured prior to using bucket + + +##### ``config.json.old`` +This file keeps previous config file version details. + +## Explore Further +* [Minio Quickstart Guide](https://docs.minio.io/docs/minio-quickstart-guide) + + + + + diff --git a/docs/screenshots/miniomirror.jpeg b/docs/screenshots/miniomirror.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..86f98a440acb159c3c301088c73c00a85a82993d GIT binary patch literal 21362 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/multiport.jpeg b/docs/screenshots/multiport.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cd888efbcbaeb646cb5051267eabba6941822603 GIT binary patch literal 29487 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
^<%Cj?#|iY-4j-WEQZYdfz-mQ_ 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 Y{ojYN9w<0G{PyVofAkL-*!G$8FYGI{I{*Lx literal 0 HcmV?d00001 diff --git a/docs/setup-replication-between-two-sites-running-minio.md b/docs/setup-replication-between-two-sites-running-minio.md new file mode 100644 index 000000000..ff969d4f5 --- /dev/null +++ b/docs/setup-replication-between-two-sites-running-minio.md @@ -0,0 +1,116 @@ +# How to use ``mc mirror`` to setup replication between two sites running Minio. [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minio/minio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +![minio_MIRROR](https://raw.githubusercontent.com/minio/blob/master/docs/screenshots/miniomirror.jpeg?raw=true) + + + +In this document we will illustrate how to set up replication between two Minio servers, `minio1` and `minio2` running on ``192.168.1.11`` and ``192.168.1.12`` respectively. We will mirror the data directory on `minio1` to the bucket on `minio2`. + + +## 1. Prerequisites + +* Download Minio server from [here](https://docs.minio.io/docs/minio) +* Download & Install mc from [here](https://docs.minio.io/docs/minio-client-quickstart-guide) +* Familiarity with [``mc mirror``](https://docs.minio.io/docs/minio-client-complete-guide#mirror) + +## 2. Install and Configure Minio Server + +### Setup minio1 + +```sh +$ ./minio server minio1-data/ + +Endpoint: http://127.0.0.1:9000 http://192.168.1.11:9000 +AccessKey: MURIVYBYNPTYE7O8I779 +SecretKey: lVbZmz4CvGkBl7JKw5icuL7RCcSvpBJTkAJTFQwz +Region: us-east-1 +``` +**mc alias** + +Alias is a short name to your cloud storage service for ``Minio client``. End-point, access and secret keys are supplied by your cloud storage provider. API signature is an optional argument. By default, it is set to ``S3v4``. + +```sh +$ ./mc config host add minio1 http://192.168.1.11:9000 MURIVYBYNPTYE7O8I779 lVbZmz4CvGkBl7JKw5icuL7RCcSvpBJTkAJTFQwz +``` + +**Create buckets and add objects** + +We have created few buckets using [``mc mb``](https://docs.minio.io/docs/minio-client-complete-guide#mb) and added objects to it using [``mc cp``](https://docs.minio.io/docs/minio-client-complete-guide#cp) Minio client commands. + +```sh +$ ./mc mb minio1/mybucket +$ ./mc cp myfile.txt minio1/bucket1 +$ ./mc ls minio1 +[2016-07-31 10:26:55 PDT] 0B bucket1/ +[2016-07-31 09:36:17 PDT] 0B bucket2/ +[2016-07-31 09:38:08 PDT] 0B bucket3/ +``` + +### Setup minio2 + +```sh +$ ./minio server minio2-data/ + +Endpoint: http://127.0.0.1:9000 http://192.168.1.12:9000 +AccessKey: YRDRWWQLEWS9OBJ31GZ2 +SecretKey: y2sSWzx5ytwvkELcxOuSaQ8n3doNqoIilRpb5Kjj +Region: us-east-1 +``` + +```sh +$ ./mc config host add minio2 http://192.168.1.12:9000 YRDRWWQLEWS9OBJ31GZ2 y2sSWzx5ytwvkELcxOuSaQ8n3doNqoIilRpb5Kjj +``` + +**Create bucket** + +We are creating destination bucket ``mbucket`` on ``minio2`` and adding ``minio2`` alias. The bucket ``mbucket`` will be used to mirror data directory of ``minio1``. + +```sh +$ ./mc mb minio1/mbucket +``` + +```sh +$ ./mc config host add minio2 http://192.168.1.12:9000 YRDRWWQLEWS9OBJ31GZ2 y2sSWzx5ytwvkELcxOuSaQ8n3doNqoIilRpb5Kjj + +``` + +## 4. Setup crontab +Cron is a Unix/Linux system utility by which you can schedule a task process for particular duration, we have tested this setup on Ubuntu Linux. + + +### Script + +Add crontab configuration on `minio1` providing path of data directory, ``minio1-data``. + +``--force`` option with ``mc mirror`` overwrites the destination contents, this would keep your contents in sync. + +```sh + +#!/bin/bash +datadir="/home/minio/minio1-data/" +minio2="minio2/mbucket" +MC_PATH="/home/minio/mc" +$MC_PATH --quiet mirror --force $minio1 $minio2 + +``` + +Set executable permissions on the script before adding a cron entry. + +```sh + +$ chmod 755 /home/minio/minio.sh +``` + +Set a new cron entry to run ``minio.sh`` script once every 30mins. + +```sh + +$ crontab -e +*/30 * * * * /home/minio/minio.sh +``` + +Note: We are going to introduce continuous replication feature in `mc mirror` which will enable the sites to be in sync without having the need to setup cron job. + +# Explore Further +* [Minio Quickstart Guide](https://docs.minio.io/docs/minio-quickstart-guide) +* [Minio Client Complete Guide](https://docs.minio.io/docs/minio-client-complete-guide)