As data volumes grow beyond what a single server’s internal drives can handle, organizations turn to storage arrays — dedicated systems built to hold, protect, and serve large amounts of data to multiple servers at once. This article explains what a storage array is, how it’s built, and the major architectural types you’ll encounter in real environments.
What Is a Storage Array?
A storage array is a dedicated hardware system containing multiple disk drives (HDD, SSD, or a mix), managed by one or more controllers, and presented to servers as usable storage over a network or direct connection. Unlike a single disk in a PC, an array combines drives using RAID or similar data-protection schemes, adds caching, and exposes storage through protocols like Fibre Channel, iSCSI, or NFS/SMB.
graph TD
subgraph Storage Array
Ctrl1[Controller A] --- Ctrl2[Controller B]
Ctrl1 --- Disks[Disk Shelf: HDD/SSD Drives]
Ctrl2 --- Disks
end
Ctrl1 -->|FC/iSCSI| Server1[Server 1]
Ctrl2 -->|FC/iSCSI| Server2[Server 2]
Disks -->|NFS/SMB| FileClient[File Access Clients]
Core Components
| Component | Role |
|---|---|
| Controllers | The “brains” — manage RAID, caching, and host connectivity; typically dual for redundancy |
| Disk shelves/enclosures | House the physical drives, connected to controllers via SAS or similar |
| Cache (RAM/NVRAM) | Absorbs writes and speeds reads before committing to slower media |
| Front-end ports | Connect to servers (FC, iSCSI, NFS, SMB) |
| Back-end connections | Connect controllers to disk shelves (typically SAS) |
Storage Array Categories by Access Type
Block Storage Arrays (SAN)
Present raw block devices (LUNs) to servers, which format them with their own filesystem, exactly as if they were local disks. Accessed via Fibre Channel or iSCSI.
| Feature | Detail |
|---|---|
| Access protocol | FC, iSCSI, FCoE |
| Presented as | Raw block devices (LUNs) |
| Filesystem control | Managed by the connecting host |
| Typical use | Databases, VM datastores, high-performance applications |
File Storage Arrays (NAS)
Present a ready-to-use filesystem over the network using NFS (Linux/Unix) or SMB/CIFS (Windows), rather than raw block devices.
| Feature | Detail |
|---|---|
| Access protocol | NFS, SMB/CIFS |
| Presented as | Shared folders/mount points |
| Filesystem control | Managed by the array itself |
| Typical use | User file shares, home directories, general-purpose file storage |
Object Storage Arrays
Store data as discrete objects, each with data, metadata, and a unique identifier, accessed via HTTP-based APIs (most commonly S3-compatible).
| Feature | Detail |
|---|---|
| Access protocol | HTTP/REST (S3-compatible, etc.) |
| Presented as | Objects via API, not a filesystem/block device |
| Scalability | Extremely high — designed for massive scale-out |
| Typical use | Backups, archives, cloud-native applications, large unstructured datasets |
Unified Storage Arrays
Many modern arrays support block, file, and sometimes object access simultaneously from a single platform — reducing the need for separate dedicated systems for each access type.
Comparison: SAN vs NAS vs Object
| Factor | SAN (Block) | NAS (File) | Object |
|---|---|---|---|
| Access method | FC/iSCSI LUNs | NFS/SMB shares | HTTP/REST API |
| Performance | Highest, low latency | Good for general file access | Higher latency, optimized for throughput/scale |
| Scalability | Moderate (array-bound) | Moderate | Very high (scale-out) |
| Best for | Databases, VMs | File shares, user data | Backup, archive, big unstructured data |
| Metadata handling | None (raw blocks) | Basic filesystem metadata | Rich, customizable metadata per object |
Storage Array Architectures
Monolithic (Dual-Controller) Arrays
The traditional design: two controllers in an active-active or active-passive configuration, sharing a common set of disk shelves. Simple, well-understood, and still very common in mid-range deployments.
Scale-Out Arrays
Add capacity and performance by adding more nodes, each contributing both storage and processing power, working together as a single logical system (common in modern NAS and object storage platforms). This avoids the ceiling imposed by a fixed pair of controllers.
Hyperconverged Infrastructure (HCI)
Storage, compute, and networking are combined within the same cluster of servers rather than existing as a separate dedicated array — software-defined storage pools local disks across nodes into a shared resource.
graph LR
subgraph Scale-Out Cluster
N1[Node 1: Compute+Storage] --- N2[Node 2: Compute+Storage]
N2 --- N3[Node 3: Compute+Storage]
N3 --- N1
end
N1 --> Net[Network]
N2 --> Net
N3 --> NetRAID Levels Used in Arrays
| RAID Level | Description | Fault Tolerance | Usable Capacity |
|---|---|---|---|
| RAID 0 | Striping, no redundancy | None | 100% |
| RAID 1 | Mirroring | 1 drive failure | 50% |
| RAID 5 | Striping + single parity | 1 drive failure | (n-1)/n |
| RAID 6 | Striping + dual parity | 2 drive failures | (n-2)/n |
| RAID 10 | Mirrored + striped | 1 per mirror pair | 50% |
Most enterprise arrays today use RAID 6 or proprietary erasure-coding schemes for large capacity drives, since RAID 5’s single-parity protection leaves a dangerously long rebuild window vulnerable to a second failure on large modern drives.
Practical Example: Presenting Storage on Linux
Connecting to an iSCSI Target
sudo apt install open-iscsi
# Discover targets
sudo iscsiadm -m discovery -t sendtargets -p 10.0.0.50
# Log in to a discovered target
sudo iscsiadm -m node --targetname iqn.2020-01.com.example:array1 --login
# Confirm the new block device appeared
lsblk
Mounting an NFS Share from a NAS
sudo apt install nfs-common
sudo mkdir -p /mnt/nasshare
sudo mount -t nfs 10.0.0.60:/export/data /mnt/nasshare
# Persist across reboots
echo "10.0.0.60:/export/data /mnt/nasshare nfs defaults 0 0" | sudo tee -a /etc/fstab
Checking Array Health via Python (SNMP Example)
from pysnmp.hlapi import *
def get_snmp_value(host, community, oid):
iterator = getCmd(
SnmpEngine(),
CommunityData(community),
UdpTransportTarget((host, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid))
)
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
if not errorIndication and not errorStatus:
for varBind in varBinds:
return varBind[1]
return None
# Example OID would be vendor-specific for array health status
value = get_snmp_value("10.0.0.50", "public", "1.3.6.1.2.1.1.1.0")
print(f"Array system description: {value}")
Best Practices
- Match the array type to the workload: block for databases/VMs, file for shared user data, object for backup/archive/unstructured scale.
- Always deploy dual controllers/redundant paths — a storage array is often a single point of failure for many servers at once.
- Use RAID 6 or erasure coding rather than RAID 5 on large modern drives, given rebuild-time risk.
- Monitor capacity trends proactively; running an array to near-full capacity degrades performance and risks outages.
- Separate management traffic from data traffic on dedicated networks/VLANs where possible.
- Plan for growth — scale-out architectures avoid painful forklift upgrades later.
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
| LUN not visible on host | Zoning/masking misconfiguration | Verify LUN masking and FC/iSCSI zoning |
| Degraded performance | Controller overload, cache exhaustion, failed disk | Check controller stats, disk health |
| Array shows degraded RAID | Failed drive | Replace drive, monitor rebuild progress |
| NFS mount hangs | Network issue or NFS server overload | Check network path, NFS server load |
| Capacity alerts | Array nearing full | Expand capacity or archive/delete data |
Further Reading
- SNIA Storage Networking Industry Association Resources
- RFC 3720 — iSCSI
- RFC 7530 — NFS Version 4 Protocol
- Red Hat: Managing iSCSI Storage
- Amazon S3 API Reference (Object Storage Reference)
Conclusion
Storage arrays come in many shapes, but they all solve the same fundamental problem: reliably storing large amounts of data and serving it efficiently to multiple consumers at once. Understanding the tradeoffs between block, file, and object access — and the underlying architectures behind them — is essential for choosing (and troubleshooting) the right storage platform for any given workload.