Auswahl einer Hash-Funktion im Data-Sharding-Problem

Wir bei Miro arbeiten am Sharding von Postgres-Datenbanken und verwenden je nach Geschäftsanforderungen unterschiedliche Ansätze. Vor kurzem standen wir vor der Aufgabe, neue Datenbanken zu sharden. Dabei haben wir einen neuen Ansatz fßr das Sharding fßr uns gewählt, der auf konsistentem Hashing basiert .





Bei der Implementierung dieses Ansatzes war eine der zentralen Fragen, welche Implementierung der nicht kryptografischen Hash-Funktion wir auswählen und verwenden sollten. In diesem Artikel werde ich die Kriterien und den Vergleichsalgorithmus beschreiben, die wir entwickelt und in der Praxis verwendet haben, um die beste Implementierung zu finden.





Über den architektonischen Ansatz

Es gibt viele Produkte ( Mongo , Redis usw.), die konsistentes Hashing fßr das Sharding verwenden, und unsere Implementierung wird ihnen sehr ähnlich sein.





Lassen Sie uns an der Eingabe eine Reihe von Entitäten mit ausgewählten Sharding-SchlĂźsseln eines Zeichenfolgentyps haben. FĂźr diese SchlĂźssel erhalten wir mit der Hash-Funktion einen Hash-Code einer bestimmten Länge, fĂźr den wir den erforderlichen Slot durch die Modulo-Operation definieren. Die Anzahl der Slots und die Entsprechung von Entitäten zu Slots ist festgelegt. Es ist auch notwendig, die Entsprechung zwischen den Bereichen von Steckplätzen und Shards aufrechtzuerhalten, was keine schwierige Aufgabe ist, und eine Konfigurationsdatei ist fĂźr den Speicherort gut geeignet. 





Die Vorteile dieses Ansatzes sind:





  • gleichmäßige Verteilung der Entitäten auf die Scherben;





  • Bestimmen der Korrespondenz von Entitäten und Shards ohne zusätzlichen Speicher mit einem Minimum an Ressourcenkosten;





  • die MĂśglichkeit, dem Cluster neue Shards hinzuzufĂźgen.





Nachteile:





  • Ineffizienz einiger Suchvorgänge, bei denen Abfragen fĂźr alle Shards erforderlich sind;





  • ziemlich komplizierter Resharding-Prozess.









Bedarf 

java- -.





- , 256 , - - , 4 . - 2 4 .









-:





  1. , , ;





  2. . , , ;





  3. ( );





  4. . , .





: - ; - , . 









  , . 









java-  - -:





  1. DJB2  (32-);





  2. SDBM (32-);





  3. LoseLose (32-);





  4. FNV-1 / FNV-1a (32-);





  5. CRC16 (16-) ;





  6. Murmur2/Murmur3 (32-).













 





  1. , 216,553 ;





  2. , UTF-8.





(- ) -  "2", "4", "8", "16", "32", "64", "128", "256".





:





  1. , - ops/ms (- );





  2. - . . , - , .









JMH.  :





, 256 . - , .









  • - warmup- - 50;





  • - measurement- - 100;





  • - throughput







  • -Xms1G, -Xmx8G







  • GCProfiler





.









, Îą=0,05, . .





:





  1. , , ;





  2. -  , , ;





  3.  \ overline {x_ {b}} ,









    n — , p_ {i}— , -  









    x_ {Länge}- , a a b -





  4. ,





    \ chi_ {obs} ^ 2 = \ sum \ frac {n_ {i} - \ hat {n_ {i}}} {\ hat {n_ {i}}},





    n_ {i}- , , \ hat {n_ {i}}- , ;





  5. \ chi_ {cr} ^ 2 (\ alpha, k), Îą k ;





  6. \ chi_ {obs} ^ 2 <\ chi_ {cr} ^ 2, , — .









:









, 256. 16384, 8192, 4096, 2048, 1024, , . 





- , -. , .





.









( ) .





:





Diagramm

, , loseLose, crc16 sdbm









16 256 :





Diagramm

murmur2 , murmurcrc16 sdbm .









, crc16, murmur2, murmur3





, .





, loseLose, Djb2, Sdbm, , ,   :





Diagramm
Diagramm
Diagramm

Fnv1 Fnv1a , :





.





Diagramm
Diagramm

:





Diagramm
Diagramm
Diagramm

, crc16, murmur2, murmur3 , .





, : .





.   murmur2/murmur3 8 . 





. , : crc16, murmur2/murmur3. crc16, murmur2/murmur3.





, , murmur2/murmur3.








All Articles