Key-Value Stores - Abteilung Datenbanken Leipzig

Transcription

Key-Value Stores - Abteilung Datenbanken Leipzig
NoSQL-Datenbanken
Kapitel 2: Key-Value Stores
Dr. Anika Groß
Wintersemester 2015/16
Universität Leipzig
http://dbs.uni-leipzig.de
2-1
Inhaltsverzeichnis
• Key-Value Stores
–
–
–
–
Einführung
Amazon Dynamo
Redis
Object Storage Service: Microsoft Azure Storage
2-2
Quelle: http://db-engines.com/en/ranking/
DB Ranking
• Key-Value-Stores
• alle
2-3
Key-Value-Store
• Einfache, sehr flexible Form eines Datenbankmanagementsystems
• Datenstruktur: assoziative Arrays
– dictionary, map, hash, hash map, hash table …
– Kollektion von (ggf. komplexen) Objekten
• Einfache API
– put(key, value)
– get(key)
– remove(key)
• Häufiger Einsatz in verteilter Umgebung
• Beispiele: Amazon DynamoDB, Redis, Memcached,Riak …
2-4
Anwendungen
• z.B. Session-Daten, E-Commerce Warenkörbe
Eigenschaften:
• Große, unstrukturierte Datensätze
– hohe Performanz für große Objektanzahl erforderlich
• Einfaches Datenmodell und einfache Anfragen
– Zugriff + Speicherung via Schlüssel
– Keine Fremdschlüssel, seltene Joins
• Hohe Lese-/Schreibraten
– Einfache Indizierung nach Primärschlüssel
2-5
Keys und Values
• Key: eindeutig innerhalb einer DB bzw. eines Namespace ( =collection of
keys, auch ‘bucket‘)
Sales
Inventory
Product
descriptions
key 1
value
key 1
value
key 1
value
key 2
value
key 2
value
key 2
value
key 3
value
key 3
value
key 3
value
…
…
…
…
…
…
key n
value
key n
value
key n
value
• Values
– Untersch. Länge & Datentypen (String, Integer, BLOB..)
– Keine DB-seitigen Integritätsbedingungen
(applikationsseitig z.B. Wertebereich prüfen)
Quelle: Dan Sullivan: “NoSQL for Mere Mortals“, Pearson Education (Us), 2015
2-6
Key Naming Convention
• Bezug zu relationaler Modellierung
– z.B. Konkatenation Tabellenname, Primärschlüssel, Spaltenname
Kunden
cust 123.address
ID (PK)
name
address
123
…
…
…
[1]
• Composite keys
– Nutzung z.B. für Indexierung
und Aggregationen
Beispiel
Index
[1] Dan Sullivan: “NoSQL for Mere Mortals“, Pearson Education (Us), 2015
[2] Ilya Katsov: NoSQL Data Modeling Techniques. Highly Scalable Blog, 2012
https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniqes/
2-7
[2]
Amazon Dynamo: Übersicht
• Amazon S3 basiert auf Amazon Dynamo
• Verteilter, skalierbarer Key-Value-Speicher
– v.a. für kleine Datensätze (z.B. 1 MB/Key), z.B. Warenkörbe
– (Software/API-gestützte Aufteilung größerer Daten)
• Eigenschaften
– hochverfügbar
– geringe Latenz
• “Eventually consistent data store”
– Schreibzugriffe sollen immer möglich sein
– Reduzierte Konsistenzzusicherungen zugunsten Verfügbarkeit
• Performance SLA (Service Level Agreement)
– “response within 300ms for 99.9% of requests for peak client load of 500 requests
per second”
• P2P-artige Verteilung
– keine Master-Knoten
– alle Knoten haben selbe Funktionalität
2-8
Quelle: [Dynamo]
Konsistentes Hashing
• Abbildung von Werten aus einer üblicherweise sehr großen Quellmenge
auf Hashwert v=h(x) aus einer deutlich kleineren Wertemenge
– Geht in konstanter Zeit
• Einfache Hashfunktion
– Modulo-Funktion: h(x,n):= x mod n
• Ziel:
– Zuordnung zu Speicherort
– Dabei: Anzahl der Neuzuordnungen minimieren (wenn Knoten hinzukommen oder
entfernt werden)
Quelle: Stefan Edlich, Achim Friedland, Jens Hampe,Benjamin Brauer: “NoSQL:
Einstieg in die Welt nichtrelationaler Web 2.0
2-9Datenbanken”, Carl Hanser Verlag, 2010
Amazon Dynamo: Partitionierung
• Knoten bilden logischen Ring
– Position entspricht zufälligem Punkt im Wertebereich einer Hashfunktion
• Zuordnung zwischen Daten und Knoten
– Bestimme Hash-Wert des Keys
– Speicherung auf den – im Uhrzeigersinn –
N Folgeknoten
– Bsp: Hash-Wert zwischen A und B
 bei N=3: Knoten B, C und D
