Linux Btrfs filesystem development
 help / color / mirror / Atom feed
* Safety of raid1 vs raid10
@ 2024-12-10  2:26 Scoopta
  2024-12-10  2:42 ` Zygo Blaxell
  2024-12-10  4:36 ` Qu Wenruo
  0 siblings, 2 replies; 9+ messages in thread
From: Scoopta @ 2024-12-10  2:26 UTC (permalink / raw)
  To: linux-btrfs

I've read online that btrfs raid10 is theoretically safer than raid1 
because raid10 groups drives together into mirrored pairs making the 
filesystem more likely to successfully survive a multi-drive failure 
event. I can't find any documentation that says this to be the case. Is 
it true that btrfs pairs drives together for raid10 but not raid1, if 
this is the case what's the reasoning for it?


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  2:26 Safety of raid1 vs raid10 Scoopta
@ 2024-12-10  2:42 ` Zygo Blaxell
  2024-12-10  2:44   ` Scoopta
  2024-12-10  4:36 ` Qu Wenruo
  1 sibling, 1 reply; 9+ messages in thread
From: Zygo Blaxell @ 2024-12-10  2:42 UTC (permalink / raw)
  To: Scoopta; +Cc: linux-btrfs

On Mon, Dec 09, 2024 at 06:26:24PM -0800, Scoopta wrote:
> I've read online that btrfs raid10 is theoretically safer than raid1 because
> raid10 groups drives together into mirrored pairs making the filesystem more
> likely to successfully survive a multi-drive failure event. I can't find any
> documentation that says this to be the case. Is it true that btrfs pairs
> drives together for raid10 but not raid1, if this is the case what's the
> reasoning for it?

It is _possible_ for raid10 and raid1 to be arranged such that multiple drive
losses are possible.  e.g. if all odd numbered devices are paired with all
even numbered devices, then any odd numbered device can be lost and the
filesystem still survives.

This is not _guaranteed_, it is only _possible_.

In a filesystem with an odd number of drives, or with drives of varying
sizes, the block groups will only guarantee that one drive loss can be
tolerated in each block group, in order to have the flexibility needed
to fill all available space.  In such cases it is common that block
groups are arranged in such a way that loss of any two drives will break
the filesystem.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  2:42 ` Zygo Blaxell
@ 2024-12-10  2:44   ` Scoopta
  2024-12-10  5:12     ` Zygo Blaxell
  0 siblings, 1 reply; 9+ messages in thread
From: Scoopta @ 2024-12-10  2:44 UTC (permalink / raw)
  To: Zygo Blaxell; +Cc: linux-btrfs

Ok, this is what I thought but I have seen so many articles that imply 
raid10 groups drives and I have found no evidence for that. I was always 
under the impression that neither raid 1 nor 10 grouped drives together 
intentionally and any grouping was circumstantial.

