Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Distribuerede systemer, CBS, 2. oktober 2014

Distribuerede systemer, CBS, 2. oktober 2014

Slides til undervisningen i distribuerede systemer på CBS, 2. oktober 2014.

Kasper Tidemann

October 02, 2014
Tweet

More Decks by Kasper Tidemann

Other Decks in Education

Transcript

  1. { navn: "Kasper Tidemann", arbejde: "Softwareudvikler", virksomhed: "Tidemann&Co", sprog: ["JavaScript",

    "Go", "Ruby"], kanLide: "At være flink og drikke øl", steder: ["København", "San Francisco"], gørOgså: "Blogging", www: "kaspertidemann.com", twitter: "@kaspertidemann" } string(json.Marshal(kasper))
  2. Spørg bagefter og skyd først - eller hvordan det nu

    er. Jeg er praktiker af natur med hang til teori.
  3. Blot for at præcisere. Det bliver ofte kaldt noget andet,

    fx real-time, pub/sub eller tilsvarende.
  4. Bemærk at nogle kalder det channels (Faye), andre rooms (Socket.io)

    osv. Publish-subscribe, yes, sir! 1. En enhed kan abonnere på en kanal. * → /chat/cbs 2. Når der sker noget på kanalen, så notificeres alle abonnenter. /chat/cbs → *
  5. Forskellige eksempler server-side. Populære implementationer socket.on('ny', function (besked) { socket.broadcast.emit('ny',

    { brugernavn: 'Kasper', besked: besked }); }); faye.getClient().publish('/ny', { brugernavn: 'Kasper' besked: besked }); sock.on('connection', function(c) { c.on('besked', function(besked) { c.write(besked); }); });
  6. Sådan kunne en simpel chat se ud i Socket.io (flooding).

    Socket.io socket.on('ny besked', function (besked) {
 ! socket.broadcast.emit('ny besked', {
 ! brugernavn: 'Kasper', besked: besked
 ! });
 ! });
  7. … eller sådan her hvor rummet, der sendes til, er

    defineret eksplicit. Socket.io socket.on('ny gruppebesked', function(id, besked) { ! socket.broadcast.to(id).emit('ny gruppebesked', { brugernavn: 'Kasper', besked: besked ! }); ! });
  8. Et par gode råd omkring publish-subscribe generelt. Vær opmærksom på

    1. Publish-subscribe kræver hurtigt en mængde systemressourcer. 2. Skalering foregår typisk via Redis, som ofte skal clusteres. 3. Heartbeating kan udgøre en væsentlig mængde trafik og kræver flere CPU-ressourcer end selve beskederne, der bliver sendt frem og tilbage. 4. Publish-subscribe er ofte implementeret via WebSockets, men mange firewalls tillader ikke protokollen.
  9. En måde at finde ud af om der er nogen

    i den anden ende. Heartbeating Socket 1 Socket 2 – Er du der? – Ja, hvad med dig? Husk også TCPs keepalive-funktion - regn dog ikke med den.
  10. WebSockets, der sender beskeder fra en database, fx. Ofte er

    publish-subscribe et lag oven på et andet lag, der sørger for persistering.
  11. Om Skypes skifte fra ren P2P til indirekte kommunikation. Et

    lille citat Previously, any client with good bandwidth, no restrictions due to firewall or NAT, and adequate processing power could become a supernode. Skype was the first peer-to-peer IP telephony network. The network contains three types of entities: supernodes, ordinary nodes, and the login server. In 2012, Microsoft altered the design of the network, and brought all supernodes under their control as hosted servers in data centres.
  12. Kort fortalt, men mere følger. Kort fortalt En message queue

    skaber løs kobling mellem applikationer. ! Den kan sørge for at modtage beskeder og sende dem videre til behandling både en-efter-en og parallelt for bedre udnyttelse af ledige ressourcer på tværs af et netværk. ! Det skaber asynkronitet og kan sikre atomicitet.
  13. Afsender, kø og modtager; eller producent, kø og arbejder. Komponenter

    Sender Producer Message queue Receiver Consumer Worker
  14. Eksempel på kode tilhørende en sender i RabbitMQ. Sender (Producer)

    connection = Bunny.new() connection.start ! channel = connection.create_channel queue = channel.queue('køen til Nexus') ! channel.default_exchange.publish('Køb lige øl til mig!')
  15. Ovenstående er forsimplet; det bør wrappes i begin/rescue. Receiver (Consumer/Worker)

    connection = Bunny.new() connection.start ! channel = connection.create_channel queu = channel.queue('køen til Nexus') ! queue.subscribe(:block => true) do puts "Slap af, jeg henter øl!" end
  16. Ovenstående er generelt, taget fra typiske anvendelser. versus Publish- subscribe

    Message queues Real-time Sporadisk Kronologisk Struktureret Forbinder klienter Forbinder servere Ingen ambition om konsistens Konsistent afvikling
  17. Fortolkning af ressourcer fra eksterne kilder, fx en FTP-server. Tilgang

    til eksterne ressourcer ftp://top-secret-data.nsa.gov http://www.google.com/ smb://192.168.1.100/fællesdrev
  18. Kernen er et program, som kommunikerer med CPU, RAM mv.

    Kernen (Kernel) CPU RAM Enheder Applikationer Kernen
  19. Kernen taler også med USB-porte, keyboard og alt andet. Kernen

    (Kernel, fortsat) Kernen er en slags koordinator, der sørger for at programmer kan få adgang til processoren, at der kan gemmes data i hukommelsen og så videre. Kernen sørger fx for virtuel adressering af hukommelse, så programmer ikke behøver kende til og tage hensyn til hinanden under afvikling.
  20. Citat: Med Apples egne ord Kernel programming is a black

    art that should be avoided if at all possible. You must be exceptionally careful to ensure that your code does not cause the system to crash, does not provide any unauthorized user access to someone else’s files or memory, does not introduce remote or local root exploits, and does not cause inadvertent data loss or corruption.
  21. Med udgangspunkt i x86-arkitekturen. Ved opstart Ved opstart bliver kernen

    indlæst i hukommelsen af en boot loader. Så starter den og indtræder i protected mode, hvor den kan bruge virtuel adressering med videre. BIOS MBR Boot loader Kernen starter Real address mode
  22. fork() er et systemkald til kernen. Processer En proces er

    en instans af en proces, der bliver afviklet. ! En proces har en mængde ressourcer til rådighed og har mulighed for at afvikle tråde og andre processer. ! Bemærk: når en proces starter en anden proces, så bliver den proces gaflet. Det nedarver sin forælders omgivelser, men får tildelt en separat plads i hukommelsen. ! (Det er derfor at en fane kan eksplodere i Chrome uden at hele Chrome går op i røg, fx.)
  23. En god, brugbar optimering. Copy-on-Write sørger for at fork() ikke

    bruger noget hukommelse før det er nødvendigt.
  24. /etc/launchd på Mac OS X og /sbin/init på Ubuntu. Hvis

    en proces er en kopi af en anden proces, hvad er så den første proces?
  25. Basalt set, anyway. Tråde En tråd er et redskab, som

    en proces kan bruge til at afvikle en instruktion. En tråd deler hukommelsesområde med sin proces og er afhængig af selvsamme. ! En proces har altid som minimum én tråd. En tråd kan fx indeholde en instruktion om at dividere to tal, som kernen så kan udføre - resultatet kommer derefter tilbage i processen.
  26. Forskellen på multithreading med en og flere processorer. Multithreading Kernen

    Tråd 1 Tråd 2 Tråd 3 Tråd 4 Eneste processor Tråd 1 Tråd 2 Første processor Tråd 1 Tråd 2 Tråd 3 Anden processor Kernen Kernen
  27. Det er egentlig en lidt kluntet forklaring. Virtualisering Virtualisering er

    en form for distribuering af et system, der giver mulighed for afvikling af enten delvist afhængige eller uafhængige miljøer. Udnyttelsen af ressourcer på en computer - altså CPU, RAM og så videre - er ofte ikke effektiv over tid, hvorfor det giver mening at virtualisere på den ene eller anden facon.
  28. Seriøst, de pjækker og går på Nexus hele tiden. Eller

    sagt på en anden måde: de fleste servere laver ikke dagens gode gerning.
  29. Ergo: den maskine laver ikke en meter. Min egen vhosts-maskine

    4% det sidste minut, 3% de sidste 5 minutter og 5% de sidste 15 minutter. 8 hjemmesider, MySQL, PostgreSQL osv.
  30. Nogle af dem gør det muligt at køre Windows 3.11

    på Mac OS X. l33t. Populære spillere på markedet
  31. Og ja, det staves schedulering med ch på dansk. Schedulering

    er en måde at give adgang til ressourcer i et (distribueret) system.
  32. Schedulering kan foregå på mange forskellige måder. Forskellige tilgange First-In-First-Out

    er den mest simple form for schedulering, hvor instruktioner afvikles i den rækkefølge som de modtages i. Shortest-Remaining-Time afvikler instruktioner, der tager kortest tid, først. Det kan resultere i starvation af længerevarende processer. Round-Robin giver alle instruktioner en del af den samlede CPU-tid. Hvis en instruktion ikke når at blive færdig indenfor tidsrammen, så går turen videre til den næste.
  33. Først om twitter og Apache Mesos. Apache Mesos is a

    cluster manager that simplifies the complexity of running applications on a shared pool of servers. Apache Mesos
  34. Det løber op i en del kroner og øre over

    tid. twitter kunne slukke 35% af deres servere og levere samme service.
  35. Lidt hurtig hovedregning giver en besparelse på $120,000 i minuttet.

    Netflix sparede omkring $2,000 i sekundet på overvågning af deres autoscaling.