Muster zum Einrichten von Sharding für SQL Server 2008 R2, um große Datasets verarbeiten zu können?

14

Ich möchte ein großes Dataset (> 1 Milliarde Zeilen) in SQL Server 2008 R2 verarbeiten. Ich habe gehört, dass beim Einrichten von "Sharding" oder "Horizontal Partitioning" die Verarbeitung großer Datasets beschleunigt wird, da die Tabellen in mehrere Dateien aufgeteilt werden.

Haben Sie zuvor Sharding oder horizontale Partitionierung verwendet? Wenn ja, können Sie Muster vorschlagen, die Ihrer Erfahrung nach bessere Ergebnisse erzielen als eine einzelne massive Tabelle?

Contango
quelle

Antworten:

23

Beachten Sie zunächst, dass mit einer partitionierten Architektur auf gewöhnlicher Commodity-Serverhardware 1 Milliarde Zeilen effektiv verarbeitet werden können. Für dieses Datenvolumen sind keine exotischen Shared-Nothing-Architekturen erforderlich. Die Tabellenpartitionierung bietet jedoch wahrscheinlich erhebliche Vorteile.

Sharding unterscheidet sich von der horizontalen Partitionierung und impliziert eine Architektur ohne gemeinsame Nutzung, die von den meisten Versionen von SQL Server 1 nicht unterstützt wird

SQL Server unterstützt die horizontale Partitionierung und eine gemeinsam genutzte Festplattenarchitektur ist für ~ 1 Milliarde Zeilen ausreichend.

In SQL Server erstellen Sie eine Partitionsfunktion, die eine Partition basierend auf Werten oder Wertebereichen in einer Spalte in einer Tabelle auswählt, z

create partition function F_AccPrdPart (int)
    as range left for values (
    180001                         -- Dummy value
   ,199012 ,199112 ,199212 ,199312, 199412 ,199512
   ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
   ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
   ,200812
   ,200901, 200902, 200903, 200904, 200905, 200906
   ,200907, 200908, 200909, 200910, 200911, 200912
   ,201001, 201002, 201003, 201004, 201005, 201006
   ,201007, 201008, 201009, 201010, 201011, 201012
   ,201101, 201102, 201103, 201104, 201105, 201106
   ,201107, 201108, 201109, 201110, 201111, 201112
   ,202012
   ,939999                         -- Dummy value
)
go

Erstellen Sie dann eine oder mehrere Dateigruppen, denen die Partitionen zugewiesen werden sollen. Für einen großen Datensatz können diese Dateigruppen auf verschiedenen physischen Volumes eingerichtet werden. Beachten Sie, dass Direct Attach Storage in fast allen Fällen viel schneller ist als ein SAN. Im folgenden Beispiel hätten wir 6 Dateigruppen mit dem Namen PartVol1-PartVol6 erstellt.

Ein oder mehrere Partitionsschemata können erstellt werden, um Tabellenpartitionen Dateigruppen basierend auf dem Wert der Partitionsfunktion zuzuweisen, z

create partition S_AccPrdPart as partition F_AccPrdPart
    TO ([PRIMARY]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6] 
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2]
      ,[PRIMARY]
      ,[PRIMARY])
go

Dieses Schema ist für die Aufteilung auf einen Abrechnungszeitraum ausgelegt. Dafür werden auch häufig Daten verwendet, obwohl jeder Schlüssel verwendet werden könnte.

Sie können eine Tabelle im Partitionsschema erstellen, als wäre es eine Dateigruppe, z

Create table FooTrans (
       FooTransID        int identity (1,1) not null
      ,AccPeriod         int not null
      ,[...]
) on S_AccPrdPart (AccPeriod)
go

Beachten Sie, dass die Tabelle im Partitionsschema anstelle einer angegebenen Dateigruppe erstellt wird und die Klausel die Spalte angibt, die als Partitionsschlüssel verwendet werden soll. Basierend auf dem Partitionsschlüssel werden die Zeilen in der Tabelle einer der Dateigruppen im Partitionsschema zugewiesen.

Hinweis: Als Faustregel für das Entwerfen eines Partitionsschemas gilt, dass jede Partition eine Zeilenzahl in den unteren 10er-Schritten von Millionen aufweisen sollte, z. B. zwischen 10 und 50 Millionen, abhängig von der Breite der Zeilen. Das Laufwerk, auf dem sich die Partition befindet, sollte schnell genug sein, um in wenigen Sekunden mindestens eine einzelne Partition zu scannen.

Partitionierungs-, Sharding- und Shared Nothing-Systeme