On 12/9/24 6:42 PM, Zygo Blaxell wrote:
> On Mon, Dec 09, 2024 at 06:26:24PM -0800, Scoopta wrote:
>> I've read online that btrfs raid10 is theoretically safer than raid1 because
>> raid10 groups drives together into mirrored pairs making the filesystem more
>> likely to successfully survive a multi-drive failure event. I can't find any
>> documentation that says this to be the case. Is it true that btrfs pairs
>> drives together for raid10 but not raid1, if this is the case what's the
>> reasoning for it?
> It is _possible_ for raid10 and raid1 to be arranged such that multiple drive
> losses are possible.  e.g. if all odd numbered devices are paired with all
> even numbered devices, then any odd numbered device can be lost and the
> filesystem still survives.
>
> This is not _guaranteed_, it is only _possible_.
>
> In a filesystem with an odd number of drives, or with drives of varying
> sizes, the block groups will only guarantee that one drive loss can be
> tolerated in each block group, in order to have the flexibility needed
> to fill all available space.  In such cases it is common that block
> groups are arranged in such a way that loss of any two drives will break
> the filesystem.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  2:26 Safety of raid1 vs raid10 Scoopta
  2024-12-10  2:42 ` Zygo Blaxell
@ 2024-12-10  4:36 ` Qu Wenruo
  2024-12-10  6:36   ` Scoopta
  1 sibling, 1 reply; 9+ messages in thread
From: Qu Wenruo @ 2024-12-10  4:36 UTC (permalink / raw)
  To: Scoopta, linux-btrfs



在 2024/12/10 12:56, Scoopta 写道:
> I've read online that btrfs raid10 is theoretically safer than raid1 
> because raid10 groups drives together into mirrored pairs making the 
> filesystem more likely to successfully survive a multi-drive failure 
> event.

It's only theoretically possible, but hardly possible in the real world.


For one single RAID10 chunk, btrfs can tolerant as many as half of the 
devices being missing, as long as each sub stripe (the RAID1 pair) has 
one device standing.

E.g. for chunk at bytenr X, we have 4 stripes:

  stripe 0 devid 1 physical X1
  stripe 1 devid 2 physical X2
  stripe 2 devid 3 physical X3
  stripe 3 devid 4 physical X4

We can have either devid 1+3 or devid 2+4 missing, and btrfs is totally 
fine with that chunk.

But the real problem is, one btrfs has more than 3 chunks, and normally 
one chunk is only 1GiB in size, so for a btrfs with 1TiB used space, it 
will have at least 1024 chunks.

Good luck all the chunks have the same stripe layout.

If there is another chunk at bytenr Y, also 4 stripes but a different 
layout:

  stripe 0 devid 1 physical Y1
  stripe 1 devid 3 physical Y2
  stripe 2 devid 2 physical Y3
  stripe 3 devid 4 physical Y4

Then the devid 1+3 missing is fine for chunk X, but not for chunk Y.

In really, the chunk layout is never ensured, and I just did the same 
RAID10 assumption in my btrfs-fuse project, until it failed selftest 
(missing two devices for a RAID10 btrfs) on a recent kernel, exactly due 
to the device rotation.

Thanks,
Qu

> I can't find any documentation that says this to be the case. Is 
> it true that btrfs pairs drives together for raid10 but not raid1, if 
> this is the case what's the reasoning for it?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  2:44   ` Scoopta
@ 2024-12-10  5:12     ` Zygo Blaxell
  2024-12-10  5:45       ` Scoopta
  0 siblings, 1 reply; 9+ messages in thread
From: Zygo Blaxell @ 2024-12-10  5:12 UTC (permalink / raw)
  To: Scoopta; +Cc: linux-btrfs

On Mon, Dec 09, 2024 at 06:44:14PM -0800, Scoopta wrote:
> Ok, this is what I thought but I have seen so many articles that imply
> raid10 groups drives and I have found no evidence for that. I was always
> under the impression that neither raid 1 nor 10 grouped drives together
> intentionally and any grouping was circumstantial.

In traditional, non-btrfs raid1/raid10 setups, this can easily be the
case, and people might be assuming this is also true on btrfs without
checking.

Traditional setups are much less flexible on space--you can't have
different sizes of drives--but you can organize the drives such that
each of them is entirely mirroring one other drive.  This can tolerate
up to N/2 failures, as long as each failure only removes one drive from
each pair--but it can also fail completely with only 2 drive failures,
if they're both mirrors of the same stripe.

> On 12/9/24 6:42 PM, Zygo Blaxell wrote:
> > On Mon, Dec 09, 2024 at 06:26:24PM -0800, Scoopta wrote:
> > > I've read online that btrfs raid10 is theoretically safer than raid1 because
> > > raid10 groups drives together into mirrored pairs making the filesystem more
> > > likely to successfully survive a multi-drive failure event. I can't find any
> > > documentation that says this to be the case. Is it true that btrfs pairs
> > > drives together for raid10 but not raid1, if this is the case what's the
> > > reasoning for it?
> > It is _possible_ for raid10 and raid1 to be arranged such that multiple drive
> > losses are possible.  e.g. if all odd numbered devices are paired with all
> > even numbered devices, then any odd numbered device can be lost and the
> > filesystem still survives.
> > 
> > This is not _guaranteed_, it is only _possible_.
> > 
> > In a filesystem with an odd number of drives, or with drives of varying
> > sizes, the block groups will only guarantee that one drive loss can be
> > tolerated in each block group, in order to have the flexibility needed
> > to fill all available space.  In such cases it is common that block
> > groups are arranged in such a way that loss of any two drives will break
> > the filesystem.
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  5:12     ` Zygo Blaxell
@ 2024-12-10  5:45       ` Scoopta
  0 siblings, 0 replies; 9+ messages in thread
