From 652fc3f0e038e33f0f7550e227b4b3d39c5a370b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 6 Feb 2011 21:11:05 -0800 Subject: [PATCH] remove ancient web content Signed-off-by: Sage Weil --- web/Makefile | 5 - web/ceph.css | 133 ------------------------ web/gen.pl | 14 --- web/images/ceph-architecture.png | Bin 31408 -> 0 bytes web/images/ceph-logo1.jpg | Bin 7692 -> 0 bytes web/index.body | 38 ------- web/overview.body | 53 ---------- web/publications.body | 39 ------- web/source.body | 168 ------------------------------- web/tasks.body | 56 ----------- web/template.html | 69 ------------- 11 files changed, 575 deletions(-) delete mode 100644 web/Makefile delete mode 100644 web/ceph.css delete mode 100755 web/gen.pl delete mode 100644 web/images/ceph-architecture.png delete mode 100644 web/images/ceph-logo1.jpg delete mode 100644 web/index.body delete mode 100644 web/overview.body delete mode 100644 web/publications.body delete mode 100644 web/source.body delete mode 100644 web/tasks.body delete mode 100644 web/template.html diff --git a/web/Makefile b/web/Makefile deleted file mode 100644 index 20271b515ed16..0000000000000 --- a/web/Makefile +++ /dev/null @@ -1,5 +0,0 @@ - -all: index.html overview.html publications.html source.html tasks.html - -%.html: %.body template.html - ./gen.pl $< > $@ diff --git a/web/ceph.css b/web/ceph.css deleted file mode 100644 index 010556de42290..0000000000000 --- a/web/ceph.css +++ /dev/null @@ -1,133 +0,0 @@ -html, body, table { - margin: 0; - padding: 0; - font-family: Verdana, sans-serif; - font-size: 12px; -} -a { text-decoration: none; } -a:hover { text-decoration: underline; } -#banner { - width: 100%; - margin: 0 0 10px 0; - padding: 0; - text-align: left; - background-color: #ffffff; - border-bottom: 1px solid #999999; - font-family: Verdana, "Arial Black", Arial, sans-serif; - color: white; -} -#banner div { - margin: 0; - border-bottom: 1px solid #333333; -} -#banner div h1 { - margin: 0; - padding: 5px; - font-weight: bold; - font-size: 40px; -} -small { font-size: 10px; } -#navcolumn { - vertical-align: top; - margin: 0; - padding: 0 5px 0 8px; -} -.navsegment { - padding: 0; - border: 1px solid #C9D2DC; - background-color: #EEEEFF; - margin-bottom: 10px; -} -.navsegment h4 { - margin: 0 0 5px 0; - font-family: sans-serif, Arial; - font-weight: bold; - color: #000066; - background-color: #C9D2EC; - border-top: 1px solid white; - border-left: 1px solid white; - border-bottom: 1px solid #93A4B7; - border-right: 0; - padding: 2px 0 2px 5px; -} -.navsegment ul { - list-style: none; - margin: 0; - padding: 0 1px 0 7px; - font-size: 12px; -} -.navsegment ul li { - white-space: nowrap; - padding: 0; - margin: 0 0 5px 0; -} -#maincolumn { - width: 100%; - vertical-align: top; - margin: 0; - padding: 0 8px 0 5px; -} -.mainsegment { - margin: 0 0 10px 0; - padding: 0; - border: 1px solid #93A4B7; -} -.mainsegment h3 { - margin: 0; - background-color: #7982BC; - color: white; - padding: 2px 1px 2px 6px; - font-family: sans-serif, "Trebuchet MS", Tahoma, Arial; - border-top: 1px solid #C9D2DC; - border-left: 1px solid #C9D2DC; - border-bottom: 1px solid #51657B; - border-right: 0; -} -.mainsegment div { - margin: 0; - padding: 10px; -} -.mainsegment h4 { - margin: 0; - padding: 2px 1px 2px 6px; - font-family: sans-serif, Arial, Tahoma; - background-color: #DDDDEE; - border-top: 1px solid white; - border-left: 1px solid white; - border-bottom: 1px solid #999999; - border-right: 0; -} -pre, .programlisting { - background-color: #EFEFEF; - border: 1px solid #CCCCEE; - padding: 10px; -} - -/* Docbook formatting */ -h3.SECT3, h3.AUTHOR { - border: 0; - font-family: sans-serif, serif; - background-color: white; - color: black; - margin: 0; - padding: 0; -} -h1 a:hover, h2 a:hover, h3 a:hover { - color: #51657B; - text-decoration: none; -} -DD { padding-bottom: 0 } -.synopsis { - background: #eeeeff; - border: solid 1px #aaaaff; - padding: 10px; -} - - -/* Diagram thinger */ -td.kernel {text-align: center; background-color: pink} -td.entity {text-align: center; background-color: #4ae544} -td.lib {text-align: center; background-color: orange} -td.abstract {text-align: center; background-color: #dde244} -td.net {text-align: center; background-color: lightgray} - diff --git a/web/gen.pl b/web/gen.pl deleted file mode 100755 index 05c622ff8b70b..0000000000000 --- a/web/gen.pl +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/perl - -use strict; -my $bodyf = shift @ARGV; -my $templatef = 'template.html'; - -open(O, $bodyf); -my $body = join('',); -close O; -open(O, $templatef); -my $template = join('',); -close O; -$template =~ s/--body--/$body/; -print $template; diff --git a/web/images/ceph-architecture.png b/web/images/ceph-architecture.png deleted file mode 100644 index 68d79c1cbcf7ed912a158d96e0e10a8582b61a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31408 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 z 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 nF&!CSv85}j-%vtL diff --git a/web/index.body b/web/index.body deleted file mode 100644 index c94dd439ba539..0000000000000 --- a/web/index.body +++ /dev/null @@ -1,38 +0,0 @@ -
-

