– 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]