– Einfügen, Löschen, Verschieben von Knoten
performant, da nur Nachbarknoten betroffen
• Präferenzliste
A
G
B
C
F
E
D
– Liste der N Knoten, die zur Datenspeicherung für einen Key zuständig
– wird von jedem Knoten geführt
• Consistent-Hashing
– Geeignete Hash-Funktion für Daten-Lokalität und Lastverteilung
2-10
Hash(key)
Beispiel N=3
Hashwert
Knoten
Replika
5
19
A:[0,10)
G:[60,69]
B:[10,20)
A
38
B
G
F:[50,60)
20
50
B’
B‘:[20,25)
F
C
E
E:[40,50)
C:[20,30)
C:[25,30)
D
69
Einfügen von B‘
Hashwert
5
19
D:[30,40)
20
38
B‘ ist Replikatknoten von A und B
Replikatlöschungen bei C und D
50
69
2-11
Knoten
Replika
Amazon Dynamo: Datenzugriff
• Key-Value-Store-Interface
– Primary-Key-Zugriff; keine komplexen Queries
– Anfrage kann an beliebigen Knoten des Ringes gesendet werden
– Weiterleitung an einen (meist ersten) Knoten der Präferenzliste dieses Keys
• Put (Key, Context, Object)
– Koordinator erstellt “Vector Clock” (Versionierung) auf Basis des Contexts
– Lokales Schreiben des Objektes inkl. Vektor Clock
– Replikation
• Write-Request an N-1 andere Knoten der Präferenzliste
• Erfolg, wenn (mindestens) W-1 Knoten antworten
• asynchrone Aktualisierung der Replikate W<N  Konsistenzprobleme
• Get (Key)
– Read-Request an N Knoten der Präferenzliste
– Rückgabe von Responses von R Knoten  Kann mehrere Versionen eines
Objektes zurückliefern: Liste von (Object, Context)-Paaren
2-12
Amazon Dynamo: Replikation
• Verwendung von Read/Write-Quoren
– R/W = minimale Anzahl der N Replikat-Knoten, die für erfolgreiche Read/Write
Operation übereinstimmen müssen
– Anwendung kann (N,R,W) an Bedürfnisse bzgl. Performanz, Verfügbarkeit und
Dauerhaftigkeit anpassen
• Aktuelle Version wird immer gelesen wenn R + W > N
–
–
–
–
Strong consistency
Kein Informationsverlust
üblich z.B. (3,2,2)
Ggf. nutzergesteuerte Konfliktbehandlung für abweichende Versionen nötig
2-13
Quorum-Varianten
R
• Optimierung der Lesezugriffe: R=1, W=N
– Konsistenz durch „write to all“ = warten bis alle writes bestätigt (ack)
W
R=1, W=N=3
• Optimierung der Schreibzugriffe: R=N, W=1
– Konsistenz durch „read from all“ = letzte Version ist garantiert dabei
R=N=3, W=1
• Weitere R+W>N
Eventual consistency: R+W≤N
• read kann aktuellen write verpassen
R=3, W=3, N=5
R=2, W=2, N=4
R=4, W=2, N=5
2-14
Amazon Dynamo: Versionierung
• Verwenden von “Vector Clocks” um Abhängigkeiten zwischen
verschiedenen Versionen eines Objektes darzustellen
– Versionsnummer/zähler pro Replikat-Knoten
z.B. D ([Sx, 1]) für Objekt D, Speicherknoten Sx, Version 1
– Vector Clock : Liste von (node,counter)-Paaren zur Anzeige welche
Objektversionen bekannt sind
• Beispiel zur Entwicklung von Objektversionen
Sx
Sy
Sz
2-15
Amazon Dynamo: Versionierung (2)
• mit Vector Clocks feststellbar, ob zwei
Objektversionen aufeinander aufbauen
oder nicht
– Counter der 1. Vector Clock ≤ alle Counter
der 2. Vector Clock 1.Version ist Vorfahr,
kann gelöscht werden
– sonst Konflikt
• Leseoperation liefert im Konfliktfall alle
bekannten Versionen inkl. Vector Clocks
– darauf folgendes Update führt verschiedene
Versionen wieder zusammen
• Konfliktlösung
– „last-write-wins“
• Problem lost updates: T1: x = x + 5, T2: x = x + 2
– Oder durch Anwendung
• z.B. Mischen verschiedener Warenkorbversionen
2-16
Beispiel Vector Clocks
• Quellen: Vorlesung Prof. Sebastian Michel „Distributed Data
Management“, SoSe 2015, TU Kaiserslautern
+ http://basho.com/why-vector-clocks-are-easy/
2-17
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-18
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-19
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-20
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-21
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-22
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-23
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-24
+ http://basho.com/why-vector-clocks-are-easy/
Quellen: Vorlesung „Distributed Data Management“, SoSe 2015, S. Michel
2-25
+ http://basho.com/why-vector-clocks-are-easy/
Amazon Dynamo: Ausfallsicherheit
• Temporärer Ausfall von Knoten
• Sloppy Quorum (N, R, W) → Folie 14
– Alle Operationen auf den ersten N verfügbaren (“healthy”) Knoten ausführen
– Damit auch bei Ausfall eines Replikat-Knoten “writable” (z.B. W=N)
• Hinted Handoff
– Wenn ein Knoten bei Replikation nicht verfügbar ist, wird Anfrage an anderen Knoten
weitergereicht (“hinted replica”)
– Background-Job: Wenn Original-Knoten wieder verfügbar, wird Hinted Replica mit
Original-Knoten synchronisiert
– Szenario
• B ist nicht verfügbar
• Kopie an E weitergeben (handoff) mit
Vermerk (hinted), dass eig. zu B gehört
• B wieder verfügbar
– Hinted Kopie E → B
– Erfolgreich release E (löscht hinted Kopie)
2-26
Amazon Dynamo: Synchronisation v. Replikaten
• Hash-Tree (Merkle Tree) für Key-Range
– Blätter sind Hash-Werte der values von keys
– Eltern-Knoten sind Hash-Werte der Kind-Knoten-Werte
• Vorteile
– Effiziente Überprüfung ob zwei
Replikate synchron sind: WurzelKnoten haben gleichen Wert
– Effiziente Identifikation nichtsynchroner Teile: Rekursive
Analyse der Teilbäume
• Nachteile
– Neuberechnung bei
Re-Partitionierung
(z.B. neue Knoten)
H(...)
H(H(H(k1), H(k2)), H(H(k3), H(k4)))
...
H(H(k1), H(k2)) H(H(k3), H(k4))
H(k1)
H(k2)
H(k3)
H(k4)
K1
V1
K2
V2
K3
V3
K4
V4
2-27
...
...
Amazon Dynamo: Techniken (Übersicht)
Problem
Technologie
Vorteil
Partitionierung
Consistent Hashing
Hochverfügbarkeit
Vector Clocks mit
von Schreibzugriffen Konfliktbehandlung
bei Lesezugriffen
Temporärer Ausfall
Sloppy Quorum und
von Knoten
Hinted Handoff
Recovering
Hash Tree
(Merkle Tree)
• Weitere Techniken u.a.
– Gossip-artiges Protokoll für P2P-Organisation (neue Knoten, Ausfallerkennung, ...)
• (hinted handoff nur für temporären Ausfall)
2-28
Dynamo Services / Implementierungen
• Amazon Dynamo DB
– http://aws.amazon.com/de/dynamodb/
– Vollständig verwalteter NoSQLDatenbankservice von AWS
• Key Value und Document Store
– Basiert auf Dynamo (weist aber Unterschiede auf)
• Synchrone Replikation über mehrere Datacenter
• Replikation über 3 Standorte einer AWS Region für Fehlertoleranz
– Schneller Zugriff, geringe Latenzen: ausschließlich SSDs
• Voldemort
– http://www.project-voldemort.com/voldemort/
– Open-Source Implementierung von Amazons Dynamo Key-Value Store
2-29
Redis
•
•
•
•
REmote DIctionary Server
Aktuelle stabile Version: Redis 3.0.5
In C implementierte In-Memory-Datenbank
Key-Value
– Neben Speicherung von Strings auch komplexere Datentypen
wie Listen, Mengen, Hashes
•
•
•
Persistenz: Snapshotting oder Journal
Replikation: Master / Slave
Performanz
–
–
–
–
•
•
Sehr schnell (in-memory), ohne Persistenz
Keine Sperren
Nicht per se distributed! einzelne Redis Instanz: single process, single-threaded
Redis Cluster für data sharding
Oft als Cache (statt als DB) genutzt
Users: GitHub, Flickr, Twitter, Stack Overflow, …
Quelle: [Redis]
2-30
Redis Datenmodell
• Key
– Printable ASCII
• Value
– Strings set mykey myvalue
– Container: Hashes, Lists, Sets, Sorted Sets
user:1
Value: Hash
field
Value: Set
value
user
Alice
mail
al@ice...
user:1:tweets
user:1:followers
Value: List
23 8 19 5 34
7 14 40
hmset myhash f1 v1 f2 v2
sadd myset v1 v2 v3
user:mostfollowed
0
1
Value: Sorted Set
2
3
Hi Alice How Are Today,
…
… you… …
rpush mylist v1 v2 v3
score
@bob
4233689
@eve
@dave
4438430
4908207
@carol
5197422
zadd mysortset score v1
http://blog.redsmin.com/post/85995135615/slides-introduction-to-redis
2-31
field
Persistenz
• In-Memory: Gefahr des Datenverlusts, z.B. bei Serverabsturz
1. RDB persistence
+ i/o Performanz,
schneller Restart
– Persistenz
•
•
•
•
= Snapshotting / “periodic dump” (.rdb files)
Automatisiertes regelmäßiges Abspeichern der gesamten DB auf Disk
Asynchrone Übertragung der Daten aus dem Hauptspeicher auf Disk  semi-persistent
Wann? save points nach X Sekunden oder Y Änderungen
•
Auch für “Disaster Recovery”: z.b. RDB backup auf Amazon S3
2. AOF persistence
•
•
= Protokolldatei/Log-Datei/Journal (“Append Only”)
ACID konforme Konfiguration möglich
–
•
•
3 Settings: no fsync, fsync every second (default), fsync always
+ Persistenz (in
Balance mit
Performance)
– i/o Performanz bei
fsync always,
langsamerer Restart
Bei jedem write wird Änderung an Journal angehängt
 (fast) vollständige Persistenz: Rekonstruktion nach Systemcrash möglich
