Skip to content

Expand a Distributed Silo Deployment

Silo supports expanding an existing distributed deployment by adding a new Server Pool. Each pool expands the total available storage capacity of the cluster.

Expansion does not provide Business Continuity/Disaster Recovery (BC/DR)-grade protection. Each pool has independent erasure sets; adding a pool does not replicate objects from existing pools. An unavailable pool can prevent access to its objects and fail writes, deletes, or other operations that must check every pool. Objects with sufficient data and metadata in other pools may remain readable. Losing quorum means unavailability first; permanent data loss requires unrecoverable loss of the necessary shards without another usable copy.

The new server pool does not need to use the same type or size of hardware and software configuration as any existing server pool, though doing so may allow for simplified cluster management and more predictable performance across pools. All drives in the new pool should be of the same type and size within the new pool. Review MinIO’s hardware recommendations for more complete guidance on selecting an appropriate configuration.

To provide BC-DR grade failover and recovery support for your single or multi-pool MinIO deployments, use site replication.

The procedure on this page expands an existing distributed MinIO deployment with an additional server pool.

Warning

Important

MinIO does not support expanding Single-Node Single-Drive topologies.

Prerequisites

Networking and Firewalls

Each node should have full bidirectional network access to every other node in the deployment. For containerized or orchestrated infrastructures, this may require specific configuration of networking and routing components such as ingress or load balancers. Certain operating systems may also require setting firewall rules. For example, the following command explicitly opens the default MinIO server API port 9000 on servers using firewalld:

firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload

All MinIO servers in the deployment must use the same listen port.

If you set a static MinIO Console port (e.g. :9001) you must also grant access to that port to ensure connectivity from external clients.

MinIO strongly recomends using a load balancer to manage connectivity to the cluster. The Load Balancer should use a “Least Connections” algorithm for routing requests to the MinIO deployment, since any MinIO node in the deployment can receive, route, or process client requests.

The following load balancers are known to work well with MinIO:

Configuring firewalls or load balancers to support MinIO is out of scope for this procedure. The Configure NGINX Proxy for MinIO Server reference provides a baseline configuration for using NGINX as a reverse proxy with basic load balancing configured.

Sequential Hostnames

MinIO requires using expansion notation {x...y} to denote a sequential series of MinIO hosts when creating a server pool. MinIO therefore requires using sequentially-numbered hostnames to represent each silo server process in the pool.

Create the necessary DNS hostname mappings prior to starting this procedure. For example, the following hostnames would support a 4-node distributed server pool:

  • minio5.example.com
  • minio6.example.com
  • minio7.example.com
  • minio8.example.com

You can specify the entire range of hostnames using the expansion notation minio{5...8}.example.com.

Configuring DNS to support MinIO is out of scope for this procedure.

Storage Requirements

The following requirements summarize the Storage section of MinIO’s hardware recommendations:

Use Local Storage

Direct-Attached Storage (DAS) has significant performance and consistency advantages over networked storage (NAS, SAN, NFS). MinIO strongly recommends flash storage (NVMe, SSD) for primary or “hot” data.

Use XFS-Formatting for Drives

MinIO strongly recommends provisioning XFS formatted drives for storage. MinIO uses XFS as part of internal testing and validation suites, providing additional confidence in performance and behavior at all scales.

MinIO does not test nor recommend any other filesystem, such as EXT4, BTRFS, or ZFS.

Use Consistent Type of Drive

MinIO does not distinguish drive types and does not benefit from mixed storage types. Each pool must use the same type (NVMe, SSD)

For example, deploy a pool consisting of only NVMe drives. If you deploy some drives as SSD or HDD, MinIO treats those drives identically to the NVMe drives. This can result in performance issues, as some drives have differing or worse read/write characteristics and cannot respond at the same rate as the NVMe drives.

Use Consistent Size of Drive

MinIO limits the size used per drive to the smallest drive in the pool.

For example, deploy a pool consisting of the same number of NVMe drives with identical capacity of 7.68TiB. If you deploy one drive with 3.84TiB, MinIO treats all drives in the pool as having that smaller capacity.

Configure Sequential Drive Mounting

MinIO uses Go expansion notation {x...y} to denote a sequential series of drives when creating the new server pool, where all nodes in the server pool have an identical set of mounted drives. Configure drive mounting paths as a sequential series to best support this notation. For example, mount your drives using a pattern of /mnt/drive-n, where n starts at 1 and increments by 1 per drive.

Persist Drive Mounting and Mapping Across Reboots

Use /etc/fstab to ensure consistent drive-to-mount mapping across node reboots.

Non-Linux Operating Systems should use the equivalent drive mount management tool.

Note

Exclusive access to drives

MinIO requires exclusive access to the drives or volumes provided for object storage. No other processes, software, scripts, or persons should perform any actions directly on the drives or volumes provided to MinIO or the objects or files MinIO places on them.

