webinar dynamodb deutsch
TRANSCRIPT
1. Erste Schritte
2. Datenmodellierung
3. Partitionierung
4. Reporting & Analytics
Überblick
Erste Schritte
1
Comput
eStorage
AWS Global Infrastructure
Databas
e
App Services
Deployment & Administration
Networking
RegionEine unabhängige Menge von AWS Ressourcen in einem
definierten geografischen Gebiet
Eine solide Basis, um ortsabhängigen Privacy- und
Compliance-Anforderungen zu genügen
Availability ZoneEntworfen als unabhängige Verfügbarkeitszone
Physisch getrennt innerhalb eines geografischen
Gebiets
Edge LocationFür die Auslieferung von Inhalten mit geringer Latenz
Globales Netzwerk von Edge Locations
Bietet globale DNS Infrastruktur (Route53) und CloudFront
Content Delivery Network
Globale Infrastruktur
Compute Storage
AWS Global Infrastructure
Database
App Services
Deployment & Administration
Networking
Relational Database Service (RDS)Database-as-a-Service
Datenbank-Instanzen ohne Installation und Administration
Skalierbare und fehlertolerante Konfigurationen
DynamoDBNoSQL Datenbank mit provisioniertem Durchsatz
Hohe, vorhersagbare Performance
Vollständig verteilte, fehlertolerante Architektur
Datenbank
RedshiftData Warehouse Dienst bis in den Petabyte-Bereich
Kostengünstig, vollständig verwaltet
Einfache Anbindung an BI Lösungen
SimpleDB
DynamoDB ist ein verwalteter
NoSQL Datenbankdienst
Speichern und Lesen von beliebigen Datenmengen
Beliebige Anzahl Abfragen
Ohne die administrative Last
Konsistente, vorhersagbare
Performance.
Latenz im einstelligen Millisekundenbereich
Auf SSDs gespeichert
Flexibles Datenmodell
Key/Attribut Paare. Kein Schema erforderlich
Leicht zu erstellen. Leicht anzupassen
Umfassende Skalierbarkeit
Keine Größenbeschränkung für Tabellen.
Unbegrenzter Speicherplatz
Keine Downtime.
Dauerhaft
Konsistentes Schreiben direkt auf Festplatte
Replikation in mehrere Data Center und Availability Zones
Sie können sich auf
Ihre Anwendung konzentrieren
Zwei Entscheidungen + drei Klicks
= bereit zur Verwendung
Zwei Entscheidungen + drei Klicks
= bereit zur Verwendung
Primärschlüssel
Provisionierter Durchsatz
Zwei Entscheidungen + drei Klicks
= bereit zur Verwendung
Primärschlüssel
Provisionierter Durchsatz
Provisionierter Durchsatz
Reservierte IOPS für Lesen und Schreiben
Jederzeit nach oben und unten skalierbar
Bezahlt nach Capacity Unit.
Preise pro Stunde provisionierter Durchsatz
Berechnet in Capacity Units
(bis zu 4kB Lesen oder 1kB Schreiben)
Schreib-Durchsatz
Größe der Elemente x Schreibvorgänge pro Sekunde
US $ 0,0065 für 10 Write Units (US-East-1)
Konsistentes Schreiben
Atomare Inkrement und Dekrement Operationen
Optimistische Parallelität: Bedingte Schreiboperationen
Transaktionen
Nur Transaktionen auf Elementebene
Puts, Updates und Deletes sind ACID.
Transaktionen über mehrere Schritte in Java Bibliothek
Lese-Durchsatz
Strong oder Eventual Consistency
Lese-Durchsatz
Strong oder Eventual Consistency
Größe der Elemente x Lesevorgänge pro Sekunde
US$ 0,0065 pro Stunde für 50 Units (US-EAST-1)
Lese-Durchsatz
Strong oder Eventual Consistency
Größe der Elemente x Lesevorgänge pro Sekunde
US$ 0,0065 pro Stunde für 100 Units (US-EAST-1)
2
Lese-Durchsatz
Strong oder Eventual Consistency
Dieselbe Latenz
Verwendung nach Bedarf zur Lese-Zeit
Der provisionierte Durchsatz wird von
DynamoDB verwaltet
Daten werden von DynamoDB
partitioniert und verwaltet
Reservierte Kapazität
Einsparung bis 53% bei 1 Jahr Reservierung
Einsparung bis 76% bei 3 Jahren Reservierung
Indizierter Speicherplatz
US$ 0,25 pro GB pro Monat (US-EAST-1)
Datentransfer out wie üblich:
aws.amazon.com/dynamodb/pricing
Authentifizierung.
Auf Session-Basis zur Minimierung der Latenz.
Verwendet den Amazon Security Token Service.
Durch AWS SDKs behandelt.
Integration mit IAM.
Element/Attribut-Berechtigungen möglich.
Monitoring.
CloudWatch Metriken:
Latenz, Verwendeter Lese- und Schreibdurchsatz,
Fehler, Drosselung,...
Bibliotheken, Wrapper, APIs
ColdFusion, Django, Erlang, Java, .Net,
Node.js, Perl, PHP, Python, Ruby...
http://j.mp/dynamodb-libs
DEMO
Datenmodellierung
2
id = 100date = 2012-05-16-
09-00-10 total = 25.00
id = 101date = 2012-05-15-
15-00-11 total = 35.00
id = 101date = 2012-05-16-
12-00-10 total = 100.00
date = 2012-03-20-
id = 100date = 2012-05-16-
09-00-10 total = 25.00
id = 101date = 2012-05-15-
15-00-11 total = 35.00
id = 101date = 2012-05-16-
12-00-10 total = 100.00
date = 2012-03-20-
Tabelle
id = 100date = 2012-05-16-
09-00-10 total = 25.00
id = 101date = 2012-05-15-
15-00-11 total = 35.00
id = 101date = 2012-05-16-
12-00-10 total = 100.00
date = 2012-03-20-
Element (Item)
id = 100date = 2012-05-16-
09-00-10 total = 25.00
id = 101date = 2012-05-15-
15-00-11 total = 35.00
id = 101date = 2012-05-16-
12-00-10 total = 100.00
date = 2012-03-20-
Attribut
Wo ist das Schema?
Tabellen benötigen kein formales Schema
Elemente sind Hashes beliebiger Größe
Sekundäre Indizes legen teilweise Schema fest
Indexe
Elemente werden über primäre und sekundäre Schlüssel indiziert
Primäre Schlüssel können zusammengesetzt werden
Sekundäre Schlüssel sind lokal oder global
ID Date Total
id = 100 date = 2012-05-16-09-00-10 total = 25.00
id = 101 date = 2012-05-15-15-00-11 total = 35.00
id = 101 date = 2012-05-16-12-00-10 total = 100.00
id = 102 date = 2012-03-20-18-23-10 total = 20.00
id = 102 date = 2012-03-20-18-23-10 total = 120.00
ID Date Total
id = 100 date = 2012-05-16-09-00-10 total = 25.00
id = 101 date = 2012-05-15-15-00-11 total = 35.00
id = 101 date = 2012-05-16-12-00-10 total = 100.00
id = 102 date = 2012-03-20-18-23-10 total = 20.00
id = 102 date = 2012-03-20-18-23-10 total = 120.00
Hash key
ID Date Total
id = 100 date = 2012-05-16-09-00-10 total = 25.00
id = 101 date = 2012-05-15-15-00-11 total = 35.00
id = 101 date = 2012-05-16-12-00-10 total = 100.00
id = 102 date = 2012-03-20-18-23-10 total = 20.00
id = 102 date = 2012-03-20-18-23-10 total = 120.00
Hash key Range key
Zusammengesetzter Primärschlüssel
ID Date Total
id = 100 date = 2012-05-16-09-00-10 total = 25.00
id = 101 date = 2012-05-15-15-00-11 total = 35.00
id = 101 date = 2012-05-16-12-00-10 total = 100.00
id = 102 date = 2012-03-20-18-23-10 total = 20.00
id = 102 date = 2012-03-20-18-23-10 total = 120.00
Hash key Range key Sekundärer range key
ID Date Total
id = 100 date = 2012-05-16-09-00-10 total = 25.00
id = 101 date = 2012-05-15-15-00-11 total = 35.00
id = 101 date = 2012-05-16-12-00-10 total = 100.00
id = 102 date = 2012-03-20-18-23-10 total = 20.00
id = 102 date = 2012-03-20-18-23-10 total = 120.00
Sekundärer Hash key Sekundärer Range Key
Neu
Programmierung von DynamoDB.
Kleines aber wohlgeformtes API
CreateTable
UpdateTable
DeleteTable
DescribeTable
ListTables
Query
Scan
PutItem
GetItem
UpdateItem
DeleteItem
BatchGetItem
BatchWriteItem
CreateTable
UpdateTable
DeleteTable
DescribeTable
ListTables
Query
Scan
PutItem
GetItem
UpdateItem
DeleteItem
BatchGetItem
BatchWriteItem
CreateTable
UpdateTable
DeleteTable
DescribeTable
ListTables
Query
Scan
PutItem
GetItem
UpdateItem
DeleteItem
BatchGetItem
BatchWriteItem
dynamoDB = new AmazonDynamoDBClient(new ClasspathPropertiesFileCredentialsProvider());
dynamoDB.setEndpoint("https://dynamodb.eu-west-1.amazonaws.com");
CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName)
.withKeySchema(new KeySchema(new KeySchemaElement().withAttributeName("name").withAttributeType("S")))
.withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(10L).withWriteCapacityUnits(10L));
TableDescription createdTableDescription = dynamoDB.createTable(createTableRequest).getTableDescription();
//Wait for table to become available
DescribeTableRequest describeTableRequest = new DescribeTableRequest().withTableName(tableName);
TableDescription tableDescription = dynamoDB.describeTable(describeTableRequest).getTable();
Map<String, AttributeValue> item = newItem("Bill & Ted's Excellent Adventure", 1989, "****", "James", "Sara");
PutItemRequest putItemRequest = new PutItemRequest(tableName, item);
PutItemResult putItemResult = dynamoDB.putItem(putItemRequest);
HashMap<String, Condition> scanFilter = new HashMap<String, Condition>();
Condition condition = new Condition()
.withComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(new AttributeValue().withN("1985"));
scanFilter.put("year", condition);
ScanRequest scanRequest = new ScanRequest(tableName).withScanFilter(scanFilter);
ScanResult scanResult = dynamoDB.scan(scanRequest);
Bedingte Updates.
PutItem, UpdateItem, DeleteItem
können optionale Bedingung enthalten.
UpdateItem ermöglicht atomare Inkrements/Dekrements
Ein API Aufruf, mehrere Elemente
BatchGet gibt mehrere Elemente nach Schlüssel zurück
Durchsatz wird nach IOs berechnet, nicht nach API Aufrufen
BatchWrite führt bis zu 25 Put oder Delete Operationen aus
CreateTable
UpdateTable
DeleteTable
DescribeTable
ListTables
Query
Scan
PutItem
GetItem
UpdateItem
DeleteItem
BatchGetItem
BatchWriteItem
Query kontra Scan
Query für Composite Key Abfragen
Scan für Full Table Scans, Exports.
Beide unterstützen Seiten und Begrenzungen.
Maximale Antwortgröße ist 1 MB
Abfragemuster
Alle Elemente nach Hash Key.
Range key Bedingungen:
==, <, >, >=, <=, begins with, between.
Count, Top und Bottom n Werte
Seitenweise Ergebnisse
Beziehungen modellieren
BEISPIEL 1:
Spieler
user_id =
mza
location =
Cambridge
joined =
2011-07-04
user_id =
jeffbarr
location =
Seattle
joined =
2012-01-20
user_id =
werner
location =
Worldwide
joined =
2011-05-15
Spieler
user_id =
mza
location =
Cambridge
joined =
2011-07-04
user_id =
jeffbarr
location =
Seattle
joined =
2012-01-20
user_id =
werner
location =
Worldwide
joined =
2011-05-15
Ergebnisseuser_id =
mza
game =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
werner
location =
bejewelled
score =
55,000
Spieler
user_id =
mza
location =
Cambridge
joined =
2011-07-04
user_id =
jeffbarr
location =
Seattle
joined =
2012-01-20
user_id =
werner
location =
Worldwide
joined =
2011-05-15
Ergebnisse Bestenliste
user_id =
mza
game =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
werner
location =
bejewelled
score =
55,000
game =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
mza
game =
tetris
score =
9,000,000
user_id =
jeffbarr
Spieler
user_id =
mza
location =
Cambridge
joined =
2011-07-04
user_id =
jeffbarr
location =
Seattle
joined =
2012-01-20
user_id =
werner
location =
Worldwide
joined =
2011-05-15
user_id =
mza
game =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
werner
location =
bejewelled
score =
55,000
Ergebnissegame =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
mza
game =
tetris
score =
9,000,000
user_id =
jeffbarr
Bestenliste
Abfrage: Ergebnisse
nach Spielern
Spieler
user_id =
mza
location =
Cambridge
joined =
2011-07-04
user_id =
jeffbarr
location =
Seattle
joined =
2012-01-20
user_id =
werner
location =
Worldwide
joined =
2011-05-15
Ergebnisse Bestenliste
user_id =
mza
game =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
werner
location =
bejewelled
score =
55,000
game =
angry-birds
score =
11,000
user_id =
mza
game =
tetris
score =
1,223,000
user_id =
mza
game =
tetris
score =
9,000,000
user_id =
jeffbarr
Bestenliste pro Spiel
Alternativ: Globaler sekundärer Index
mit projizierten Attributen
Speicherung von großen Elementen
BEISPIEL 2:
Unbegrenzter Speicherplatz
Unbegrenzte Attribute pro Element
Unbegrenzte Elemente pro Tabelle
Maximal 64k pro Element
message_id = 1 part = 1message =
<first 64k>
message_id = 1 part = 2message =
<second 64k>
message_id = 1 part = 3joined =
<third 64k>
Aufteilen auf mehrere Elemente
message_id = 1message =
http://s3.amazonaws.com...
message_id = 2message =
http://s3.amazonaws.com...
message_id = 3message =
http://s3.amazonaws.com...
Speichern eines Pointers in S3
Zeitreihen-Daten
EXAMPLE 3:
event_id =
1000
timestamp =
2013-04-16-09-59-01
key =
value
event_id =
1001
timestamp =
2013-04-16-09-59-02
key =
value
event_id =
1002
timestamp =
2013-04-16-09-59-02
key =
value
Heiße und kalte TabellenApril
März
event_id =
1000
timestamp =
2013-03-01-09-59-01
key =
value
event_id =
1001
timestamp =
2013-03-01-09-59-02
key =
value
event_id =
1002
timestamp =
2013-03-01-09-59-02
key =
value
AprilMärzFebruarJanuarDezember
Daten-Archivierung
Alte Daten nach S3: niedrigere Kosten
Verfügbar für Analysen
Abfragen über heiße und kalte Daten
mit Elastic MapReduce.
Partitionierung
3
Einheitliche Workload.
Daten in mehreren Partitionen
Daten hauptsächlich über Primärschlüssel verteilt
Provisionierter Durchsatz gleichmäßig über Partitionen verteilt
Um den vollen provisionierten Durchsatz zu
nutzen muss die Workload gleichmäßig auf die
Hash Keys verteilt sein
Ungleichmäßig verteilte Workloads
Können auch bei hohem provisionierten Durchsatz
gedrosselt werden
Unterschiedliche Werte für Hash Keys
BEST PRACTICE 1:
Hash Keys sollten eine große Zahl
unterschiedlicher Werte haben
user_id =
mza
first_name =
Matt
last_name =
Wood
user_id =
jeffbarr
first_name =
Jeff
last_name =
Barr
user_id =
werner
first_name =
Werner
last_name =
Vogels
user_id =
simone
first_name =
Simone
last_name =
Brunozzi
... ... ...
Viele Benutzer mit eindeutiger user_id.
Workload gut verteilt über Hash Keys
Vermeide begrenzte Hash Key Werte
BEST PRACTICE 2:
Hash Keys sollten eine große Zahl
unterschiedlicher Werte haben
status =
200
date =
2012-04-01-00-00-01
status =
404
date =
2012-04-01-00-00-01
status
404
date =
2012-04-01-00-00-01
status =
404
date =
2012-04-01-00-00-01
Geringe Anzahl Status Codes
Ungleichmäßig verteilte Schlüsselwerte
Modell für gleichmäßige Verteilung
BEST PRACTICE 3:
Zugriff nach Hash Key Wert sollte gleichmäßig verteilt sein
mobile_id =
100
access_date =
2012-04-01-00-00-01
mobile_id =
100
access_date =
2012-04-01-00-00-02
mobile_id =
100
access_date =
2012-04-01-00-00-03
mobile_id =
100
access_date =
2012-04-01-00-00-04
... ...
Große Anzahl Geräte.
Wenige Geräte sind sehr populär, viele sind es nicht
Ungleichmäßig verteilte Workload
mobile_id =
100.1
access_date =
2012-04-01-00-00-01
mobile_id =
100.2
access_date =
2012-04-01-00-00-02
mobile_id =
100.3
access_date =
2012-04-01-00-00-03
mobile_id =
100.4
access_date =
2012-04-01-00-00-04
... ...
Beispiel-Zugriffsmuster
Workload nach Hash Key
Vermeide heiße Hash Keys
BEST PRACTICE 4:
Keine streng monoton steigende Folge von Hash Keys
Aufsteigende Datums/Zeitwerte sind schlechte Hash Keys
Wenn Datum/Zeit,
dann mit niedrigstem Feld (z.B. Sekunde) beginnen
Reporting & Analytics
4
Skalierbarer Zugriff
Skalierbare Datenanalyse
Skalierbares Backup
Amazon Elastic MapReduce.
Verwalteter Hadoop-Dienst für
datenintensive Workloads
aws.amazon.com/emr
create external table items_db
(id string, votes bigint, views bigint) stored by
'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
tblproperties
("dynamodb.table.name" = "items",
"dynamodb.column.mapping" =
"id:id,votes:votes,views:views");
select id, likes, views
from items_db
order by views desc;
1. Erste Schritte
2. Datenmodellierung
3. Partitionierung
4. Replikation & Analytics
Zusammenfassung
Free tier.
aws.amazon.com/dynamodb
Getting Started Guide:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Getti
ngStartedDynamoDB.html
http://aws.amazon.com/de
Beginnen Sie mit dem Free Tier:
http://aws.amazon.com/de/free/
Twitter: @AWS_Aktuell
Facebook: http://www.facebook.com/awsaktuell
Webinare: http://aws.amazon.com/de/about-aws/events/
Slides: http://de.slideshare.net/AWSAktuell/
Youtube: http://www.youtube.com/awsaktuell
Ressourcen