From: Scoopta @ 2024-12-10  5:45 UTC (permalink / raw)
  To: Zygo Blaxell; +Cc: linux-btrfs

On 12/9/24 9:12 PM, Zygo Blaxell wrote:

> On Mon, Dec 09, 2024 at 06:44:14PM -0800, Scoopta wrote:
>> Ok, this is what I thought but I have seen so many articles that imply
>> raid10 groups drives and I have found no evidence for that. I was always
>> under the impression that neither raid 1 nor 10 grouped drives together
>> intentionally and any grouping was circumstantial.
> In traditional, non-btrfs raid1/raid10 setups, this can easily be the
> case, and people might be assuming this is also true on btrfs without
> checking.

Yeah I figured that's where the misconception was coming from but I 
wanted to verify that it was a misconception. It didn't make sense to me 
that btrfs would pair up raid10 drives but not raid1 drives. I figured 
they'd all behave the same way and that btrfs was free to organize data 
however it wanted provided the redundancy "on the tin", so to speak, was 
met.


> Traditional setups are much less flexible on space--you can't have
> different sizes of drives--but you can organize the drives such that
> each of them is entirely mirroring one other drive.  This can tolerate
> up to N/2 failures, as long as each failure only removes one drive from
> each pair--but it can also fail completely with only 2 drive failures,
> if they're both mirrors of the same stripe.
>
>> On 12/9/24 6:42 PM, Zygo Blaxell wrote:
>>> On Mon, Dec 09, 2024 at 06:26:24PM -0800, Scoopta wrote:
>>>> I've read online that btrfs raid10 is theoretically safer than raid1 because
>>>> raid10 groups drives together into mirrored pairs making the filesystem more
>>>> likely to successfully survive a multi-drive failure event. I can't find any
>>>> documentation that says this to be the case. Is it true that btrfs pairs
>>>> drives together for raid10 but not raid1, if this is the case what's the
>>>> reasoning for it?
>>> It is _possible_ for raid10 and raid1 to be arranged such that multiple drive
>>> losses are possible.  e.g. if all odd numbered devices are paired with all
>>> even numbered devices, then any odd numbered device can be lost and the
>>> filesystem still survives.
>>>
>>> This is not _guaranteed_, it is only _possible_.
>>>
>>> In a filesystem with an odd number of drives, or with drives of varying
>>> sizes, the block groups will only guarantee that one drive loss can be
>>> tolerated in each block group, in order to have the flexibility needed
>>> to fill all available space.  In such cases it is common that block
>>> groups are arranged in such a way that loss of any two drives will break
>>> the filesystem.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  4:36 ` Qu Wenruo
@ 2024-12-10  6:36   ` Scoopta
  2024-12-10  7:54     ` Qu Wenruo
  0 siblings, 1 reply; 9+ messages in thread
From: Scoopta @ 2024-12-10  6:36 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

Yeah, that makes a lot of sense. Given what I know about btrfs it seemed 
very unlikely it would pair up drives consistently. This actually gives 
me an interesting side question. With raid1, which is not striped, is 
there any guarantee that a file will be placed contiguously on a given 
drive or is the only guarantee for chunks while files over 1GiB, and 
therefore occupying more than one chunk, could be spread across multiple 
drives so long as each chunk is mirrored?

On 12/9/24 8:36 PM, Qu Wenruo wrote:
>
>
> 在 2024/12/10 12:56, Scoopta 写道:
>> I've read online that btrfs raid10 is theoretically safer than raid1 
>> because raid10 groups drives together into mirrored pairs making the 
>> filesystem more likely to successfully survive a multi-drive failure 
>> event.
>
> It's only theoretically possible, but hardly possible in the real world.
>
>
> For one single RAID10 chunk, btrfs can tolerant as many as half of the 
> devices being missing, as long as each sub stripe (the RAID1 pair) has 
> one device standing.
>
> E.g. for chunk at bytenr X, we have 4 stripes:
>
>  stripe 0 devid 1 physical X1
>  stripe 1 devid 2 physical X2
>  stripe 2 devid 3 physical X3
>  stripe 3 devid 4 physical X4
>
> We can have either devid 1+3 or devid 2+4 missing, and btrfs is 
> totally fine with that chunk.
>
> But the real problem is, one btrfs has more than 3 chunks, and 
> normally one chunk is only 1GiB in size, so for a btrfs with 1TiB used 
> space, it will have at least 1024 chunks.
>
> Good luck all the chunks have the same stripe layout.
>
> If there is another chunk at bytenr Y, also 4 stripes but a different 
> layout:
>
>  stripe 0 devid 1 physical Y1
>  stripe 1 devid 3 physical Y2
>  stripe 2 devid 2 physical Y3
>  stripe 3 devid 4 physical Y4
>
> Then the devid 1+3 missing is fine for chunk X, but not for chunk Y.
>
> In really, the chunk layout is never ensured, and I just did the same 
> RAID10 assumption in my btrfs-fuse project, until it failed selftest 
> (missing two devices for a RAID10 btrfs) on a recent kernel, exactly 
> due to the device rotation.
>
> Thanks,
> Qu
>
>> I can't find any documentation that says this to be the case. Is it 
>> true that btrfs pairs drives together for raid10 but not raid1, if 
>> this is the case what's the reasoning for it?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  6:36   ` Scoopta
@ 2024-12-10  7:54     ` Qu Wenruo
  2024-12-10 17:01       ` Scoopta
  0 siblings, 1 reply; 9+ messages in thread
