it's time to rethink datenbank-design in der schönen neuen ... · orientation in objects gmbh...
TRANSCRIPT
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
[email protected] Version:
– It's time to rethink –
Datenbank-Design in der
schönen neuen Welt
1.1
Java User Group Hessen 2015
Datenbank Design © 2015 Orientation in Objects GmbH
Ihr Sprecher
Thorsten Maier
Trainer, Berater, Entwickler
Schwerpunkte Prozesse
Architektur Code-Qualität
eigentlich kein „Datenbänker“
2
Datenbank Design © 2015 Orientation in Objects GmbH
Um was geht’s?
3
Die Welt des Betriebs
Datenbank Design © 2015 Orientation in Objects GmbH
Um was geht’s?
4
Die Welt der Entwickler
Datenbank Design © 2015 Orientation in Objects GmbH
Um was geht’s?
5
Die Welt der Entwickler Die Welt des Betriebs
Datenbank Design © 2015 Orientation in Objects GmbH 6
Die schöne neue Welt
Continuous Delivery
Datenbank Design © 2015 Orientation in Objects GmbH
300.000.000 Benutzer
300.000 reads/sec
6000 writes/sec
400.000.000 Tweets/day
Lady Gaga hat 49.000.000 Follower
7
Noch mehr schöne neue Welt
Datenbank Design © 2015 Orientation in Objects GmbH
Continuous Delivery ist genial
Wir müssen (fast) alles anders machen
Keine Downtime
DB kontrolliert ändern
8
Datenbank Design © 2015 Orientation in Objects GmbH
+ Schnellere Reaktionszeiten
+ Weniger Risiko
3 Monats- Releases
Continuous Delivery
9
Datenbank Design © 2015 Orientation in Objects GmbH 10
Continuous Delivery für alle?
Projekt oder Produkt
Datenbank Design © 2015 Orientation in Objects GmbH
Continuous Delivery ist genial
Wir müssen (fast) alles anders machen
Keine Downtime
DB kontrolliert ändern
11
Wir müssen (fast) alles anders machen
Datenbank Design © 2015 Orientation in Objects GmbH 12
„Wer schafft mindestens 1 Produktions-Release
pro Tag?“
Datenbank Design © 2015 Orientation in Objects GmbH 13
Deploy ≠ Feature Launch
Datenbank Design © 2015 Orientation in Objects GmbH 14
„Können Sie ohne Downtime deployen?“
Datenbank Design © 2015 Orientation in Objects GmbH
Blue-Green-Deployment
15
Router
Blue Server
Green Server DB
Datenbank Design © 2015 Orientation in Objects GmbH
Blue-Green-Deployment
16
Router
Blue Server
Green Server DB
Kann unsere Anwendung das?
Datenbank Design © 2015 Orientation in Objects GmbH 17
Was passiert mit den eingeloggten Usern beim
Umschalten zwischen blau und grün?
Datenbank Design © 2015 Orientation in Objects GmbH 18
Server 1 Sync Sessions
Server 2
Datenbank Design © 2015 Orientation in Objects GmbH 19
Server 1 Server 2
Session Store Memcache, Infinispan, …
Datenbank Design © 2015 Orientation in Objects GmbH
Application-Server sind tot
20
Datenbank Design © 2015 Orientation in Objects GmbH
Was spricht gegen Application-Server?
• Der Betrieb erwartet ein „RPM für Linux“ und kein „WAR / EAR“
– Spezielles Monitoring für App-Server notwendig
• App-Server für mehrere Apps wird praktisch nicht verwendet
– eher Clustering von mehreren App-Servern
• App-Server bringt Bibliotheken mit und verhindert somit ein
einfaches Update
• App-Server ist ein Problem im Umfeld von Continuous Delivery
– Deployment-Artefakte können durch die Deployment-Pipe geschoben
werden, aber was ist mit der App-Server-Version?
21
Datenbank Design © 2015 Orientation in Objects GmbH
Abhängigkeiten in App-Servern
22
App-Server Java EE 7
Shared Libs
JPA 2.1
JTA 1.2
Servlet 3.1
Web-App 1
Web-App 2
Spring
JSF 2.2
Richfaces HTTP
JPA 1.0
Hibernate 3
Datenbank Design © 2015 Orientation in Objects GmbH
Web-App 2
Web-App 1
Abhängigkeiten OHNE App-Server
23
JPA 2.1
JTA 1.2
Servlet 3.1
Spring
JSF 2.2
Richfaces
JPA 1.0
Hibernate 3
JTA 1.2
Servlet 3.1
HTTP
HTTP
Datenbank Design © 2015 Orientation in Objects GmbH
Sind Application-Server tot?
com.example:myproject:jar:0.0.1-SNAPSHOT
\- org.springframework.boot:spring-boot-starter-web:jar:1.1.1.BUILD-SNAPSHOT:compile
+- org.springframework.boot:spring-boot-starter:jar:1.1.1.BUILD-SNAPSHOT:compile
| +- org.springframework.boot:spring-boot:jar:1.1.1.BUILD-SNAPSHOT:compile
| +- org.springframework.boot:spring-boot-autoconfigure:jar:1.1.1.BUILD-SNAPSHOT:compile
| +- org.springframework.boot:spring-boot-starter-logging:jar:1.1.1.BUILD-SNAPSHOT:compile
| | +- org.slf4j:jcl-over-slf4j:jar:1.7.7:compile
| | | \- org.slf4j:slf4j-api:jar:1.7.7:compile
| | +- org.slf4j:jul-to-slf4j:jar:1.7.7:compile
| | +- org.slf4j:log4j-over-slf4j:jar:1.7.7:compile
| | \- ch.qos.logback:logback-classic:jar:1.1.2:compile
| | \- ch.qos.logback:logback-core:jar:1.1.2:compile
| \- org.yaml:snakeyaml:jar:1.13:runtime
+- org.springframework.boot:spring-boot-starter-tomcat:jar:1.1.1.BUILD-SNAPSHOT:compile
| +- org.apache.tomcat.embed:tomcat-embed-core:jar:7.0.54:compile
| +- org.apache.tomcat.embed:tomcat-embed-el:jar:7.0.54:compile
| \- org.apache.tomcat.embed:tomcat-embed-logging-juli:jar:7.0.54:compile
+- com.fasterxml.jackson.core:jackson-databind:jar:2.3.3:compile
| +- com.fasterxml.jackson.core:jackson-annotations:jar:2.3.3:compile
| \- com.fasterxml.jackson.core:jackson-core:jar:2.3.3:compile
+- org.hibernate:hibernate-validator:jar:5.0.3.Final:compile
| +- javax.validation:validation-api:jar:1.1.0.Final:compile
| +- org.jboss.logging:jboss-logging:jar:3.1.1.GA:compile
| \- com.fasterxml:classmate:jar:1.0.0:compile
+- org.springframework:spring-core:jar:4.0.5.RELEASE:compile
+- org.springframework:spring-web:jar:4.0.5.RELEASE:compile
| +- org.springframework:spring-aop:jar:4.0.5.RELEASE:compile
| | \- aopalliance:aopalliance:jar:1.0:compile
| +- org.springframework:spring-beans:jar:4.0.5.RELEASE:compile
| \- org.springframework:spring-context:jar:4.0.5.RELEASE:compile
\- org.springframework:spring-webmvc:jar:4.0.5.RELEASE:compile
\- org.springframework:spring-expression:jar:4.0.5.RELEASE:compile
24
Datenbank Design © 2015 Orientation in Objects GmbH
Spring Boot – Starter POMs
• spring-boot-starter-actuator
• spring-boot-starter-amqp
• spring-boot-starter-aop
• spring-boot-starter-batch
• spring-boot-starter-data-elasticsearch
• spring-boot-starter-data-gemfire
• spring-boot-starter-data-jpa
• spring-boot-starter-data-mongodb
• spring-boot-starter-data-rest
• spring-boot-starter-data-solr
• spring-boot-starter-freemarker
• spring-boot-starter-groovy-templates
• spring-boot-starter-hornetq
• spring-boot-starter-integration
• spring-boot-starter-jdbc
• spring-boot-starter-jetty
• spring-boot-starter-log4j
• spring-boot-starter-logging
• spring-boot-starter-mobile
• spring-boot-starter-parent
• spring-boot-starter-redis
• spring-boot-starter-remote-shell
• spring-boot-starter-security
• spring-boot-starter-social-facebook
• spring-boot-starter-social-linkedin
• spring-boot-starter-social-twitter
• spring-boot-starter-test
• spring-boot-starter-thymeleaf
• spring-boot-starter-tomcat
• spring-boot-starter-velocity
• spring-boot-starter-web
• spring-boot-starter-websocket
• spring-boot-starter-ws
25
Datenbank Design © 2015 Orientation in Objects GmbH
Spring Boot – „Hello World“-Class
26
Datenbank Design © 2015 Orientation in Objects GmbH 27
„Wie sieht bei 30 Deploys
pro Tag die
Rollback-Strategie aus?
Datenbank Design © 2015 Orientation in Objects GmbH 28
Datenbank Design © 2015 Orientation in Objects GmbH 29
Datenbank Design © 2015 Orientation in Objects GmbH 30
Datenbank Design © 2015 Orientation in Objects GmbH 31
Vertrauen Sie dem Backup und der Anwendung
nicht dem Rollback!
Datenbank Design © 2015 Orientation in Objects GmbH 32
“Chuck Norris does not deploy, he develops on the production environment.”
Datenbank Design © 2015 Orientation in Objects GmbH 33
DEV
Reviewer
Datenbank Design © 2015 Orientation in Objects GmbH 34
DEV
Reviewer
QA
Datenbank Design © 2015 Orientation in Objects GmbH 35
DEV
Reviewer
QA Monitoring
Prod server
Datenbank Design © 2015 Orientation in Objects GmbH 36
Datenbank Design © 2015 Orientation in Objects GmbH 37
Datenbank Design © 2015 Orientation in Objects GmbH 38
Datenbank Design © 2015 Orientation in Objects GmbH 39
Controller
ServiceImpl
Datenbank Design © 2015 Orientation in Objects GmbH 40
https://github.com/thorstenmaier/architecture-layer-check/
Controller
ServiceImpl
DaoImpl
Datenbank Design © 2015 Orientation in Objects GmbH 41
Datenbank Design © 2015 Orientation in Objects GmbH 42
(Service) - [DEPENDS_ON] -> (Controller)
Datenbank Design © 2015 Orientation in Objects GmbH 43
MATCH (s:Service)-[:DEPENDS_ON]->(c:Controller) return s,c
Datenbank Design © 2015 Orientation in Objects GmbH 44
Datenbank Design © 2015 Orientation in Objects GmbH 45
Wollen Sie das alles?
Datenbank Design © 2015 Orientation in Objects GmbH 46 46
Wollen Sie das alles?
Will Ihr Kunde das???
Datenbank Design © 2015 Orientation in Objects GmbH
Dann benötigen wir
kontrollierte Änderungen
der Datenbank
ohne Downtime
47
Datenbank Design © 2015 Orientation in Objects GmbH
Continuous Delivery ist genial
Wir müssen (fast) alles anders machen
Keine Downtime
DB kontrolliert ändern
48
DB kontrolliert ändern
Datenbank Design © 2015 Orientation in Objects GmbH
Code und Datenbank müssen synchron bleiben
49
Datenbank Design © 2015 Orientation in Objects GmbH
Kennen Sie das?
50
„Vor dem Update von Version 1.0.2 auf 1.1 musst du erst noch die neuen SQL-Skript einspielen.“
Datenbank Design © 2015 Orientation in Objects GmbH
2 Lösungsmöglichkeiten
hbm2ddl.auto=update
Manuelle SQL-Skripte
51
Datenbank Design © 2015 Orientation in Objects GmbH
hbm2ddl.auto=update?
52
Datenbank Design © 2015 Orientation in Objects GmbH
hbm2ddl.auto=update?
http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production
53
Datenbank Design © 2015 Orientation in Objects GmbH
2 Lösungsmöglichkeiten
hbm2ddl.auto=update
Manuelle SQL-Skripte
54
Datenbank Design © 2015 Orientation in Objects GmbH
Manuelle SQL-Skripte
1.0 schema.sql
55
Datenbank Design © 2015 Orientation in Objects GmbH
Manuelle SQL-Skripte
1.0 schema.sql
1.1 10_to_11.sql
56
Datenbank Design © 2015 Orientation in Objects GmbH
Manuelle SQL-Skripte
1.0 schema.sql
1.1 10_to_11.sql
1.0.1 10_to_101.sql
101_to_11.sql
57
Datenbank Design © 2015 Orientation in Objects GmbH
Manuelle SQL-Skripte
1.0 schema.sql
1.1 10_to_11.sql
1.0.1 10_to_101.sql
101_to_11.sql
1.0.2
101_to_102.sql
102_to_11.sql
58
Datenbank Design © 2015 Orientation in Objects GmbH
Manuelle SQL-Skripte
1.0 schema.sql
1.1 10_to_11.sql
1.0.1 10_to_101.sql
101_to_11.sql
1.0.2
101_to_102.sql
102_to_11.sql
59
Datenbank Design © 2015 Orientation in Objects GmbH
Eigentlich noch komplizierter
60
Datenbank Design © 2015 Orientation in Objects GmbH
Die Lösung
61
Datenbank Design © 2015 Orientation in Objects GmbH
Liquibase
62
Datenbank Design © 2015 Orientation in Objects GmbH
Changelog.xml
63
Datenbank Design © 2015 Orientation in Objects GmbH
Metadaten in der Datenbank
64
Datenbank Design © 2015 Orientation in Objects GmbH
Liquibase beim Starten der Anwendung automatisch ausführen!
65
Datenbank Design © 2015 Orientation in Objects GmbH 66
Datenbank Design © 2015 Orientation in Objects GmbH 67
Warum nehmen wir eigentlich keine
schemalose NoSQL DB?
Datenbank Design © 2015 Orientation in Objects GmbH
Relationale Datenbanken
skalieren nicht
Warum?
Normalisierung => Joins
Forderung nach Konsistenz => Transaktionen
68
Datenbank Design © 2015 Orientation in Objects GmbH
NoSQL =
Relationale Datenbank
- Transaktionen - Normalisierung - Joins - Konsistenz - hartes Schema
(+) Skalierung
(+) Performance
69
Datenbank Design © 2015 Orientation in Objects GmbH
Datenmodellierung
70
• Relationale Datenbank
– Welche Antworten habe ich?
– Allgemeine Datenmodellierung für möglichst viele Fragenstellungen
• NoSQL
– Welche Frage möchte ich beantworten?
– Konkret für einen Anwendungsfall
– Denormalisierung und Duplizierung ist der Normalfall
Datenbank Design © 2015 Orientation in Objects GmbH
Datenmodellierung in Key-Value-Stores
Index-Tabelle und Aggregation
71
userids 1, 2, 5, 7, 12, …
1 John Doe, 1975-08-29, …
2 Richard Miles, 1982-03-14, …
Datenbank Design © 2015 Orientation in Objects GmbH
Datenmodellierung in Key-Value-Stores
Zusammengesetzte Schlüssel
72
user:1:firstname John
user:1:lastname Doe
user:1:birthday 1975-08-29
userids 1, 2, 5, 7, 12, …
Datenbank Design © 2015 Orientation in Objects GmbH
Datenmodellierung: Reduktion der Dimension
73
Datenbank Design © 2015 Orientation in Objects GmbH 74
Nochmal Twitter
Viel Aktion beim Schreiben, wenig beim Lesen
300.000 reads/sec
6000 writes/sec
Datenbank Design © 2015 Orientation in Objects GmbH 75
Tweet speichern in Key-Value-Store
Datenbank Design © 2015 Orientation in Objects GmbH 76
Follower aus Graph-DB laden
Datenbank Design © 2015 Orientation in Objects GmbH 77
Tweet-ID in Key-Value-Store speichern
Datenbank Design © 2015 Orientation in Objects GmbH
The Architecture Twitter
78
{Tweet-Inhalt}
User: 12
Tweet-ID: 4711
Key-Value-Store
Tweet:4711 {Tweet-Inhalt}
Graph-DB
User-Timeline:17 4711, 3013, 302, …
User-Timeline:123 4711, 2001, 878, …
Follower von
User 12?
12
17
123
Tweet wird unter der
ID 4711 eingetragen
Für jeden Follower
wird die Tweet-ID
in die Timeline
eingetragen
Datenbank Design © 2015 Orientation in Objects GmbH 79
Joins
Fluch oder Segen?
Datenbank Design © 2015 Orientation in Objects GmbH
Document
80
http://docs.mongodb.org/manual/core/crud-introduction/
Datenbank Design © 2015 Orientation in Objects GmbH
Collection
81
http://docs.mongodb.org/manual/core/crud-introduction/
Datenbank Design © 2015 Orientation in Objects GmbH
Embedded Data Models
82
http://docs.mongodb.org/manual/core/data-model-design/
Datenbank Design © 2015 Orientation in Objects GmbH
Normalized Data Models
83
http://docs.mongodb.org/manual/core/data-model-design/
Achtung:
Kein DB-seitiger JOIN möglich!
Datenbank Design © 2015 Orientation in Objects GmbH 84
NoSQL?
Ja, falls die Anforderungen passen!
Datenbank Design © 2015 Orientation in Objects GmbH
Continuous Delivery ist genial
Wir müssen (fast) alles anders machen
Keine Downtime
DB kontrolliert ändern
85
Keine Downtime
Datenbank Design © 2015 Orientation in Objects GmbH
Blue-Green-Deployment
86
Router
Blue Server
Green Server DB
Datenbank Design © 2015 Orientation in Objects GmbH 87
Ersetze die Spalte Name
durch die Spalten
Vorname und Nachname
Datenbank Design © 2015 Orientation in Objects GmbH
1) Neue Version zum Schema hinzufügen
2) In beide Versionen schreiben
3) Historische Daten auffüllen
4) Von neuer Version lesen
5) Nicht mehr in die alte Version schreiben
88
Datenbank Design © 2015 Orientation in Objects GmbH
1) Neue Version zum Schema hinzufügen
2) In beide Versionen schreiben
3) Historische Daten auffüllen
4) Von neuer Version lesen
5) Nicht mehr in die alte Version schreiben
89
Datenbank Design © 2015 Orientation in Objects GmbH
Continuous Delivery ist genial
Wir müssen (fast) alles anders machen
Keine Downtime
DB kontrolliert ändern
90
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
? ?
? ?
? Fragen ?
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Vielen Dank für ihre
Aufmerksamkeit !