Unless directed by MinIO Engineering, do not use scripts or tools to directly modify, delete, or move any of the data shards, parity shards, or metadata files on the provided drives, including from one drive or node to another. Such operations are very likely to result in widespread corruption and data loss beyond MinIO’s ability to heal.

Minimum Drives for Erasure Code Parity

MinIO requires each pool satisfy the deployment erasure code settings. Specifically the new pool topology must support a minimum of 2 x EC:N drives per erasure set, where EC:N is the Standard parity storage class of the deployment. This requirement ensures the new server pool can satisfy the expected SLA of the deployment.

You can use the MinIO Erasure Code Calculator to check the Erasure Code Stripe Size (K+M) of your new pool. If the highest listed value is at least 2 x EC:N, the pool supports the deployment’s erasure parity settings.

Time Synchronization

Multi-node systems must maintain synchronized time and date to maintain stable internode operations and interactions. Make sure all nodes sync to the same time server regularly. Operating systems vary for methods used to synchronize time and date, such as with ntp, timedatectl, or timesyncd.

Check the documentation for your operating system for how to set up and maintain accurate and identical system clock times across nodes.

Back Up Cluster Settings First

Use the mc admin cluster bucket export and mc admin cluster iam export commands to take a snapshot of the bucket metadata and IAM configurations respectively prior to starting decommissioning. You can use these snapshots to restore bucket and IAM settings to recover from user or process errors as necessary.

Considerations

Writing Files

SILO does not automatically rebalance existing objects when a pool is added. When selecting a pool for a new object, it chooses randomly with weights based on available capacity. A pool with more free capacity is more likely to be selected; it is not selected on every write.

The formula to determine the probability of a write operation on a particular pool is

FreeSpaceOnPoolA/FreeSpaceOnAllPoolsFreeSpaceOnPoolA / FreeSpaceOnAllPools

Consider a situation where a group of three pools has a total of 10 TiB of free space distributed as:

  • Pool A has 3 TiB of free space
  • Pool B has 2 TiB of free space
  • Pool C has 5 TiB of free space

MinIO calculates the probability of a write operation to each of the pools as:

  • Pool A: 30% chance (3TiB/10TiB3TiB / 10TiB)
  • Pool B: 20% chance (2TiB/10TiB2TiB / 10TiB)
  • Pool C: 50% chance (5TiB/10TiB5TiB / 10TiB)

In addition to the free space calculation, if a write option (with parity) would bring a drive usage above 99% or a known free inode count below 1000, MinIO does not write to the pool.

If desired, you can manually initiate a rebalance procedure with mc admin rebalance. For more about how rebalancing works, see managing objects across a deployment.

Likewise, MinIO does not write to pools in a decommissioning process.

Expansion Requires a Coordinated Restart

Adding a new server pool requires restarting all MinIO server processes in the deployment at around same time.

Expansion requires a coordinated restart of all SILO server processes with the same pool configuration. A full restart temporarily interrupts service and can fail in-flight requests. Schedule a maintenance window, and have clients retry and verify results according to each operation’s semantics. Restarting does not guarantee uninterrupted service.

Do not perform “rolling” (e.g. one node at a time) restarts.

Capacity-Based Planning

MinIO recommends planning storage capacity sufficient to store at least 2 years of data before reaching 70% usage. Performing server pool expansion more frequently or on a “just-in-time” basis generally indicates an architecture or planning issue.

For example, consider an application suite expected to produce at least 100 TiB of data per year and a 3 year target before expansion. The deployment has ~500TiB of usable storage in the initial server pool, such that the cluster safely met the 70% threshold with some buffer for data growth. The new server pool should ideally meet at minimum 500TiB of additional storage to allow for a similar lifespan before further expansion.

Since MinIO erasure coding requires some storage for parity, the total raw storage must exceed the planned usable capacity. Consider using the MinIO Erasure Code Calculator for guidance in planning capacity around specific erasure code settings.

This tutorial assumes all hosts running MinIO use a recommended Linux operating system.

All hosts in the deployment should run with matching software configurations.

Expand a Distributed MinIO Deployment

The following procedure adds a Server Pool to an existing MinIO deployment. Each Pool expands the total available storage capacity of the cluster while maintaining the overall availability of the cluster.

All commands provided below use example values. Replace these values with those appropriate for your deployment.

Review the Prerequisites before starting this procedure.

Complete any planned hardware expansion prior to decommissioning older hardware pools.

1) Install the Silo Binary on Each Node in the New Server Pool

Install the same published Silo release used by the existing pool. Download the x86-64 or ARM64 RPM, DEB, or standalone archive from Download & Install, and verify its checksum before installation. The Silo release currently publishes those two Linux architectures; inherited references to unsupported ppc64le and s390x downloads have been removed.

sudo dnf install ./silo-*.rpm
sudo dpkg -i ./silo_*_amd64.deb

Use the arm64 package name on ARM64 hosts.

tar -xzf silo_*_linux_*.tar.gz
sudo install -m 0755 ./silo /usr/local/bin/silo
silo --version

