MinIO - Add support for ellipsis syntax on distributed mode (#14)

This commit is contained in:
Juan Ariza Toledano 2021-03-09 20:53:33 +01:00 committed by GitHub
parent ccffc3fe35
commit 51a28fa11d
5 changed files with 146 additions and 7 deletions

View File

@ -29,6 +29,7 @@ export MINIO_LOGDIR="${MINIO_BASEDIR}/log"
export MINIO_SECRETSDIR="${MINIO_BASEDIR}/secrets"
export MINIO_DATADIR="/data"
export MINIO_CERTSDIR="/certs"
export MINIO_SCHEME="${MINIO_SCHEME:-http}"
export MINIO_SKIP_CLIENT="${MINIO_SKIP_CLIENT:-no}"
export MINIO_DISTRIBUTED_MODE_ENABLED="${MINIO_DISTRIBUTED_MODE_ENABLED:-no}"
export MINIO_DEFAULT_BUCKETS="${MINIO_DEFAULT_BUCKETS:-}"
@ -58,6 +59,42 @@ EOF
fi
}
########################
# Checks if MINIO_DISTRIBUTED_NODES uses the ellipses syntax {1...n}
# Globals:
# MINIO_DISTRIBUTED_NODES
# Arguments:
# None
# Returns:
# Boolean
#########################
is_distributed_ellipses_syntax() {
! is_empty_value "$MINIO_DISTRIBUTED_NODES" && [[ $MINIO_DISTRIBUTED_NODES == *"..."* ]]
}
########################
# Obtain the list of drives used by the MinIO node
# Globals:
# MINIO_DISTRIBUTED_NODES
# Arguments:
# None
# Returns:
# Array with MinIO node drives
#########################
minio_distributed_drives() {
local -a drives=()
local -a nodes
if ! is_empty_value "$MINIO_DISTRIBUTED_NODES"; then
read -r -a nodes <<< "$(tr ',;' ' ' <<< "${MINIO_DISTRIBUTED_NODES}")"
for node in "${nodes[@]}"; do
drive="$(parse_uri "${MINIO_SCHEME}://${node}" "path")"
drives+=("$drive")
done
fi
echo "${drives[@]}"
}
########################
# Checks if MinIO is running
# Globals:
@ -96,12 +133,17 @@ is_minio_running() {
#########################
minio_start_bg() {
local -r exec=$(command -v minio)
local args=("server" "--certs-dir" "${MINIO_CERTSDIR}")
local -a args=("server" "--certs-dir" "${MINIO_CERTSDIR}")
local -a nodes
if is_boolean_yes "$MINIO_DISTRIBUTED_MODE_ENABLED"; then
read -r -a nodes <<< "$(tr ',;' ' ' <<< "${MINIO_DISTRIBUTED_NODES}")"
for node in "${nodes[@]}"; do
args+=("http://${node}:${MINIO_PORT_NUMBER}/${MINIO_DATADIR}")
if is_distributed_ellipses_syntax; then
args+=("${MINIO_SCHEME}://${node}")
else
args+=("${MINIO_SCHEME}://${node}:${MINIO_PORT_NUMBER}/${MINIO_DATADIR}")
fi
done
else
args+=("--address" ":${MINIO_PORT_NUMBER}" "${MINIO_DATADIR}")
@ -182,7 +224,7 @@ minio_validate() {
print_validation_error "Distributed mode is enabled. Nodes must be indicated setting the environment variable MINIO_DISTRIBUTED_NODES"
else
read -r -a nodes <<< "$(tr ',;' ' ' <<< "${MINIO_DISTRIBUTED_NODES}")"
if [[ "${#nodes[@]}" -lt 4 ]] || (( "${#nodes[@]}" % 2 )); then
if ! is_distributed_ellipses_syntax && ([[ "${#nodes[@]}" -lt 4 ]] || (( "${#nodes[@]}" % 2 ))); then
print_validation_error "Number of nodes must even and greater than 4."
fi
fi

View File

@ -21,7 +21,11 @@ ARGS=("server" "--certs-dir" "${MINIO_CERTSDIR}")
if is_boolean_yes "$MINIO_DISTRIBUTED_MODE_ENABLED"; then
read -r -a nodes <<< "$(tr ',;' ' ' <<< "${MINIO_DISTRIBUTED_NODES}")"
for node in "${nodes[@]}"; do
ARGS+=("http://${node}:${MINIO_PORT_NUMBER}${MINIO_DATADIR}")
if is_distributed_ellipses_syntax; then
ARGS+=("${MINIO_SCHEME}://${node}")
else
ARGS+=("${MINIO_SCHEME}://${node}:${MINIO_PORT_NUMBER}/${MINIO_DATADIR}")
fi
done
else
ARGS+=("--address" ":${MINIO_PORT_NUMBER}" "${MINIO_DATADIR}")

View File

@ -30,11 +30,17 @@ else
minio_start_bg
# Ensure MinIO Client is stopped when this script ends.
trap "minio_stop" EXIT
# Configure MinIO Client to use local MinIO server
minio_client_configure_local "${MINIO_DATADIR}/.minio.sys/config/config.json"
if is_boolean_yes "$MINIO_DISTRIBUTED_MODE_ENABLED"; then
if is_distributed_ellipses_syntax; then
read -r -a drives <<< "$(minio_distributed_drives)"
minio_client_configure_local "/${drives[0]}/.minio.sys/config/config.json"
else
minio_client_configure_local "${MINIO_DATADIR}/.minio.sys/config/config.json"
fi
# Wait for other clients (distribute mode)
sleep 5
else
minio_client_configure_local "${MINIO_DATADIR}/.minio.sys/config/config.json"
fi
# Create default buckets
minio_create_default_buckets

View File

@ -248,7 +248,7 @@ services:
You can configure MinIO(R) in Distributed Mode to setup a highly-available storage system. To do so, the environment variables below **must** be set on each node:
* `MINIO_DISTRIBUTED_MODE_ENABLED`: Set it to 'yes' to enable Distributed Mode.
* `MINIO_DISTRIBUTED_NODES`: List of MiNIO nodes hosts. Available separatos are ' ', ',' and ';'.
* `MINIO_DISTRIBUTED_NODES`: List of MinIO(R) nodes hosts. Available separators are ' ', ',' and ';'.
* `MINIO_ACCESS_KEY`: MinIO(R) server Access Key. Must be common on every node.
* `MINIO_SECRET_KEY`: MinIO(R) server Secret Key. Must be common on every node.
@ -288,6 +288,44 @@ services:
- MINIO_DISTRIBUTED_NODES=minio1,minio2,minio3,minio4
```
MinIO(R) also supports ellipsis syntax (`{1..n}`) to list the MinIO(R) node hosts, where `n` is the number of nodes. This syntax is also valid to use multiple drives (`{1..m}`) on each MinIO(R) node, where `n` is the number of drives per node. You can use the Docker Compose below to create an 2-node distributed MinIO(R) setup with 2 drives per node:
```yaml
version: '2'
services:
minio-0:
image: 'bitnami/minio:latest'
volumes:
- 'minio_0_data_0:/data-0'
- 'minio_0_data_1:/data-1'
environment:
- MINIO_ACCESS_KEY=minio
- MINIO_SECRET_KEY=miniosecret
- MINIO_DISTRIBUTED_MODE_ENABLED=yes
- MINIO_DISTRIBUTED_NODES=minio-{0...1}/data-{0...1}
minio-1:
image: 'bitnami/minio:latest'
volumes:
- 'minio_1_data_0:/data-0'
- 'minio_1_data_1:/data-1'
environment:
- MINIO_ACCESS_KEY=minio
- MINIO_SECRET_KEY=miniosecret
- MINIO_DISTRIBUTED_MODE_ENABLED=yes
- MINIO_DISTRIBUTED_NODES=minio-{0...1}/data-{0...1}
volumes:
minio_0_data_0:
driver: local
minio_0_data_1:
driver: local
minio_1_data_0:
driver: local
minio_1_data_1:
driver: local
```
Find more information about the Distributed Mode in the [MinIO(R) documentation](https://docs.min.io/docs/distributed-minio-quickstart-guide.html).
### Reconfiguring Keys on container restarts

View File

@ -0,0 +1,49 @@
version: '2'
services:
prepare-data:
image: 'docker.io/bitnami/bitnami-shell:10'
command:
- /bin/bash
- -ec
- |
chmod -R g+rwX /data-0-0 /data-0-1 /data-1-0 /data-1-1
volumes:
- 'minio_0_data_0:/data-0-0'
- 'minio_0_data_1:/data-0-1'
- 'minio_1_data_0:/data-1-0'
- 'minio_1_data_1:/data-1-1'
minio-0:
image: 'docker.io/bitnami/minio:2021-debian-10'
volumes:
- 'minio_0_data_0:/data-0'
- 'minio_0_data_1:/data-1'
environment:
- MINIO_ACCESS_KEY=minio
- MINIO_SECRET_KEY=miniosecret
- MINIO_DISTRIBUTED_MODE_ENABLED=yes
- MINIO_DISTRIBUTED_NODES=minio-{0...1}/data-{0...1}
depends_on:
- prepare-data
minio-1:
image: 'docker.io/bitnami/minio:2021-debian-10'
volumes:
- 'minio_1_data_0:/data-0'
- 'minio_1_data_1:/data-1'
environment:
- MINIO_ACCESS_KEY=minio
- MINIO_SECRET_KEY=miniosecret
- MINIO_DISTRIBUTED_MODE_ENABLED=yes
- MINIO_DISTRIBUTED_NODES=minio-{0...1}/data-{0...1}
depends_on:
- prepare-data
volumes:
minio_0_data_0:
driver: local
minio_0_data_1:
driver: local
minio_1_data_0:
driver: local
minio_1_data_1:
driver: local