functional infrastructures - cw 2013

Upload: tbatchelli

Post on 14-Apr-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/30/2019 Functional Infrastructures - CW 2013

    1/55

    Functional

    InfrastructuresToni Batchelli, @disclojure

    PalletOpsClojure/West 2013

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    2/55

    or...

    It's all fn until you hit

    production

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    3/55

    user> _Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    4/55

    user> _Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    5/55

    b = f(a)Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    6/55

    bash $ _

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    7/55

    bash $ _

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    8/55

    bf(a)?Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    9/55

    b=rand(a)

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    10/55

    InfrastructureAutomation

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    11/55

    =f( )desiredsystem currentsystemTuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    12/55

    Bottom Up:Ops Perspective

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    13/55

    One box

    Concrete: known hardware, OS family and

    OS version, package version, tooling

    Stateful (erk!)

    Scripts

    Save/Clone Image

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    14/55

    Many boxes

    Some configuration is shared

    Certain uniformity is desired

    Scripts+Templates

    Configuration Data Base

    Transport

    Declarative actions

    Image Save/Clone

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    15/55

    Many boxes

    Some configuration is shared

    Certain uniformity is desired

    Scripts+Templates

    Configuration Data Base

    Transport

    Declarative actions

    Image Save/Clone

    } DevOpsTuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    16/55

    Top Down:

    Devs Perspective

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    17/55

    user> _Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    18/55

    Devs view

    OS & Hardware dont matter

    Size doesnt matter

    Build environments Dev, Test, Stage & Production

    Same code everywhere

    Development branches

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    19/55

    Devs OTHER view

    Test on ubuntu 10.04 and Centos 6.3

    Prepare changes for new version of HBase

    Test recovery with hot stand-by DB

    Benchmark horizontal scalability

    Swap MySQL for MongoDB

    How do firewall rules affect our distributed

    system?

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    20/55

    timeTuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    21/55Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    22/55

    master

    time

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    23/55

    master

    new DB

    time

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    24/55

    master

    new DB

    time

    hbase upgrade

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    25/55

    master

    new DB

    Hot-Fix

    time

    hbase upgrade

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    26/55

    master

    new DB

    Hot-Fix

    time

    hbase upgrade

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    27/55

    master

    new DB

    Hot-Fix

    more

    users

    time

    hbase upgrade

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    28/55

    master

    new DB

    Hot-Fix

    more

    users

    cheaperinstances

    time

    hbase upgrade

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    29/55

    master

    new DB

    Hot-Fix

    more

    users

    cheaperinstances

    time

    hbase upgrade

    repo changes

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    30/55

    Moving Parts

    ( os-families os-versions node-types

    configurations cross-node configs

    branches environments

    cluster shapes

    infrastructure providers ...)

    time

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    31/55

    clojureTuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    32/55

    Pallet

    An Functional Infrastructure Automation

    platform written in Clojure

    3+ years of development

    Brain child of Hugo Duncan

    Used in IaaS, PaaS, SaaS and elsewhere

    +30K lines of Clojure

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    33/55

    Design Constraints

    Needs to work today

    Write once; run everywhere

    Native support for Cloud infrastructure

    Native support for Clusters

    A library, not a framework, not a server

    Build your own automation

    Build your own abstractions

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    34/55

    Pallet

    A Library Stateless

    Embeddable

    Provides abstractions over Cloud Providers Hardware

    OS

    Configuration Relationships

    A companion library of Crates (modules) a number ofservices

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    35/55

    (defweb-server-nodes(node-spec{:image{:os-family:ubuntu:os-version"10.04"}}{:hardware{:cpu-count12:min-ram(*641024)}}))(defweb-servers(group-specweb-server

    :node-specnode-spec:phases{:configure(plan-fn(java/install)(tomcat/install))))

    (defec2(compute-service:ec2...))(converge{web-servers5}:compute-serviceec2)

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    36/55

    (defnweb-server-node[cpusramos-familyos-version]

    (node-spec{:image{:os-familyos-family:os-versionos-version}}{:hardware{:cpu-countcpus:min-ram(*ram1024)}}

    (defnweb-servers[cpusramos-familyos-version](group-spec:node-specnode-spec:phases

    {:configure(plan-fn(java/install)(tomcat/install))))

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    37/55

    (converge{(web-servers1232:centos"6.3")1}:compute-serviceec2)(defplatforms[[:centos"6.3"][:ubuntu"10.04"]

    [:rhel"7"]])(defwebservers-to-build(zipmap(map(fn[[os-familyos-version]](web-servers1232os-familyos-version))platforms)

    (repeat1)))

    (convergewebservers-to-build:compute-serviceec2)

    (convergewebservers-to-build:compute-servicevirtualbox)

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    38/55

    Pallet

    Serverless -- your infrastructure in Git

    Build your abstractions on top of Pallets

    abstractions

    Embed Pallet in your application

    Distribute automation as .jars

    Describe and build your infrastructure in agenerative way

    Write once, run everywhere

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    39/55

    DSLs

    Bridging between very different worlds

    Pallet has a DSL named Stevedore for

    abstracting over scripting languages and tooling

    Clojure + Stevedore + OS family/version = correct script

    Intertwine clojure code with shell scripts in a way similar

    to macros do with clojure.

    Pallet itself is built on Stevedore, and all of it is OSindependent

    Script abstractions -- create and reuse scripts inside

    stevedore

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    40/55

    DEMO

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    41/55

    Multi-methods

    For when the same abstract concept has many

    concrete representations

    Open extensibility -- very important!

    Pallet uses them for abstracting over OS family& version, at both script and plan levels, e.g.:

    Passwordless sudo is done differently in Centos 5.3 and

    Centos 6+

    Java is installed different depending on the OS family

    and version

    Java is installed differently if its Oracle JDK or OpenJDK

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    42/55

    Data

    Data allows to perform heavy lifting

    operations very simply

    Data is easy to test, inspect, debug, log

    Defer execution as much as possible

    Pallet internals are built around data

    manipulation

    Coupling between components is data

    All intermediate representation is data, until right

    before the execution

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    43/55

    Data

    Pallet represents abstractions as data

    structures: they compose well

    Abstractions built as maps

    Infrastructure can be defined dynamically and

    programmatically

    Mixins with different merging semantics

    E.g. if you merge different specs with the same function,the actions are first joined and then reordered

    environment, node, server, group, cluster...

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    44/55

    Compilers

    Powerful design pattern to bridge two

    different worlds

    In a compiler

    Start with your code and target architecture

    Build abstract data representation of the code

    Live in the data world for as long as you can,

    transforming this data (pipeline)

    translate to data into OPCodes for the target

    CPU/Architecture

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    45/55

    plan=lift( )currentsystem

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    46/55

    plan=lift( )currentsystem

    =exec(plan)desired

    system

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    47/55

    DEMO

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    48/55

    Finite State Machines

    Provide a better understanding andmanagement of external stateful resources

    Separate state from execution

    Pallets main execution paths arecontrolled by state machines

    Separate side-effect free from side-effect all-the-things

    Query the execution state

    Write your own functions on existing primitives

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    49/55

    Concurrency

    Immutability in Clojure is priceless...

    ... for everything else, there are atoms and refs

    99% of pallet is stateless

    functions are easy to test

    we use threads at the target-node level

    a session is kept in thread-local atoms

    100s of nodes

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    50/55

    JVM

    Access to well tested, well understood and

    high-performance libraries

    dm;hc

    Pallet uses 3 java libs:

    Multi-cloud support via jclouds (optional)

    slf4j for logging

    jsch -- ssh support

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    51/55

    JVM

    .jar

    Embed Pallet in your code

    Distribute pallet automation as jars

    Build your domain on Pallet

    Every developer can build their own infrastructure

    Projects can distribute their infrastructure builder

    Versioning, signing, etc...

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    52/55

    bf(a)?Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    53/55

    Where are we now?

    Functional and programmatic

    infrastructure automation

    Works on most cloud providers and target

    OSs (as long as theyre *nix)

    Build complex and flexible clusters

    Fast development paths

    Easy to build your domain abstractions on

    infrastructure

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    54/55

    What are we doing with it?

    Pallet Big Data -- Automate everything Big

    Data

    Amazon EMR everywhere!

    Build Clusters, keep them happy, run workloads

    bricklayer -- like git, but for builds

    Decouple build from server

    Build evolves with code

    lein pallet up -- download project from git,

    run it everywhere

    Tuesday, April 2, 13

  • 7/30/2019 Functional Infrastructures - CW 2013

    55/55

    Infrastructure Automation

    Clojure Development

    http://palletops.com

    mailto:[email protected]:[email protected]