Interested in working on Ceph?

-
-We are actively seeking experienced C/C++ and Linux kernel developers who are interested in helping turn Ceph into a stable production-grade storage system. Competitive salaries, benefits, etc. If interested, please contact sage at newdream dot net. -
-
- - -
-

Welcome

-
- Ceph is a distributed network file system designed to provide excellent performance, reliability, and scalability. Ceph fills two significant gaps in the array of currently available file systems: - -
    -
  1. Robust, open-source distributed storage -- Ceph is released under the terms of the LGPL, which means it is free software (as in speech and beer). Ceph will provide a variety of key features that are generally lacking from existing open-source file systems, including seamless scalability (the ability to simply add disks to expand volumes), intelligent load balancing, and efficient, easy to use snapshot functionality. -
  2. Scalability -- Ceph is built from the ground up to seamlessly and gracefully scale from gigabytes to petabytes and beyond. Scalability is considered in terms of workload as well as total storage. Ceph is designed to handle workloads in which tens thousands of clients or more simultaneously access the same file, or write to the same directory--usage scenarios that bring typical enterprise storage systems to their knees. -
- - Here are some of the key features that make Ceph different from existing file systems that you may have worked with: - -
    -
  1. Seamless scaling -- A Ceph filesystem can be seamlessly expanded by simply adding storage nodes (OSDs). However, unlike most existing file systems, Ceph proactively migrates data onto new devices in order to maintain a balanced distribution of data. This effectively utilizes all available resources (disk bandwidth and spindles) and avoids data hot spots (e.g., active data residing primarly on old disks while newer disks sit empty and idle). -
  2. Strong reliability and fast recovery -- All data in Ceph is replicated across multiple OSDs. If any OSD fails, data is automatically re-replicated to other devices. However, unlike typical RAID systems, the replicas for data on each disk are spread out among a large number of other disks, and when a disk fails, the replacement replicas are also distributed across many disks. This allows recovery to proceed in parallel (with dozens of disks copying to dozens of other disks), removing the need for explicit "spare" disks (which are effectively wasted until they are needed) and preventing a single disk from becoming a "RAID rebuild" bottleneck. -
  3. Adaptive MDS -- The Ceph metadata server (MDS) is designed to dynamically adapt its behavior to the current workload. As the size and popularity of the file system hierarchy changes over time, that hierarchy is dynamically redistributed among available metadata servers in order to balance load and most effectively use server resources. (In contrast, current file systems force system administrators to carve their data set into static "volumes" and assign volumes to servers. Volume sizes and workloads inevitably shift over time, forcing administrators to constantly shuffle data between servers or manually allocate new resources where they are currently needed.) Similarly, if thousands of clients suddenly access a single file or directory, that metadata is dynamically replicated across multiple servers to distribute the workload. -
