Det finns två anledningar till att använda flera noder i ett kluster:
- Sharding för att begränsa mängden data som lagras på varje nod
- Duplicering för att minska läsbelastningen och tillåta att en nod tas bort utan dataförlust.
De två är fundamentalt olika, men du kan implementera båda - använd konsekvent hash för att peka på en uppsättning noder med en standard master/slav-inställning snarare än en enda nod.
Om klustret är ditt primära datalager snarare än en cache, behöver du en annan omfördelningsstrategi som inkluderar kopiering av data.
Min implementering är baserad på att klienten väljer en av 64k buckets för en hash och har en tabell som mappar den bucket till en nod. Initialt mappas alla till nod #1.
När nod #1 blir för stor blir dess slav masternod #2 och tabellen uppdateras för att mappa hälften av nod #1-nycklarna till nod #2. Vid denna tidpunkt kommer all läsning och skrivning att fungera med den nya mappningen och du behöver bara rensa upp nycklarna som nu är på fel nod. Beroende på prestandakraven kan du kontrollera alla nycklar på en gång eller kontrollera ett slumpmässigt urval av nycklar som utgångssystemet gör.