Docker – nettverk og svermer

Anders Fongen, september 2022

Dette er et blogginnlegg som skal diskutere nettverk av Docker-kontainere, hvordan de kan kommunisere gjennom beskyttede interne nett, og hvordan de kan opptre i svermer under styring av en sentral kontrollnode. Forutsetningen for å få godt ubytte av denne teksten er grunnleggende kjennskap til bygging og kjøring av vanlige Docker-komponenter (eng. images)

Vi kan enkelt tenke oss fornuftige anvendelser hvor en Docker-komponent har nytte av å påkalle tjenester fra en annen komponent. Dette er da typisk en komponent som ikke betjenes med en HTML-basert web -dialog, men som benytter maskin-til-maskin kommunikasjon (m2m). Slik kommunikasjon kan gjerne være basert på HTTP-protokoll og benytte programmeringsbiblioteker for dette, men vil ha innholdet kodet med XML eller JSON. Slike komponenter forbinder vi med begrepet Service Oriented Architecture (SOA). Jeg kommer ikke til å komme inn på slik programmering her, men det finnes mengder av læremidler der ute basert på ditt favoritt programmeringsspråk.

Beskyttet nettverk internt i Docker

Når en komponent ønsker å kalle en annen, er det selvfølgelig mulig å utplassere den kalte komponenten slik at den kan kalles fra “utsiden” (evt. hele Internet) og bruke denne utvendige IP-adressen som servicepunkt. Det er lett å tenke seg hvorfor dette ofte ikke er ønskelig: Uvedkommende kan fritt utnytte og sabotere tjenesten med mindre man lager mekanismer for adgangskontroll, noe som strengt tatt ikke burde vært nødvendig.

Docker tilbyr derimot “interne” nettverk som kun er synlig for Docker-kontainere på den samme maskinen og som er koplet til det interne nettverket. I det man skaper et slikt nettverk:
$ docker network create my-internal-network
$ docker network ls
$ docker network inspect my-internal-network

vil det også bli tildelt en subnett-adresse, og forsynes med tjenester for tildeling av adresser fra subnettet (lik DHCP) og tjenester for å finne IP-adresser til de tilkoplede kontainerne (lik DNS). For siden å kople en kontainer til nettverket kan vi velge to metoder:

  1. Kople til nettverket i det kontaineren skapes, f.eks slik:
    $ docker run -p 80:80 --name mycontainer --net my-internal-network image-name

    Med denne metoden vil kontaineren mycontainer være knyttet til kun my-internal-network. Om kontaineren skal være knyttet til flere nettverk, bruk metode nr.2:
  2. Lage kontaineren, kople til nettverket og starte programmet, i tre steg (eksempelvis)
    $ docker create -p 80:80 -name mycontainer image-name
    $ docker network connect my-internal-network mycontainer
    $ docker network connect my-second-internal-network mycontainer
    $ docker network disconnect bridge mycontainer
    $ docker start mycontainer

    Denne listen av kommandoen viser bruken av create, som oppretter en kontainer uten å starte den, network connect som kopler kontaineren til interne nettverk, og disconnect, som kopler fra nettverk. Deretter starter kjøringen av programmet i kontaineren med $docker run.

Det forholder seg nemlig slik at en kontainer som standardinnstilling koples til et nettverk kalt bridge. Alle andre kontainere vil også ha forbindelse til denne, noe som i mange tilfeller ikke er ønskelig. Metode nr.1 vil erstatte bridge-forbindelsen med en forbindelse til my-internal-network. Metode nr.2 vil legge nye forbindelser til eksisterende.

Eksempel 1 – BusyBox

Som eksempel på viste metode nr.2 kan komponenten BusyBox brukes. Den gir et lite Linux-kjøremiljø som vi kan skrive kommandoer til.

Først lister vi opp eksisterende nettverk og skaper to nye:


Vi er interessert i å vite subnet-adressene til disse to nye nettene:


Vi skaper en kontainer med BusyBox-komponenten og knytter den til de to nye nettverkene, i tillegg til bridge:


Nå starter vi kontaineren bb med BusyBox inni, og skriver kommandoen ip a for å se nettverkskonfigurasjonen på komponenten:

Fra denne kommandoen ser vi de tre ethernet-adaptrene eth0, eth1 og eth2 med subnettadresser som tilsvarer nettverkene bridge, my-net-1 og my-net-2. Som nevnt tidligere ville vi trolig koplet fra bridge for å unngå påvirkning fra uvedkommende komponenter.

Eksempel 2 – Trafikk mellom to Docker-komponenter

Det første eksemplet viste kun konfigurasjon av nettverksforbindelser, ikke hvordan vi kan bruke dem. Derfor vil vi nå sette opp komponenten first slik at vi kan kalle den fra busybox med linux-kommandoen wget og vise html-innholdet som first sender. Komponenten first er beskrevet i et tidligere blogginnlegg.


Her brukes kommandoene som er vist som metode nr.1 ovenfor og vi starter henholdsvis first og busybox med forbindelser til my-net-3. I busybox bruker vi kommandoene slik:

  1. ip a for å se at vi har fått et nettverksadapter med en adresse fra subnettet til my-net-3
  2. ping first for å vise at det foreligger en navnetjeneste som kopler navnet first (navnet på kontaineren) til ip-adressen 172.27.0.2, og at det foreligger en virkelig forbindelse dit.
  3. wget first:8080 for å sende et http-forespørsel til 172.27.0.2, port 8080 og lagre svaret på filen index.html.
  4. more index.html for å vise innholdet av denne filen på konsollet.

Vi har altså med dette eksemplet demonstrert at to komponenter kan ha en nettverksforbindelse som er skjermet fra andre komponenter. Det som er verd å huske er:

  • Interne nettverk får automatisk en subnett-adresse.
  • Containere som kopler seg til et internt nettverk får tildelt IP-adresse automatisk.
  • Interne nettverk (unntatt bridge) har en navnetjeneste som returnerer IP-adressen til navngitte containere. Derfor er det lurt å gi containere et navn med --name parameteren.

Av en eller annen grunn er det ingen navntjeneste i nettverket bridge, slik at ping first ikke vil fungere dersom komponentene ønsket å kommunisere over det nettverket.

Docker-compose

En applikasjon vil gjerne bestå av flere Docker-containere som samarbeider og må konfigureres og startes på en kontrollert måte. Enkeltkommandoer som vist i eksemplene ovenfor kan kanskje settes sammen i en kommandofil (.bat, .sh) og kjøres samlet. Dette forutsetter at du har konsoll-adgang til maskinen som skal kjøre applikasjonen, og at ulike maskiner kan forstå denne kommandofilen. Dette er forutsetninger som ikke kan garanteres. Docker-compose vil øke portabiliteten av applikasjoner og forenkle konfigurasjonen, siden alt foregår i én fil.

Derfor kommer Docker-compose inn som et verktøy hvor detaljer vedrørende konfigurasjon og kjøring for alle komponentene i applikasjon kan uttrykkes i én fil. Denne filen har en såkalt YAML-syntaks, som skal vises i eksemplet som følger.

