Enabling a RAID controller to support a mixture of stripe sizes and configurations over the same array simultaneously and dynamically, thereby allowing stripe sizes to be optimised for different data types and access patterns.
Existing RAID controllers, once configured, normally have a fixed stripe size and configuration (raid 0, 1, 5 or 6 etc) over the entire array (or sub-arrays).
This invention allows a RAID controller to support a mixture of stripe sizes and configurations over the same array simultaneously and dynamically.
Optimal stripe size may vary for different data types and access patterns; one size does not necessarily fit all.
Some file systems use variable-sized stripes to improve performance, reliability and avoid read-modify-write. These are not currently supported by hardware RAID controllers.
One stripe configuration may not be appropriate for all data types, i.e. mixtures of critical and non-critical data. Therefore the ability to support a mixture of stripe sizes and configurations is useful.
· The array is presented as a number of virtual LUNs.
· Each virtual LUN represents a different way of accessing the same array of disks.
· Each virtual LUN represents a different stripe size and configuration.
· The LUN number is used to direct the operation of the RAID controller, otherwise it functions as a ‘dumb’ block device.
· It assumes the stripe is formed of contiguous reads or writes in the configuration determined by the LUN number.
· The user is responsible for policing of non-compatible or overlapping stripes.
· Rebuild is driven by reads – it may be possible to use spare space (520/528B blocks) to tag a stripe configuration for auto-rebuild.
Consider an existing RAID array with the following configuration:-
· 8 data drives and 1 parity drive.
· Drive block size of 512 bytes, stripe size of 8 KB = 16 blocks.
|
LBA |
Disk 1 |
Disk 2 |
Disk 3 |
Disk 4 |
Disk 5 |
Disk 6 |
Disk 7 |
Disk 8 |
Disk 9 |
|
0 |
D0 |
D2 |
D4 |
D6 |
D8 |
D10 |
D12 |
D14 |
P0 |
|
1 |
D1 |
D3 |
D5 |
D7 |
D9 |
D11 |
D13 |
P1 |
D15 |
|
2 |
D0 |
D2 |
D4 |
D6 |
D8 |
D10 |
P0 |
D12 |
D14 |
|
3 |
D1 |
D3 |
D5 |
D7 |
D9 |
P1 |
D11 |
D13 |
D15 |
|
|
|
|
|
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
|
By way of example consider a RAID controller with a number of virtual LUNs. The same array of disks can be represented in many ways:
|
Virtual LUN
|
Configuration |
|
0 |
Raw 512B |
|
1 |
512B + mirror |
|
2 |
1KB stripe + parity |
|
3 |
2KB stripe + parity |
|
4 |
4KB stripe + parity |
|
5,6,7,8 |
8,16,32,64KB stripe + parity |
|
9 |
128KB stripe + parity |
Obviously many more options exist, including raid 6, non-modulo 2 sizes and alternative alignments.
Virtual LUN 0, RAW 512B:
|
LBA |
Disk 1 |
Disk 2 |
Disk 3 |
Disk 4 |
Disk 5 |
Disk 6 |
Disk 7 |
Disk 8 |
Disk 9 |
|
N |
|
D0 |
D0 |
|
|
|
… |
… |
… |
|
N+1 |
|
|
|
|
D0 |
D0 |
|
D0 |
|
Virtual LUN 1, 512B + mirror:
|
LBA |
Disk 1 |
Disk 2 |
Disk 3 |
Disk 4 |
Disk 5 |
Disk 6 |
Disk 7 |
Disk 8 |
Disk 9 |
|
N |
|
|
D0 |
M0 |
D1 |
M0 |
|
|
.. |
|
N+1 |
|
D2 |
M2 |
|
|
|
|
|
|
Virtual LUN 3, 2KB + parity:
|
LBA |
Disk 1 |
Disk 2 |
Disk 3 |
Disk 4 |
Disk 5 |
Disk 6 |
Disk 7 |
Disk 8 |
Disk 9 |
|
N |
D0 |
D1 |
D2 |
D3 |
P0 |
|
|
|
|
|
N+1 |
|
|
|
|
|
|
D0 |
D1 |
D2 |
|
N+2 |
D3 |
P0 |
|
|
|
|
|
D0 |
D1 |
|
N+3 |
D2 |
D3 |
P0 |
|
|
|
|
|
|
Virtual LUN 5, 8KB + parity:
|
LBA |
Disk 1 |
Disk 2 |
Disk 3 |
Disk 4 |
Disk 5 |
Disk 6 |
Disk 7 |
Disk 8 |
Disk 9 |
|
N |
D... |