From: Qu Wenruo @ 2024-12-10  7:54 UTC (permalink / raw)
  To: Scoopta, linux-btrfs



在 2024/12/10 17:06, Scoopta 写道:
> Yeah, that makes a lot of sense. Given what I know about btrfs it seemed 
> very unlikely it would pair up drives consistently. This actually gives 
> me an interesting side question. With raid1, which is not striped, is 
> there any guarantee that a file will be placed contiguously on a given 
> drive or is the only guarantee for chunks while files over 1GiB, and 
> therefore occupying more than one chunk, could be spread across multiple 
> drives so long as each chunk is mirrored?

For a file, there is no guarantee at all that it will be placed on a 
given drive.

As you mentioned, a file can exist on multiple chunks, thus it can be 
spread across different devices.

And the guarantee is, as long as all the file extents are all on raid1 
chunks, all of these file extents will have two copies on different devices.



And to be more accurate, a file is consisted of zero or more file extents.
The file extent size can vary, from the block size (usually 4K for 
btrfs, and we normally call it sector size), to as large as 128M 
(non-compressed extent) or 128K (compressed one).

And the extent size is determined by various factors, from the free 
space of the fs, to the write pattern (worst case like checker board 
writes, 4K write then 4K hole, will definitely result 4K sized extents).

So even for a file smaller than chunk size, it can have multiple file 
extents on different chunks.

Thus there isn't really any guarantee on how a file is stored where, due 
to all the layers involved:

   file -> file extents -> chunks


And I forgot a corner case, inlined file extents, which is fully stored 
inside a tree block, can have a different profile than the data profile 
completely.

That's why we have fiemap ioctl, to show the file extents layout (inside 
btrfs logical address space), then only with the chunk layout (btrfs ins 
dump-tree or btrfs-map-logical) info, one can really determine where the 
data is.

