Atomic Upgrading of Distributed Systems

17
November 3, 2009 Atomic Upgrading of Distributed Systems HotSWUp'08 Sander van der Burg, Eelco Dolstra, Merijn de Jonge SERG

description

Presentation given at HotSWUp 2008 workshop (co located with OOPSLA 2008) in Nashville, Tennessee, USA.

Transcript of Atomic Upgrading of Distributed Systems

Page 1: Atomic Upgrading of Distributed Systems

November 3, 2009

Atomic Upgrading ofDistributed Systems

HotSWUp'08

Sander van der Burg, Eelco Dolstra, Merijn de Jonge

SERG

Page 2: Atomic Upgrading of Distributed Systems

Introduction

• Nix deployment system• Disnix deployment system• Atomic upgrading

Page 3: Atomic Upgrading of Distributed Systems

Distributed systems

• Distributed systems– Consists of multiple autonomous computers– Components work together to reach a common goal– Appear to a user as one logical system– Components have intra-dependencies and inter-

dependencies

Page 4: Atomic Upgrading of Distributed Systems

Dependency relationships

Page 5: Atomic Upgrading of Distributed Systems

Upgrading distributed systems

• Upgrading distributed systems is complex:• Usually a semi automatic process• Requires up-to-date documentation• Requires people with skills• Tedious and error prone• Is not an atomic operation

Page 6: Atomic Upgrading of Distributed Systems

Upgrading distributed systems

• Upgrading distributed systems should be a simple process• Automatic process• Configurations should be captured in models• Upgrading should be an atomic operation

Page 7: Atomic Upgrading of Distributed Systems

Nix Deployment System

• Is a package manager, like RPM• Builds packages from Nix expressions• Stores components in isolation in a Nix store• Nix profiles which abstracts over store components• Upgrading is atomic• Deals with single systems

Page 8: Atomic Upgrading of Distributed Systems

Nix store and Nix profile

Page 9: Atomic Upgrading of Distributed Systems

Nix expressionrec { HelloService = derivation { name = "HelloService-1.0"; src = fetchurl { url = http://nixos.org/.../HelloService.tar.gz; md5 = "de3187eac06baf5f0506c06935a1fd29"; }; buildInputs = [ant jdk axis2]; builder = ./builder.sh; };

HelloWorldService = derivation { ... }; stdenv = ... firefox = import ... ... # other package definitions}

Page 10: Atomic Upgrading of Distributed Systems

Disnix Deployment System

• Extends the Nix deployment system with support for distributed systems

• Provides remote access to the Nix stores and Nix profiles trough a webservice interface

• Introduces three model types to model a distributed system

• Uses a variant of the two-phase commit algorithm to allow distributed atomic commits

Page 11: Atomic Upgrading of Distributed Systems

Disnix overview

Page 12: Atomic Upgrading of Distributed Systems

Services modelrec { pkgs = import ./pkgs.nix;

HelloService = { pkg = pkgs.HelloService; dependsOn = []; }; HelloWorldService = { pkg = pkgs.HelloWorldService; dependsOn = [ HelloService ]; };}

Page 13: Atomic Upgrading of Distributed Systems

Infrastructure model{ itchy = { hostname = "itchy"; targetEPR = http://itchy/.../DisnixService; }; scratchy = { hostname = "scratchy"; targetEPR = http://scratchy/.../DisnixService; };}

Page 14: Atomic Upgrading of Distributed Systems

Distribution model{services, infrastructure}:

[ { service = services.HelloService; target = infrastructure.itchy; } { service = services.HelloWorldService; target = infrastructure.scratchy; }]

Page 15: Atomic Upgrading of Distributed Systems

Distribution export<?xml version="1.0" encoding="utf-8"?><expr> <list> <attrs> <attr name="service"> <string value="/nix/store/bw7dnw...-HelloService-0.1"/> </attr> <attr name="target"> <string value="http://itchy:8080/axis2/services/DisnixService"/> </attr> </attrs> <attrs> <attr name="service"> <string value="/nix/store/2490znhi8...-HelloWorldService-0.1"/> </attr> <attr name="target"> <string value="http://scratchy:8080/axis2/services/DisnixService"/> </attr> </attrs> </list></expr>

Page 16: Atomic Upgrading of Distributed Systems

Atomic commits

• Commit-request phase:– Build all services on the coordinator machine– Transfer the services and intra-dependencies to the

cohort machines through the webservice interface• Request phase, on each cohort:– Deactivate the old components– Uninstall old components in profile– Install new component in profile– Activate new the components– All connections to the services are blocked

Page 17: Atomic Upgrading of Distributed Systems

Concluding remarks

• We have demonstrated that we can extend the Nix approach of upgrading single systems to distributed systems• Upgrading can be done from a declarative

specification• Upgrading is an atomic operation

• Distribution of services is still a static process• We are developing a dynamic approach based on

quality of service models• http://www.nixos.org