From 8f5d4d24557887b4691fc219cefbc30e478bf7ed Mon Sep 17 00:00:00 2001 From: Paul Luse Date: Thu, 3 Jul 2014 15:59:33 -0700 Subject: [PATCH] Erasure Code Documentation This patch adds all the relevant EC documentation to the source tree. Notable additions are: - Updated SAIO documentation - Updates to existing swift documentation; and - Erasure Coding overview Co-Authored-By: Alistair Coles Co-Authored-By: Thiago da Silva Co-Authored-By: John Dickinson Co-Authored-By: Clay Gerrard Co-Authored-By: Tushar Gohad Co-Authored-By: Samuel Merritt Co-Authored-By: Christian Schwede Co-Authored-By: Yuan Zhou Change-Id: I0403016a4bb7dad9535891632753b0e5e9d402eb Implements: blueprint swift-ec Signed-off-by: Thiago da Silva --- doc/saio/bin/remakerings | 10 + doc/saio/bin/resetswift | 5 +- doc/saio/swift/object-server/1.conf | 2 + doc/saio/swift/object-server/2.conf | 2 + doc/saio/swift/object-server/3.conf | 2 + doc/saio/swift/object-server/4.conf | 2 + doc/saio/swift/swift.conf | 9 + doc/source/associated_projects.rst | 2 + doc/source/development_saio.rst | 40 +- doc/source/images/ec_overview.png | Bin 0 -> 148090 bytes doc/source/index.rst | 1 + doc/source/overview_architecture.rst | 17 +- doc/source/overview_erasure_code.rst | 672 +++++++++++++++++++++++++++ doc/source/overview_policies.rst | 274 ++++++----- doc/source/overview_replication.rst | 52 ++- 15 files changed, 943 insertions(+), 147 deletions(-) create mode 100755 doc/source/images/ec_overview.png create mode 100755 doc/source/overview_erasure_code.rst diff --git a/doc/saio/bin/remakerings b/doc/saio/bin/remakerings index e95915953c..1452cea739 100755 --- a/doc/saio/bin/remakerings +++ b/doc/saio/bin/remakerings @@ -16,6 +16,16 @@ swift-ring-builder object-1.builder add r1z2-127.0.0.1:6020/sdb2 1 swift-ring-builder object-1.builder add r1z3-127.0.0.1:6030/sdb3 1 swift-ring-builder object-1.builder add r1z4-127.0.0.1:6040/sdb4 1 swift-ring-builder object-1.builder rebalance +swift-ring-builder object-2.builder create 10 6 1 +swift-ring-builder object-2.builder add r1z1-127.0.0.1:6010/sdb1 1 +swift-ring-builder object-2.builder add r1z1-127.0.0.1:6010/sdb5 1 +swift-ring-builder object-2.builder add r1z2-127.0.0.1:6020/sdb2 1 +swift-ring-builder object-2.builder add r1z2-127.0.0.1:6020/sdb6 1 +swift-ring-builder object-2.builder add r1z3-127.0.0.1:6030/sdb3 1 +swift-ring-builder object-2.builder add r1z3-127.0.0.1:6030/sdb7 1 +swift-ring-builder object-2.builder add r1z4-127.0.0.1:6040/sdb4 1 +swift-ring-builder object-2.builder add r1z4-127.0.0.1:6040/sdb8 1 +swift-ring-builder object-2.builder rebalance swift-ring-builder container.builder create 10 3 1 swift-ring-builder container.builder add r1z1-127.0.0.1:6011/sdb1 1 swift-ring-builder container.builder add r1z2-127.0.0.1:6021/sdb2 1 diff --git a/doc/saio/bin/resetswift b/doc/saio/bin/resetswift index dd2692f7da..c7c9d9eae9 100755 --- a/doc/saio/bin/resetswift +++ b/doc/saio/bin/resetswift @@ -9,7 +9,10 @@ sudo mkfs.xfs -f ${SAIO_BLOCK_DEVICE:-/dev/sdb1} sudo mount /mnt/sdb1 sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 sudo chown ${USER}:${USER} /mnt/sdb1/* -mkdir -p /srv/1/node/sdb1 /srv/2/node/sdb2 /srv/3/node/sdb3 /srv/4/node/sdb4 +mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ + /srv/2/node/sdb2 /srv/2/node/sdb6 \ + /srv/3/node/sdb3 /srv/3/node/sdb7 \ + /srv/4/node/sdb4 /srv/4/node/sdb8 sudo rm -f /var/log/debug /var/log/messages /var/log/rsyncd.log /var/log/syslog find /var/cache/swift* -type f -name *.recon -exec rm -f {} \; # On Fedora use "systemctl restart " diff --git a/doc/saio/swift/object-server/1.conf b/doc/saio/swift/object-server/1.conf index c0300ee558..178e3fcba3 100644 --- a/doc/saio/swift/object-server/1.conf +++ b/doc/saio/swift/object-server/1.conf @@ -22,6 +22,8 @@ use = egg:swift#recon [object-replicator] vm_test_mode = yes +[object-reconstructor] + [object-updater] [object-auditor] diff --git a/doc/saio/swift/object-server/2.conf b/doc/saio/swift/object-server/2.conf index 71d373a48e..6b611ca25a 100644 --- a/doc/saio/swift/object-server/2.conf +++ b/doc/saio/swift/object-server/2.conf @@ -22,6 +22,8 @@ use = egg:swift#recon [object-replicator] vm_test_mode = yes +[object-reconstructor] + [object-updater] [object-auditor] diff --git a/doc/saio/swift/object-server/3.conf b/doc/saio/swift/object-server/3.conf index 4c103b3041..7352592319 100644 --- a/doc/saio/swift/object-server/3.conf +++ b/doc/saio/swift/object-server/3.conf @@ -22,6 +22,8 @@ use = egg:swift#recon [object-replicator] vm_test_mode = yes +[object-reconstructor] + [object-updater] [object-auditor] diff --git a/doc/saio/swift/object-server/4.conf b/doc/saio/swift/object-server/4.conf index c51d12215e..be1211047b 100644 --- a/doc/saio/swift/object-server/4.conf +++ b/doc/saio/swift/object-server/4.conf @@ -22,6 +22,8 @@ use = egg:swift#recon [object-replicator] vm_test_mode = yes +[object-reconstructor] + [object-updater] [object-auditor] diff --git a/doc/saio/swift/swift.conf b/doc/saio/swift/swift.conf index 4d8b014e8e..25e1002646 100644 --- a/doc/saio/swift/swift.conf +++ b/doc/saio/swift/swift.conf @@ -5,7 +5,16 @@ swift_hash_path_suffix = changeme [storage-policy:0] name = gold +policy_type = replication default = yes [storage-policy:1] name = silver +policy_type = replication + +[storage-policy:2] +name = ec42 +policy_type = erasure_coding +ec_type = jerasure_rs_vand +ec_num_data_fragments = 4 +ec_num_parity_fragments = 2 diff --git a/doc/source/associated_projects.rst b/doc/source/associated_projects.rst index 72ed9c016d..c0f8cf7e5d 100644 --- a/doc/source/associated_projects.rst +++ b/doc/source/associated_projects.rst @@ -104,5 +104,7 @@ Other * `Swiftsync `_ - A massive syncer between two swift clusters. * `Django Swiftbrowser `_ - Simple Django web app to access Openstack Swift. * `Swift-account-stats `_ - Swift-account-stats is a tool to report statistics on Swift usage at tenant and global levels. +* `PyECLib `_ - High Level Erasure Code library used by Swift +* `liberasurecode `_ - Low Level Erasure Code library used by PyECLib * `Swift Browser `_ - JavaScript interface for Swift * `swift-ui `_ - OpenStack Swift web browser diff --git a/doc/source/development_saio.rst b/doc/source/development_saio.rst index 338b1420ce..3bd94872dd 100644 --- a/doc/source/development_saio.rst +++ b/doc/source/development_saio.rst @@ -87,8 +87,11 @@ another device when creating the VM, and follow these instructions: sudo chown ${USER}:${USER} /mnt/sdb1/* sudo mkdir /srv for x in {1..4}; do sudo ln -s /mnt/sdb1/$x /srv/$x; done - sudo mkdir -p /srv/1/node/sdb1 /srv/2/node/sdb2 /srv/3/node/sdb3 \ - /srv/4/node/sdb4 /var/run/swift + sudo mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ + /srv/2/node/sdb2 /srv/2/node/sdb6 \ + /srv/3/node/sdb3 /srv/3/node/sdb7 \ + /srv/4/node/sdb4 /srv/4/node/sdb8 \ + /var/run/swift sudo chown -R ${USER}:${USER} /var/run/swift # **Make sure to include the trailing slash after /srv/$x/** for x in {1..4}; do sudo chown -R ${USER}:${USER} /srv/$x/; done @@ -124,7 +127,11 @@ these instructions: sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 sudo chown ${USER}:${USER} /mnt/sdb1/* for x in {1..4}; do sudo ln -s /mnt/sdb1/$x /srv/$x; done - sudo mkdir -p /srv/1/node/sdb1 /srv/2/node/sdb2 /srv/3/node/sdb3 /srv/4/node/sdb4 /var/run/swift + sudo mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ + /srv/2/node/sdb2 /srv/2/node/sdb6 \ + /srv/3/node/sdb3 /srv/3/node/sdb7 \ + /srv/4/node/sdb4 /srv/4/node/sdb8 \ + /var/run/swift sudo chown -R ${USER}:${USER} /var/run/swift # **Make sure to include the trailing slash after /srv/$x/** for x in {1..4}; do sudo chown -R ${USER}:${USER} /srv/$x/; done @@ -402,7 +409,7 @@ Setting up scripts for running Swift #. Copy the SAIO scripts for resetting the environment:: - cd $HOME/swift/doc; cp -r saio/bin $HOME/bin; cd - + cd $HOME/swift/doc; cp saio/bin/* $HOME/bin; cd - chmod +x $HOME/bin/* #. Edit the ``$HOME/bin/resetswift`` script @@ -455,30 +462,41 @@ Setting up scripts for running Swift .. literalinclude:: /../saio/bin/remakerings - You can expect the output from this command to produce the following (note - that 2 object rings are created in order to test storage policies in the - SAIO environment however they map to the same nodes):: + You can expect the output from this command to produce the following. Note + that 3 object rings are created in order to test storage policies and EC in + the SAIO environment. The EC ring is the only one with all 8 devices. + There are also two replication rings, one for 3x replication and another + for 2x replication, but those rings only use 4 devices:: Device d0r1z1-127.0.0.1:6010R127.0.0.1:6010/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-127.0.0.1:6020R127.0.0.1:6020/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-127.0.0.1:6030R127.0.0.1:6030/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-127.0.0.1:6040R127.0.0.1:6040/sdb4_"" with 1.0 weight got id 3 - Reassigned 1024 (100.00%) partitions. Balance is now 0.00. + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-127.0.0.1:6010R127.0.0.1:6010/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-127.0.0.1:6020R127.0.0.1:6020/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-127.0.0.1:6030R127.0.0.1:6030/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-127.0.0.1:6040R127.0.0.1:6040/sdb4_"" with 1.0 weight got id 3 - Reassigned 1024 (100.00%) partitions. Balance is now 0.00. + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 + Device d0r1z1-127.0.0.1:6010R127.0.0.1:6010/sdb1_"" with 1.0 weight got id 0 + Device d1r1z1-127.0.0.1:6010R127.0.0.1:6010/sdb5_"" with 1.0 weight got id 1 + Device d2r1z2-127.0.0.1:6020R127.0.0.1:6020/sdb2_"" with 1.0 weight got id 2 + Device d3r1z2-127.0.0.1:6020R127.0.0.1:6020/sdb6_"" with 1.0 weight got id 3 + Device d4r1z3-127.0.0.1:6030R127.0.0.1:6030/sdb3_"" with 1.0 weight got id 4 + Device d5r1z3-127.0.0.1:6030R127.0.0.1:6030/sdb7_"" with 1.0 weight got id 5 + Device d6r1z4-127.0.0.1:6040R127.0.0.1:6040/sdb4_"" with 1.0 weight got id 6 + Device d7r1z4-127.0.0.1:6040R127.0.0.1:6040/sdb8_"" with 1.0 weight got id 7 + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-127.0.0.1:6011R127.0.0.1:6011/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-127.0.0.1:6021R127.0.0.1:6021/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-127.0.0.1:6031R127.0.0.1:6031/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-127.0.0.1:6041R127.0.0.1:6041/sdb4_"" with 1.0 weight got id 3 - Reassigned 1024 (100.00%) partitions. Balance is now 0.00. + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-127.0.0.1:6012R127.0.0.1:6012/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-127.0.0.1:6022R127.0.0.1:6022/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-127.0.0.1:6032R127.0.0.1:6032/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-127.0.0.1:6042R127.0.0.1:6042/sdb4_"" with 1.0 weight got id 3 - Reassigned 1024 (100.00%) partitions. Balance is now 0.00. + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 #. Read more about Storage Policies and your SAIO :doc:`policies_saio` diff --git a/doc/source/images/ec_overview.png b/doc/source/images/ec_overview.png new file mode 100755 index 0000000000000000000000000000000000000000..d44a103177ac662b6db1ee48ee5fac3cadbb284e GIT binary patch literal 148090 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 literal 0 HcmV?d00001 diff --git a/doc/source/index.rst b/doc/source/index.rst index 630e6bd70e..45ee1fd0ef 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -56,6 +56,7 @@ Overview and Concepts overview_expiring_objects cors crossdomain + overview_erasure_code overview_backing_store associated_projects diff --git a/doc/source/overview_architecture.rst b/doc/source/overview_architecture.rst index b8c9a32f75..1f3452a55c 100644 --- a/doc/source/overview_architecture.rst +++ b/doc/source/overview_architecture.rst @@ -11,7 +11,10 @@ Proxy Server The Proxy Server is responsible for tying together the rest of the Swift architecture. For each request, it will look up the location of the account, container, or object in the ring (see below) and route the request accordingly. -The public API is also exposed through the Proxy Server. +For Erasure Code type policies, the Proxy Server is also responsible for +encoding and decoding object data. See :doc:`overview_erasure_code` for +complete information on Erasure Code suport. The public API is also exposed +through the Proxy Server. A large number of failures are also handled in the Proxy Server. For example, if a server is unavailable for an object PUT, it will ask the @@ -87,7 +90,8 @@ implementing a particular differentiation. For example, one might have the default policy with 3x replication, and create a second policy which, when applied to new containers only uses 2x replication. Another might add SSDs to a set of storage nodes and create a performance tier -storage policy for certain containers to have their objects stored there. +storage policy for certain containers to have their objects stored there. Yet +another might be the use of Erasure Coding to define a cold-storage tier. This mapping is then exposed on a per-container basis, where each container can be assigned a specific storage policy when it is created, which remains in @@ -156,6 +160,15 @@ item (object, container, or account) is deleted, a tombstone is set as the latest version of the item. The replicator will see the tombstone and ensure that the item is removed from the entire system. +-------------- +Reconstruction +-------------- + +The reconstructor is used by Erasure Code policies and is analogous to the +replicator for Replication type policies. See :doc:`overview_erasure_code` +for complete information on both Erasure Code support as well as the +reconstructor. + -------- Updaters -------- diff --git a/doc/source/overview_erasure_code.rst b/doc/source/overview_erasure_code.rst new file mode 100755 index 0000000000..9927e2ace2 --- /dev/null +++ b/doc/source/overview_erasure_code.rst @@ -0,0 +1,672 @@ +==================== +Erasure Code Support +==================== + + +-------------------------- +Beta: Not production ready +-------------------------- +The erasure code support in Swift is considered "beta" at this point. +Most major functionality is included, but it has not been tested or validated +at large scale. This feature relies on ssync for durability. Deployers are +urged to do extensive testing and not deploy production data using an +erasure code storage policy. + +If any bugs are found during testing, please report them to +https://bugs.launchpad.net/swift + + +------------------------------- +History and Theory of Operation +------------------------------- + +There's a lot of good material out there on Erasure Code (EC) theory, this short +introduction is just meant to provide some basic context to help the reader +better understand the implementation in Swift. + +Erasure Coding for storage applications grew out of Coding Theory as far back as +the 1960s with the Reed-Solomon codes. These codes have been used for years in +applications ranging from CDs to DVDs to general communications and, yes, even +in the space program starting with Voyager! The basic idea is that some amount +of data is broken up into smaller pieces called fragments and coded in such a +way that it can be transmitted with the ability to tolerate the loss of some +number of the coded fragments. That's where the word "erasure" comes in, if you +transmit 14 fragments and only 13 are received then one of them is said to be +"erased". The word "erasure" provides an important distinction with EC; it +isn't about detecting errors, it's about dealing with failures. Another +important element of EC is that the number of erasures that can be tolerated can +be adjusted to meet the needs of the application. + +At a high level EC works by using a specific scheme to break up a single data +buffer into several smaller data buffers then, depending on the scheme, +performing some encoding operation on that data in order to generate additional +information. So you end up with more data than you started with and that extra +data is often called "parity". Note that there are many, many different +encoding techniques that vary both in how they organize and manipulate the data +as well by what means they use to calculate parity. For example, one scheme +might rely on `Galois Field Arithmetic `_ while others may work with only XOR. The number of variations and +details about their differences are well beyond the scope of this introduction, +but we will talk more about a few of them when we get into the implementation of +EC in Swift. + +-------------------------------- +Overview of EC Support in Swift +-------------------------------- + +First and foremost, from an application perspective EC support is totally +transparent. There are no EC related external API; a container is simply created +using a Storage Policy defined to use EC and then interaction with the cluster +is the same as any other durability policy. + +EC is implemented in Swift as a Storage Policy, see :doc:`overview_policies` for +complete details on Storage Policies. Because support is implemented as a +Storage Policy, all of the storage devices associated with your cluster's EC +capability can be isolated. It is entirely possible to share devices between +storage policies, but for EC it may make more sense to not only use separate +devices but possibly even entire nodes dedicated for EC. + +Which direction one chooses depends on why the EC policy is being deployed. If, +for example, there is a production replication policy in place already and the +goal is to add a cold storage tier such that the existing nodes performing +replication are impacted as little as possible, adding a new set of nodes +dedicated to EC might make the most sense but also incurs the most cost. On the +other hand, if EC is being added as a capability to provide additional +durability for a specific set of applications and the existing infrastructure is +well suited for EC (sufficient number of nodes, zones for the EC scheme that is +chosen) then leveraging the existing infrastructure such that the EC ring shares +nodes with the replication ring makes the most sense. These are some of the +main considerations: + +* Layout of existing infrastructure. +* Cost of adding dedicated EC nodes (or just dedicated EC devices). +* Intended usage model(s). + +The Swift code base does not include any of the algorithms necessary to perform +the actual encoding and decoding of data; that is left to external libraries. +The Storage Policies architecture is leveraged to enable EC on a per container +basis -- the object rings are still used to determine the placement of EC data +fragments. Although there are several code paths that are unique to an operation +associated with an EC policy, an external dependency to an Erasure Code library +is what Swift counts on to perform the low level EC functions. The use of an +external library allows for maximum flexibility as there are a significant +number of options out there, each with its owns pros and cons that can vary +greatly from one use case to another. + +--------------------------------------- +PyECLib: External Erasure Code Library +--------------------------------------- + +PyECLib is a Python Erasure Coding Library originally designed and written as +part of the effort to add EC support to the Swift project, however it is an +independent project. The library provides a well-defined and simple Python +interface and internally implements a plug-in architecture allowing it to take +advantage of many well-known C libraries such as: + +* Jerasure and GFComplete at http://jerasure.org. +* Intel(R) ISA-L at http://01.org/intel%C2%AE-storage-acceleration-library-open-source-version. +* Or write your own! + +PyECLib uses a C based library called liberasurecode to implement the plug in +infrastructure; liberasure code is available at: + +* liberasurecode: https://bitbucket.org/tsg-/liberasurecode + +PyECLib itself therefore allows for not only choice but further extensibility as +well. PyECLib also comes with a handy utility to help determine the best +algorithm to use based on the equipment that will be used (processors and server +configurations may vary in performance per algorithm). More on this will be +covered in the configuration section. PyECLib is included as a Swift +requirement. + +For complete details see `PyECLib `_ + +------------------------------ +Storing and Retrieving Objects +------------------------------ + +We will discuss the details of how PUT and GET work in the "Under the Hood" +section later on. The key point here is that all of the erasure code work goes +on behind the scenes; this summary is a high level information overview only. + +The PUT flow looks like this: + +#. The proxy server streams in an object and buffers up "a segment" of data + (size is configurable). +#. The proxy server calls on PyECLib to encode the data into smaller fragments. +#. The proxy streams the encoded fragments out to the storage nodes based on + ring locations. +#. Repeat until the client is done sending data. +#. The client is notified of completion when a quorum is met. + +The GET flow looks like this: + +#. The proxy server makes simultaneous requests to participating nodes. +#. As soon as the proxy has the fragments it needs, it calls on PyECLib to + decode the data. +#. The proxy streams the decoded data it has back to the client. +#. Repeat until the proxy is done sending data back to the client. + +It may sound like, from this high level overview, that using EC is going to +cause an explosion in the number of actual files stored in each node's local +file system. Although it is true that more files will be stored (because an +object is broken into pieces), the implementation works to minimize this where +possible, more details are available in the Under the Hood section. + +------------- +Handoff Nodes +------------- + +In EC policies, similarly to replication, handoff nodes are a set of storage +nodes used to augment the list of primary nodes responsible for storing an +erasure coded object. These handoff nodes are used in the event that one or more +of the primaries are unavailable. Handoff nodes are still selected with an +attempt to achieve maximum separation of the data being placed. + +-------------- +Reconstruction +-------------- + +For an EC policy, reconstruction is analogous to the process of replication for +a replication type policy -- essentially "the reconstructor" replaces "the +replicator" for EC policy types. The basic framework of reconstruction is very +similar to that of replication with a few notable exceptions: + +* Because EC does not actually replicate partitions, it needs to operate at a + finer granularity than what is provided with rsync, therefore EC leverages + much of ssync behind the scenes (you do not need to manually configure ssync). +* Once a pair of nodes has determined the need to replace a missing object + fragment, instead of pushing over a copy like replication would do, the + reconstructor has to read in enough surviving fragments from other nodes and + perform a local reconstruction before it has the correct data to push to the + other node. +* A reconstructor does not talk to all other reconstructors in the set of nodes + responsible for an EC partition, this would be far too chatty, instead each + reconstructor is responsible for sync'ing with the partition's closest two + neighbors (closest meaning left and right on the ring). + +.. note:: + + EC work (encode and decode) takes place both on the proxy nodes, for PUT/GET + operations, as well as on the storage nodes for reconstruction. As with + replication, reconstruction can be the result of rebalancing, bit-rot, drive + failure or reverting data from a hand-off node back to its primary. + +-------------------------- +Performance Considerations +-------------------------- + +Efforts are underway to characterize performance of various Erasure Code +schemes. One of the main goals of the beta release is to perform this +characterization and encourage others to do so and provide meaningful feedback +to the development community. There are many factors that will affect +performance of EC so it is vital that we have multiple characterization +activities happening. + +In general, EC has different performance characteristics than replicated data. +EC requires substantially more CPU to read and write data, and is more suited +for larger objects that are not frequently accessed (eg backups). + +---------------------------- +Using an Erasure Code Policy +---------------------------- + +To use an EC policy, the administrator simply needs to define an EC policy in +`swift.conf` and create/configure the associated object ring. An example of how +an EC policy can be setup is shown below:: + + [storage-policy:2] + name = ec104 + policy_type = erasure_coding + ec_type = jerasure_rs_vand + ec_num_data_fragments = 10 + ec_num_parity_fragments = 4 + ec_object_segment_size = 1048576 + +Let's take a closer look at each configuration parameter: + +* ``name``: This is a standard storage policy parameter. + See :doc:`overview_policies` for details. +* ``policy_type``: Set this to ``erasure_coding`` to indicate that this is an EC + policy. +* ``ec_type``: Set this value according to the available options in the selected + PyECLib back-end. This specifies the EC scheme that is to be used. For + example the option shown here selects Vandermonde Reed-Solomon encoding while + an option of ``flat_xor_hd_3`` would select Flat-XOR based HD combination + codes. See the `PyECLib `_ page for + full details. +* ``ec_num_data_fragments``: The total number of fragments that will be + comprised of data. +* ``ec_num_parity_fragments``: The total number of fragments that will be + comprised of parity. +* ``ec_object_segment_size``: The amount of data that will be buffered up before + feeding a segment into the encoder/decoder. The default value is 1048576. + +When PyECLib encodes an object, it will break it into N fragments. However, what +is important during configuration, is how many of those are data and how many +are parity. So in the example above, PyECLib will actually break an object in +14 different fragments, 10 of them will be made up of actual object data and 4 +of them will be made of parity data (calculations depending on ec_type). + +When deciding which devices to use in the EC policy's object ring, be sure to +carefully consider the performance impacts. Running some performance +benchmarking in a test environment for your configuration is highly recommended +before deployment. Once you have configured your EC policy in `swift.conf` and +created your object ring, your application is ready to start using EC simply by +creating a container with the specified policy name and interacting as usual. + +.. note:: + + It's important to note that once you have deployed a policy and have created + objects with that policy, these configurations options cannot be changed. In + case a change in the configuration is desired, you must create a new policy + and migrate the data to a new container. + +Migrating Between Policies +-------------------------- + +A common usage of EC is to migrate less commonly accessed data from a more +expensive but lower latency policy such as replication. When an application +determines that it wants to move data from a replication policy to an EC policy, +it simply needs to move the data from the replicated container to an EC +container that was created with the target durability policy. + +Region Support +-------------- + +For at least the initial version of EC, it is not recommended that an EC scheme +span beyond a single region, neither performance nor functional validation has +be been done in such a configuration. + +-------------- +Under the Hood +-------------- + +Now that we've explained a little about EC support in Swift and how to +configure/use it, let's explore how EC fits in at the nuts-n-bolts level. + +Terminology +----------- + +The term 'fragment' has been used already to describe the output of the EC +process (a series of fragments) however we need to define some other key terms +here before going any deeper. Without paying special attention to using the +correct terms consistently, it is very easy to get confused in a hurry! + +* **chunk**: HTTP chunks received over wire (term not used to describe any EC + specific operation). +* **segment**: Not to be confused with SLO/DLO use of the word, in EC we call a + segment a series of consecutive HTTP chunks buffered up before performing an + EC operation. +* **fragment**: Data and parity 'fragments' are generated when erasure coding + transformation is applied to a segment. +* **EC archive**: A concatenation of EC fragments; to a storage node this looks + like an object. +* **ec_ndata**: Number of EC data fragments. +* **ec_nparity**: Number of EC parity fragments. + +Middleware +---------- + +Middleware remains unchanged. For most middleware (e.g., SLO/DLO) the fact that +the proxy is fragmenting incoming objects is transparent. For list endpoints, +however, it is a bit different. A caller of list endpoints will get back the +locations of all of the fragments. The caller will be unable to re-assemble the +original object with this information, however the node locations may still +prove to be useful information for some applications. + +On Disk Storage +--------------- + +EC archives are stored on disk in their respective objects-N directory based on +their policy index. See :doc:`overview_policies` for details on per policy +directory information. + +The actual names on disk of EC archives also have one additional piece of data +encoded in the filename, the fragment archive index. + +Each storage policy now must include a transformation function that diskfile +will use to build the filename to store on disk. The functions are implemented +in the diskfile module as policy specific sub classes ``DiskFileManager``. + +This is required for a few reasons. For one, it allows us to store fragment +archives of different indexes on the same storage node which is not typical +however it is possible in many circumstances. Without unique filenames for the +different EC archive files in a set, we would be at risk of overwriting one +archive of index n with another of index m in some scenarios. + +The transformation function for the replication policy is simply a NOP. For +reconstruction, the index is appended to the filename just before the .data +extension. An example filename for a fragment archive storing the 5th fragment +would like this this:: + + 1418673556.92690#5.data + +An additional file is also included for Erasure Code policies called the +``.durable`` file. Its meaning will be covered in detail later, however, its on- +disk format does not require the name transformation function that was just +covered. The .durable for the example above would simply look like this:: + + 1418673556.92690.durable + +And it would be found alongside every fragment specific .data file following a +100% successful PUT operation. + +Proxy Server +------------ + +High Level +========== + +The Proxy Server handles Erasure Coding in a different manner than replication, +therefore there are several code paths unique to EC policies either though sub +classing or simple conditionals. Taking a closer look at the PUT and the GET +paths will help make this clearer. But first, a high level overview of how an +object flows through the system: + +.. image:: images/ec_overview.png + +Note how: + +* Incoming objects are buffered into segments at the proxy. +* Segments are erasure coded into fragments at the proxy. +* The proxy stripes fragments across participating nodes such that the on-disk + stored files that we call a fragment archive is appended with each new + fragment. + +This scheme makes it possible to minimize the number of on-disk files given our +segmenting and fragmenting. + +Multi_Phase Conversation +======================== + +Multi-part MIME document support is used to allow the proxy to engage in a +handshake conversation with the storage node for processing PUT requests. This +is required for a few different reasons. + +#. From the perspective of the storage node, a fragment archive is really just + another object, we need a mechanism to send down the original object etag + after all fragment archives have landed. +#. Without introducing strong consistency semantics, the proxy needs a mechanism + to know when a quorum of fragment archives have actually made it to disk + before it can inform the client of a successful PUT. + +MIME supports a conversation between the proxy and the storage nodes for every +PUT. This provides us with the ability to handle a PUT in one connection and +assure that we have the essence of a 2 phase commit, basically having the proxy +communicate back to the storage nodes once it has confirmation that all fragment +archives in the set have been committed. Note that we still require a quorum of +data elements of the conversation to complete before signaling status to the +client but we can relax that requirement for the commit phase such that only 2 +confirmations to that phase of the conversation are required for success as the +reconstructor will assure propagation of markers that indicate data durability. + +This provides the storage node with a cheap indicator of the last known durable +set of fragment archives for a given object on a successful durable PUT, this is +known as the ``.durable`` file. The presence of a ``.durable`` file means, to +the object server, `there is a set of ts.data files that are durable at +timestamp ts.` Note that the completion of the commit phase of the conversation +is also a signal for the object server to go ahead and immediately delete older +timestamp files for this object. This is critical as we do not want to delete +the older object until the storage node has confirmation from the proxy, via the +multi-phase conversation, that the other nodes have landed enough for a quorum. + +The basic flow looks like this: + + * The Proxy Server erasure codes and streams the object fragments + (ec_ndata + ec_nparity) to the storage nodes. + * The storage nodes store objects as EC archives and upon finishing object + data/metadata write, send a 1st-phase response to proxy. + * Upon quorum of storage nodes responses, the proxy initiates 2nd-phase by + sending commit confirmations to object servers. + * Upon receipt of commit message, object servers store a 0-byte data file as + `.durable` indicating successful PUT, and send a final response to + the proxy server. + * The proxy waits for a minimal number of two object servers to respond with a + success (2xx) status before responding to the client with a successful + status. In this particular case it was decided that two responses was + the mininum amount to know that the file would be propagated in case of + failure from other others and because a greater number would potentially + mean more latency, which should be avoided if possible. + +Here is a high level example of what the conversation looks like:: + + proxy: PUT /p/a/c/o + Transfer-Encoding': 'chunked' + Expect': '100-continue' + X-Backend-Obj-Multiphase-Commit: yes + obj: 100 Continue + X-Obj-Multiphase-Commit: yes + proxy: --MIMEboundary + X-Document: object body + + --MIMEboundary + X-Document: object metadata + Content-MD5: + + --MIMEboundary + + obj: 100 Continue + + proxy: X-Document: put commit + commit_confirmation + --MIMEboundary-- + + obj: 20x + =2 2xx responses> + proxy: 2xx -> client + +A few key points on the .durable file: + +* The .durable file means \"the matching .data file for this has sufficient + fragment archives somewhere, committed, to reconstruct the object\". +* The Proxy Server will never have knowledge, either on GET or HEAD, of the + existence of a .data file on an object server if it does not have a matching + .durable file. +* The object server will never return a .data that does not have a matching + .durable. +* When a proxy does a GET, it will only receive fragment archives that have + enough present somewhere to be reconstructed. + +Partial PUT Failures +==================== + +A partial PUT failure has a few different modes. In one scenario the Proxy +Server is alive through the entire PUT conversation. This is a very +straightforward case. The client will receive a good response if and only if a +quorum of fragment archives were successfully landed on their storage nodes. In +this case the Reconstructor will discover the missing fragment archives, perform +a reconstruction and deliver fragment archives and their matching .durable files +to the nodes. + +The more interesting case is what happens if the proxy dies in the middle of a +conversation. If it turns out that a quorum had been met and the commit phase +of the conversation finished, its as simple as the previous case in that the +reconstructor will repair things. However, if the commit didn't get a change to +happen then some number of the storage nodes have .data files on them (fragment +archives) but none of them knows whether there are enough elsewhere for the +entire object to be reconstructed. In this case the client will not have +received a 2xx response so there is no issue there, however, it is left to the +storage nodes to clean up the stale fragment archives. Work is ongoing in this +area to enable the proxy to play a role in reviving these fragment archives, +however, for the current release, a proxy failure after the start of a +conversation but before the commit message will simply result in a PUT failure. + +GET +=== + +The GET for EC is different enough from replication that subclassing the +`BaseObjectController` to the `ECObjectController` enables an efficient way to +implement the high level steps described earlier: + +#. The proxy server makes simultaneous requests to participating nodes. +#. As soon as the proxy has the fragments it needs, it calls on PyECLib to + decode the data. +#. The proxy streams the decoded data it has back to the client. +#. Repeat until the proxy is done sending data back to the client. + +The GET path will attempt to contact all nodes participating in the EC scheme, +if not enough primaries respond then handoffs will be contacted just as with +replication. Etag and content length headers are updated for the client +response following reconstruction as the individual fragment archives metadata +is valid only for that fragment archive. + +Object Server +------------- + +The Object Server, like the Proxy Server, supports MIME conversations as +described in the proxy section earlier. This includes processing of the commit +message and decoding various sections of the MIME document to extract the footer +which includes things like the entire object etag. + +DiskFile +======== + +Erasure code uses subclassed ``ECDiskFile``, ``ECDiskFileWriter`` and +``ECDiskFileManager`` to impement EC specific handling of on disk files. This +includes things like file name manipulation to include the fragment index in the +filename, determination of valid .data files based on .durable presence, +construction of EC specific hashes.pkl file to include fragment index +information, etc., etc. + +Metadata +-------- + +There are few different categories of metadata that are associated with EC: + +System Metadata: EC has a set of object level system metadata that it +attaches to each of the EC archives. The metadata is for internal use only: + +* ``X-Object-Sysmeta-EC-Etag``: The Etag of the original object. +* ``X-Object-Sysmeta-EC-Content-Length``: The content length of the original + object. +* ``X-Object-Sysmeta-EC-Frag-Index``: The fragment index for the object. +* ``X-Object-Sysmeta-EC-Scheme``: Description of the EC policy used to encode + the object. +* ``X-Object-Sysmeta-EC-Segment-Size``: The segment size used for the object. + +User Metadata: User metadata is unaffected by EC, however, a full copy of the +user metadata is stored with every EC archive. This is required as the +reconstructor needs this information and each reconstructor only communicates +with its closest neighbors on the ring. + +PyECLib Metadata: PyECLib stores a small amount of metadata on a per fragment +basis. This metadata is not documented here as it is opaque to Swift. + +Database Updates +---------------- + +As account and container rings are not associated with a Storage Policy, there +is no change to how these database updates occur when using an EC policy. + +The Reconstructor +----------------- + +The Reconstructor performs analogous functions to the replicator: + +#. Recovery from disk drive failure. +#. Moving data around because of a rebalance. +#. Reverting data back to a primary from a handoff. +#. Recovering fragment archives from bit rot discovered by the auditor. + +However, under the hood it operates quite differently. The following are some +of the key elements in understanding how the reconstructor operates. + +Unlike the replicator, the work that the reconstructor does is not always as +easy to break down into the 2 basic tasks of synchronize or revert (move data +from handoff back to primary) because of the fact that one storage node can +house fragment archives of various indexes and each index really /"belongs/" to +a different node. So, whereas when the replicator is reverting data from a +handoff it has just one node to send its data to, the reconstructor can have +several. Additionally, its not always the case that the processing of a +particular suffix directory means one or the other for the entire directory (as +it does for replication). The scenarios that create these mixed situations can +be pretty complex so we will just focus on what the reconstructor does here and +not a detailed explanation of why. + +Job Construction and Processing +=============================== + +Because of the nature of the work it has to do as described above, the +reconstructor builds jobs for a single job processor. The job itself contains +all of the information needed for the processor to execute the job which may be +a synchronization or a data reversion and there may be a mix of jobs that +perform both of these operations on the same suffix directory. + +Jobs are constructed on a per partition basis and then per fragment index basis. +That is, there will be one job for every fragment index in a partition. +Performing this construction \"up front\" like this helps minimize the +interaction between nodes collecting hashes.pkl information. + +Once a set of jobs for a partition has been constructed, those jobs are sent off +to threads for execution. The single job processor then performs the necessary +actions working closely with ssync to carry out its instructions. For data +reversion, the actual objects themselves are cleaned up via the ssync module and +once that partition's set of jobs is complete, the reconstructor will attempt to +remove the relevant directory structures. + +The scenarios that job construction has to take into account include: + +#. A partition directory with all fragment indexes matching the local node + index. This is the case where everything is where it belongs and we just + need to compare hashes and sync if needed, here we sync with our partners. +#. A partition directory with one local fragment index and mix of others. Here + we need to sync with our partners where fragment indexes matches the + local_id, all others are sync'd with their home nodes and then deleted. +#. A partition directory with no local fragment index and just one or more of + others. Here we sync with just the home nodes for the fragment indexes that + we have and then all the local archives are deleted. This is the basic + handoff reversion case. + +.. note:: + A \"home node\" is the node where the fragment index encoded in the + fragment archive's filename matches the node index of a node in the primary + partition list. + +Node Communication +================== + +The replicators talk to all nodes who have a copy of their object, typically +just 2 other nodes. For EC, having each reconstructor node talk to all nodes +would incur a large amount of overhead as there will typically be a much larger +number of nodes participating in the EC scheme. Therefore, the reconstructor is +built to talk to its adjacent nodes on the ring only. These nodes are typically +referred to as partners. + +Reconstruction +============== + +Reconstruction can be thought of sort of like replication but with an extra step +in the middle. The reconstructor is hard-wired to use ssync to determine what is +missing and desired by the other side. However, before an object is sent over +the wire it needs to be reconstructed from the remaining fragments as the local +fragment is just that - a different fragment index than what the other end is +asking for. + +Thus, there are hooks in ssync for EC based policies. One case would be for +basic reconstruction which, at a high level, looks like this: + +* Determine which nodes need to be contacted to collect other EC archives needed + to perform reconstruction. +* Update the etag and fragment index metadata elements of the newly constructed + fragment archive. +* Establish a connection to the target nodes and give ssync a DiskFileLike class + that it can stream data from. + +The reader in this class gathers fragments from the nodes and uses PyECLib to +reconstruct each segment before yielding data back to ssync. Essentially what +this means is that data is buffered, in memory, on a per segment basis at the +node performing reconstruction and each segment is dynamically reconstructed and +delivered to `ssync_sender` where the `send_put()` method will ship them on +over. The sender is then responsible for deleting the objects as they are sent +in the case of data reversion. + +The Auditor +----------- + +Because the auditor already operates on a per storage policy basis, there are no +specific auditor changes associated with EC. Each EC archive looks like, and is +treated like, a regular object from the perspective of the auditor. Therefore, +if the auditor finds bit-rot in an EC archive, it simply quarantines it and the +reconstructor will take care of the rest just as the replicator does for +replication policies. diff --git a/doc/source/overview_policies.rst b/doc/source/overview_policies.rst index 9cabde6cf9..06c7fc79a2 100755 --- a/doc/source/overview_policies.rst +++ b/doc/source/overview_policies.rst @@ -8,22 +8,22 @@ feature is implemented throughout the entire code base so it is an important concept in understanding Swift architecture. As described in :doc:`overview_ring`, Swift uses modified hashing rings to -determine where data should reside in the cluster. There is a separate ring -for account databases, container databases, and there is also one object -ring per storage policy. Each object ring behaves exactly the same way -and is maintained in the same manner, but with policies, different devices -can belong to different rings with varying levels of replication. By supporting -multiple object rings, Swift allows the application and/or deployer to -essentially segregate the object storage within a single cluster. There are -many reasons why this might be desirable: +determine where data should reside in the cluster. There is a separate ring for +account databases, container databases, and there is also one object ring per +storage policy. Each object ring behaves exactly the same way and is maintained +in the same manner, but with policies, different devices can belong to different +rings. By supporting multiple object rings, Swift allows the application and/or +deployer to essentially segregate the object storage within a single cluster. +There are many reasons why this might be desirable: -* Different levels of replication: If a provider wants to offer, for example, - 2x replication and 3x replication but doesn't want to maintain 2 separate clusters, - they would setup a 2x policy and a 3x policy and assign the nodes to their - respective rings. +* Different levels of durability: If a provider wants to offer, for example, + 2x replication and 3x replication but doesn't want to maintain 2 separate + clusters, they would setup a 2x and a 3x replication policy and assign the + nodes to their respective rings. Furthermore, if a provider wanted to offer a + cold storage tier, they could create an erasure coded policy. -* Performance: Just as SSDs can be used as the exclusive members of an account or - database ring, an SSD-only object ring can be created as well and used to +* Performance: Just as SSDs can be used as the exclusive members of an account + or database ring, an SSD-only object ring can be created as well and used to implement a low-latency/high performance policy. * Collecting nodes into group: Different object rings may have different @@ -36,10 +36,12 @@ many reasons why this might be desirable: .. note:: - Today, choosing a different storage policy allows the use of different - object rings, but future policies (such as Erasure Coding) will also - change some of the actual code paths when processing a request. Also note - that Diskfile refers to backend object storage plug-in architecture. + Today, Swift supports two different policy types: Replication and Erasure + Code. Erasure Code policy is currently a beta release and should not be + used in a Production cluster. See :doc:`overview_erasure_code` for details. + + Also note that Diskfile refers to backend object storage plug-in + architecture. See :doc:`development_ondisk_backends` for details. ----------------------- Containers and Policies @@ -61,31 +63,33 @@ Policy-0 is considered the default). We will be covering the difference between default and Policy-0 in the next section. Policies are assigned when a container is created. Once a container has been -assigned a policy, it cannot be changed (unless it is deleted/recreated). The implications -on data placement/movement for large datasets would make this a task best left for -applications to perform. Therefore, if a container has an existing policy of, -for example 3x replication, and one wanted to migrate that data to a policy that specifies -a different replication level, the application would create another container -specifying the other policy name and then simply move the data from one container -to the other. Policies apply on a per container basis allowing for minimal application -awareness; once a container has been created with a specific policy, all objects stored -in it will be done so in accordance with that policy. If a container with a -specific name is deleted (requires the container be empty) a new container may -be created with the same name without any restriction on storage policy -enforced by the deleted container which previously shared the same name. +assigned a policy, it cannot be changed (unless it is deleted/recreated). The +implications on data placement/movement for large datasets would make this a +task best left for applications to perform. Therefore, if a container has an +existing policy of, for example 3x replication, and one wanted to migrate that +data to an Erasure Code policy, the application would create another container +specifying the other policy parameters and then simply move the data from one +container to the other. Policies apply on a per container basis allowing for +minimal application awareness; once a container has been created with a specific +policy, all objects stored in it will be done so in accordance with that policy. +If a container with a specific name is deleted (requires the container be empty) +a new container may be created with the same name without any restriction on +storage policy enforced by the deleted container which previously shared the +same name. Containers have a many-to-one relationship with policies meaning that any number -of containers can share one policy. There is no limit to how many containers can use -a specific policy. +of containers can share one policy. There is no limit to how many containers +can use a specific policy. -The notion of associating a ring with a container introduces an interesting scenario: -What would happen if 2 containers of the same name were created with different -Storage Policies on either side of a network outage at the same time? Furthermore, -what would happen if objects were placed in those containers, a whole bunch of them, -and then later the network outage was restored? Well, without special care it would -be a big problem as an application could end up using the wrong ring to try and find -an object. Luckily there is a solution for this problem, a daemon known as the -Container Reconciler works tirelessly to identify and rectify this potential scenario. +The notion of associating a ring with a container introduces an interesting +scenario: What would happen if 2 containers of the same name were created with +different Storage Policies on either side of a network outage at the same time? +Furthermore, what would happen if objects were placed in those containers, a +whole bunch of them, and then later the network outage was restored? Well, +without special care it would be a big problem as an application could end up +using the wrong ring to try and find an object. Luckily there is a solution for +this problem, a daemon known as the Container Reconciler works tirelessly to +identify and rectify this potential scenario. -------------------- Container Reconciler @@ -184,9 +188,9 @@ this case we would not use the default as it might not have the same policy as legacy containers. When no other policies are defined, Swift will always choose ``Policy-0`` as the default. -In other words, default means "create using this policy if nothing else is specified" -and ``Policy-0`` means "use the legacy policy if a container doesn't have one" which -really means use ``object.ring.gz`` for lookups. +In other words, default means "create using this policy if nothing else is +specified" and ``Policy-0`` means "use the legacy policy if a container doesn't +have one" which really means use ``object.ring.gz`` for lookups. .. note:: @@ -244,17 +248,19 @@ not mark the policy as deprecated to all nodes. Configuring Policies -------------------- -Policies are configured in ``swift.conf`` and it is important that the deployer have a solid -understanding of the semantics for configuring policies. Recall that a policy must have -a corresponding ring file, so configuring a policy is a two-step process. First, edit -your ``/etc/swift/swift.conf`` file to add your new policy and, second, create the -corresponding policy object ring file. +Policies are configured in ``swift.conf`` and it is important that the deployer +have a solid understanding of the semantics for configuring policies. Recall +that a policy must have a corresponding ring file, so configuring a policy is a +two-step process. First, edit your ``/etc/swift/swift.conf`` file to add your +new policy and, second, create the corresponding policy object ring file. -See :doc:`policies_saio` for a step by step guide on adding a policy to the SAIO setup. +See :doc:`policies_saio` for a step by step guide on adding a policy to the SAIO +setup. -Note that each policy has a section starting with ``[storage-policy:N]`` where N is the -policy index. There's no reason other than readability that these be sequential but there -are a number of rules enforced by Swift when parsing this file: +Note that each policy has a section starting with ``[storage-policy:N]`` where N +is the policy index. There's no reason other than readability that these be +sequential but there are a number of rules enforced by Swift when parsing this +file: * If a policy with index 0 is not declared and no other policies defined, Swift will create one @@ -269,9 +275,11 @@ are a number of rules enforced by Swift when parsing this file: * The policy name 'Policy-0' can only be used for the policy with index 0 * If any policies are defined, exactly one policy must be declared default * Deprecated policies cannot be declared the default + * If no ``policy_type`` is provided, ``replication`` is the default value. -The following is an example of a properly configured ``swift.conf`` file. See :doc:`policies_saio` -for full instructions on setting up an all-in-one with this example configuration.:: +The following is an example of a properly configured ``swift.conf`` file. See +:doc:`policies_saio` for full instructions on setting up an all-in-one with this +example configuration.:: [swift-hash] # random unique strings that can never change (DO NOT LOSE) @@ -280,10 +288,12 @@ for full instructions on setting up an all-in-one with this example configuratio [storage-policy:0] name = gold + policy_type = replication default = yes [storage-policy:1] name = silver + policy_type = replication deprecated = yes Review :ref:`default-policy` and :ref:`deprecate-policy` for more @@ -300,11 +310,14 @@ There are some other considerations when managing policies: the desired policy section, but a deprecated policy may not also be declared the default, and you must specify a default - so you must have policy which is not deprecated at all times. + * The option ``policy_type`` is used to distinguish between different + policy types. The default value is ``replication``. When defining an EC + policy use the value ``erasure_coding``. + * The EC policy has additional required parameters. See + :doc:`overview_erasure_code` for details. -There will be additional parameters for policies as new features are added -(e.g., Erasure Code), but for now only a section name/index and name are -required. Once ``swift.conf`` is configured for a new policy, a new ring must be -created. The ring tools are not policy name aware so it's critical that the +Once ``swift.conf`` is configured for a new policy, a new ring must be created. +The ring tools are not policy name aware so it's critical that the correct policy index be used when creating the new policy's ring file. Additional object rings are created in the same manner as the legacy ring except that '-N' is appended after the word ``object`` where N matches the @@ -404,43 +417,47 @@ Middleware ---------- Middleware can take advantage of policies through the :data:`.POLICIES` global -and by importing :func:`.get_container_info` to gain access to the policy -index associated with the container in question. From the index it -can then use the :data:`.POLICIES` singleton to grab the right ring. For example, +and by importing :func:`.get_container_info` to gain access to the policy index +associated with the container in question. From the index it can then use the +:data:`.POLICIES` singleton to grab the right ring. For example, :ref:`list_endpoints` is policy aware using the means just described. Another example is :ref:`recon` which will report the md5 sums for all of the rings. Proxy Server ------------ -The :ref:`proxy-server` module's role in Storage Policies is essentially to make sure the -correct ring is used as its member element. Before policies, the one object ring -would be instantiated when the :class:`.Application` class was instantiated and could -be overridden by test code via init parameter. With policies, however, there is -no init parameter and the :class:`.Application` class instead depends on the :data:`.POLICIES` -global singleton to retrieve the ring which is instantiated the first time it's -needed. So, instead of an object ring member of the :class:`.Application` class, there is -an accessor function, :meth:`~.Application.get_object_ring`, that gets the ring from :data:`.POLICIES`. +The :ref:`proxy-server` module's role in Storage Policies is essentially to make +sure the correct ring is used as its member element. Before policies, the one +object ring would be instantiated when the :class:`.Application` class was +instantiated and could be overridden by test code via init parameter. With +policies, however, there is no init parameter and the :class:`.Application` +class instead depends on the :data:`.POLICIES` global singleton to retrieve the +ring which is instantiated the first time it's needed. So, instead of an object +ring member of the :class:`.Application` class, there is an accessor function, +:meth:`~.Application.get_object_ring`, that gets the ring from +:data:`.POLICIES`. In general, when any module running on the proxy requires an object ring, it does so via first getting the policy index from the cached container info. The exception is during container creation where it uses the policy name from the -request header to look up policy index from the :data:`.POLICIES` global. Once the -proxy has determined the policy index, it can use the :meth:`~.Application.get_object_ring` method -described earlier to gain access to the correct ring. It then has the responsibility -of passing the index information, not the policy name, on to the back-end servers -via the header ``X-Backend-Storage-Policy-Index``. Going the other way, the proxy also -strips the index out of headers that go back to clients, and makes sure they only -see the friendly policy names. +request header to look up policy index from the :data:`.POLICIES` global. Once +the proxy has determined the policy index, it can use the +:meth:`~.Application.get_object_ring` method described earlier to gain access to +the correct ring. It then has the responsibility of passing the index +information, not the policy name, on to the back-end servers via the header ``X +-Backend-Storage-Policy-Index``. Going the other way, the proxy also strips the +index out of headers that go back to clients, and makes sure they only see the +friendly policy names. On Disk Storage --------------- -Policies each have their own directories on the back-end servers and are identified by -their storage policy indexes. Organizing the back-end directory structures by policy -index helps keep track of things and also allows for sharing of disks between policies -which may or may not make sense depending on the needs of the provider. More -on this later, but for now be aware of the following directory naming convention: +Policies each have their own directories on the back-end servers and are +identified by their storage policy indexes. Organizing the back-end directory +structures by policy index helps keep track of things and also allows for +sharing of disks between policies which may or may not make sense depending on +the needs of the provider. More on this later, but for now be aware of the +following directory naming convention: * ``/objects`` maps to objects associated with Policy-0 * ``/objects-N`` maps to storage policy index #N @@ -466,19 +483,19 @@ policy index and leaves the actual directory naming/structure mechanisms to :class:`.Diskfile` being used will assure that data is properly located in the tree based on its policy. -For the same reason, the :ref:`object-updater` also is policy aware. As previously -described, different policies use different async pending directories so the -updater needs to know how to scan them appropriately. +For the same reason, the :ref:`object-updater` also is policy aware. As +previously described, different policies use different async pending directories +so the updater needs to know how to scan them appropriately. -The :ref:`object-replicator` is policy aware in that, depending on the policy, it may have to -do drastically different things, or maybe not. For example, the difference in -handling a replication job for 2x versus 3x is trivial; however, the difference in -handling replication between 3x and erasure code is most definitely not. In -fact, the term 'replication' really isn't appropriate for some policies -like erasure code; however, the majority of the framework for collecting and -processing jobs is common. Thus, those functions in the replicator are -leveraged for all policies and then there is policy specific code required for -each policy, added when the policy is defined if needed. +The :ref:`object-replicator` is policy aware in that, depending on the policy, +it may have to do drastically different things, or maybe not. For example, the +difference in handling a replication job for 2x versus 3x is trivial; however, +the difference in handling replication between 3x and erasure code is most +definitely not. In fact, the term 'replication' really isn't appropriate for +some policies like erasure code; however, the majority of the framework for +collecting and processing jobs is common. Thus, those functions in the +replicator are leveraged for all policies and then there is policy specific code +required for each policy, added when the policy is defined if needed. The ssync functionality is policy aware for the same reason. Some of the other modules may not obviously be affected, but the back-end directory @@ -487,25 +504,26 @@ parameter. Therefore ssync being policy aware really means passing the policy index along. See :class:`~swift.obj.ssync_sender` and :class:`~swift.obj.ssync_receiver` for more information on ssync. -For :class:`.Diskfile` itself, being policy aware is all about managing the back-end -structure using the provided policy index. In other words, callers who get -a :class:`.Diskfile` instance provide a policy index and :class:`.Diskfile`'s job is to keep data -separated via this index (however it chooses) such that policies can share -the same media/nodes if desired. The included implementation of :class:`.Diskfile` -lays out the directory structure described earlier but that's owned within -:class:`.Diskfile`; external modules have no visibility into that detail. A common -function is provided to map various directory names and/or strings -based on their policy index. For example :class:`.Diskfile` defines :func:`.get_data_dir` -which builds off of a generic :func:`.get_policy_string` to consistently build -policy aware strings for various usage. +For :class:`.Diskfile` itself, being policy aware is all about managing the +back-end structure using the provided policy index. In other words, callers who +get a :class:`.Diskfile` instance provide a policy index and +:class:`.Diskfile`'s job is to keep data separated via this index (however it +chooses) such that policies can share the same media/nodes if desired. The +included implementation of :class:`.Diskfile` lays out the directory structure +described earlier but that's owned within :class:`.Diskfile`; external modules +have no visibility into that detail. A common function is provided to map +various directory names and/or strings based on their policy index. For example +:class:`.Diskfile` defines :func:`.get_data_dir` which builds off of a generic +:func:`.get_policy_string` to consistently build policy aware strings for +various usage. Container Server ---------------- -The :ref:`container-server` plays a very important role in Storage Policies, it is -responsible for handling the assignment of a policy to a container and the -prevention of bad things like changing policies or picking the wrong policy -to use when nothing is specified (recall earlier discussion on Policy-0 versus +The :ref:`container-server` plays a very important role in Storage Policies, it +is responsible for handling the assignment of a policy to a container and the +prevention of bad things like changing policies or picking the wrong policy to +use when nothing is specified (recall earlier discussion on Policy-0 versus default). The :ref:`container-updater` is policy aware, however its job is very simple, to @@ -538,19 +556,19 @@ migrated to be fully compatible with the post-storage-policy queries without having to fall back and retry queries with the legacy schema to service container read requests. -The :ref:`container-sync-daemon` functionality only needs to be policy aware in that it -accesses the object rings. Therefore, it needs to pull the policy index -out of the container information and use it to select the appropriate -object ring from the :data:`.POLICIES` global. +The :ref:`container-sync-daemon` functionality only needs to be policy aware in +that it accesses the object rings. Therefore, it needs to pull the policy index +out of the container information and use it to select the appropriate object +ring from the :data:`.POLICIES` global. Account Server -------------- -The :ref:`account-server`'s role in Storage Policies is really limited to reporting. -When a HEAD request is made on an account (see example provided earlier), -the account server is provided with the storage policy index and builds -the ``object_count`` and ``byte_count`` information for the client on a per -policy basis. +The :ref:`account-server`'s role in Storage Policies is really limited to +reporting. When a HEAD request is made on an account (see example provided +earlier), the account server is provided with the storage policy index and +builds the ``object_count`` and ``byte_count`` information for the client on a +per policy basis. The account servers are able to report per-storage-policy object and byte counts because of some policy specific DB schema changes. A policy specific @@ -564,23 +582,23 @@ pre-storage-policy accounts by altering the DB schema and populating the point in time. The per-storage-policy object and byte counts are not updated with each object -PUT and DELETE request, instead container updates to the account server are performed -asynchronously by the ``swift-container-updater``. +PUT and DELETE request, instead container updates to the account server are +performed asynchronously by the ``swift-container-updater``. .. _upgrade-policy: Upgrading and Confirming Functionality -------------------------------------- -Upgrading to a version of Swift that has Storage Policy support is not difficult, -in fact, the cluster administrator isn't required to make any special configuration -changes to get going. Swift will automatically begin using the existing object -ring as both the default ring and the Policy-0 ring. Adding the declaration of -policy 0 is totally optional and in its absence, the name given to the implicit -policy 0 will be 'Policy-0'. Let's say for testing purposes that you wanted to take -an existing cluster that already has lots of data on it and upgrade to Swift with -Storage Policies. From there you want to go ahead and create a policy and test a -few things out. All you need to do is: +Upgrading to a version of Swift that has Storage Policy support is not +difficult, in fact, the cluster administrator isn't required to make any special +configuration changes to get going. Swift will automatically begin using the +existing object ring as both the default ring and the Policy-0 ring. Adding the +declaration of policy 0 is totally optional and in its absence, the name given +to the implicit policy 0 will be 'Policy-0'. Let's say for testing purposes +that you wanted to take an existing cluster that already has lots of data on it +and upgrade to Swift with Storage Policies. From there you want to go ahead and +create a policy and test a few things out. All you need to do is: #. Upgrade all of your Swift nodes to a policy-aware version of Swift #. Define your policies in ``/etc/swift/swift.conf`` diff --git a/doc/source/overview_replication.rst b/doc/source/overview_replication.rst index 81523fab51..56aeeacd7d 100644 --- a/doc/source/overview_replication.rst +++ b/doc/source/overview_replication.rst @@ -111,11 +111,53 @@ Another improvement planned all along the way is separating the local disk structure from the protocol path structure. This separation will allow ring resizing at some point, or at least ring-doubling. -FOR NOW, IT IS NOT RECOMMENDED TO USE SSYNC ON PRODUCTION CLUSTERS. Some of us -will be in a limited fashion to look for any subtle issues, tuning, etc. but -generally ssync is an experimental feature. In its current implementation it is -probably going to be a bit slower than RSync, but if all goes according to plan -it will end up much faster. +Note that for objects being stored with an Erasure Code policy, the replicator +daemon is not involved. Instead, the reconstructor is used by Erasure Code +policies and is analogous to the replicator for Replication type policies. +See :doc:`overview_erasure_code` for complete information on both Erasure Code +support as well as the reconstructor. + +---------- +Hashes.pkl +---------- + +The hashes.pkl file is a key element for both replication and reconstruction +(for Erasure Coding). Both daemons use this file to determine if any kind of +action is required between nodes that are participating in the durability +scheme. The file itself is a pickled dictionary with slightly different +formats depending on whether the policy is Replication or Erasure Code. In +either case, however, the same basic information is provided between the +nodes. The dictionary contains a dictionary where the key is a suffix +directory name and the value is the MD5 hash of the directory listing for +that suffix. In this manner, the daemon can quickly identify differences +between local and remote suffix directories on a per partition basis as the +scope of any one hashes.pkl file is a partition directory. + +For Erasure Code policies, there is a little more information required. An +object's hash directory may contain multiple fragments of a single object in +the event that the node is acting as a handoff or perhaps if a rebalance is +underway. Each fragment of an object is stored with a fragment index, so +the hashes.pkl for an Erasure Code partition will still be a dictionary +keyed on the suffix directory name, however, the value is another dictionary +keyed on the fragment index with subsequent MD5 hashes for each one as +values. Some files within an object hash directory don't require a fragment +index so None is used to represent those. Below are examples of what these +dictionaries might look like. + +Replication hashes.pkl:: + + {'a43': '72018c5fbfae934e1f56069ad4425627', + 'b23': '12348c5fbfae934e1f56069ad4421234'} + +Erasure Code hashes.pkl:: + + {'a43': {None: '72018c5fbfae934e1f56069ad4425627', + 2: 'b6dd6db937cb8748f50a5b6e4bc3b808'}, + 'b23': {None: '12348c5fbfae934e1f56069ad4421234', + 1: '45676db937cb8748f50a5b6e4bc34567'}} + + + -----------------------------