Filen skal hete docker-compose.yml. Som eksempel på utforming skal vi bruke konfigurasjonen i eksempel nr.2 ovenfor. Innholdet i filen er som vist under:

Syntaksen og mulige informasjonselementer i denne YAML-filer (uttales “jammel”) er ganske omfattende, og en oversikt finner du her. Derfor velger jeg heller å demonstrere ett bestemt kjent tilfelle med en typisk struktur: nettverksforbindelse, volumer, eksponerte porter. Elementene under disse to vil være tilsvarende de parametrene vi tidligere ga på kommandolinjen. For first, legg merke til at build: nå må ha et stinavn til der hvor kildefilene til first ligger.

Syntaksen i den viste docker-compose.yml skal forstås som et hierarki der innrykk av teksten viser en “tilhørighet” til linjen ovenfor med kortere innrykk. Her har vi altså tre hovedkategorier: services, volumes, networks. Før en kontainer kan knyttes til et volum eller nettverk må disse først deklareres på denne måten. Under networks finner vi hvilket nett som skal brukes i applikasjonen og hva dette skal hete.

Under services finner vi de to vi har arbeidet med så langt, bb og firsts. For bb kommer det to linjer knyttet til stdin_open og tty, som har å gjøre med at vi ønsker konsolltilgang til denne kontaineren, noe som i mange tilfeller ikke vil være aktuelt. Derfor vil denne viste filen ha de fleste av de egenskapene du i praksis vil trenge.

La oss nå gi denne filen til Docker-compose og se hva som kommer ut av det. Arbeidskatalogen (current directory) må være den som inneholder docker-compose.yml . Oppstart skjer med kommandoen $ docker-compose up:


Nå er både bb og first started i hver sine kontainere, men vi får ingen konsolltilgang til å skrive kommandoer i. Til forskjell fra eksempel nr.2 må vi skrive dette i tilegg:
$ docker exec -it bb sh
Denne kommandoen utfører kommandoen sh i kontaineren som heter bb. Parameteren -it gjør at sh også kommuniserer med konsollet, så vi får en interaktivt Linux-konsoll. Nå kan vi teste at det er kommunikasjon mellom bb og first:


Dette må dog skrives i et annet CMD-vindu, fordi vinduet der vi startet docker-compose er opptatt. Der kan vi derimot lukke applikasjonen og stanse kontainerne ved å trykke ctrl-C noen ganger:


Kommandoen $ docker ps -a viser en liste over kontainerne og at disse er stoppet. Vi kan nå slette én og en kontainer med kommandoen $ docker rm bb first, men en enklere måte er $ docker container prune, som sletter alle inaktive kontainere under ett. Inaktive kontainere kan okkupere en del ressurser i systemet, og det er sunt å rydde regelmessig.

Docker swarms

I et storskala informasjonssystem vil en web-tjeneste kjøre på mange maskiner i parallell. Da oppnår man at maskinene kan fordele kundetrafikken mellom seg for å oppnå høyere total ytelse (kalt lastfordeling), og at noen av maskinene kan falle ut av drift uten at systemet som sådan blir utilgjengelig (kalt fail-over). Denne formen for ressursorganisering krever en sjef (manager), som fordeler forespørsler mellom arbeiderne (workers) og som holder oversikt ettersom maskiner går inn eller ut av drift.

Docker-arkitekturen egner seg godt til å inngå i en slik storskala arkitektur, siden tilstandsløse komponenter kan dupliseres på flere maskiner og utføre nøyaktig den samme tjenesten. Kunder vil se ett eneste servicepunkt (IP-adresse og port) og ikke merke noe til at tjenesten er fordelt på mange maskiner. La oss derfor se på hvordan Docker-komponenter kan organiseres som en Docker swarm:

Bruk helst Linux-maskiner

Selv om kommandoene for Docker-svermer også finnes på Windows-versjonen av Docker-systemet, er det en del egenskaper som simpelthen ikke virker som forventet. Det er derfor å anbefale at et eksperiment med Docker-svermer kun benytter Linux-maskiner. Husk også at Docker-komponenter ikke er arkitekturnøytrale, de kan ikke kjøre både på X86- og ARM-maskintyper. Ikke blande f.eks. Raspberry Pi (ARM) med ordinære PCer (X86) i en Docker-sverm.

Alt foregår fra sjefen

For å bygge opp en sverm må maskinene kunne nå hverandre gjennom et IP-nettverk, det er ikke tilstrekkelig at sjefen kan nå alle arbeiderne, arbeiderne må også kunne kommunisere med hverandre. For først å bygge opp en sverm gjør vi følgende:

  1. Bestem hvilke maskiner som skal delta, skriv ned deres IP-adresser og lag et kart som viser hvem som er sjef og hvem som er arbeidere. Fra konsollet til sjefen, logg inn (med ssh) på alle arbeiderne i separate konsollvinduer. Alle kommandoer som vises som eksempler må kjøres i sudo-modus (skriv sudo bash for komme dit).
  2. På alle maskinene i svermen, sørg nå for at alle kontainere er stanset ($ docker stop ..., $ docker rm ...) og kontroller resultatet med $ docker ps -a.
  3. På sjefens maskin, sjekk om det allerede er en sverm med $ docker node ls. Dersom det finnes en, fjerne dem med kommandoen $ docker swarm leave --force.
  4. På sjefens maskin, opprett en sverm med kommandoen $ docker swarm init. Reponsen kan se omtrent slik ut:
    Swarm initialized: current node (icv8b9vnemxfmym4lb1gbto7f) is now a manager
    To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-0ezzbg9iw2glu6d7xd6c2shjvhadr7zlemwuf4l9besxl2iogl-a1yngnqehgyub0phopuslysly 192.168.2.116:2377
  5. Ta en kopi av den uthevede teksten, og lim den inn i konsollvinduet til alle arbeiderne slik at kommandoen utføres der. De vil nå kople seg til sjefen (til ip-adressen som er vist i kommandoen) og slutte seg til svermen. Nå vil de etterhvert få opprettet kontainere for applikasjonstjenester og motta klientforespørsler.
  6. Fra sjefens konsoll skriv $docker node ls for å kontrollere at alle arbeiderne er kommet inn i svermen.

Utplassering av en tjeneste i svermen

Nå kan sjefen plassere en tjenesten inn i svermen. Dette betyr, som tidligere nevnt, at en applikasjon blir plassert ut på én eller flere av arbeiderne (inkludert sjefen), og en forespørsel fra en klient blir betjent av én av dem.

Hvilken IP-adresse leder inn til den utplassert tjenesten? Svaret er at alle IP-adressene i svermen (altså endepunktet til alle arbeiderne og sjefen) gir adgang til tjenesten, også de arbeiderne som ikke betjener selve tjenesten. Det eksisterer et eget “overlay” nettverk mellom maskinene som fremforhandler fordelingen av arbeidsoppgaver og som videresender forespørsler fra klienter til en kandidat-arbeider.

