MinIO - Add support for ellipsis syntax on distributed mode (#14)
This commit is contained in:
parent
ccffc3fe35
commit
51a28fa11d
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue