Graduate Networked Systems with George Porter was a course I was drawn to purely by the practical assignments, that too in Go. With my background in networking and programming in Go, I felt this was a good course to polish it up and I was not let down. The gradual build up of complexity and a wide variety of topics being covered made the course a well rounded one.
The course started off with the basics of networking, IP addressing, NAT, DNS and a bunch of other topics. The first assignment was to implement a distributed sorting algorithm for raw binary values over a cluster. The implementation brought out many details that would otherwise be missed such as who should and how to distribute the values, what format should the data be sent in, what protocol to use and many others. We settled on raw TCP connections with a simple fixed size framing and a primary node which has the input data to distribute and sort. This was also the time to get familiar with goroutines if not already.
The next concept was HTTP. The widely used basis of the internet standard also used by this very page you are viewing. We went in depth on the HTTP/1.1 standard, it’s message format and the changes between versions. The assignment was to implement a subset of it, rightly called TritonHTTP (!) from scratch, only using the abstractions provided by TCP to build the layer 7 protocol. The parsing uses both types, delimiter based for message header and the length based format for the message body, making the implementation non trivial. Combine it with the rules to handle duplicate headers, missing and malformed messages and pipelining, made it a good assignment to get familiar network programming.
DNS and CDN
This section touched upon the basics of DNS and how CDNs use DNS in combination with reverse proxies to make a resiliant, globally available cache. Akamai’s papers were really nice in showing how they came up with the algorithm to distribute load across their clusters.
This is the main project over the course for next three assignments which would build a distributed, fault tolerant and highly available file/block store, complete with a sync client, something resembling a primitive Dropbox. The server is comprised to two pieces, a metastore for the file metadata, and a blockstore that stores the raw contents of the files. The first assignment on this was to set up a base by implementing a single node meta and block store.
While I had an idea of how something would be located on a large scale, with something like Distributed Hash Tables (DHTs) used by the infamous torrenting peer-to-peer network for content lookup, I never really thought about how they would actually work. Consistent Hashing was a game changer to understand how nodes going out and coming in still keep the whole network functional while not overloading any single node.
The attached project was to build up on the base for SurfStore multi node blockstore where the data is distributed using consistent hashing. This gave a solid understanding and allowed an incremental increase of capacity for our SurfStore.
RAFT is a consensus algorithm used in many distributed systems, well known by its use in
etcd, a distributed key value store used by Kubernetes. While this was built to be easily understood compared to the alternative Paxos, it is by no means a simple algorithm. The ease of understanding comes from how RAFT divides responsibilities and allows us to understand it module by module without having to think about the big picture until the end. A real good thought provoking paper and a very interactive web simulator makes for a very interesting study.
For the SurfStore’s final component, a distributed metastore with RAFT for consistency was implemented. Thus making the metastore resilient to failures, while the consistent hashing providing a scaling mechanism for the blockstore.
This was a solid course comprising of all the building blocks needed to build enterprise scale distributed systems. I am glad that this course went over the theory just as much in depth as the projects did, because I, for one, think that understanding concepts is way more important than just implementing something cool without knowing why it works the way it does. RAFT will stick with me for quite a while because of this course!