Kommandoen skal skrives på sjefens konsoll. Sånn kan den se ut:

$ docker service create --name first --replicas 3 --publish 8080:8080 andfon7a/first

Den eneste nye parameteren siden de tidligere eksperimentene er --replicas som angir det maksimale antall arbeidere (inkl. sjefen) som skal laste denne applikasjonen. Legg også merke til at Docker-komponenten ikke må ligge på sjefens egen maskin, den kan hentes fra Docker-hub om nødvendig (og den må da evt. plasseres der på forhånd med $ docker push andfon7a/first).

Med kommandoen $ netstat -ant på alle maskinene i svermen kan man nå konstatere at port 8080 er “åpen”. Med en web-leser kan man kontake én av maskinenes IP-adresse på port 8080 og konstatere at tjenesten utføres korrekt.

For å inspisere tjenesten bruk kommandoen $ docker service inspect --pretty first. For å fjerne den skrives $ docker service rm first.

Opp- og nedskalering: Det opplagt nyttige i svermen er muligheten for å endre kapasiteten ved å øke eller redusere antall maskiner som deltar i en tjeneste. Det gjøres som følger (i dette eksemplet reduseres antallet fra 3 til 2):

$ docker service scale first=2

Konklusjon

Målet med dette blogginnlegget var å gi en kortfattet, men ukomplett, innføring i hvordan man setter opp nettverk og svermer av Docker-komponenter. Det fulle omfanget av muligheter og detaljer er mye større, men er blitt utelatt fordi det er lagt vekt på å vise konkret hvor enkelt det er å sette opp en grunnleggende tjeneste.

Jeg anbefaler først leseren å gjennomføre disse eksemplene på eget utstyr og så gjøre nødvendige endringer etter egen interesse: F.eks. hvordan en sverm kan operere med permanent lagring gjennom en filtjener eller en SQL-database. Slike komponenter er ikke enkle å replikere i en sverm og vil naturlig ligge i egne tjenester, gjerne i frittstående Docker-kontainere med muligheter for å lagre data i volumes.

Utplassering av Docker-komponenter i Microsoft Azure

Anders Fongen, september 2022

Å konstruere Docker-komponenter og utplassere (eng. deploy) dem i en lokal kontainer på egen maskin er en ganske overkommelig oppgave. Mer omstendelig er det å sette slike komponenter i drift i en sky. De store skytjenestene (f.eks. Amazon AWS, Google Cloud og Microsoft Azure) er svært store og komplekse installasjoner som skal kunne betjene kunder med helt ulike behov. De tilbyr alle en web-tjeneste (portal) som lar kunden laste opp egenutviklet programvare og konfigurere samspillet med de tjenestene som skyen tilbyr (f.eks. sikkerhet, backup, navnekataloger, fillagring og SQL-databaser). For alle disse skyene blir denne portalen svært omfattende og omstendelig å bruke. Kvaliteten på dokumentasjonen er dessuten svært varierende.

Jeg har tatt for meg utvikling, utplassering, feilsøking og drift av Docker-komponenter med påfølgende utplassering i Microsoft Azure. Etter vellykket utplassering er tjenesten tilgjengelig på Internet. Dette blogginnlegget vil vise hvordan det kan skje.

Hvorfor er skyen en god idé?

Visst er det mulig å sette opp en webtjener på ditt eget hjemmenett, bestille fast IP-adresse hos Internet-leverandøren, sette opp port forwarding på hjemmeruteren, og gi hjemmeadressen et DNS-navn. Denne prosessen har jeg forøvrig beskrevet i et eget blogginnlegg.

Med et slik løsning må du selv ta hånd om sikkerhet, backup, reserveløsninger ved systembrudd, brukertillatelser, og fremfor alt skalering. En vellykket tjeneste på Internet kan oppnå en svært rask vekst i kundemengden, og dersom du ikke klarer å opprettholde en akseptabel responstid under slike forhold har du mislykkes.

Disse kravene kan skyen innfri, fordi de besitter store datasentraler med høy nettverkskapasitet, og de kan raskt øke kapasiteten på tjenesten din, de kan endog gjøre det automatisk. Personellet i datasentralene er eksperter på skalering, sikkerhet, overvåking og etterforskning, og de har ingen annen jobb enn å passe på at tjenestene leverer stabilt og raskt. Du har andre oppgaver og vil ikke klare å gjøre denne jobben like godt.

Docker

Programvare som skal kjøres som en skytjeneste må skrives etter bestemte regler, og utplasseringen trenger noen opplysninger som må fremskaffes av kunden. Docker er programvare for å lage og kjøre skytjenester. Jeg skal ikke forklare Docker grundig her, fordi det finnes mye informasjon om nettopp dette på nettet:

Det er nødvendig å gå gjennom noen eksempler på bygging og kjøring av Docker-komponenter på lokal maskin: Når Docker-komponenter kjøres på lokal maskin, f.eks. BusyBox, kan de kommunisere med brukeren gjennom konsollet, dvs. skjermen som brukes for å bygge og starte komponenter. Dette er ikke mulig på Azure, hvor komponenten må kommunisere med omverdenen gjennom nettverket (Internet).

Nettverkstrafikk kan omfatte protokoller som ssh, http, mqtt og det meste annet, men komponenten må selv besørge selve protokollen, Azure besørger bare UDP- og TCP porter, samt en brannvegg for å beskytte mot angrep via nettverket. Vi skal demonstrere bruk av Azure med web-komponenter som benytter http-protokoll.

Installasjon av programvare

For å kommunisere med Azure trengs programvaren Docker Desktop, installert på Windows eller Mac (bruk lenken ovenfor). I CMD-konsollet (Windows) kan man nå skrive $ docker for å utføre diverse kommandoer.

I den påfølgende tekst vil jeg bruke “$”-symbolet for å vise en kommando slik den skal skrives inn i CMD-konsollet. Dollartegnet skal altså ikke skrives inn.

For å utplassere Docker-komponenter på Azure trenger du følgende brukerkontoer:

  1. Hos hub.docker.com. Her plasserer du dine komponenter slik at andre kan laste dem ned til seg og bruke dem. Kontoen er gratis.
  2. Hos portal.azure.com. Her foregår selve kontrollen av Azur-aktivitetene. Duu må registrere et betalingskort, men du får også en romslig kvote gratis som du kan eksperimentere med.

Eksperimentprogrammer

To små Python-programmer blir brukt i denne demonstrasjonen: De ene er et enkelt tilstandsløst web-program som adderer to tall og viser resultatet, det andre web-programmet benytter en tekstfil som lagres på et permanent lager. Skillet mellom disse to programmene er hvordan de bruker permanent lager. Programmene ser slik ut:

Summere to tall (tilstandsløst web-program)

first.py:
import web
urls = ('/','index')