“Rewrite” des Journals möglich, um “unendliches Wachstum” des Journals zu verhindern
• oder Kombination RDB + AOF (bei Restart wird AOF genutzt, RDBs für backup)
• oder ohne Persistenz (disable RDB+AOF)
2-32
Redis Replikation
• Ziel: Ausfallsicherheit durch Redundanz
– keine Datenverteilung / partitioning (erst mit Redis Cluster!)
• Asynchrone Master-Slave Replikation
– Slaves: exakte Kopien von Master Server
– Slave senden periodisch ‘acknowledgement’, welche Daten verarbeitet wurden
• Gute Skalierbarkeit für reads (nicht für writes)
• Ein Master kann mehrere Slaves haben
• Slave kann Master oder anderer Slave sein
• Daten von jedem Redis Server können auf beliebige Anzahl Slaves
repliziert werden
• Slaves können sich untereinander verbinden (graph-like structure)
2-33
Single-rooted Replication Tree
•
Topologie:
Slave-1
Sl-1a
Sl-1b
Replikationsrichtung
RedisMaster
Sl-1c
Slave-2
Sl-2a
Slave-3
Sl-2b
Sl-2c
Sl-3a
Sl-3b
Sl-3c
Master:
Slave
– Kein Quorum, nur Master akzeptiert writes
– Asynchrone Propagierung von writes (downstream!)
– Read-only Slaves (default)
– Verantwortlich für Schreiben der Replika auf Festplatte
(für Datenredundanz)
– Bei Sync
• Alle Knoten sind Master ihrer eigenen Slaves
• Warum Tree? einzelner Master kann nicht „schnell
genug“ auf alle Slaves schreiben
• Anfragen werden mit alter Version beantwortet
(alternative config: Slave gibt error an Client zurück)
• Kurze Sperre, wenn alter Datensatz gelöscht & neuer
geladen wird
– Keine Sperren auf Master bei Sync der Slaves
• Kann immer Anfragen beantworten
• Seit Redis 2.8 mögliches Setting:
writes nur erlauben, wenn Master mind. N Slaves hat,
die innerhalb maxTime antworten
2-34
Redis Replikation (2)
•
Verringerte Schreiblast Master: Slave kann das Schreiben auf Festplatte übernehmen
– Auto Restart am Master vermeiden, falls “persistence off”, sonst Restart des Masters mit
leerer DB + Replikation der leeren DB an Slaves → überschreibt backup)
•
Hinzufügen eines Slave
–
–
–
–
•
Sendet SYNC command
Master startet background saving und puffert alle neuen Schreiboperationen/Änderungen
background saving vollständig: Master sendet Datei an Slave
Slave speichert diese auf Disk + lädt sie in den Hauptspeicher
+ empfängt gepufferte Änderungen
Netzwerkausfall/unterbrechung
– Automatische Neuverbindung der Slaves zum Master
– Bei konkurrierenden Anfragen → ein background saving → an alle Slaves
– Auch partielle statt vollständiger Resynchronisation
• Dafür in-Memory Backlog des Replikation-Stream auf Master (agree über replication offset zw.
Master und allen Slaves)
•
„Diskless“ Replikation: keine Zwischenspeicherung auf Festplatte, Master sendet RDB
direkt an Slaves
2-35
Redis Transaktionen
•
•
•
Gruppierung von mehreren Operationen in einer Transaktion möglich
Reduktion der Anzahl der “Network Roundtrips”, auf die Client warten muss
Dabei wird garantiert:
– Isolation: alle Operationen einer Transaktion werden serialisiert und
sequentiell ausgeführt
– Atomarität: alle oder keine der Operationen einer TA werden ausgeführt
• MULTI: Start einer Transaktion, alle folgenden Operationen in eine Queue
• EXEC: führt alle Operationen der Queue in einer TA aus
– Bei AOF wird sichergestellt, dass Redis TA als ein write verarbeitet
– Bei System Crash: möglich dass nur Teil der Änderungen geschrieben wird
• Mit Redis-Check-AOF Tool → Entfernen der partiellen TA möglich
•
Verhindern von Lost Updates durch Optimistic Locking mit WATCH mykey
– Überwachen von Änderungen bzgl. key
– In Bsp.: anderer Client versucht val zwischen WATCH und EXEC
zu ändern → TA schlägt fehl
– Dann wird TA wiederholt (i.d. Hoffnung, dass es nicht wieder fehlschlägt)
2-36
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
Redis Cluster
• Ermöglicht Data Sharding
– Verteilung des Datensatzes über mehrere Knoten
– Alle Befehle der nicht-verteilten Version von Redis werden unterstützt
• Ziele:
1) Hohe Performanz + Skalierbarkeit bis zu 1000 Knoten
2) Akzeptable Konsistenz („small windows where
acknowledged writes can be lost“ [2])
3) Availability bei Netzwerkpartitionierung
• Cluster verfügbar, solange Mehrheit
der Master erreichbar + weitere Bedingungen
• Jeder Knoten hat 2 offene TCP Verbindungen
– Kommunikation mit Clients: z.B. 6379
– Node-to-Node Kommunikation:
Cluster Bus Port = „high port“ (+10000)  16379
Quellen: [1] http://redis.io/topics/cluster-tutorial, [2] http://redis.io/topics/cluster-spec,
Bild: http://redis.io/presentation/Redis_Cluster.pdf
2-37
Kommunikation zwischen Knoten
• Clients können alle Knoten anfragen und werden ggf. an anderen Knoten
umgeleitet (Clients können aber Map zwischen Keys und Knoten cachen)
• Gossip-Protokoll für Austausch von Informationen zwischen Cluster nodes
– Erkennen neuer Knoten; Sicherstellen, ob Knoten erreichbar
Quelle: http://redis.io/presentation/Redis_Cluster.pdf
2-38
Redis Cluster - Sharding
•
Sharding: jeder key ist Teil eines Hash Slot
– Kein konsistentes Hashing
•
•
Es gibt 16384 Hash Slots in Redis Cluster
Hash Slot Zuordnung eines keys
– Berechnung: CRC16 key modulo 16384
•
•
Jeder Knoten in Cluster ist für Teilmenge der Hash Slots verantwortlich
Bsp. 3 Knoten
–
–
–
–
•
Node A Hash Slots 0 - 5500
Node B Hash Slots 5501 - 11000
Node C Hash Slots 11001 – 16384
Hinzufügen neuer Knoten D: Teil der Hashslots von A, B, C muss verschoben werden
(System kann dabei weiterlaufen)
Mit Hash Tags kann erzwungen werden, dass keys im gleichen Slot landen
– Verwende {} in key → nur innerer Teil wird gehasht
– this{foo}key und another{foo}key landen im gleichen Hash Slot
2-39
Sharding und Redundanz
• Alle Knoten stehen in Verbindung und sind funktionell äquivalent
• Zwei Arten: Masters und Slaves (=exakte Kopien von Master Server)
Bild: http://redis.io/presentation/Redis_Cluster.pdf
2-40
Redis Cluster - Availability
• Verfügbarkeit nur für “majority partition“
– Mehrheit der Master muss erreichbar sein
– und mind. ein Slave pro nicht erreichbarem Master
– Cluster wieder verfügbar nach „node timeout“ + Zeit für Wahl eines Slaves zum
neuen Master (1-2 Sek.)
• Ausfälle einzelner Knoten können gehandelt werden, jedoch keine
größeren Netzwerkausfälle
• Szenario: N Master Knoten mit je 1 Slave
– Verfügbarkeit majority partition, wenn max. 1 Knoten wegfällt (2 ∙ 𝑁 − 1 Knoten)
– Ausfallwahrscheinlichkeit für Master ohne Replika:
1
2∙𝑁−1
1
– Bsp. 5 Master, je 1 Slave:
⇒ 11.11% Wahrscheinlichkeit, dass bei Ausfall
5∗2−1
eines weiteren Knoten Netzwerk nicht mehr verfügbar
•
Replica Migration Feature: Master ohne Replika → Migration von Replika auf diese
„orphaned master“ (bessere Verfügbarkeit in „Realworld Szenarien“)
2-41
Redis Cluster - Consistency
• Asynchrone Replikation, „last failover wins“ (kein merge von Änderungen)
– Letzter Master-Datensatz kann ggf. alle Replikas überschreiben
• Keine Strong Consistency
• Unter bestimmten Bedingungen können writes verloren gehen!!
1.) Aufgrund asynchroner Replikation
– Client schreibt an Master B; Master B antwortet OK (=ack)
– Master B propagiert Änderung an Slaves B1, B2, B3 (wartet nicht auf ack!)
– Problem: Crash von B bevor write bei Slave, der als neuer Master gewählt wird
→ write verloren
2.) Aufgrund Netzwerkpartitionierung
– Ein Client wird in „minor partition“ mit ≥1 Master isoliert
– Bsp: 3 Master A, B, C, 3 Slaves A1, B1, C1 + Client Z1
A
A1
• Falls Partitioning lange andauert, wird B1 zum neuen Master
in “major partition” gewählt → writes von Z1 an B in minor partition verloren
• B muss in „node timeout“, damit Z1 keine writes mehr an B schickt
C
B1
C1
B
Z1
• Synchrone Writes können mit WAIT Befehl erzwungen werden (aber sehr
negativer Einfluss auf Performanz)
2-42
Inhaltsverzeichnis
• Key-Value Stores
–
–
–
–
Einführung
Amazon Dynamo
Redis
Object Storage Service: Microsoft Azure Storage
2-43
Object Storage Services
• Dienste zum Speichern von Objekten (Binärdaten) in der Cloud
– Upload + Speicherung auf mehreren Knoten
• Einfache Strukturierung
– Buckets: einfache (flache) Container
– Objekte: beliebige Daten (z.B. Datei), beliebige Größe
– Authentifizierung, Zugriffsrechte
• Einfache API
– HTTP-Requests (REST-ful API): PUT, GET, DELETE
– Einfache Nutzung durch Anwendungen, z.B. DropBox (Online Backup & Sync Tool)
• Performanz
– Schnell, skalierbar, hochverfügbar
• Kosten
– “Pay as you go”: #Request , Datenmenge, Upload- und Download-Menge
• Beispiele: Microsoft Azure Storage, Amazon S3, Google Cloud Storage
2-44
Probleme
• Mehrere Nutzer können auf die gleichen Daten zugreifen
– YouTube-Videos, kollaborative Arbeit an Dokumenten, ...
• Problem 1: Konkurrierende Schreibzugriffe
– Conditional Updates: “IF AktuelleVersion=X THEN Update”
– Knoten-basierte Versionierung
• Kopien von Daten werden auf verschiedenen Knoten gespeichert
– Zuverlässigkeit
• Redundanz zum Schutz gegen Knoten-Ausfall
– Lese-Geschwindigkeit
• Mehrere Clients können verschiedene Kopien parallel lesen
• Ausnutzung von Lokalität
• Problem 2: Synchronisation der Replikate
– Strong Consistency: Nach Write lesen alle Clients sofort die aktuellen Daten
– Eventual Consistency: Nach Write lesen alle Clients letztendlich die aktuellen Daten
– Read-your-writes Consistency: EC + schreibender Client liest sofort aktuelle Daten
2-45
Azure Storage
• Ziele
– Hohe Verfügbarkeit mit strenger Konsistenz
• Datenzugang bei Ausfällen und Netzwerkpartitionierung
– Durability
• Replikation innerhalb und über mehrere Datacenter
• Geographische Replikation für Disaster Recovery
– Skalierbarkeit
• > Exabyte Bereich
• Automatische Lastbalancierung für hohe Zugriffsraten auf Daten (Peaks)
• Globaler, partitionierter Namespace:
http(s)://AccountName.<service>.core.windows.net/PartitionName/ObjectName
• Storage für Container (Blobs), Table (Entities), …
Quelle: [Azure]
2-46
Windows Azure Storage Stamps
Location
Service
Data
access
-
Mehrere Locations in den 3
geographischen Regionen
(Nordamerika, Europa, Asien)
Jede Location umfasst
mehrere Storage Stamps
VIP
VIP
Front-Ends
Front-Ends
Partition Layer
Partition Layer
Stream Layer
Inter-stamp
(Geo) replication
Stream Layer
Intra-stamp replication
Intra-stamp replication
Storage Stamp
Storage Stamp
Synchrone Replikation
Asynchrone
Replikation
Quelle: http://www.sigops.org/sosp/sosp11/current/2011-Cascais/11-calder.pptx
2-47
Architektur
Incoming Write Request
Ack
Front End
Layer
FE
FE
FE
FE
FE
Partition
Master
Lock
Service
Partition
Layer
Partition
Server
Stream
Layer
(Distributed
File System)
M
Partition
Server
Partition
Server
M
Paxos
M
Extent Nodes (EN)
Quelle: http://www.sigops.org/sosp/sosp11/current/2011-Cascais/11-calder.pptx
2-48
Partition Layer – Index Range Partitioning
•
•
•
•
•
Split index into
RangePartitions
based on load
Split at PartitionKey
boundaries
PartitionMap
tracks Index
RangePartition
assignment to
partition servers
Front-End caches
the PartitionMap to
route user requests
Each part of the
index is assigned to
only one Partition
Server at a time
Blob Index
Account
Account
Name
Name
Container
Container
Name
Name
Blob
Blob
Name
Name
aaaa
aaaa
aaaa
aaaa
aaaaa
aaaaa
……..
………
……..
………
……..
………
……..
………
……..
………
……..
………
……..
……..
Account
Container
harry
pictures
Name
Name
……..
……..
Front-End
harry
pictures
…….. Server
……..
………
………
……..
……..
A-H:
PS1
………
………
……..
……..
PS2
Account H’-R:
Container
richard
videos
Name R’-Z:
Name
PS3
……..
……..
richard
videos
……..
……..
Partition
………
………
…….. Map……..
……..
Blob
sunrise
Name
……..
sunset
……..
………
……..
………
……..
Blob
soccer
Name
……..
tennis
……..
………
……..
………
……..
………
……..
………
……..
zzzz
zzzz
zzzz
zzzz
zzzzz
zzzzz
Storage Stamp
Partition
Server
A-H
Partition
Map
PS 1
Partition
Server
H’-R
PS 2
Quelle: http://www.sigops.org/sosp/sosp11/current/2011-Cascais/11-calder.pptx
2-49
A-H: PS1
Partition
H’-R: PS2
Master
R’-Z: PS3
Partition
Server
R’-Z
PS 3
Azure Storage: Request Lifecycle
• Beispiel: PUT <account>.blob.core.windows.net
• DNS-Auflösung
– Ermittle IP-Adresse eines Front-End-Server der Geo-Location des Accounts
• Front-End-Server
– Authentifizierung, Autorisierung
– Partition Map: Object-Name  Partition Server
• Partition Server
– GET: Falls Daten nicht im Memory-Cache  Request an einen DFS-Server
– PUT: Request an primary DFS-Server
• DFS Server: Replikation
– Primary DFS Server + Replikation bei 2 Secondary Servern
 Strong Consistency