- - For more information about the underlying architecture of Ceph, please see the Overview. This project is based on a substantial body of research conducted by the Storage Systems Research Center at the University of California, Santa Cruz over the past few years that has resulted in a number of publications. -
- -

Current Status

-
- Ceph is roughly alpha quality, and is under very active development. Ceph is not yet suitable for any uses other than testing and review. The file system is mountable and more or less usable using a FUSE-based client, and development is underway on a native Linux kernel client. Many features are planned but not yet implemented, including snapshots. - -

The Ceph project is actively seeking participants. If you are interested in using Ceph, or contributing to its development, please join the mailing list. -

-
- -Please feel free to contact me with any questions or comments. \ No newline at end of file diff --git a/web/overview.body b/web/overview.body deleted file mode 100644 index 6033949533364..0000000000000 --- a/web/overview.body +++ /dev/null @@ -1,53 +0,0 @@ - -
-

Ceph Overview -- What is it?

-
- Ceph is a scalable distributed network file system that provides both excellent performance and reliability. Like network file protocols such as NFS and CIFS, clients require only a network connection to mount and use the file system. Unlike NFS and CIFS, however, Ceph clients can communicate directly with storage nodes (which we call OSDs) instead of a single "server" (something that limits the scalability of installations using NFS and CIFS). In that sense, Ceph resembles "cluster" file systems based on SANs (storage area networks) and FC (fibre-channel) or iSCSI. The main difference is that FC and iSCSI are block-level protocols that communicate with dumb, passive disks; Ceph OSDs are intelligent storage nodes, all communication is over TCP and commodity IP networks. -

- Ceph's intelligent storage nodes (basically, storage servers running software to serve "objects" instead of files) facilitate improved scalability and parallelism. NFS servers (i.e. NAS devices) and cluster file systems funnel all I/O through a single (or limited set of) servers, limiting scalability. Ceph clients interact with a set of (perhaps dozens or hundreds of) metadata servers (MDSs) for high-level operations like open() and rename(), but communicate directly with storage nodes (OSDs) for I/O, of which there may be thousands. -

- There are a handful of new file systems and enterprise storage products adopting a similar object- or brick-based architecture, including Lustre (also open-source, but with restricted access to source code) and the Panasas file system (a commercial storage product). Ceph is different: -

    -
  • Open source, open development. We're hosted on SourceForge, and are actively looking for interested users and developers. -
  • Scalability. Ceph sheds legacy file system design principles like explicit allocation tables that are still found in almost all other file systems (including Lustre and the Panasas file system) and ultimately limit scalability. -
  • Commodity hardware. Ceph is designed to run on commodity hardware running Linux (or any other POSIX-ish Unix variant). (Lustre relies on a SAN or other shared storage failover to make storage nodes reliable, while Panasas is based on custom hardware using integrated UPSs.) -
- In additional to promising greater scalability than existing solutions, Ceph also promises to fill the huge gap between open-source filesystems and commercial enterprise systems. If you want network-attached storage without shelling out the big bucks, your are usually stuck with NFS and a direct-attached RAID. Technologies like ATA-over-ethernet and iSCSI help scale raw volume sizes, but the relative lack of "cluster-aware" open-source file systems (particularly those with snapshot-like functionality) still limits one to a single NFS "server" that limits scalability. -

