Entwerfen einer Plattform: eine Datenbank oder mehrere Datenbanken?

31

Wir bauen eine Webplattform auf, die mehrere Dienste mit jeweils eigenen zugrunde liegenden Daten umfasst. Diese Dienste werden unabhängig nach den Prinzipien der serviceorientierten Architektur erstellt , sie werden jedoch mit potenziell verwandten Daten abgewickelt. Wir überlegen, ob diese Dienste eine große Datenbank gemeinsam nutzen sollen oder jede über eine eigene Datenbank verfügt. (Wir planen die Verwendung von SQL Server 2008 Enterprise in einem Windows 2008-Cluster.)

Zu den Vorteilen jedes Ansatzes, den wir bereits in Betracht gezogen haben, gehören:

Einzelne Datenbank

  • Das Verknüpfen von Daten aus verschiedenen Diensten kann durch Fremdschlüsseleinschränkungen miteinander verbunden werden
  • Analytische Extrakte sind einfacher zu schreiben und schneller auszuführen
  • Im Katastrophenfall ist es einfacher, die Plattform in einen konsistenten Zustand zu versetzen
  • Bei Daten, auf die von mehreren Diensten verwiesen wird, werden die von einem Dienst zwischengespeicherten Daten wahrscheinlich bald darauf von einem anderen Dienst verwendet
  • Verwaltung und Überwachung sind im Vorfeld einfacher und kostengünstiger

Mehrere Datenbanken

  • Wartungsarbeiten, Hardwareprobleme, Sicherheitslücken usw. wirken sich nicht unbedingt auf die gesamte Plattform aus
  • Unter der Annahme, dass sich jede Datenbank auf einer separaten Hardware befindet, bietet das Skalieren mehrerer Computer mehr Leistungsvorteile als das Skalieren eines großen Computers

Ist es aus betrieblicher Sicht vorteilhafter, wenn jeder Dienst auf dieser Plattform eine eigene Datenbank erhält oder alle in derselben Datenbank gespeichert sind? Welche Schlüsselfaktoren bestimmen eine Antwort auf diese Frage?

Nick Chammas
quelle
Was hast du gewählt?
Frank Visaggio
@BobSinclar - Das ist schon eine Weile her, aber wir haben am Ende mehrere Datenbanken erstellt.
Nick Chammas
Sind Schemaänderungen schwieriger oder nicht? Angenommen, Sie mussten das Schema jeder Datenbank aktualisieren.
Frank Visaggio
@ BobSinclar - Ich bin nicht das, was Sie fragen. Wann müssen Sie das Schema jeder Datenbank auf einmal aktualisieren, wenn Sie eine Plattform nach SOA-Prinzipien erstellt haben? Die verschiedenen Systeme sollten lose gekoppelt sein.
Nick Chammas
Ich weiß, es ist schon eine Weile her, aber haben Sie etwas dagegen, die verschiedenen Datenbanken, die Sie ausgewählt haben, und den Grund zu teilen?
Azngunit81

Antworten:

18

Meiner Meinung nach ist das Hauptunterscheidungsmerkmal echter SOA-Systeme (gegenüber den immer häufiger vorkommenden Pseudo-SOA-Systemen / verteilten Systemen), dass zwischen diskreten Diensten keine Interaktion stattfinden sollte. Wenn dies erreicht wird, kann und sollte jede Anwendung, die Sie aus diesen Diensten erstellen, so erstellt werden, dass sie den Ausfall eines konsistenten Teils toleriert. Ein Fehler verringert die Funktionalität, der Service bleibt jedoch erhalten.

In diesem Szenario ist es logisch oder erforderlich, die zugrunde liegende Datenbank für jeden Dienst zu trennen. Wenn Sie jedoch Dienste haben, die voneinander abhängig sind, können Sie aus einer Aufteilung wenig (möglicherweise nichts) ziehen.

Ich würde empfehlen, Websites wie HighScalability.com zu lesen, die sich mit den Architekturen befassen, die von Websites des Typs Never -Fail übernommen wurden. Einer meiner Favoriten in letzter Zeit war die Geschichte des Netflix Chaos Monkey, die in Coding Horror erwähnt wurde .

Ansprechen einiger Punkte in Ihrer Frage:

Im Katastrophenfall ist es einfacher, die Plattform in einen konsistenten Zustand zu versetzen.

Dies ist richtig, aber Sie sollten sich vielleicht überlegen, wie Sie diese Dienste besser entkoppeln können, damit dies kein Problem darstellt. Alternativ gibt es Methoden, um die Synchronisation über mehrere Datenbanken hinweg sicherzustellen, beispielsweise Transaktionsmarken in SQL Server .

Bei Daten, auf die von mehreren Diensten verwiesen wird, werden von einem Dienst zwischengespeicherte Daten wahrscheinlich bald darauf von einem anderen Dienst verwendet.

Verteilte Cache-Lösungen (memcached et al.) Könnten hier Abhilfe schaffen, aber Sie würden die Prinzipien der Dienstunabhängigkeit verletzen. Dies wäre vergleichbar mit der direkten Kommunikation zwischen zwei Diensten oder, schlimmer noch, mit einem Dienstzugriff auf einen anderen Datenspeicher, der die Dienstschnittstelle insgesamt umgeht. Unweigerlich werden Daten in Beziehung gesetzt und von der aufrufenden Plattform zwischen den Diensten ausgetauscht. Die kniffligen Entscheidungen betreffen in der Regel, welcher Dienst welche Daten besitzt. StackOverflow- oder Programmierer-Sites sind möglicherweise besser in der Lage, bei allgemeinen SOA-Problemen zu helfen.

Unter der Annahme, dass sich jede Datenbank auf einer separaten Hardware befindet, bietet die Skalierung weitere Leistungsvorteile.

Sicherlich kann es billiger sein, mehrere Maschinen mit niedrigeren Spezifikationen zu skalieren, als eine einzelne Maschine zu skalieren. Die niedrigeren Hardwarekosten können jedoch in den Gesamtbetriebskosten in den Schatten gestellt werden, wenn die weichen Kosten des zusätzlichen Entwicklungsaufwands und der Betriebskomplexität berücksichtigt werden.

Wenn dies nicht SOA ist und Sie nur einen Fall haben, in dem die Komponentendienste dieser Plattform aus logistischen Gründen von verschiedenen Teams / Lieferanten erstellt werden, bleiben Sie bei einer einzigen Datenbank und ignorieren Sie alles oben Genannte vollständig! :)

Mark Storey-Smith
quelle
Guter Punkt in Bezug auf verteilte Cache-Lösungen. Bei der Zwischenspeicherung auf SAN- oder Datenbankebene ist dies jedoch kein Problem. Dort erhalten Sie aufgrund Ihrer Bereitstellungstopologie (dh unterschiedliche Dienste teilen sich zufällig die gleiche Hardware) und nicht aufgrund der direkten Kommunikation zwischen Diensten einen Caching-Vorteil, wie dies bei memcached der Fall ist.
Nick Chammas