Announce: mogilefs-server 2.15, aka "fsck, rebalance, drain"

Brad Fitzpatrick brad at danga.com
Mon May 7 19:58:42 UTC 2007


Mogilers,

I'm pleased to announce an exciting new MogileFS release.  The Changelog,
while exciting, is long, so I'll summarize:

   * much, much faster fsck (if using new mogstored, else
     same speed as before)

   * rebalance support (replicators, when idle, can optionally rebalance
     the state of the world).  to use, with new mogadm command:

        mogadm settings set enable_rebalance 1

     see if it's still running with:

        mogadm settings list

     (it turns itself off when done)

   * new device state "drain", like mix of dead & readonly.  still serve
     traffic, but don't get new files.  replicators, when idle, migrate
     files off those disks.

   * mogstored can use lighttpd instead of Perlbal now, including
     auto-configing lighttpd, and managing it as a child process.
     passes tests at least, but could use field reports from you
     guys using it in production.  (this previously worked with trickery,
     but now it works out-of-the-box...)

And internals-wise:

   * tons of code cleanup, new objects, new tests, lots of new comments
   * bug fixes (especially corner cases with MultipleHosts
     replication policy)
   * DeviceState abstraction
   * ReplicationRequest abstraction
   * RebalancePolicy abstraction (complementing ReplicationPolicy)

I think you'll all really enjoy this release.  Please report any
questionable behavior, or just ask questions in general.

Unfortunately (or fortunately), this release has some new dependencies
which made our life much easier and code much cleaner to add some new
stuff to mogstored... Gearman server/clients are now required, as the
mogstored now has an embedded gearman server in it, for child processes
doing work.  This will also be used in mogilefsd soon, for upcoming
pure-HTTP support, so we didn't feel bad adding the dependency already.

If you want, you can only upgrade the mogilefs-server and use the old
mogstoreds, then you don't need Gearman stuff yet.  (you'll need it in
future upgrades, though)  But note, then you won't have fast fsck.

Downloads:
----------

new mogadm (in MogileFS-Utils package)

   http://danga.com/dist/MogileFS/MogileFS-Utils-2.09.tar.gz
   * http://danga.com/dist/MogileFS/client-perl/MogileFS-Client-1.07.tar.gz

new mogilefs-server:

   http://danga.com/dist/MogileFS/server/mogilefs-server-2.15.tar.gz
   * Danga::Socket >= 1.56, and Perlbal >= 1.53.
   * http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Gearman-1.07.tar.gz
   * http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Gearman-Client-Async-0.93.tar.gz
   * http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Gearman-Server-1.08.tar.gz

If you want mogstored to use less CPU, you'll also want Perlbal::XS::HTTPHeaders:

   http://search.cpan.org/CPAN/authors/id/M/MA/MARKSMITH/Perlbal-XS-HTTPHeaders-0.19.tar.gz

Full changelog:
---------------

2007-05-07: Release version 2.15 ("fsck/drain/rebalance")

        * minor bug fixes and enhancements for MultipleHosts replication
          policy.  bunch of corner cases now checked with new tests.
          now easy to write more replication policy tests in future.

        * replication policies can now return "desperate" requests,
          signalling that a replication reassessment should be
          enqueued for the future, to see if things could be improved.
          (that part's not currently implemented, but the real feature
           and motivation is that the rebalancer now won't delete a
           DevFID if it results in a desperate move, only an ideal move. )

        * replication policies now can optionally return a new return
          value of the (new) type MogileFS::ReplicationRequest, which
          has pretty accessor names, can suggest multiple places,
          can indicate non-ideal emergency replication decisions.
          old plugins' return values will be transparently upgraded
          to the equivalent new return value objects.

        * adding new device state: "drain".  it's a hybrid of "dead"
          (in that files are migrated off it) and "readonly", it that
          it still serves traffic... it just doesn't get new files.
          this also introduces the new object-oriented DeviceState class,
          and device_state($name) utility function to get the DeviceState
          singleton by name

        * internal code cleanup.  notably, kill the old & nasty legacy
          'find_deviceid' function which was ridiculously long and hairy.
          the two callers are now more readable with sorts/greps/etc.

        * make mogstored's devN/usage writing process (DiskUsage) be less
          racy with the mogilefsd monitoring code... don't open file for
          write... open read/write, then in one write system call, write
          the entire file, with newline padding at end to cover old data,
          then truncate it if necessary.  should remove harmless (but scary)
          error messages previously reported by the mogilefsd monitor
          about zero-length usage files.

        * new protocol commands to list/set (certain) server settings,
          with value sanity checking (see MogileFS::Config for which
          are settable, and with what values).  needed for "enable_rebalance".
          was partially enabled before for slave settings.  also needed
          for memcached support before, which was never possible to
          set with mogadm, only with db tweaking.

        * make mogilefsd fsck use new mogstored fid_sizes command, to
          do bulk stats.  speeds up fscks a ton.

        * be robust against system clocks that go backwards between
          gettimeofday calls:
          http://lists.danga.com/pipermail/mogilefs/2007-April/000897.html

        * Put gearman server in mogstored process, add worker
          'mogstored-fidsizes' which runs as subprocess of mogstored. Add
          side-channel command 'fid_sizes' which allows us to quickly enumerate
          and get sizes for files across entire devices on a storage node.

        * remove all code like $state eq "readonly", $state=~ /^dead|down$/
          and instead convert it into specific questions on policy/traits
          of given state, like $dev->should_put_new_files_on, or
          $dev->should_drain_files_off.  see MogileFS::DeviceState,
          objects of which are accessed via $dev->dstate, or new
          MogileFS::Util device_state($name) wrapper.

        * start of rebalance support.  (where replication workers, in their
          idle time, can rearrange files to even out disk space and/or IO
          activity on storage nodes... policy isn't hard-coded, and is
          in fact currently random)

        * lighttpd support in both mogilefsd and mogstored.  passes test
          suite with environment MOGSTORED_SERVER_TYPE=lighttpd set now.

        * abstract out the HTTP server support in mogstored, so
          mogstored isn't just a perlbal wrapper, but an anything
          wrapper. (in particular, lighttpd and apache)  mogstored still
          exists for all its other misc admin/monitoring functions,
          but can then manage/configure apache/lighttpd child process(es).
          so far they're just stubbed out.

        * split mogstored into separate files per class, rather than one
          large script.


Enjoy!

Brad


More information about the mogilefs mailing list