Oracle Sharding: Eine neue Oracle Architektur
von Sebastian Solbach |
![]() |
Sharding bezeichnet eine Funktionalität große Datenmengen auf verschiedene Server zu verteilen. Hierzu werden die Daten einzelner Tabellen in unabhängige,
benutzerdefinierte Teilmengen aufgeteilt, den sogenannten Shards. Das Besondere bei Sharding ist, dass sich die einzelnen Shards nicht auf einem Server und in einer Datenbank,
sondern in komplett unterschiedlichen Datenbanken befinden. Die einzelnen Datenbanken haben dabei keine gemeinsamen Komponenten - weder verwenden Sie dieselbe Software, noch die gleiche Hardware.
Letztendlich können die einzelnen Shards komplett unabhängig voneinander operieren, allerdings nur auf denen für Sie zugewiesenen Daten.
Diese Eigenschaft ist bei Sharding der größte Vorteil, allerdings gleichzeitig auch die größte Restriktion.
Oracle Sharding: Architektur, Funktionalitäten und Begrifflichkeiten
Oracle stellt nun zum ersten mal mit der Version 12.2 offiziell die Sharding Architektur und Funktionalität zur Verfügung.
Hintergrund ist eine erhebliche Minimierung des administrativen Aufwands mit Oracle Sharding gegenüber einer manuellen Implementierung.
Dazu gehört das automatische Anlegen von Hunderten von Shards durch einfache SQL Syntax inklusive der Absicherung einzelner Shards durch Active Data Guard, Golden Gate und/oder RAC.
Dies funktioniert über eine zentrale Definition der Tabellen, die die sharded Architektur ausmachen. Eine automatische Verteilung der Daten ist ebenso integriert,
wie ein Lifecycle Management, sollten Änderungen an den Tabellen notwendig sein. Ebenso bietet Oracle Sharding eine zentrale Zugriffsebene auf die einzelnen Shards um auch Abfragen zu erlauben,
bei denen im Vorfeld nicht bekannt ist, in welchem Shard bzw. in welchen Shards (mehrere Shards überspannend) die Daten liegen. Auch wenn letztere Abfragen nicht empfohlen sind.
Oracle Sharding Datenmodell und Applikationsanforderungen
Sharded Tabellen basieren auf einer Ursprungstabelle, die Ihre Eigenschaften auf die einzelnen Tabellen innerhalb eines Shards vererben.
Wichtig ist, dass jede dieser Sharded Tabellen einen Sharding Schlüssel (Sharding Key) enthalten muss und dies muss die führende Spalte im Primärschlüssel sein.
Dieser Sharding Schlüssel ist allen Sharded Tabellen gemein. Anhand dieses Sharding Schlüssels übernimmt Oracle auch das Anlegen der einzelnen Shards und verteilt die Daten dementsprechend -
vergleichbar mit dem Partitionierungsschlüssel bei der Partitionierung. Alle abhängigen Partitionen (Tabellen mit gleichem Sharding Schlüssel Wert) werden hierbei als "Chunk" bezeichnet.
Dies ist gleichzeitig die Einheit in der einzelne Partitionen im Falle eines "Resharding" neu verteilt werden können.
Auf Basis dieses Sharding Schlüssels unterstützt Oracle 12.2 zwei Arten der Datenverteilung: System Managed (konsistenter Hash) und einen zusammengesetzten Range-Hash oder List-Hash.
Überlässt man die Datenverteilung einfach einem konsistenten Hash so werden die Daten uniform über alle Shards der Sharded Datenbank verteilt.
Die einzelnen Chunks werden dabei relativ klein und sind dabei gleich groß. Allerdings hat der Administrator dadurch keinen Einfluss auf die Lokalität der Daten.
Aus diesem Grund gibt es das Composite Sharding, welches letztendlich eine Zusammensetzung von 2 Shard Schlüsseln ist: Einem führenden Super-Shard Key,
der zum Beispiel die Lokation angibt (wie Amerika, Europa, Asien) und dem oben erwähnten Shard Schlüssel für den konsistent Hash. Damit kann die Lokation der Daten gesteuert werden.
Logischerweise sind dadurch die einzelnen Chunks aber nicht mehr zwingend gleich groß, da dies nun abhängig von den Daten ist.
Die größte Änderung stellt Sharding aber hinsichtlich der Applikationsentwicklung dar.
Denn Applikationen müssen mit dem Wissen programmiert worden sein, dass diese mit einer sharded Datenbank arbeiten.
An einem einfachen Beispiel wird dies sofort ersichtlich: So ist ein direktes Update auf den Shard Schlüssel nicht möglich. Es gibt nämlich keinen Automatismus beim Update,
der einen Datensatz in einen anderen Chunk bzw. Shard verschieben kann, falls dies erforderlich wäre. Bei sharded Datenbanken erfordert dies ein Löschen und neu Anlegen des Datensatzes.
Was sich im ersten Augenblick einfach und selbstverständlich anhört, wird komplex wenn viele abhängige Datensätze vorhanden sind, bei denen sich dann ebenfalls der Wert des Sharding Schlüssels ändert.
Ebenso profitieren Applikationen am meisten wenn diese nur innerhalb eines Shards arbeiten und auch beim Zugriff bereits mitteilen, mit welchem Shard gearbeitet werden soll.
Hierzu sollten Applikationen bereits bei der Verbindung zur Sharded Datenbank den Wert des Sharding Schlüssels angeben.
Oracle integrierte Connections Pools (UCP, OCI, ODP.NET, JDBC) kennen diese Anforderungen und halten auch Verbindungen zu den jeweiligen Shards vor.
Hierbei ist nur bei der Initiierung des Connection Pools oder neuen Verbindung eine Information vom Sharding Katalog notwendig.
Danach werden die entsprechenden Session-Attribute im Connection Cache gehalten und direkt an die jeweilige Applikation ausgegeben.
Nur wenn eine Neuverteilung der Shards ansteht, werden die Connections neu initialisiert.
Falls es der Applikation nicht möglich ist, den Sharding Schlüssel zu spezifizieren oder Abfragen über mehrere Shards erforderlich sind,
so tritt das Proxy Routing auf den Plan. Dann wird über den Sharding Katalog die jeweiligen Shards ermittelt und die Abfragen an die jeweiligen Shards weitergegeben.
Dies führt zu einer schlechteren Performance, da die Sharding Directors am Ende auch die Datenaggregation übernehmen müssen.
Ausfallsicherheit
Die Verfügbarkeit der einzelnen Shards kann über 3 Mechanismen bewerkstelligt werden: Die jeweilige Konfiguration funktioniert automatisch und wird beim Anlegen der Shards aus dem Sharding Katalog heraus gesteuert.
Die einfachste Variante ist, jedem Shard eine Active Data Guard Standby Datenbank mit Fast-Start Failover zur Seite zu stellen.
Damit dies bei der Erstellung automatisch erzeugt werden kann, wurde übrigens der Database Configuration Assistant (DBCA) erweitert und unterstützt mit 12.2 nun auch das Anlegen von Standby Datenbanken.
Allerdings ist diese Konfiguration rein Activ/Passiv so dass es bei Ausfall eines Shards durchaus zu kleineren Verzögerungen kommen kann.
Die beste Lösung ist die Nutzung von Oracle Golden Gate: Dabei können sowohl ganze Shards oder auch nur einzelnen Chunks jeweils in ein anderes Shard repliziert werden.
Hierbei kann die Redundanz angegeben werden, so dass ein Chunk auch in mehrere Shards repliziert wird. Die Golden Gate Sharding Regeln sorgen für eine automatische Konflikterkennung und Lösung,
sollten unterschiedliche Prozesse auf denselben Chunks in unterschiedlichen Shards arbeiten.
Kombinieren lassen sich beide Lösungen noch mit Oracle Real Application Cluster, der jeweils Hochverfügbarkeit für einzelne Datenbanken (Shards) gewährleistet.
Fazit
Den Vorteilen disjunkter einzelner Shards die unabhängig voneinander operieren und deshalb Flexibilität in Bezug auf Update und Verfügbarkeit bietet, steht eine Applikationsanpassung und die gestiegenen Anforderungen an die Shard Directors und des Sharding Katalogs gegenüber.Hinweis zur Lizenzierung
Bei bis zu 3 Shards genügt es die Shards mit Oracle Enterprise Edition zu lizenzieren. Hochverfügbarkeit erhält man aber nur mit Active Data Guard und Golden Gate Lizenz. Bei mehr als 3 Shards muss für alle Shards eine Active Data Guard oder Golden Gate Lizenz zusätzlich zur Enterprise Edition vorhanden sein.Weitere Informationen
Zurück zum Anfang des Artikels
Zurück zur Community-Seite