Run silo --version on every new node and compare it with the existing pool. Do not join a node running a different release. For upgrades, follow the systemctl-managed Silo procedure.

2) Add TLS/SSL Certificates

For a systemd-managed SILO deployment, configure an explicit certificate directory such as /etc/silo/certs rather than depending on a service account’s home directory. Place public.crt and private.key on each node. When an internal CA must be trusted, place its public CA certificate in /etc/silo/certs/CAs. Restrict private-key access to the accounts that need it.

Set the following in /etc/default/silo:

MINIO_OPTS="--certs-dir /etc/silo/certs --console-address :9001"

SILO packages use the silo user and group, which do not necessarily have a usable home directory. Ensure that this account can traverse the certificate directory and read the required files. For a manual archive installation, create the service account as described in the next step first. See Network Encryption (TLS) and --certs-dir for default-directory compatibility and multiple-domain certificates.

3) Create the systemd Service File

SILO RPM/DEB packages install the following files and create the silo system user and group:

  • Executable: /usr/bin/silo
  • Service unit: /usr/lib/systemd/system/silo.service
  • Environment file: /etc/default/silo

The service runs as silo:silo. For existing deployments, the unit reads /etc/default/minio first, then /etc/default/silo; values in the latter override matching keys in the former. It also declares a conflict with minio.service so the two services do not access the same data concurrently. See the installation layout.

For a manual archive installation, create a dedicated silo user and group and grant the required access to data and certificate directories. Use the current SILO unit as a template and install the local unit at /etc/systemd/system/silo.service. If the executable is installed at /usr/local/bin/silo, adjust both AssertFileIsExecutable and ExecStart instead of retaining the package’s /usr/bin/silo path.

Inspect the effective unit and any overrides, then reload after changes:

systemctl cat silo.service
sudo systemctl daemon-reload

Keep existing data paths. Renaming the executable or service does not require renaming object data directories. For version upgrades, see the systemctl-managed upgrade procedure.

4) Create the Service Environment File

Create an environment file at /etc/default/silo. The MinIO service uses this file as the source of all environment variables used by MinIO and the silo.service file.

The following examples assumes that:

  • The deployment has a single server pool consisting of four MinIO server hosts with sequential hostnames.

    minio1.example.com   minio3.example.com
    minio2.example.com   minio4.example.com

    Each host has 4 locally attached drives with sequential mount points:

    /mnt/disk1/minio   /mnt/disk3/minio
    /mnt/disk2/minio   /mnt/disk4/minio
  • The new server pool consists of eight new MinIO hosts with sequential hostnames:

    minio5.example.com   minio9.example.com
    minio6.example.com   minio10.example.com
    minio7.example.com   minio11.example.com
    minio8.example.com   minio12.example.com
  • All hosts have eight locally-attached drives with sequential mount-points:

    /mnt/disk1/minio  /mnt/disk5/minio
    /mnt/disk2/minio  /mnt/disk6/minio
    /mnt/disk3/minio  /mnt/disk7/minio
    /mnt/disk4/minio  /mnt/disk8/minio
  • The deployment has a load balancer running at https://minio.example.net that manages connections across all MinIO hosts. The load balancer should not be routing requests to the new hosts at this step, but should have the necessary configuration updates planned.

Modify the example to reflect your deployment topology:

# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example starts the MinIO server with two server pools.
#
# The space delimiter indicates a seperate server pool
#
# The second set of hostnames and volumes is the newly added pool.
# The pool has sufficient stripe size to meet the existing erasure code
# parity of the deployment (2 x EC:4)
#
# The command includes the port on which the MinIO servers listen for each
# server pool.

MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio{5...12}.example.net:9000/mnt/disk{1...8}/minio"

# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.

MINIO_OPTS="--certs-dir /etc/silo/certs --console-address :9001"

# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

You may specify other environment variables or server commandline options as required by your deployment. All MinIO nodes in the deployment should include the same environment variables with the matching values.

5) Restart the MinIO Deployment with Expanded Configuration

Issue the following commands on each node simultaneously in the deployment to restart the MinIO service:

sudo systemctl restart silo.service

Use the following commands to confirm the service is online and functional:

sudo systemctl status silo.service
journalctl -f -u silo.service

MinIO may log an increased number of non-critical warnings while the server processes connect and synchronize. These warnings are typically transient and should resolve as the deployment comes online.

Expansion requires a coordinated restart of all SILO server processes with the same pool configuration. A full restart temporarily interrupts service and can fail in-flight requests. Schedule a maintenance window, and have clients retry and verify results according to each operation’s semantics. Restarting does not guarantee uninterrupted service.

Do not perform “rolling” (e.g. one node at a time) restarts.

6) Next Steps

  • Update any load balancers, reverse proxies, or other network control planes to route client requests to the new hosts in the MinIO distributed deployment. While MinIO automatically manages routing internally, having the control planes handle initial connection management may reduce network hops and improve efficiency.
  • Review the MinIO Console to confirm the updated cluster topology and monitor performance.