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.
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:
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.comminio6.example.comminio7.example.comminio8.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 with3.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, wherenstarts at1and increments by1per drive.
Persist Drive Mounting and Mapping Across Reboots
Use
/etc/fstabto ensure consistent drive-to-mount mapping across node reboots.Non-Linux Operating Systems should use the equivalent drive mount management tool.
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
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 ()
- Pool B: 20% chance ()
- Pool C: 50% chance ()
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.
Recommended Operating Systems
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.
Use the arm64 package name on ARM64 hosts.
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:
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:
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.
Each host has 4 locally attached drives with sequential mount points:
-
The new server pool consists of eight new MinIO hosts with sequential hostnames:
-
All hosts have eight locally-attached drives with sequential mount-points:
-
The deployment has a load balancer running at
https://minio.example.netthat 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:
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:
Use the following commands to confirm the service is online and functional:
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.