2-51
Azure Storage: Ausfall-Behandlung
• Front-End-Server
– Entfernen von DNS-Liste
• Partition Server
– Partitionen werden von anderem Server verwaltet
– Anpassung der Partition Map des „zu Hilfe eilenden“ Front End Server
– Keine Verschiebung der Daten (nur Metadaten-Anpassung)
• DFS Server
– Nutzung eines neuen DFS Servers
– Erstellung eines neuen Replikats
2-52
Azure Storage: Conditional Updates
• Update-Request enthält Versionsnummer (ETag) der aus “Client-Sicht”
aktuellen Version
– Erfolg, wenn Client-Versionsnummer = Knoten-Versionsnummer; sonst Fehler
– bei Neuerstellung “Version=0”
• Verhindert unbeabsichtigtes Überschreiben
– Konsistenzwahrung wird auf Anwendung übertragen
• Beispiel
GET
V7
Zeit
GET
V7
UPD V7
OK V8
UPD V7
ERROR
2-53
Azure Storage: Content Delivery Network
• Erweiterung um ein CDN sinnvoll für
– Daten mit hohen Lesezugriffen (in einem bestimmten Zeitraum)
– Daten mit geografisch stark verteilten Zugriffen
• Einführung von Edge locations
– “Server nahe am Client/Nutzer”  performanter Zugriff
– Fungieren als Proxy-Server für Zugriffe auf Azure Storage
• Request Lifecycle
–
–
–
–
–
Client fragt CDN-URL für Objekt an
DNS routet an nächstgelegene Edge Location
Wenn Datei im Cache  Response
Andernfalls Request an Azure Storage; Speicherung im Cache; Response
Time-to-Live für Cache-Objekt
• Keine Strong-Consistency mehr
– Updates werden wegen Cache verzögert repliziert
2-54
Azure Storage - Services
LOKAL
ZONENREDUNDANTER REDUNDANTER
SPEICHER (LRS) SPEICHER (ZRS)
Funktion
Kopien gesamt
Empfohlene
Verwendung
GEOGRAFISCH
REDUNDANTER
SPEICHER MIT LESEZUGRIFF (RA-GRS)
Mehrere synchrone Drei Kopien der Daten
Wie LRS, plus mehrere Wie GRS, plus
Kopien der Daten über mehrere Datencenter asynchrone Kopien in Lesezugriff auf das
innerhalb eines
innerhalb von Regionen einem zweiten,
sekundäre Datencenter
Datencenters
oder regionsübergreifend Hunderte Kilometer
(nur für Blockblobs)
entfernten Datencenter
3
3
6
Wirtschaftliche,
Wirtschaftlich, robustere
lokale Speicherung Option für Blockblobvon Daten
speicher
Verfügbarkeits- 99,9 % Lese-/
SLA
Schreibzugriff
Standardspeicher €0,0203 pro GB
Erstes TB/Monat
GEOGRAFISCH
REDUNDANTER
SPEICHER (GRS)
Zum Schutz bei
größeren
Datencenterausfällen
oder Notfällen
6
99,9 % Lese-/
Schreibzugriff
99,9 % Lese-/
Schreibzugriff
Bietet Lesezugriff auf
Daten während Ausfall
 maximale Datenverfügbarkeit und