Ein wenig Terminologie scheint hier angebracht, um einen Teil der Diskussion zu diesem Thema zu disambiguieren.

  • Ein System ohne gemeinsame Nutzung ist ein Parallelsystem, bei dem die Knoten keinen gemeinsamen SAN-Speicher haben, sondern den für den Knoten lokalen Speicher verwenden. Das klassische Beispiel für diese Art von Architektur ist Teradata. Shared-nothing-Systeme lassen sich gut auf sehr große Datenmengen skalieren, da sie keine zentralen E / A-Engpässe aufweisen. Der E / A-Durchsatz skaliert mit der Anzahl der Knoten im System.

  • Ein "Shared Disk" -System ist eines, bei dem sich ein oder mehrere Datenbankserver ein einziges Plattenspeichersubsystem teilen. Die Datenbank kann ein einzelner Server mit lokalem Speicher oder mit einem SAN verbunden sein oder ein Cluster von Servern, die mit einem gemeinsam genutzten SAN verbunden sind. Systeme dieses Typs sind durch den vom Speichersubsystem verfügbaren Durchsatz beschränkt.

  • "Sharding" ist ein Begriff, der das Aufteilen einer Datenbank auf mehrere physische Server in einer Architektur ohne gemeinsame Nutzung beschreibt. Auf verschiedenen Plattformen werden Sharded-Datenbanken mehr oder weniger unterstützt. In Teradata-Kreisen wird der Begriff nicht verwendet, da Teradata den Clients ein transparentes einzelnes System-Image präsentiert, obwohl die physische Architektur ein gemeinsam genutzter Nichts-Typ ist.

    Ältere Versionen von SQL Server unterstützen das Sharding durch verteilte partitionierte Ansichten nur eingeschränkt. Microsoft stellt jetzt eine Version von SQL Server 2008 R2 zur Verfügung, die eine Shared-Nothing-Architektur mit einem einzelnen System-Image unterstützt. Diese Version ist jedoch nur für OEMs verfügbar und kann nur in einem Hardware-Bundle erworben werden.

Für 1 Milliarde Zeilen

Für 1 Milliarde Zeilen (es sei denn, die einzelnen Zeilen sind extrem breit) befindet sich eine gemeinsam genutzte Nichts- oder Splitterarchitektur im Bereich des Overkills. Dieser Datenträgertyp kann auf einem einzelnen Server mit angemessenen Spezifikationen verarbeitet werden, wenn er über ein ausreichend schnelles Festplattensubsystem verfügt.

Local Direct Attach Disk ist im Hinblick auf den Preis für die Leistung bei weitem am kostengünstigsten. Ein einzelner SAS-RAID-Controller kann mehrere Arrays aufnehmen, und mehrere Controller können auf einem Server installiert werden. Abhängig von der Konfiguration kann ein modernes SAS-Array mit 24 bis 25 Steckplätzen Tausende von IOPS- oder 1 GB + / Sek. -Streaming-Leistungen erbringen. Ein Server mit mehreren PCI-E-Bussen und mehreren Controllern kann theoretisch mehr verarbeiten.

Die Leistung, die für die Arbeit mit einer Datenbank mit 1 Milliarde Zeilen erforderlich ist, lässt sich mit Standard-Serverhardware und direktem Attach-Speicher dieses Typs recht einfach und kostengünstig erzielen. Es könnte auch ein SAN verwendet werden, aber Sie benötigen möglicherweise mehrere SAN-Controller, um die gleiche Leistung zu erzielen, und die Hardware ist wahrscheinlich um eine Größenordnung teurer.

Verwenden Sie als allgemeine Empfehlung Direct Attach Storage für Anwendungen mit hohen E / A-Anforderungen, es sei denn, Sie benötigen eine wirklich gute Betriebszeit. Konfigurations- und Änderungskontrollfehler sind eine weitaus größere Ursache für ungeplante Ausfallzeiten als Hardwarefehler in modernen Rechenzentrumsbetrieben.

SANs bieten Ihnen eine besser verwaltbare Speicherplattform, wenn Sie über ein großes Portfolio an Anwendungen verfügen, da sie eine Reihe zentralisierter Speichermanagementfunktionen bieten. Dies ist jedoch mit einem hohen Preis verbunden, und es ist schwierig und teuer, eine hohe Leistung aus einer SAN-basierten Infrastruktur zu ziehen.

1 Microsoft stellt eine parallele Version von SQL Server her, die jedoch nur über OEM-Kanäle verfügbar ist, die mit Hardware gebündelt sind. Die im Handel erhältlichen Versionen unterstützen diese Funktion nicht.

Betroffen vonTunbridgeWells
quelle
3
Wow - erstaunliche Antwort, ich denke, das ist alles, was ich brauche, um dieses Projekt zum Laufen zu bringen.