Datenbank-Design in der schönen neuen Welt

Werbung
– It's time to rethink –
Datenbank-Design in der
schönen neuen Welt
Java User Group Hessen 2015
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
Version: 1.1
www.oio.de
[email protected]
Ihr Sprecher
Thorsten Maier
Trainer, Berater, Entwickler
Schwerpunkte
Prozesse
Architektur
Code-Qualität
eigentlich kein „Datenbänker“
© 2015 Orientation in Objects GmbH
Datenbank Design
2
Um was geht’s?
Die Welt des Betriebs
© 2015 Orientation in Objects GmbH
Datenbank Design
3
Um was geht’s?
Die Welt der Entwickler
© 2015 Orientation in Objects GmbH
Datenbank Design
4
Um was geht’s?
Die Welt der Entwickler
© 2015 Orientation in Objects GmbH
Die Welt des Betriebs
Datenbank Design
5
Die schöne neue Welt
Continuous Delivery
© 2015 Orientation in Objects GmbH
Datenbank Design
6
Noch mehr schöne neue Welt
Twitter
300.000.000 Benutzer
300.000 reads/sec
6000 writes/sec
400.000.000 Tweets/day
Lady Gaga hat 49.000.000 Follower
© 2015 Orientation in Objects GmbH
Datenbank Design
7
Continuous Delivery
ist genial
DB kontrolliert
ändern
Keine
Downtime
Wir müssen (fast) alles
anders machen
© 2015 Orientation in Objects GmbH
Datenbank Design
8
3 MonatsReleases
Continuous
Delivery
+ Schnellere Reaktionszeiten
+ Weniger Risiko
© 2015 Orientation in Objects GmbH
Datenbank Design
9
Continuous Delivery für alle?
Projekt oder Produkt
© 2015 Orientation in Objects GmbH
Datenbank Design
10
Continuous Delivery
ist genial
DB kontrolliert
ändern
Keine
Downtime
Wir müssen (fast) alles
anders machen
© 2015 Orientation in Objects GmbH
Datenbank Design
11
„Wer schafft mindestens
1 Produktions-Release
pro Tag?“
© 2015 Orientation in Objects GmbH
Datenbank Design
12
Deploy ≠ Feature Launch
© 2015 Orientation in Objects GmbH
Datenbank Design
13
„Können Sie ohne Downtime
deployen?“
© 2015 Orientation in Objects GmbH
Datenbank Design
14
Blue-Green-Deployment
Blue Server
Router
Green Server
© 2015 Orientation in Objects GmbH
Datenbank Design
DB
15
Blue-Green-Deployment
Blue Server
Router
Green Server
DB
Kann unsere Anwendung das?
© 2015 Orientation in Objects GmbH
Datenbank Design
16
Was passiert mit den
eingeloggten Usern beim
Umschalten zwischen blau
und grün?
© 2015 Orientation in Objects GmbH
Datenbank Design
17
Server 1
Server 2
Sync Sessions
© 2015 Orientation in Objects GmbH
Datenbank Design
18
Server 1
Server 2
Session Store
Memcache, Infinispan, …
© 2015 Orientation in Objects GmbH
Datenbank Design
19
Application-Server sind tot
© 2015 Orientation in Objects GmbH
Datenbank Design
20
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?
© 2015 Orientation in Objects GmbH
Datenbank Design
21
Abhängigkeiten in App-Servern
App-Server Java EE 7
Shared Libs
Web-App 1
JPA 2.1
Spring
JTA 1.2
Servlet 3.1
Web-App 2
JPA 1.0
JSF 2.2
Hibernate 3
HTTP
© 2015 Orientation in Objects GmbH
Richfaces
Datenbank Design
22
Abhängigkeiten OHNE App-Server
Web-App 2
JPA 1.0
Web-App 1
Spring
Hibernate 3
JPA 2.1
Richfaces
JTA 1.2
JSF 2.2
Servlet 3.1
JTA 1.2
HTTP
Servlet 3.1
HTTP
© 2015 Orientation in Objects GmbH
Datenbank Design
23
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
© 2015 Orientation in Objects GmbH
Datenbank Design
24
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
© 2015 Orientation in Objects GmbH
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
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
Datenbank Design
25
Spring Boot – „Hello World“-Class
© 2015 Orientation in Objects GmbH
Datenbank Design
26
„Wie sieht bei 30 Deploys
pro Tag die
Rollback-Strategie aus?
© 2015 Orientation in Objects GmbH
Datenbank Design
27
© 2015 Orientation in Objects GmbH
Datenbank Design
28
© 2015 Orientation in Objects GmbH
Datenbank Design
29
© 2015 Orientation in Objects GmbH
Datenbank Design
30
Vertrauen Sie dem
Backup und der Anwendung
nicht dem Rollback!
© 2015 Orientation in Objects GmbH
Datenbank Design
31
“Chuck Norris does not deploy,
he develops on the production environment.”
© 2015 Orientation in Objects GmbH
Datenbank Design
32
DEV
Reviewer
© 2015 Orientation in Objects GmbH
Datenbank Design
33
DEV
Reviewer
QA
© 2015 Orientation in Objects GmbH
Datenbank Design
34
DEV
Reviewer
Prod
server
Monitoring
© 2015 Orientation in Objects GmbH
QA
Datenbank Design
35
© 2015 Orientation in Objects GmbH
Datenbank Design
36
© 2015 Orientation in Objects GmbH
Datenbank Design
37
© 2015 Orientation in Objects GmbH
Datenbank Design
38
Controller
ServiceImpl
© 2015 Orientation in Objects GmbH
Datenbank Design
39
Controller
ServiceImpl
DaoImpl
https://github.com/thorstenmaier/architecture-layer-check/
© 2015 Orientation in Objects GmbH
Datenbank Design
40
© 2015 Orientation in Objects GmbH
Datenbank Design
41
(Service)
© 2015 Orientation in Objects GmbH
-
[DEPENDS_ON]
->
Datenbank Design
(Controller)
42
MATCH (s:Service)-[:DEPENDS_ON]->(c:Controller) return s,c
© 2015 Orientation in Objects GmbH
Datenbank Design
43
© 2015 Orientation in Objects GmbH
Datenbank Design
44
Wollen Sie das alles?
© 2015 Orientation in Objects GmbH
Datenbank Design
45
Wollen Sie das alles?
Will Ihr Kunde das???
© 2015 Orientation in Objects GmbH
Datenbank Design
46
Dann benötigen wir
kontrollierte Änderungen
der Datenbank
ohne Downtime
© 2015 Orientation in Objects GmbH
Datenbank Design
47
Continuous Delivery
ist genial
DB kontrolliert
ändern
Keine
Downtime
Wir müssen (fast) alles
anders machen
© 2015 Orientation in Objects GmbH
Datenbank Design
48
Code und Datenbank müssen synchron bleiben
© 2015 Orientation in Objects GmbH
Datenbank Design
49
Kennen Sie das?
„Vor dem Update von Version 1.0.2 auf 1.1
musst du erst noch die neuen SQL-Skript einspielen.“
© 2015 Orientation in Objects GmbH
Datenbank Design
50
2 Lösungsmöglichkeiten
hbm2ddl.auto=update
Manuelle SQL-Skripte
© 2015 Orientation in Objects GmbH
Datenbank Design
51
hbm2ddl.auto=update?
© 2015 Orientation in Objects GmbH
Datenbank Design
52
hbm2ddl.auto=update?
http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production
© 2015 Orientation in Objects GmbH
Datenbank Design
53
2 Lösungsmöglichkeiten
hbm2ddl.auto=update
Manuelle SQL-Skripte
© 2015 Orientation in Objects GmbH
Datenbank Design
54
Manuelle SQL-Skripte
schema.sql
1.0
© 2015 Orientation in Objects GmbH
Datenbank Design
55
Manuelle SQL-Skripte
schema.sql
1.0
© 2015 Orientation in Objects GmbH
10_to_11.sql
Datenbank Design
1.1
56
Manuelle SQL-Skripte
schema.sql
1.0
10_to_11.sql
1.1
10_to_101.sql
1.0.1
101_to_11.sql
© 2015 Orientation in Objects GmbH
Datenbank Design
57
Manuelle SQL-Skripte
schema.sql
1.0
10_to_11.sql
1.1
10_to_101.sql
1.0.1
101_to_11.sql
101_to_102.sql
1.0.2
© 2015 Orientation in Objects GmbH
102_to_11.sql
Datenbank Design
58
Manuelle SQL-Skripte
schema.sql
1.0
10_to_11.sql
1.1
10_to_101.sql
1.0.1
101_to_11.sql
101_to_102.sql
1.0.2
© 2015 Orientation in Objects GmbH
102_to_11.sql
Datenbank Design
59
Eigentlich noch komplizierter
© 2015 Orientation in Objects GmbH
Datenbank Design
60
Die Lösung
© 2015 Orientation in Objects GmbH
Datenbank Design
61
Liquibase
© 2015 Orientation in Objects GmbH
Datenbank Design
62
Changelog.xml
© 2015 Orientation in Objects GmbH
Datenbank Design
63
Metadaten in der Datenbank
© 2015 Orientation in Objects GmbH
Datenbank Design
64
Liquibase beim Starten der
Anwendung automatisch ausführen!
© 2015 Orientation in Objects GmbH
Datenbank Design
65
© 2015 Orientation in Objects GmbH
Datenbank Design
66
Warum nehmen wir
eigentlich keine
schemalose
NoSQL DB?
© 2015 Orientation in Objects GmbH
Datenbank Design
67
Relationale Datenbanken
skalieren nicht
Warum?
Normalisierung => Joins
Forderung nach Konsistenz => Transaktionen
© 2015 Orientation in Objects GmbH
Datenbank Design
68
NoSQL
=
Relationale Datenbank
- Transaktionen - Normalisierung - Joins - Konsistenz - hartes Schema
(+) Skalierung
(+) Performance
© 2015 Orientation in Objects GmbH
Datenbank Design
69
Datenmodellierung
•
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
© 2015 Orientation in Objects GmbH
Datenbank Design
70
Datenmodellierung in Key-Value-Stores
Index-Tabelle und Aggregation
userids
1, 2, 5, 7, 12, …
1
John Doe, 1975-08-29, …
2
Richard Miles, 1982-03-14, …
© 2015 Orientation in Objects GmbH
Datenbank Design
71
Datenmodellierung in Key-Value-Stores
Zusammengesetzte Schlüssel
userids
1, 2, 5, 7, 12, …
user:1:firstname
John
user:1:lastname
Doe
user:1:birthday
1975-08-29
© 2015 Orientation in Objects GmbH
Datenbank Design
72
Datenmodellierung: Reduktion der Dimension
© 2015 Orientation in Objects GmbH
Datenbank Design
73
Nochmal Twitter
Viel Aktion beim Schreiben,
wenig beim Lesen
300.000 reads/sec
6000 writes/sec
© 2015 Orientation in Objects GmbH
Datenbank Design
74
Tweet speichern in Key-Value-Store
© 2015 Orientation in Objects GmbH
Datenbank Design
75
Follower aus Graph-DB laden
© 2015 Orientation in Objects GmbH
Datenbank Design
76
Tweet-ID in Key-Value-Store speichern
© 2015 Orientation in Objects GmbH
Datenbank Design
77
The Architecture Twitter
Tweet wird unter der
ID 4711 eingetragen
{Tweet-Inhalt}
User: 12
Tweet-ID: 4711
17
Tweet:4711
{Tweet-Inhalt}
User-Timeline:17
4711, 3013, 302, …
User-Timeline:123
4711, 2001, 878, …
12
Key-Value-Store
123
Follower von
User 12?
Graph-DB
© 2015 Orientation in Objects GmbH
Für jeden Follower
wird die Tweet-ID
in die Timeline
eingetragen
Datenbank Design
78
Joins
Fluch oder Segen?
© 2015 Orientation in Objects GmbH
Datenbank Design
79
Document
http://docs.mongodb.org/manual/core/crud-introduction/
© 2015 Orientation in Objects GmbH
Datenbank Design
80
Collection
http://docs.mongodb.org/manual/core/crud-introduction/
© 2015 Orientation in Objects GmbH
Datenbank Design
81
Embedded Data Models
http://docs.mongodb.org/manual/core/data-model-design/
© 2015 Orientation in Objects GmbH
Datenbank Design
82
Normalized Data Models
Achtung:
Kein DB-seitiger JOIN möglich!
http://docs.mongodb.org/manual/core/data-model-design/
© 2015 Orientation in Objects GmbH
Datenbank Design
83
NoSQL?
Ja, falls die Anforderungen
passen!
© 2015 Orientation in Objects GmbH
Datenbank Design
84
Continuous Delivery
ist genial
DB kontrolliert
ändern
Keine
Downtime
Wir müssen (fast) alles
anders machen
© 2015 Orientation in Objects GmbH
Datenbank Design
85
Blue-Green-Deployment
Blue Server
Router
Green Server
© 2015 Orientation in Objects GmbH
Datenbank Design
DB
86
Ersetze die Spalte Name
durch die Spalten
Vorname und Nachname
© 2015 Orientation in Objects GmbH
Datenbank Design
87
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
© 2015 Orientation in Objects GmbH
Datenbank Design
88
1) Neue Version zum Schema hinzufügen
2) In beide Versionen schreiben
5) Nicht mehr in die alte Version
schreiben
3) Historische Daten auffüllen
4) Von neuer Version lesen
© 2015 Orientation in Objects GmbH
Datenbank Design
89
Continuous Delivery
ist genial
DB kontrolliert
ändern
Keine
Downtime
Wir müssen (fast) alles
anders machen
© 2015 Orientation in Objects GmbH
Datenbank Design
90
? ?
?
Fragen ?
?
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
[email protected]
?
Vielen Dank für ihre
Aufmerksamkeit !
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
[email protected]
Herunterladen