From 1f82704ef89583af40909a3c9d83bc91be692a5e Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Thu, 23 Apr 2015 18:55:05 +0900 Subject: [PATCH] WIP: name-game-sketch.org --- doc/cluster-of-clusters/migration-3to4.png | Bin 19362 -> 8945 bytes doc/cluster-of-clusters/migration-4.png | Bin 0 -> 8021 bytes doc/cluster-of-clusters/name-game-sketch.org | 149 +++++++++++++++++-- 3 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 doc/cluster-of-clusters/migration-4.png diff --git a/doc/cluster-of-clusters/migration-3to4.png b/doc/cluster-of-clusters/migration-3to4.png index 51eb6180ffe0ae372d4629a47c76deacf9bfad48..b35475e5e807ac28b3f86f4878902c7580765374 100644 GIT binary patch literal 8945 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 literal 19362 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 M07*qoM6N<$f}D8FPXGV_ diff --git a/doc/cluster-of-clusters/migration-4.png b/doc/cluster-of-clusters/migration-4.png new file mode 100644 index 0000000000000000000000000000000000000000..c381fe6068a35cee349cb91d8c35b95908926877 GIT binary patch literal 8021 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 literal 0 HcmV?d00001 diff --git a/doc/cluster-of-clusters/name-game-sketch.org b/doc/cluster-of-clusters/name-game-sketch.org index c06efc1..476edc7 100644 --- a/doc/cluster-of-clusters/name-game-sketch.org +++ b/doc/cluster-of-clusters/name-game-sketch.org @@ -4,12 +4,12 @@ #+STARTUP: lognotedone hidestars indent showall inlineimages #+SEQ_TODO: TODO WORKING WAITING DONE -* "Name Games" with random-slicing style consistent hashing +* 1. "Name Games" with random-slicing style consistent hashing Our goal: to distribute lots of files very evenly across a cluster of Machi clusters (hereafter called a "cluster of clusters" or "CoC"). -* Assumptions +* 2. Assumptions ** Basic familiarity with Machi high level design and Machi's "projection" @@ -41,6 +41,15 @@ clusters. We wish to provide partitioned/distributed file storage across all N clusters. We call the entire collection of N Machi clusters a "cluster of clusters", or abbreviated "CoC". +** Continue CoC prototype's assumption: a Machi cluster is unaware of CoC + +Let's continue with an assumption that an individual Machi cluster +inside of the cluster-of-clusters is completely unaware of the +cluster-of-clusters layer. + +We may need to break this assumption sometime in the future? It isn't +quite clear yet, sorry. + ** Analogy: "neighborhood : city :: Machi :: cluster-of-clusters" Analogy: The word "machi" in Japanese means small town or @@ -59,7 +68,7 @@ slicing works, see [[http://hibari.github.io/hibari-doc/hibari-sysadmin-guide.en For a comprehensive description, please see these two papers: -#BEGIN_QUOTE +#+BEGIN_QUOTE Reliable and Randomized Data Distribution Strategies for Large Scale Storage Systems Alberto Miranda et al. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.226.5609 @@ -70,7 +79,7 @@ Random Slicing: Efficient and Scalable Data Placement for Large-Scale Alberto Miranda et al. DOI: http://dx.doi.org/10.1145/2632230 (long version, ACM Transactions on Storage, Vol. 10, No. 3, Article 9, 2014) -#END_QUOTE +#+END_QUOTE ** We use random slicing to map CoC file names -> Machi cluster ID/name @@ -103,13 +112,135 @@ It's likely that the projection given by this map will be out-of-date, so the client must be ready to use the standard Machi procedure to request the cluster's current projection, in any case. -* Goo +* 3. A simple illustration -[[./migration-3to4.png]] +I'm borrowing an illustration from the HibariDB documentation here, +but it fits my purposes quite well. (And I originally created that +image, and the use license is OK.) + +#+CAPTION: Illustration of 'Map', using four Machi clusters + +[[./migration-4.png]] + +Assume that we have a random slicing map called Map. This particular +Map maps the unit interval onto 4 Machi clusters: + +| Hash range | Cluster ID | +|-------------+------------| +| 0.00 - 0.25 | Cluster1 | +| 0.25 - 0.33 | Cluster4 | +| 0.33 - 0.58 | Cluster2 | +| 0.58 - 0.66 | Cluster4 | +| 0.66 - 0.91 | Cluster3 | +| 0.91 - 1.00 | Cluster4 | + +Then, if we had CoC file name "foo", the hash SHA("foo") maps to about +0.05 on the unit interval. So, according to Map, the value of +rs_hash("foo",Map) = Cluster1. Similarly, SHA("hello") is about +0.67 on the unit interval, so rs_hash("hello",Map) = Cluster3. + +* 4. An additional assumption: clients will want some control over file placement + +We will continue to use the 4-cluster diagram from the previous +section. + +When a client wishes to append data to a Machi file, the Machi server +chooses the file name & byte offset for storing that data. This +feature is why Machi's eventual consistency operating mode is so +nifty: it allows us to merge together files safely at any time because +any two client append operations will always write to different files +& different offsets. + +** Our new assumption: client control over initial file placement + +The CoC management scheme may decide that files need to migrate to +other clusters. The reason could be for storage load or I/O load +balancing reasons. It could be because a cluster is being +decomissioned by its owners. There are many legitimate reasons why a +file that is initially created on cluster ID X has been moved to +cluster ID Y. + +However, there are legitimate reasons for why the client would want +control over the choice of Machi cluster when the data is first +written. The single biggest reason is load balancing. Assuming that +the client (or the CoC management layer acting on behalf of the CoC +client) knows the current utilization across the participating Machi +clusters, then it may be very helpful to send new append() requests to +under-utilized clusters. + +** Cool! Except for a couple of problems... + +However, this Machi file naming feature is not so helpful in a +cluster-of-clusters context. If the client wants to store some data +on Cluster2 and therefore sends an append("foo",CoolData) request to +the head of Cluster2 (which the client magically knows how to +contact), then the result will look something like +{ok,"foo.s923.z47",ByteOffset}. + +So, "foo.s923.z47" is the file name that any Machi CoC client must use +in order to retrieve the CoolData bytes. + +*** Problem #1: We want CoC files to move around automatically + +If the CoC client stores two pieces of information, the file name +"foo.s923.z47" and the Cluster ID Cluster2, then what happens when the +cluster-of-clusters system decides to rebalance files across all +machines? The CoC manager may decide to move our file to Cluster66. + +How will a future CoC client wishes to retrieve CoolData when Cluster2 +no longer stores the required file? + +**** When migrating the file, we could put a "pointer" on Cluster2 that points to the new location, Cluster66. + +This scheme is a bit brittle, even if all of the pointers are always +created 100% correctly. Also, if Cluster2 is ever unavailable, then +we cannot fetch our CoolData, even though the file moved away from +Cluster2 several years ago. + +The scheme would also introduce extra round-trips to the servers +whenever we try to read a file where we do not know the most +up-to-date cluster ID for. + +**** We could store "foo.s923.z47"'s location in an LDAP database! + +Or we could store it in Riak. Or in another, external database. We'd +rather not create such an external dependency, however. + +*** Problem #2: "foo.s923.z47" doesn't always map via random slicing to Cluster2 + +... if we ignore the problem of "CoC files may be redistributed in the +future", then we still have a problem. + +In fact, the value of ps_hash("foo.s923.z47",Map) is Cluster1. + +The whole reason using random slicing is to make a very quick, +easy-to-distribute mapping of file names to cluster IDs. It would be +very nice, very helpful if the scheme would actually *work for us*. + + +* 5. Proposal: Break the opacity of Machi file names, slightly + +Assuming that Machi keeps the scheme of creating file names (in +response to append() and sequencer_new_range() calls) based on a +predictable client-supplied prefix and an opaque suffix, e.g., + +append("foo",CoolData) -> {ok,"foo.s923.z47",ByteOffset}. + +... then we propose that all CoC and Machi parties be aware of this +naming scheme, i.e. that Machi assigns file names based on: + +ClientSuppliedPrefix ++ "." ++ SomeOpaqueFileNameSuffix + +The Machi system doesn't care about the file name -- a Machi server +will treat the entire file name as an opaque thing. But this document +is called the "Name Game" for a reason. + +What if the CoC client uses a similar scheme? + +** * Acknowledgements -The source for the "migration-3to4.png" image is from the [[http://hibari.github.io/hibari-doc/images/migration-3to4.png][HibariDB -documentation]]. - +The source for the "migration-4.png" and "migration-3to4.png" images +come from the [[http://hibari.github.io/hibari-doc/images/migration-3to4.png][HibariDB documentation]].