And if you want to dig this deep, welcome to the rabbit whole of how to 
read a file on btrfs, and there is also a small project explaining the 
whole process: https://github.com/adam900710/btrfs-fuse

Thanks,
Qu

> 
> On 12/9/24 8:36 PM, Qu Wenruo wrote:
>>
>>
>> 在 2024/12/10 12:56, Scoopta 写道:
>>> I've read online that btrfs raid10 is theoretically safer than raid1 
>>> because raid10 groups drives together into mirrored pairs making the 
>>> filesystem more likely to successfully survive a multi-drive failure 
>>> event.
>>
>> It's only theoretically possible, but hardly possible in the real world.
>>
>>
>> For one single RAID10 chunk, btrfs can tolerant as many as half of the 
>> devices being missing, as long as each sub stripe (the RAID1 pair) has 
>> one device standing.
>>
>> E.g. for chunk at bytenr X, we have 4 stripes:
>>
>>  stripe 0 devid 1 physical X1
>>  stripe 1 devid 2 physical X2
>>  stripe 2 devid 3 physical X3
>>  stripe 3 devid 4 physical X4
>>
>> We can have either devid 1+3 or devid 2+4 missing, and btrfs is 
>> totally fine with that chunk.
>>
>> But the real problem is, one btrfs has more than 3 chunks, and 
>> normally one chunk is only 1GiB in size, so for a btrfs with 1TiB used 
>> space, it will have at least 1024 chunks.
>>
>> Good luck all the chunks have the same stripe layout.
>>
>> If there is another chunk at bytenr Y, also 4 stripes but a different 
>> layout:
>>
>>  stripe 0 devid 1 physical Y1
>>  stripe 1 devid 3 physical Y2
>>  stripe 2 devid 2 physical Y3
>>  stripe 3 devid 4 physical Y4
>>
>> Then the devid 1+3 missing is fine for chunk X, but not for chunk Y.
>>
>> In really, the chunk layout is never ensured, and I just did the same 
>> RAID10 assumption in my btrfs-fuse project, until it failed selftest 
>> (missing two devices for a RAID10 btrfs) on a recent kernel, exactly 
>> due to the device rotation.
>>
>> Thanks,
>> Qu
>>
>>> I can't find any documentation that says this to be the case. Is it 
>>> true that btrfs pairs drives together for raid10 but not raid1, if 
>>> this is the case what's the reasoning for it?


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Safety of raid1 vs raid10
  2024-12-10  7:54     ` Qu Wenruo
@ 2024-12-10 17:01       ` Scoopta
  0 siblings, 0 replies; 9+ messages in thread
From: Scoopta @ 2024-12-10 17:01 UTC (permalink / raw)
  To: Qu Wenruo, linux-btrfs

Hmmmm, very interesting. I do love this rabbit hole I've ended up down 
although the data structures involved with modern filesystems hurt my 
head a bit. My experience implementing a filesystem starts and ends with 
ext2 as it's pretty simple data structure wise. I'll give some of the 
code a read and see if I can get my head around it.

