Webinar DynamoDB deutsch

Preview:

Citation preview

DynamoDB- NoSQL as a Service

Steffen Krause

Technology Evangelist

@AWS_Aktuell

skrause@amazon.de

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

Danke!

skrause@amazon.de

@AWS_Aktuell

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

Recommended