-Ceph fills this gap by providing a scalable, reliable file system that can seamlessly grow from gigabytes to petabytes. Moreover, Ceph will eventually provide efficient snapshots, which almost no freely available file system (besides ZFS on Solaris) provides, despite snapshots having become almost ubiquitous in enterprise systems. -

- -

Ceph Architecture

-
-
-

- A thorough overview of the system architecture can be found in this paper that appeared at OSDI '06. -

- A Ceph installation consists of three main elements: clients, metadata servers (MDSs), and object storage devices (OSDs). Ceph clients can either be individual processes linking directly to a user-space client library, or a host mounting the Ceph file system natively (ala NFS). OSDs are servers with attached disks and are responsible for storing data. -

- The Ceph architecture is based on three key design principles that set it apart from traditional file systems. - -

    -
  1. Separation of metadata and data management.
    - A small set of metadata servers (MDSs) manage the file system hierarchy (namespace). Clients communicate with an MDS to open/close files, get directory listings, remove files, or any other operations that involve file names. Once a file is opened, clients communicate directly with OSDs (object-storage devices) to read and write data. A large Ceph system may involve anywhere from one to many dozens (or possibly hundreds) of MDSs, and anywhere from four to hundreds or thousands of OSDs. -

    - Both file data and file system metadata are striped over multiple objects, each of which is replicated on multiple OSDs for reliability. A special-purpose mapping function called CRUSH is used to determine which OSDs store which objects. CRUSH resembles a hash function in that this mapping is pseudo-random (it appears random, but is actually deterministic). This provides load balancing across all devices that is relatively invulnerable to "hot spots," while Ceph's policy of redistributing data ensures that workload remains balanced and all devices are equally utilized even when the storage cluster is expanded or OSDs are removed. - -

    - -

  2. Intelligent storage devices
    - Each Ceph OSD stores variably-sized, named objects. (In contract, conventional file systems are built directly on top of raw hard disks that store small fixed-sized numbered blocks.) In contract, Ceph OSDs can be built with conventional server hardware with attached storage (either raw disks or a small RAID). Each Ceph OSD runs a special-purpose "object file system" called EBOFS designed to efficiently and reliable store variably sized objects. -

    - More importantly, Ceph OSDs are intelligent. Collectively, the OSD cluster manages data replication, data migration (when the cluster composition changes due to expansion, failures, etc.), failure detection (OSDs actively monitor their peers), and failure recovery. We call the collective cluster RADOS--Reliable Autonomic Distributed Object Store--because it provides the illusion of a single logical object store while hiding the details of data distribution, replication, and failure recovery. -

    - -

  3. Dynamic distributed metadata
    - Ceph dynamically distributes responsibility for managing the file system directory hierarchy over tens or even hundreds of MDSs. Because Ceph embeds most inodes directly within the directory that contains them, the hierarchical partitional allows each MDS to operation independently and efficiently. This distribution is entirely adaptive, based on the current workload, allowing the cluster to redistribute the hierarchy to balance load as client access patterns change over time. Ceph also copes with metadata hot spots: popular metadata is replicated across multiple MDS nodes, and extremely large directories can be distributed across the entire cluster when necessary. - -
- - -
- -
- diff --git a/web/publications.body b/web/publications.body deleted file mode 100644 index 5bfd16d42761e..0000000000000 --- a/web/publications.body +++ /dev/null @@ -1,39 +0,0 @@ - -
-

Publications

-
- Ceph has grown out of the petabyte-scale storage research at the Storage Systems Research Center at the University of California, Santa Cruz. The project is funded primarily by a grant from the Lawrence Livermove, Sandia, and Los Alamos National Laboratories. A range of publications related to scalable storage systems have resulted. -

- The following publications are directly related to the current design of Ceph. -

