On 06/20/2011 01:26 PM, Philip Poten wrote:> I operate a distributed replicated (1:2) setup that looks like this:
>
> server1:bigdisk,server1:smalldisk,server2:bigdisk,server2:smalldisk
>
> replica sets are bigdisk-bigdisk and smalldisk-smalldisk.
Are you sure? I'm not trying to be snarky here; if you specified the
bricks in that order to "volume create" then the combination of bricks
into replica sets might not be what you expect. Instead, you'd have both
disks on server1 combined into one replica set and both disks on server2
combined into another, and that wouldn't protect your data against
server failure.
> This setup will be extended by another set of four bricks (same
> setup) within the next few days, and I could make those into another
> volume entirely, but I'd prefer not to, leaving me with more disks
> and hosts to distribute the data.
>
> Now, I should've seen this earlier and used different volumes for
> this, but I'd like to seperate two main directories between bigdisk
> and smalldisk replica sets.
>
> Is there a best practice for doing this? I thought I could manually
> move all the files pertaining to those directories between the disks,
> but since this is a production system, I'd like to know if gluster
> can handle this, and if not, if there's a better way to achieve this
> - without seperating the data into two volumes.
There is kind of a way to do this, but it's distinctly non-kosher so I
have to slap a big planet-sized "caveat emptor" on it. As is
explained
in an article I wrote a while ago
(http://cloudfs.org/2011/04/glusterfs-extended-attributes/) the "layout
map" that controls placement of files within a directory is actually
stored in an extended attribute on each copy of that directory (one copy
per brick). Therefore, by manipulating these extended attributes from
the command line you could affect placement of files in any number of
ways including the way you mention. In that case, you would set the
xattrs on each server to "claim" hash ranges (see the article) as
follows:
bigdisk/bigdir - 0x00000000 to 0xfffffffe
bigdisk/smalldir - 0xffffffff to 0xffffffff
smalldisk/bigdir - 0xffffffff to 0xffffffff
smalldisk/smalldir - 0x00000000 to 0xfffffffe
This would cause practically all files in bigdir to be placed in
server*:bigdisk/bigdir, and practically all files in smalldir to be
placed in server*:smalldisk/smalldir. I say "practically all" instead
of "all" because it's actually not possible to assign a zero range
to a
brick, so there's a one four in four billion chance that a file in
either directory will get assigned to the "wrong" place. After doing
this, "gluster volume rebalance xxx migrate-data start" should cause
files to be migrated to the "correct" locations, but with two major
caveats.
(1) A subsequent "gluster volume rebalance xxx fix-layout start" will
undo your careful xattr-twiddling, so that files will no longer be
placed the way you intended.
(2) These values are not inherited by subdirectories (that would be a
very good subject for an enhancement request) so the careful placement
would only apply to the top-level directories.
For these reasons, I wouldn't necessarily recommend doing things this
way. It's *possible*, but in the long run you'd probably be better off
creating separate volumes.