Files
scoutfs/kmod
Zach BrownandZach Brown 5b258cee3b scoutfs: refine quorum voting
The current quorum voting implementatoin had some rough edges that
increased the complexity of the system and introduced undesirable
failure modes.  We can keep the same basic pattern but move
functionality around a few places, and rethink the quorum voting, to end
up with a meaningfully simpler system.

The motivation for this work was to remove the need to provide a
uniq_name option for every mount instance.

The first big change is to remove the idea of static configuration slots
for mounts.  This removes the use of uniq_name.  Mounts now simply have
a server_addr mount option instead of using their uniq_name to find
their address in the configuration.

The server can't check the configuration to see if a given connected
client's name is found in the quorum config.  Clients can set a flag in
their sent greeting which indicates that they're a voter.  This removes
the uniq_name from the greeting and mounted client records.

Without a static configuration mounts no longer have dedicated block
locations to write to.  We increase the size of the region of quorum
blocks and have voters simply write to a random block.  Overwriting vote
blocks is OK because we move from heartbeating design patterns to a
protocol strongly based on raft's election.  We're using quorum blocks
to communicate votes instead of network messages and overwriting blocks
is analagous to lossy networks droping vote messages in the raft
election protocol.

We were using the dedicated per-mount quorum blocks to track mounts that
had been elected and needed to be fenced.  We no longer have that
storage so instead we add the idea of an election log that is stored in
every voting block.  Readers merge the logs from all the blocks they
read and write the resulting merged log in their block.

With no static quorum configuration we no longer have to worry about the
complexity of changing the slot configurations while they're in use.
The only persistent configuration is the number of votes a candidate
needs to be elected by a quorum.

It was a mistake to use quorum voting blocks to communicate state
between the server and the quorum voters.  We can easily move the
unmount_barrier, server address, and fencing state from the quorum
blocks into the super block.  The server no longer needs the quorum
election info struct to be able to later write its quorum block.  It
instead writes a few fields in the super.  There's only one place where
clients need to look to find out who they should connect to or if they
can finish unmount.

Signed-off-by: Zach Brown <zab@versity.com>
2019-08-20 15:52:13 -07:00
..
2019-08-20 15:52:13 -07:00
2019-05-21 11:33:26 -07:00

Introduction

scoutfs is a clustered in-kernel Linux filesystem designed and built from the ground up to support large archival systems.

Its key differentiating features are:

  • Integrated consistent indexing to accelerate archival maintenance operations
  • Shared LSM index structure to scale metadata rates with storage bandwidth
  • Decoupled logical locking from serialized device writes to reduce contention

It meets best of breed expectations:

  • Fully consistent POSIX semantics between nodes
  • Rich metadata to ensure the integrity of metadata references
  • Atomic transactions to maintain consistent persistent structures
  • First class kernel implementation for high performance and low latency
  • Open GPLv2 implementation

Learn more in the white paper.

Current Status

Alpha Open Source Development

scoutfs is under heavy active development. We're developing it in the open to give the community an opportunity to affect the design and implementation.

The core architectural design elements are in place. Much surrounding functionality hasn't been implemented. It's appropriate for early adopters and interested developers, not for production use.

In that vein, expect significant incompatible changes to both the format of network messages and persistent structures. To avoid mistakes the implementation currently calculates a hash of the format and ioctl header files in the source tree. The kernel module will refuse to mount a volume created by userspace utilities with a mismatched hash, and it will refuse to connect to a remote node with a mismatched hash. This means having to unmount, mkfs, and remount everything across many functional changes. Once the format is nailed down we'll wire up forward and back compat machinery and remove this temporary safety measure.

The current kernel module is developed against the RHEL/CentOS 7.x kernel to minimize the friction of developing and testing with partners' existing infrastructure. Once we're happy with the design we'll shift development to the upstream kernel while maintaining distro compatibility branches.

Community Mailing List

Please join us on the open scoutfs-devel@scoutfs.org mailing list hosted on Google Groups for all discussion of scoutfs.

Quick Start

This following a very rough example of the procedure to get up and running, experience will be needed to fill in the gaps. We're happy to help on the mailing list.

The requirements for running scoutfs on a small cluster are:

  1. One or more nodes running x86-64 CentOS/RHEL 7.4 (or 7.3)
  2. Access to a single shared block device
  3. IPv4 connectivity between the nodes

The steps for getting scoutfs mounted and operational are:

  1. Get the kernel module running on the nodes
  2. Make a new filesystem on the device with the userspace utilities
  3. Mount the device on all the nodes

In this example we run all of these commands on two nodes. The block device name is the same on all the nodes.

  1. Get the Kernel Module and Userspace Binaries

    • Either use snapshot RPMs built from git by Versity:
    rpm -i https://scoutfs.s3-us-west-2.amazonaws.com/scoutfs-repo-0.0.1-1.el7_4.noarch.rpm
    yum install scoutfs-utils kmod-scoutfs
    
    • Or use the binaries built from checked out git repositories:
    yum install kernel-devel
    git clone git@github.com:versity/scoutfs-kmod-dev.git
    make -C scoutfs-kmod-dev module 
    modprobe libcrc32c
    insmod scoutfs-kmod-dev/src/scoutfs.ko
    
    git clone git@github.com:versity/scoutfs-utils-dev.git
    make -C scoutfs-utils-dev
    alias scoutfs=$PWD/scoutfs-utils-dev/src/scoutfs
    
    
  2. Make a New Filesystem (destroys contents, no questions asked)

    We specify that every node will participate in quorum voting by configuring each in the super block with options to mkfs.

    scoutfs mkfs --quorum_slot node1:0:172.16.1.1 \
     	--quorum_slot node2:0:172.16.1.2 /dev/shared_block_device
    
  3. Mount the Filesystem

    Each mounting node provides the name that was given to the quorum_slot option to mkfs.

    mkdir /mnt/scoutfs
    mount -t scoutfs -o uniq_name=$NODENAME /dev/shared_block_device /mnt/scoutfs
    
    
  4. For Kicks, Observe the Metadata Change Index

    The meta_seq index tracks the inodes that are changed in each transaction.

    scoutfs walk-inodes meta_seq 0 -1 /mnt/scoutfs
    touch /mnt/scoutfs/one; sync
    scoutfs walk-inodes meta_seq 0 -1 /mnt/scoutfs
    touch /mnt/scoutfs/two; sync
    scoutfs walk-inodes meta_seq 0 -1 /mnt/scoutfs
    touch /mnt/scoutfs/one; sync
    scoutfs walk-inodes meta_seq 0 -1 /mnt/scoutfs