class index:
   def GET(self):
      f = open("first.html","r")
      return f.read()
   def POST(self):
      i = web.input()
      if i.a.isnumeric() and i.b.isnumeric():
         return "Svaret er %d" % (int(i.a)+int(i.b))
      else:
         return "Kun numerisk inndata er lovlig"

if __name__ == '__main__':
   app = web.application(urls,globals())
   app.run()

first.html:
<html><body>
  <h1>Addere to heltall</h1>
  <form method='POST'>
     <input name='a', size='4'>
     <input name='b', size='4'>
     <input type='submit' value='finn sum'>
   </form>
</body></html>

Dockerfile:
FROM python:3.8
WORKDIR /usr/src/app
COPY . .
RUN pip3 install web.py
EXPOSE 8080
CMD ["python","./first.py"]

Dette webprogrammet kan startes direkte fra kommandolinjen og tilby en enkel tilstandsløs tjeneste. Vi kan når som helst restarte tjenesten uten å forstyrre klientene. Vi kan lage en Docker-komponent og kjøre den lokalt på vår egen maskin med disse kommandoene (de tre filene må ligge på samme katalog, og katalogen må være arbeidskatalog (current directory):

$ docker build -t first .
$ docker run --name container1 -d -p 8080:8080 first

Nå er denne webtjenesten tilgjengelig på http://localhost:8080/. For å stoppe og fjerne tjenesten (f.eks. før utplassering av en ny programversjon) kan disse kommandoene skrives:

$ docker ps -a
$ docker stop container1
$ docker rm container1

Dele en liten datafil (tilstandsfylt web-program)

third.py:
import web, os

urls = ('/','index')
os.environ['PORT'] = '80'
app = web.application(urls, locals())
filename = "message.txt"
class index:
   def GET(self):
      if not os.path.isfile(filename):
         f = open(filename,"w")
         f.close()
         message = "Ingen melding"
      else:
         f = open(filename,"r")
         message = f.read()
      resp ="<html><body><h2>Din siste melding var: %s"%(message)
      resp += "<p>Skriv inn melding:<form method='POST'><input name='m' size='20'>"
      resp += "<input type='submit' value='Lagre melding'></form></body></html>"
      return resp
   def POST(self):
      i = web.input()
      f = open(filename,"w")
      f.write(i.m)
      f.close()
      raise web.seeother('/')

if __name__ == '__main__':
   app.run()

Dockerfile:
FROM python:3.8
WORKDIR /usr/src/app
COPY . .
RUN pip3 install web.py
EXPOSE 80
CMD ["python","./third.py"]

Dette web-programmet vil ta imot en tekstlinje og lagre den på en fil, som siden kan hentes frem av denne eller andre klienter. En form for datadeling altså. Filen som lagrer tekstlinjen bør bevares også når programmet stopper og starter igjen. Dersom vi kjører third.py som et vanlig Python-program vil filen ligge på vertsmaskinens filsystem, og vil dermed bevares slik vi ønsker.

Dersom vi lager en Docker-komponent som med forrige eksempel, vil også denne tekstlinjen bevares og utveksles mens Docker-komponenten kjører. Dersom Docker-kontaineren stoppes og startes igjen:

$ docker stop container1
$ docker start container1

(gitt at kontaineren er gitt navnet container1 ved docker run – kommandoen), da vil fortsatt tekstlinjen bevares slik vi ønsker. Dersom vi derimot fjerner kontaineren og lager en ny:

$ docker stop container1
$ docker rm container1
$ docker run --name container1 -d -p 80:80 third

Da har tekstlinjen fått det innholdet den hadde da Docker-komponenten ble laget (evt. tom), og endringer etter det tidspunktet er gått tapt. Altså, ikke slik vi ønsker at webtjenesten vår skal fungere.

Docker-komponenter med volumes

For å kunne bevare data også når docker-kontaineren slettes og skapes på nytt, må dataene lagres utenfor kontaineren, i vertsmaskinens filsystem. Dette er mulig å få til gjennom å montere en del av vertsmaskinens filsystem inne i kontainerens. Vi skal først endre én programsetning i third.py:

filename = "/app/message.txt"

og bygger web-tjenesten på lignende måte:

$ docker build -t third .
$ docker run --name container3 -v textdata:/app -d -p 80:80 third

Da oppnår vi nemlig det vi ønsker, nemlig at innholdet på området textdata i vertskapets filområde (i et nærmere bestemt filområde inne i Docker-installasjonen) vises under katalogen /app inne i kontaineren, og data som lagres under /app blir bevart selv når kontaineren slettes og gjenskapes. Dette kan kontrolleres ganske enkelt i et eksperiment.

Merk at dette permanente lageret kan lagre alle slags objekter, ikke bare tekstfiler: Bilder, lyd og selvfølgelig en databasefil fra f.eks. SQLite.

Litt om tilstander i Azure/Docker

Azure, i likhet med andre skyleverandører, lar Docker-komponenter kjøre i omgivelser som støtter stor skala, høy sikkerhet og dynamisk konfigurasjon. Det vil si at web-tjenesten som kjører kan gis et elastisk ressurstilbud ettersom pågangen øker og minker. Slik automatisk skalering skjer gjennom at Docker-komponenter kjører samtidig på mange maskiner i parallell (kalt flere instanser) og fordeler forespørselene mellom seg, og at antallet samtidige maskiner øker og minsker dynamisk.

Med datalagring inne i komponenten, slik vi har demonstrert med third.py, vil ikke en slik skalering kunne finne sted, fordi alle instansene vil ha ulikt datainnhold siden de betjener ulike forespørsler. Nei, skalering krever at Docker-komponenten benytter en separat lagringstjeneste som behandler skrivbare data (som filen message.txt i third.py ovenfor). Kun lesbare data kan fortsatt legges inne i Docker-komponenten dersom mengden ikke er for stor.

Dette skillet mellom brukerbetjening, forretningslogikk og datalager er en populær og velprøvd konstruksjonsteknikk for store informasjonssystemer. Trafikken mot datalageret (kalt back-end) er ofte lavere enn mot front-end (web-tjenesten) og datalageret kan skaleres med andre teknikker enn en front-end. Derfor ser vi at dette skillet mellom utføring og lagring i adskilte tjenester går igjen hos alle skyleverandører.

Utplassering av third.py i Azure

Vi skal hoppe over utplassering av first.py i Azure fordi det skjer på samme måten som med lokal Docker-plattform med noen små endringer, som vil fremgå av forklaringen som følger. Jeg skal gå gjennom utplassering av third.py i Azure, etter at den ene programsetningen er endret (filename = "/app/message.txt). Trinn for trinn er prosessen denne:

  1. Bygge en lokal Docker-komponent. Navnet på komponenten må prefikses med brukernavnet i Docker-hub, som i mitt tilfelle er andfon7a:
    $ docker build -t andfon7a/third .
  2. Plassere komponenten i Docker-hub. Det er nemlig herfra at Azure skal hente den senere
    $ docker login (Her kreves brukernavn og passord til brukerkontoen din)
    $ docker push andfon7a/third
    $ docker logout
  3. Logge inn i Azure og opprette filområdet
    $ docker login azure (Får du feilmelding “Azure lookup failure”, har du feil
    versjon av Docker installert. Bruk nyeste versjon av Docker desktop)
    $ docker context create aci mycontext (velg “create new resource group”)
    $ docker context use mycontext
    $ docker volume create mydata --storage-account andfon7astorage
  4. Lag en kontainer og start komponenten i den. Den lastes inn fra Docker-hub
    $ docker run -p 80:80 --name third --domainname andfon7a -d -v andfon7astorage/mydata:/app andfon7a/third
  5. Sjekk at kontaineren kjører og hvilket DNS-navn den har fått.
    $ docker ps -a
    – Sjekk nå med en web-leser at du får tak i tjenesten med dette DNS-navnet

Microsofts egen infoside om denne prosessen finner du her. Docker sin tilsvarende veiledning finnes her.

For å stoppe/starte/fjerne kontaineren bruker du kommandoene:
$ docker stop third
$ docker start third
$ docker rm third

Starting av en kontainer kan ta lengre tid enn kun kommandoen i konsollet. Bruk $docker ps -a for å se status i oppstartsarbeidet.

Om DNS-registreringen: For bruk av --domainname parameteren gjelder det at DNS-navnet blir registrert på den tildelte IP-adressen med en TTL-verdi på 300 sekunder. Dersom du under f.eks. eksperimentarbeid statid starter containeren på nytt kan du komme i situasjonen hvor DNS-tjenesten fortsatt en stund returnerer den forrige IP-adressen. Om du utelater --domainname parameteren vil $docker ps vise deg IP-adressen i den samme kolonnen , som alltid er riktig.

Huskn

Når du vil igjen jobbe lokalt eller mot Docker-hub:
$ docker logout azure
$ docker context use default

Docker-tjenester fra Amazon AWS og Google Cloud

Amazon AWS og Google Cloud er to konkurrerende skytjenester som i det store bildet har mye til felles. Begge disse kan enkelt støtte tilstandsløse Docker-komponenter, enklest gjennom egne kontrollprogrammer (à la docker) som installeres i Windows-konsollet (cmd).

  • Google Cloud betjenes av programmet Gcloud som installeres på din lokale maskin. Opplastingen skjer direkte fra lokal maskin med commandoen gcloud run deploy, og nødvendige tilleggsopplysninger legges inn i den påfølgende dialogen.
  • For Amazon AWS skjer utplasseringen ved hjelp av en tilleggsfil som inneholder de nødvendige ekstraopplysningene (som ikke ligger i Dockerfile). For en veiledning for dette, sjekk avsnittet “Docker on AWS” på denne websiden.

Ingen av disse to skytjenestene støtter derimot Volumer, slik vi har vist er mulig i Azure. Derimot har begge database-tjenester som kan brukes av Docker-komponenter for lagring. Dette dekker noe av behovet for permanent lagring, men krever også at programvaren i større grad er tilpasset for dette og blir derfor mindre portabel enn hva som er ønskelig. Databasetjenester er dessuten krevende å konfigurere, sammenlignet med et filsystem.

Space Information Networks

Anders Fongen, 03.01.2022

Kommunikasjonssatellitter har hatt en historisk utvikling fra å være enkle “speil” som reflekterer radiosignaler, til å danne nettverk med andre satellitter for å tilby høyere hastigheter, lavere forsinkelse og flere tjenester. Vi spår at denne utviklingen vil fortsette og at satellittnettverk vil utvide sine tjenester fra kun kommunikasjonstjenester til også databehandlingstjenester av ulik art. Vi ser nærmere på mulighetene for dette i denne artikkelen.

Innledning

Vi vil her omtale idéen om Cloud Computing in Space. Altså skytjenester i satellittnettverk, også kalt Space Information Networks (SIN). SIN innebærer at satellittnettverket ikke kun tilbyr kommunikasjonstjenester, men også tjenester knyttet til informasjonsbehandling og annet type samarbeid. Et SIN kan bygges slik at det tilbyr slike tjenester med global dekning og svært lave forsinkelser, og kan derfor støtte anvendelser som ikke det jordbaserte Internet kan. 

Vi velger å betrakte et SIN som et distribuert system, men med egenskaper som skiller jeg ganske mye fra ordinære distribuerte systemer slik vi vanligvis kjenner dem: I et SIN er klientene stasjonære, infrastrukturen er mobil, altså ganske omvendt av hva som er “vanlig”.

Et annet forhold som kjennetegner et SIN er forutsigbarhet. Én satellitt vil alltid vite hvor andre satellitter befinner seg hen, og hvilke som er innen rekkevidde for kommunikasjon mellom dem. Dessuten er de demografiske forholdene på jordoverflaten kjent, så det er mulig å forutse både mengden av forespørsler fra bakken, og hva slags type forespørsler det er (språk og kulturelle preferanser). 

I den resterende delen av denne artikkelen vil noen grunnleggende egenskaper knyttet til satellitter bli presentert. Skillet mellom LEO- HEO- og GEO-satellitter vil bli forklart og noe historie presentert. Hoveddelen av teksten vil beskrive de særegne egenskapene til et SIN, og hvordan informasjonstjenester kan konstrueres for best å tilpasses disse egenskapene.

Litt om geostasjonære satellitter

Idéen om å bruke romfartøy til støtte for radiokommunikasjon oppsto lenge før den første satellitten ble skutt opp i jordbane i 1957. Mest kjent er en artikkel fra 1945 skrevet av Arthur C. Clarke kalt “Extra-terrestrial Relays” hvor prinsippene for en såkalt geostasjonær satellitt ble skissert. Arthur C. Clarke var forøvrig ikke kjent som vitenskapsmann, men som science-fiction forfatter bl.a. av manuset til filmen “2001 – En romodyssé” (1968). 

En geostasjonær (GEO – Geosynchronous Earth Orbit) satellitt går i bane rundt jordas ekvator og med en omløpstid på 24 timer (egentlig litt mindre, blir forklart senere). En GEO-satellitt har et stort dekningsområde (er synlig for en stor del av jordoverflaten) men flyr så høyt over jordoverflaten at signalforsinkelsen blir merkbar. Et radiosignal sendt fra jorda og returnert fra satellitten bruker ca 250 ms på rundturen. GEO-satellitter har den store fordelen at de, sett fra jorda, står fast på samme posisjon på himmelen og krever derfor ikke bevegelige parabolantenner nede på bakken. 

Hvilken flyvehøyde har en GEO-satellitt? Den skal ligge i en bane hvor sentripetalakselerasjonen (tidligere kalt sentrifugalkraften) i den ene retningen er like stor som gravitasjonen i den andre retningen, vist med ligningen under:

  • G = gravitasjonskonstanten, 6.677*10-11 m3 kg-1 s-2
  • M = jordas masse, 5.972*1024 kg
  • T = varighet av et stjernedøgn, 86164 s
  • R = jordas radius, 6371 km
  • r = satellittens flyvehøyde over jordoverflaten

Løs denne likningen for r, du bør få 35783 km som svar.

Omløpstiden for satellitten er ikke 24 timer (som vi kaller et soldøgn), men litt kortere. Et soldøgn er tiden det tar før solen igjen står i samme posisjon på himmelen, men da har jorden dreiet litt mer enn 360 grader, fordi jorden har beveget seg rundt solen i det samme tidsrommet. Jorden snurrer faktisk 366,25 omdreininger på et år, ikke 365,25. Derfor må vi trekke fra litt for å regne tidsrommet som jorda bruker på en virkelig omdreining, og dette tallet kalles stjernedøgn. Utregning er som følger:

3600 sek/t * 24 t/sold *(365,25/366,25)sold/stjerned = 86164 sek/stjerned

Dette tallet bruker vi i likningen over og får at flyvehøyden er 35783 km. Samme likning kan vi bruke for å bestemme flyvehøyden for enhver omløpstid så lenge banen er sirkulær (ikke elliptisk). Vi kan naturligvis også løse likningen på T og finne omløpstiden når flyvehøyden er gitt.

Den første GEO satellitten het Syncom III, bygget av NASA og skutt opp i 1964. GEO-satellitter ble siden mest kjent for TV-overføringer, og alle private parabolantenner får sine TV-signaler fra slike. GEO-satellitter kan også brukes til telefoni. I mange år var dette svært dyrt og krevet avansert og plasskrevende bakkeutstyr, men utviklingen siden har bydd på enkle bærbare enheter og lavere brukskostnader.

GEO-satellitter er derimot ikke synlig lengst nord og sør på kloden, fordi banen alltid går langs ekvator. På hvilken breddegrad ligger en GEO-satellitt akkurat i horisonten? Denne verdien finner vi med en enkel trigonometrisk likning, vist med figur under:

Regn selv ut v og finn på kartet hvilke landområder som ligger nord for denne breddegraden, både nord og sør. Merk at vi ikke nødvendigvis har dekning på denne breddegraden, for dempingen av radiosignalet øker ned mot horisonten.

Hvorfor trenger vi parabolantenner? En GEO-satellitt flyr høyt over jordoverflaten og avstanden som radiosignalene skal sendes over er ca 35000 km. Over en slik avstand svekkes energien i radiosignalene såpass mye at en antennepisk (slik som vi ser på håndholdte radioer og gamle mobiltelefoner) ikke vil motta tilstrekkelig radiosignal for å gi godt mottak. Vi må da bruke såkalt direktive antenner, som samler opp energi fra en bestemt retning, fremfor en rundstrålende antenne som samler opp energi fra alle retninger (og stråler ut energi i alle retninger). En parabolantenne er direktiv og samler opp energi fra et ganske smal “stråle”, slik som en lommelykt sender lyset ut i en smal stråle og virker på større avstand enn om lyspæren stråler fritt i alle retninger.

Om lavbane (LEO) satellitter

Satellitter kan naturligvis settes i alle slags baner rundt jorden, men vil da muligens kreve bevegelige direktive antenner på bakken for å motta tilstrekkelig sterkt signal, avhengig av hvor høyt satellitten går i bane. Om de derimot går i lav bane (og med kort omløpstid) omtales de som LEO-satellitter (Low Earth Orbit) og har den fordelen at bakkeutstyret kan klare seg med enklere antenner direkte montert på håndholdt utstyr. LEO-satellitter er dessuten billigere å plassere ut i bane enn GEO-satellitter fordi dette kan gjøres med mindre og billigere raketter.

LEO-satellitter har lenge vært i bruk til værobservasjoner, etterretningsformål m.m. I slike tilfeller blir innsamlet sensorinformasjon (f.eks. bilder) oppbevart i satellitten inntil den kan lastes ned til en jordstasjon noen minutter eller timer senere. Satellitten klarer seg uten et nettverk av andre satellitter, men bruker derimot mer tid på leveransen. Satellitten opptrer som “brevdue” fremfor “telefonsentral”. 

En konsekvens av den lave banen er at “fotavtrykket” (eng. footprint), dvs. det området på jorda som har kontakt med satellitten (begrenset av horisonten og hva slags antenner som benyttes), er liten. I tillegg gjør den korte omløpstiden at utstyret på bakken har satellitten over horisonten kun en kort tid (typisk 10-20 minutter).

Disse egenskapene gir både fordeler og ulemper, sammenlignet med en GEO-satellitt:

Fordeler:

  • Banen kan legges i en vinkel på ekvator (kalt inklinasjon) slik at den passerer nær polområdene. Da vil også utstyr på bakken langt nord og langt sør kunne nå satellitten. Husk at GEO-satellitter har her en grense på ca. 81 grader nord og sør.

Bakkeutstyret kan være enklere, billigere og mer bærbart.

  • Fordi fotavtrykket er mindre, vil det være færre bakkestasjoner som skal betjenes til enhver tid, dvs. bakkeutstyret kan oppnå bedre tjenester (tilgjengelighet og kapasitet).

Ulemper:

  • Satellitten er tilgjengelig i kun korte perioder ad gangen. 
  • Bakkeutstyret må være relativt nærme hverandre for å kunne betjenes av samme satellitt. 

LEO-nettverk

De nevnte ulempene kan unngås ved å opprette et nettverk av LEO-satellitter som beveger seg i ulike baner slik at en stasjon på bakken alltid har en satellitt innen rekkevidde. Forutsetningen er da at satellittene kan kommunisere hverandre slik at en “hand-over” operasjon kan skje når bakkeutstyret må skifte sin forbindelse til en ny satellitt. Satellittene kan også ha radiolinker til hverandre og kan danne en sti hvor dataene kan videresendes til et annet sted på kloden.

For å tilby en overføringstjeneste (av f.eks. tale, data, alarmer og posisjoner) kan LEO-nettverket bruke to alternative metoder:

  1. Benytte et godt utbygget nett av bakkestasjoner som er sammenknyttet gjennom et bakkenett (f.eks. Internet). Data fra klienter på bakken sendes direkte til en bakkestasjon som videresender mot mottakeren, tilsvarende motsatt vei.
  2. Bruke kommunikasjonslinker mellom satellittene slik at den danner en sti hvor dataene kan videresendes mot den satellitten som brukes av mottakeren.

Alternativ 1 benytter altså det landbaserte nettet til å oppnå global dekning, mens alternativ 2 benytter nettverket i verdensrommet til å oppnå det samme.

Satellittnettverk har eksistert siden 1990-tallet, det mest kjente i daglig bruk er Iridium. Iridium tilbyr telefontjeneste, lavhastighet dataoverføring, tekst- og posisjonsmeldinger. 66 satellitter flyr i 6 polarbaner med inklinasjon 86.4 grader slik illustrasjonen viser, 11 i hver bane. Satellittenes fotavtrykk overlapper slik at det alltid er en satellitt tilgjengelig for bakkeutstyret. Iridium oppnår global dekning ved å utnytte linker mellom satellittene, slik som beskrevet i alternativ 2 over.

Merk at det er en matematisk sammenheng mellom størrelse på fotavtrykket, flyvehøyde og omløpstid, og dermed også antall satellitter som kreves for kontinuerlig dekning for utstyr på bakken. Lavere flyvehøyde krever flere satellitter, men betyr også enklere krav til antenner og radioutstyret på bakken, Et redusert fotavtrykk betyr også færre klienter som skal dele på den samlede overføringskapasiteten.

Fra radiospeil til datanettverk

Kommunikasjonsutstyret i de tidlige geostasjonære satellittene var relativt enkelt: Det besto av en transponder, som betegner en radio som mottar et helt frekvensspekter (ikke bare en bestemt frekvens) og sender det samme signalet ut på et annet frekvensspekter. Omtrent som et speil som reflekterer alle fargene i lyset. Oppdeling av frekvensspekteret, modulasjon, kanaldeling m.m. foregikk på bakkeutstyret. 

En slik arbeidsdeling mellom satellitten og bakkeutstyret medførte den gang at kompleksiteten i systemet kunne plasseres på bakken, noe som bidro til at nye tjenester kunne utvikles ved å skifte ut kun bakkeutstyret. I dag konstrueres radioer på en annen måte enn før, og bruken av Software Defined Radio (SDR) gjør det mulig å endre på mye av radioens virkemåte gjennom å endre programvaren i radioen, selv om den befinner seg i en satellitt i bane. Sammen med annen teknologisk utvikling er nå trenden at satellittnettverk bygges med en høyere systemkompleksitet og ivaretar flere aspekter av tjenestene enn før, f.eks. at de selv sørger for hand-off mellom satellitter, og veivalg når data skal sendes via andre satellitter. Satellitter har altså utviklet seg fra å være radiospeil til å være nettverkskomponenter.

Hvordan ser en satellittkonstellasjon ut?

En gruppe med LEO-satellitter som omkretser jorden vil bli plassert i nøye uttenkte baner: De skal ha et fotavtrykk og en inklinasjon som gir dekning for en del av jordkloden, de skal ha en passende avstand mellom seg (i samme bane og mellom baner) slik at de kan danne kommunikasjonslinker med hverandre. Flyvehøyden vil også påvirke kravene til antenner i bakkeutstyret og energiforbruket i satellitten.  Vi vil i denne diskusjonen begrense oss til sirkulære baner, ikke elliptiske, fordi det er det vanligste valget for LEO-satellitter. 

Mesteparten av jordas befolkning bor i nærheten av ekvator. Kun en liten del av befolkningen bor sør for 30 grader sørlig bredde, og enda færre (0.1 %) nord for 61 grader nordlig bredde (hvor jeg bor). En satellitt med lav inklinasjon vil tilbringe mer av tiden i befolkede områder, men vil aldri dekke områder lenger nord. For en høy inklinasjonsvinkel er det motsatt. Men alle satellitter trenger ikke å bruke baner med lik inklinasjon. Starlink lar grupper av satellitter bruke baner med ulik inklinasjon og kan derfor tilby dekning også i polarområdene, men med et mindre antall satellitter og med lavere kapasitet. 

For en gitt flyvehøyde vil det være en maksimal rekkevidde for en link mellom satellittene. Satellittene må være synlige for hverandre, altså over horisonten, men også slik at signalet ikke svekkes på vei gjennom ionosfæren. Synslinjen bør ikke komme nærmere jordoverflaten enn ca. 400 km. Den maksimale avstandene mellom satellittene, målt ved vinkelen φ, blir derfor lett å beregne som en funksjon av flyvehøyden. R betegner jordas radius.

Eksempel: To Iridium-satellitter med en flyvehøyde på 781 km vil ha en maksimal avstand på 37.6°. Avstanden mellom banene i Iridium-systemet er 30°.

Når jordoverflaten blir projisert på et plan, slik som vist nedenfor, blir satellittbanene vist som en “slangeform”. Dette er et fenomen som gjelder alle storsirkler, dvs. sirkler med sentrum i jordas sentrum. Fly, skip og radiobølger vil vise det samme fenomenet. Illustrasjonen nedenfor viser et eksempel på hvordan 150 satellitter kan spre seg ut i mange baner og danne forbindelser både med bakkeutstyr og med hverandre. 

Legg også merke til hvordan satellittene (i dette tilfellet) ikke har forbindelse mellom banene i nærheten av ekvator, men derimot nærmere polområdene. Dette skyldes at avstanden mellom to lengdegrader er større ved ekvator, selv om det ikke fremkommer av den valgte projeksjonen. Meridianene (linjene mellom polene) er vist som parallelle linjer i projeksjonen, men er ikke parallelle i virkeligheten.

Et annet forhold som trenger litt oppmerksomhet, er at satellittene ikke følger jordas rotasjon. Når de har fullført et omløp vil de befinne seg lenger vest fordi jorda har dreiet mot øst i mellomtiden. En enkelt satellitt vil derfor dekke hele jordkloden etter et antall omløp, noe som utnyttes av vær- og overvåkningssatellitter. Disse kan overvåke hele jordoverflaten stykkevis til bestemte tider, men ikke kontinuerlig.

Konstellasjonen på illustrasjonen over viser et antall satellittbaner som beveger seg i samme retning og dekker halve jordas omkrets ved ekvator. De beveger seg “side om side” nordover, over polen og sydover på motsatt side. Alternativet hadde vært at banene gis skiftevis motsatt omløp. Fordelen med den valgte konstellasjon er at satellitter i nabobaner har bedre tid på seg til å kommunisere seg imellom. Når de har lav relativ hastighet vil dessuten kommunikasjonen mellom dem blir mindre forstyrret av såkalt Doppler-effekt. Dette prinsippet benyttes bl.a. av Iridium-systemet.

Når satellittene beveger seg i en slik formasjon vil de alltid ha de samme naboene i øst og vest, noe som vi kan utnytte i situasjoner hvor vi ønsker at de skal samarbeide.

Satellitter i samarbeidsgrupper

Man kan utnytte det forholdet at satellittene flyr i formasjoner til å danne samarbeidsgrupper og la oppgaver løses av disse i fellesskap. I det viste eksemplet over har hver satellitt 6 direkte naboer (N-NV-NØ-S-SV-SØ). Om man nummererer satellittene 1-7 etter et slikt mønster som vist nedenunder, oppnår man at alle satellittene, uansett tildelt nummer, har de andre tallene som direkte naboer.

De satellittene i “ytterkant” som ikke har naboer på begge sider finner dem to hopp unna i motsatt retning via naboen i NØ eller SV.

Satellittnettverk som et Distribuert System

Med den forutsetningen oppfylt at hver satellitt har et stabilt nettverk av naboer rundt seg, kan vi bygge et satellittnettverk hvor grupper på 7 satellitter samarbeider om å løse oppgaver, og hver satellitt er medlem av 7 ulike slike grupper. Om vi deler slike oppgaver inn i 7 roller kan alle vite hvilken nabo man skal overlate en deloppgave til, og denne satellitten vil spille den samme rollen overfor medlemmene i 7 grupper. 

Et annet interessant forhold er at to satellitter med samme rollenummer vil kunne ha glede av å lære fra hverandre, f.eks. utveksle innhold av sine datalagre. Det kan skje når de kan danne en kommunikasjonslink seg imellom. Illustrasjonen over den globale konstellasjonen ovenfor antyder at slike linker kan dannes under to ulike forhold:

  1. Ved polområdene, hvor avstanden mellom nabobanene er liten
  2. I “sømmen” mellom nord- og sørgående satellitter der de passerer hverandre i motsatt retning.

For å utvikle idéen om SIN eller “Cloud Computing in Space” er det nødvendig å betrakte et satellittsystem som et Distribuert System og låne metoder og teknikker fra dette fagfeltet. Et SIN vil ha mange fellestrekk med tradisjonelle mobile og distribuerte systemer, men også noen interessante forskjeller:

  1. Tradisjonelle mobile systemer består av en stasjonær infrastruktur og mobile klientnoder. Her er det omvendt, med stasjonære brukere (sett fra rommet) og en mobil infrastruktur.
  2. Bevegelsesmønsteret er forutsigbart og kjent, og det fremtdige påtrykket fra  klientnoder kan estimeres.
  3. Topologien i infrastrukturen er kjent slik at det ikke er nødvendig med protokoller for å oppdage kommunikasjonslinker (link discovery). Routingprotokoller er da heller ikke nødvendige, alle kan kalkulere ruter basert på det kjente bevegelsesmønsteret.

Utnytte øde områder til vedlikeholdsoppgaver og ruting

Det er vel kjent at jordas befolkning er svært ujevnt fordelt og at flesteparten bor på sterkt befolkede områder. Illustrasjonen av den globale konstellasjonen ovenfor viser nettopp dette ved hjelp av fargekoder for befolkningstettheten. I løpet av et omløp vil en satellitt tilbringe mesteparten av tiden over ørken, hav eller polområder hvor den vil ha svært lite trafikk mot klienter på bakken, avløst av korte perioder med et intenst påtrykk av forespørsler. Og disse periodene er fullt forutsigbare, vi vet når de kommer og satellitten husker fra forrige gang hvor høyt påtrykket var. 

For at satellitten skal ha mest mulig ressurser til å betjene disse trafikktoppene er det fornuftig om den kan gjøre mest mulig av “husholdningsoppgavene” over de øde områdene, som f.eks. å oppdatere sine hurtiglagre (cacher), overføre filer som ikke haster, oppdatere programvare m.m.

Skille mellom haste- og venteoppgaver

For å kunne utbytte dette potensiallet som er nevnt i forrige avsnitt er det nødvendig å identifisere deloppgaver i tjenesten som kan tilhøre én av to kategorier: Hastoppgaver og venteoppgaver. Altså, operasjoner som enten må utføres så raskt som mulig, eller oppgaver som kan utsettes til senere. På engelsk benevnes disse oppgavene som delay sensitive og delay tolerant.

Hasteoppgaver er de som knyttes til interaktive tjenester, altså der hvor det sitter mennesker og venter på svar, og hvor ingen andre oppgaver kan utføres i mellomtiden. I denne kategorien finner vi henting av web-sider, bruk av søkemotorer, dataregistrering av ulik art, utveksling av lynmeldinger, tale- og videokonferanser. Også støttetjenester for disse har hast: Oppslagstjenester for DNS-navn, databaseoperasjoner, videresending av data langs en sti m.m. Dette er oppgaver som ikke kan utsettes til f.eks. satellitten er over ubebodde områder, men må gis prioritet og utføres med de ressursene som foreligger for øyeblikket.

Venteoppgaver er slike som kan vente noen minutter eller timer før de fullføres eller et svar foreligger. Det fremste eksemplet på slike oppgaver er e-post, fordi vi er vant til å fortsette med andre oppgaver i påvente av et svar på en e-post melding. Andre eksempler inkluderer oppdatering av adresselister og andre felles datalagre, sikkerhetskopiering, oppgradering til nyere programvareversjoner, fremstilling av statistikker og raporter m.m.

Til omlegging av skytjenester til å bruke et SIN som plattform inngår det følgelig et designarbeid som må følge litt andre arkitekturprinsipper for å fordele oppgaver og deloppgaver i passende porsjoner som egner seg for den ressursmengden som satellittnettverket disponerer over til enhver tid.

Et SIN kan også velge å sende hasteoppgaver videre til andre mindre belastede satelliter for utføring der dersom den har de nødvendige forutsetninger for dette, og at kommunikasjonsveien dit har ledig kapasitet.

Caching og replikering

For programmer og tjenester som utføres i SIN-skyen vil det være nødvendig å lagre data som tilhører klienten på bakken, f.eks. et dokumentarkiv. Men disse dataene vil være sekundærkopier av klientens data, primærkopien vil trolig befinne seg i et lager på bakken. Grunnen til dette er:

  1. Det vil være behov for sikkerhetskopiering til et mer stabilt lager enn en satellitt
  2. Dataene i satellitten vil måte overføres til neste satellitt i banen i forbindelse med “handover”-operasjoner med noen minutters mellomrom

Av disse grunnene vil det være fornuftig å kun lagre de mest brukte dataene i satellitten, mens øvrig innhold ligger lagret et annet sted. Denne teknikken kalles for caching, og innebærer at vi kopierer deler av et primærlager til et sekundærlager som er raskere og billigere i bruk (gjerne nærmere klienten). 

Hvilket utvalg som skal kopieres til en cache er et interessant problem med svar som varierer med anvendelsen, klienten og tidspunktet. En måte å finne dette utvalget er å benytte seg av såkalt passiv replikering, hvor data som blir etterspurt og hentes fra “hovedlageret” på bakken blir plassert i cachen. Om cachen allerede er full slettes det elementet som ikke har vært i bruk på lengst tid (kalt Least Recently Used) for å gi plass til det nye. Dette er en velkjent teknikk men slik replikering skaper forsinkelse og er en hasteoppgave.

Aktiv replikering, derimot, er en “spekulativ” teknikk hvor man antar hvilket innhold som vil bli etterspurt i fremtiden og kopierer dette til cachen før de blir etterspurt. Aktiv replikering kan utføres som en venteoppgave, og skaper ingen forsinkelse så lenge utvalget i cachen dekker klientens behov.

Avslutning

Et Space Information Network byr på en lang rekke med problemstillinger som må studeres og løses. Jeg har her omtalt noen ganske få. For at denne artikkelen skal bli for lang avslutter vi nå. Videre funn i forskningen på SIN vil publiseres i denne bloggen i separate artikler.