- - The following papers describe aspects of subsystems of Ceph that have not yet been fully designed or integrated, but soon will be. - - - The following papers represent earlier research upon which Ceph's design is partially based. - - - This is a partial selection. A complete list of publications for the project is available on the SSRC Ceph project web site. - -
-
diff --git a/web/source.body b/web/source.body deleted file mode 100644 index a2424b15fd7a8..0000000000000 --- a/web/source.body +++ /dev/null @@ -1,168 +0,0 @@ - -
-

Getting Started

-
- The Ceph source code is managed with Git. For a Git crash course, there is a tutorial and more from the official Git site. Here is a quick crash course for Subversion users. - -

The Ceph project is always looking for more participants. If you are interested in using Ceph, or contributing to its development, please join our mailing list and drop us a line. - -

Checking out the source

-
- You can check out a working copy (actually, clone the repository) with -
-git clone git://ceph.newdream.net/ceph.git
-
-or -
-git clone http://ceph.newdream.net/git/ceph.git
-
- To pull the latest, -
-git pull
-
- You can browse the git repo at http://ceph.newdream.net/git. -
- -

Build Targets

-
- There are a range of binary targets, mostly for ease of development and testing: -
    -
  • cmon -- monitor
  • -
  • cosd -- OSD storage daemon
  • -
  • cmds -- MDS metadata server
  • -
  • cfuse -- client, mountable via FUSE
  • -
  • csyn -- client sythetic workload generator
  • -
  • cmonctl -- control tool
  • -

    -

  • fakesyn -- places all logical elements (MDS, client, etc.) in a single binary, with synchronous message delivery (for easy debugging!). Includes synthetic workload generation.
  • -
  • fakefuse -- same as fakesyn, but mounts a single client via FUSE.
  • -
-
- -

Runtime Environment

-
- Few quick steps to get things started. Note that these instructions assume either that you are running on one node, or have a shared directory (e.g. over NFS) mounted on each node. - -
    -
  1. Checkout, change into the ceph/src directory, and build. E.g., -
    -git clone git://ceph.newdream.net/ceph.git
    -cd ceph
    -./autogen.sh
    -./configure   # of CXXFLAGS="-g" ./configure to disable optimizations (for debugging)
    -cd src
    -make
    -
    - -
  2. Create a log/ dir for various runtime stats. -
    -mkdir log
    -
    -
  3. Identify the EBOFS block devices. This is accomplished with symlinks (or actual files) in the dev/ directory. Devices can be identified by symlinks named after the hostname (e.g. osd.googoo-1), logical OSD number (e.g. osd4), or simply osd.all (in that order of preference). For example, -
    -mkdir dev
    -ln -s /dev/sda3 dev/osd.all   # all nodes use /dev/sda3
    -ln -s /dev/sda4 dev/osd0      # except osd0, which should use /dev/sd4
    -
    - That is, when an osd starts up, it first looks for dev/osd$n, then dev/osd.all, in that order. - - These need not be "real" devices--they can be regular files too. To get going with fakesyn, for example, or to test a whole "cluster" running on the same node, -
    -# create small "disks" for osd0-osd3
    -for f in 0 1 2 3; do                                 # default is 4 OSDs
    -dd if=/dev/zero of=dev/osd$f bs=1048576 count=1024   # 1 GB each
    -done
    -
    - Note that if your home/working directory is mounted via NFS or similar, you'll want to symlink dev/ to a directory on a local disk. -
- - -

Starting up a full "cluster" on a single host