Robustheit
99,9 % Schreibzugriff
99,99 % Lesezugriff
€0,0253 pro GB
€0,0405 pro GB
€0,0515 pro GB
https://azure.microsoft.com/de-de/pricing/details/storage/
2-55
Azure Redis Cache + Azure Storage
• Azure Redis Cache: Redis Cache hosted and managed by Microsoft
• Suche auf Primärindex sehr schnell
• Für andere Anfragen  secondary index im Cache
Redis Cache
Azure Table Storage
Alice:001:234
001:234:Alice:1st road …
Bob:002:765
…
Ted:001:923
001:923:Ted:3rd avenue …
…
002:765:Bob:2nd street …
Alice
001:234
001:234
Azure Web Site
2-56
https://azure.microsoft.com/de-de/documentation/videos/azure-redis-cache-102-application-patterns/
Vergleich
Amazon Dynamo
Redis (Cluster)
Azure Storage
Hash-Funktion
Hash-Funktion
Objekt-Name
Dynam. erweiterbar +
+
+
Routing
P2P
Hierarchisch
Hierarchisch
Replikation
Asynchron
Asynchron
Synchron
Konsistenz
Eventual Consistency
Partitionierung
Strong Consistency
Behandlung
konkurrierender
Writes
Performanz
(Fokus)
2-57
Literatur
• [Dynamo]: DeCandia et al.: „Dynamo: Amazon’s Highly Available Keyvalue Store“, SOSP’07
• [Redis]: http://redis.io/documentation
• [Azure]: Calder et al.: “Windows Azure Storage: A Highly Available Cloud
Storage Service with Strong Consistency”, SOSP’11
2-58