Skip to content

Distributed Config Deployment based on a Spanning Tree Topology.

Notifications You must be signed in to change notification settings

tushar-rishav/CSCI5273_Final_Project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Network Systems Final Project

Design

Refer to the project proposal doc for design ideas.

Design Overview

For example with branching factor (configurable) as 2, the tree topology stored in the MDS is shown below (red arrows show parent-child relationship) Tree topology

Repo Content

.
├── Dockerfile                  # Docker image file for tree node servers (tns) and metadata server (mds)
├── FinalProject.pdf
├── README.md
├── config
│   └── default.json            # Configurable options such as heartbeat frequency, host configs etc for tns/mds
├── credentials.env             # Storing sensitive info like DB password for building docker images
├── doc
│   ├── FinalProject.pdf        # Brief design doc
│   ├── PPT.pdf                 # Slides from the presentation
│   └── img
│       ├── design.png
│       └── tree.png
├── docker-compose.yml          # Orchestrator file to manage container life-cycle.
├── package-lock.json           
├── package.json                # Dependency files
├── protos                      # Protobuf definitions for gRPC calls.
│   ├── metadata_service.proto
│   └── node_service.proto
└── src                         # Source code for mds and tns
    ├── metadata_server.js
    ├── node_server.js
    └── util
        ├── db_util.js          # Various utilities for database interaction, grpc client and server communication
        ├── extra.js            # and logging.
        └── grpc_util.js

4 directories, 15 files

Key RPC calls

  • MetaDataService::JoinCluster: A node makes a RPC call to Metadata server (MDS) with cluster join request. Receives a parent node to join the cluster as response.
  • MetaDataService::PublishWhereabouts: Tree node servers (TNS) send periodic heartbeats along with crucial metadata about their state. Metadata includes node_id, parent_node_id, child_count and its tree depth. MDS can then use this information to find the best parent for an incoming new node joining the cluster.
  • NodeState: An internal state each TNS maintains to store its unique node_id, tree depth, pointer to parent and grandparent node. It also maintains its children, siblings and uncles to facilitate peer-discovery and failure recovery in case its parent node dies.
  • NodeService::JoinParent: A child node makes a join call to its assigned (by MDS) parent node. Parent updates its NodeState to reflect the node as its children.
  • NodeService::GetSiblingsAndUncles: Child node makes periodic RPC call to its parent node to collect siblings, uncles and grandparent. Child node uses siblings and uncles info to fall back to those nodes should the parent node crashes or the upstream link breaks.

Local calls (not implemented yet)

  • get_new_parent: In case of failure, a node can compute the best parent locally using the metadata available from peer-discovery.
  • trigger_parent_switch: Invokes parent NodeService::JoinParent RPC once get_new_parent returns a parent to pick. Else triggers MetaDataService::JoinCluster in case no suitable parent has been found.

Setup

To setup locally with docker-compose run the following

$ git clone <repo> && cd <repo_dir>
$ docker-compose up --scale node=0 --scale mds=1 -d # starts MDS
$ docker-compose up --no-recreate --scale node=10 --scale mds=1 -d # starts a cluster of 10 tree node servers as per tree topology.

Presentation Slides and Video

About

Distributed Config Deployment based on a Spanning Tree Topology.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published