-
- You can start up a the full cluster of daemons on a single host. Assuming you've created a set of individual files for each OSD's block device (the second option of #3 above), there is a start.sh and stop.sh script that will start up on port 12345. -

-One caveat here is that the ceph daemons need to know what IP they are reachable at; they determine that by doing a lookup on the machine's hostname. Since many/most systems map the hostname to 127.0.0.1 in /etc/hosts, you either need to change that (the easiest approach, usually) or add a --bind 1.2.3.4 argument to cmon/cosd/cmds to help them out. -

-Note that the monitor has the only fixed and static ip:port in the system. The rest of the cluster daemons bind to a random port and register themselves with the monitor. -

- -

Mounting with FUSE

-
- The easiest route is fakefuse: -
-modprobe fuse  # make sure fuse module is loaded
-mkdir mnt      # or whereever you want your mount point
-make fakefuse && ./fakefuse --mkfs --debug_ms 1 mnt
-
- You should be able to ls, copy files, or whatever else (in another terminal; fakefuse will stay in the foreground). Control-C will kill fuse and cause an orderly shutdown. Alternatively, fusermount -u mnt will unmount. If fakefuse crashes or hangs, you may need to kill -9 fakefuse and/or fusermount -u mnt to clean up. Overall, FUSE is pretty well-behaved. - -If you have the cluster daemon's already running (as above), you can mount via the standalone fuse client: -
-modprobe fuse
-mkdir mnt
-make cfuse && ./cfuse mnt
-
-
- -

Running the kernel client in a UML instance

-
- Any recent mainline kernel will do here. -
-$ cd linux
-$ patch -p1 < ~/ceph/src/kernel/kconfig.patch
-patching file fs/Kconfig
-patching file fs/Makefile
-$ cp ~/ceph/src/kernel/sample.uml.config .config
-$ ln -s ~/ceph/src/kernel fs/ceph
-$ ln -s ~/ceph/src/include/ceph_fs.h include/linux
-$ make ARCH=um
-
- I am using this x86_64 Debian UML root fs image, but any image will do (see http://user-mode-linux.sf.net) as long as the architecture (e.g. x86_64 vs i386) matches your host. Start up the UML guest instance with something like -
-./linux ubda=Debian-3.1-AMD64-root_fs mem=256M eth0=tuntap,,,1.2.3.4  # 1.2.3.4 is the _host_ ip
-
- Note that if UML crashes/oopses/whatever, you can restart quick-and-dirty (up arrow + enter) with -
-reset ; killall -9 linux ; ./linux ubda=Debian-3.1-AMD64-root_fs mem=256M eth0=tuntap,,,1.2.3.4
-
- You'll need to configure the network in UML with an unused IP. For my debian-based root fs image, this /etc/network/interfaces file does the trick: -
-iface eth0 inet static
-        address 1.2.3.5     # unused ip in your host's netowrk for the uml guest
-        netmask 255.0.0.0
-        gateway 1.2.3.4     # host ip
-auto eth0
-
- Note that you need install uml-utilities (apt-get install uml-utilities on debian distros) and add yourself to the uml-net group on the host (or run the UML instance as root) for the network to start up properly. -

- Inside UML, you'll want an /etc/fstab line like -

-none            /host           hostfs  defaults        0       0
-
- You can then load the kernel client module and mount from the UML instance with -
-insmod /host/path/to/ceph/src/kernel/ceph.ko
-mount -t ceph 1.2.3.4:/ mnt  # 1.2.3.4 is host
-
- -
- -

Running fakesyn -- everything one process

-
- A quick example, assuming you've set up "fake" EBOFS devices as above: -
-make fakesyn && ./fakesyn --mkfs --debug_ms 1 --debug_client 3 --syn rw 1 100000
-# where those options mean:
-#	--mkfs               # start with a fresh file system
-#	--debug_ms 1         # show message delivery
-#	--debug_client 3     # show limited client stuff
-#	--syn rw 1 100000    # write 1MB to a file in 100,000 byte chunks, then read it back
-
- One the synthetic workload finishes, the synthetic client unmounts, and the whole system shuts down. - - The full set of command line arguments can be found in config.cc. -
- -
-
- diff --git a/web/tasks.body b/web/tasks.body deleted file mode 100644 index fc81ba8249cd8..0000000000000 --- a/web/tasks.body +++ /dev/null @@ -1,56 +0,0 @@ - -
-

Current Roadmap

-
- Here is a brief summary of what we're currently working on, and what state we expect Ceph to take in the foreseeable future. This is a rough estimate, and highly dependent on what kind of interest Ceph generates in the larger community. - -
    -
  • Q1 2008 -- Basic in-kernel client (Linux) -
  • Q2 2008 -- Snapshots -
  • Q2 2008 -- User/group quotas -
- -
- -

Tasks

-
- Although Ceph is currently a working prototype that demonstrates the key features of the architecture, a variety of features need to be implemented in order to make Ceph a stable file system that can be used in production environments. Some of these tasks are outlined below. If you are a kernel or file system developer and are interested in contributing to Ceph, please join the email list and drop us a line. - -

- -

Snapshots

-
- The distributed object storage fabric (RADOS) includes a simple mechanism of versioning objects, and performing copy-on-write when old objects are updated. In order to utilize this mechanism for implementing flexible snapshots, the MDS needs to be extended to manage versioned directory entries and maintain some additional directory links. For more information, see this tech report. -
- -

Content-addressable Storage

-
- The underlying problems of reliable, scalable and distributed object storage are solved by the RADOS object storage system. This mechanism can be leveraged to implement a content-addressible storage system (i.e. one that stores duplicated data only once) by selecting a suitable chunking strategy and naming objects by the hash of their contents. Ideally, we'd like to incorporate this into the overall Ceph file system, so that different parts of the file system can be selectively stored normally or by their hash. Ideally, the system could (perhaps lazily) detect duplicated data when it is written and adjust the underlying storage strategy accordingly in order to optimize for space efficiency or performance. -
- -

Ebofs

-
- Each Ceph OSD (storage node) runs a custom object "file system" called EBOFS to store objects on locally attached disks. Although the current implementation of EBOFS is fully functional and already demonstrates promising performance (outperforming ext2/3, XFS, and ReiserFS under the workloads we anticipate), a range of improvements will be needed before it is ready for prime-time. These include: -
    -
  • NVRAM for data journaling. Actually, this has been implemented, but is untested. EBOFS can utilize NVRAM to journal uncommitted requests much like WAFL does, significantly lowering write latency while facilitating more efficient disk scheduling, delayed allocation, and so forth. -
  • RAID-aware allocation. Although we conceptually think of each OSD as a disk with an attached CPU, memory, and network interface, it is more likely that the actual OSDs deployed in production systems will be small to medium sized storage servers: a standard server with a locally attached array of SAS or SATA disks. In order to properly take advantage of the parallelism inherent in the use of multiple disks, the EBOFS allocator and disk scheduling algorithms have to be aware of the underlying structure of the array (be it RAID0, 1, 5, 10, etc.) in order to reap the performance and reliability rewards. -
-
- - -

Native kernel client

-
- The prototype Ceph client is implemented as a user-space library. Although it can be mounted under Linux via the FUSE (file system in userspace) library, this incurs a significant performance penalty and limits Ceph's ability to provide strong POSIX semantics and consistency. A native Linux kernel implementation of the client in needed in order to properly take advantage of the performance and consistency features of Ceph. We are actively looking for experienced kernel programmers to help guide development in this area! -
- -

CRUSH tools

-
- Ceph utilizes a novel data distribution function called CRUSH to distribute data (in the form of objects) to storage nodes (OSDs). CRUSH is designed to generate a balanced distribution will allowing the storage cluster to be dynamically expanded or contracted, and to separate object replicas across failure domains to enhance data safety. There is a certain amount of finesse involved in properly managing the OSD hierarchy from which CRUSH generates its distribution in order to minimize the amount of data migration that results from changes. An administrator tool would be useful for helping to manage the CRUSH mapping function in order to best exploit the available storage and network infrastructure. For more information, please refer to the technical paper describing CRUSH. -
- -

The Ceph project is always looking for more participants. If any of these projects sound interesting to you, please join our mailing list. -

-
- - -Please feel free to contact me with any questions or comments. diff --git a/web/template.html b/web/template.html deleted file mode 100644 index 65430ebc8e175..0000000000000 --- a/web/template.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - Ceph - Petascale Distributed Storage - - - - - - -
- - - - - - -
- ---body-- - -
- - -- 2.39.5