On 12/9/24 11:54 PM, Qu Wenruo wrote:
>
>
> 在 2024/12/10 17:06, Scoopta 写道:
>> Yeah, that makes a lot of sense. Given what I know about btrfs it 
>> seemed very unlikely it would pair up drives consistently. This 
>> actually gives me an interesting side question. With raid1, which is 
>> not striped, is there any guarantee that a file will be placed 
>> contiguously on a given drive or is the only guarantee for chunks 
>> while files over 1GiB, and therefore occupying more than one chunk, 
>> could be spread across multiple drives so long as each chunk is 
>> mirrored?
>
> For a file, there is no guarantee at all that it will be placed on a 
> given drive.
>
> As you mentioned, a file can exist on multiple chunks, thus it can be 
> spread across different devices.
>
> And the guarantee is, as long as all the file extents are all on raid1 
> chunks, all of these file extents will have two copies on different 
> devices.
>
>
>
> And to be more accurate, a file is consisted of zero or more file 
> extents.
> The file extent size can vary, from the block size (usually 4K for 
> btrfs, and we normally call it sector size), to as large as 128M 
> (non-compressed extent) or 128K (compressed one).
>
> And the extent size is determined by various factors, from the free 
> space of the fs, to the write pattern (worst case like checker board 
> writes, 4K write then 4K hole, will definitely result 4K sized extents).
>
> So even for a file smaller than chunk size, it can have multiple file 
> extents on different chunks.
>
> Thus there isn't really any guarantee on how a file is stored where, 
> due to all the layers involved:
>
>   file -> file extents -> chunks
>
>
> And I forgot a corner case, inlined file extents, which is fully 
> stored inside a tree block, can have a different profile than the data 
> profile completely.
>
> That's why we have fiemap ioctl, to show the file extents layout 
> (inside btrfs logical address space), then only with the chunk layout 
> (btrfs ins dump-tree or btrfs-map-logical) info, one can really 
> determine where the data is.
>
> And if you want to dig this deep, welcome to the rabbit whole of how 
> to read a file on btrfs, and there is also a small project explaining 
> the whole process: https://github.com/adam900710/btrfs-fuse
>
> Thanks,
> Qu
>
>>
>> On 12/9/24 8:36 PM, Qu Wenruo wrote:
>>>
>>>
>>> 在 2024/12/10 12:56, Scoopta 写道:
>>>> I've read online that btrfs raid10 is theoretically safer than 
>>>> raid1 because raid10 groups drives together into mirrored pairs 
>>>> making the filesystem more likely to successfully survive a 
>>>> multi-drive failure event.
>>>
>>> It's only theoretically possible, but hardly possible in the real 
>>> world.
>>>
>>>
>>> For one single RAID10 chunk, btrfs can tolerant as many as half of 
>>> the devices being missing, as long as each sub stripe (the RAID1 
>>> pair) has one device standing.
>>>
>>> E.g. for chunk at bytenr X, we have 4 stripes:
>>>
>>>  stripe 0 devid 1 physical X1
>>>  stripe 1 devid 2 physical X2
>>>  stripe 2 devid 3 physical X3
>>>  stripe 3 devid 4 physical X4
>>>
>>> We can have either devid 1+3 or devid 2+4 missing, and btrfs is 
>>> totally fine with that chunk.
>>>
>>> But the real problem is, one btrfs has more than 3 chunks, and 
>>> normally one chunk is only 1GiB in size, so for a btrfs with 1TiB 
>>> used space, it will have at least 1024 chunks.
>>>
>>> Good luck all the chunks have the same stripe layout.
>>>
>>> If there is another chunk at bytenr Y, also 4 stripes but a 
>>> different layout:
>>>
>>>  stripe 0 devid 1 physical Y1
>>>  stripe 1 devid 3 physical Y2
>>>  stripe 2 devid 2 physical Y3
>>>  stripe 3 devid 4 physical Y4
>>>
>>> Then the devid 1+3 missing is fine for chunk X, but not for chunk Y.
>>>
>>> In really, the chunk layout is never ensured, and I just did the 
>>> same RAID10 assumption in my btrfs-fuse project, until it failed 
>>> selftest (missing two devices for a RAID10 btrfs) on a recent 
>>> kernel, exactly due to the device rotation.
>>>
>>> Thanks,
>>> Qu
>>>
>>>> I can't find any documentation that says this to be the case. Is it 
>>>> true that btrfs pairs drives together for raid10 but not raid1, if 
>>>> this is the case what's the reasoning for it?
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-12-10 17:01 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-10  2:26 Safety of raid1 vs raid10 Scoopta
2024-12-10  2:42 ` Zygo Blaxell
2024-12-10  2:44   ` Scoopta
2024-12-10  5:12     ` Zygo Blaxell
2024-12-10  5:45       ` Scoopta
2024-12-10  4:36 ` Qu Wenruo
2024-12-10  6:36   ` Scoopta
2024-12-10  7:54     ` Qu Wenruo
2024-12-10 17:01       ` Scoopta

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox