sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDb regional replikuppsättning - primär nod i varje region?

Tack @avanti, @MarkusWMalhberg - att fundera över hur jag ska svara på kommentarerna knuffade mig i rätt riktning. Detta tog lite tid att få ihop så jag kommer att vara lite utförlig och förklara konfigurationen.

Översikt

Med fokus på användarupplevelsen vill vi skapa en Mongo-databaskonfiguration som gör att läsning och skrivning kan ske närmast användaren.

Antaganden

  • Användare läser och skriver nästan alltid dokument i sin region och har inget emot om sällsynta läsningar av andra regioners data är långsammare.
  • Varje dokument innehåller en nyckel som anger deras region (för enkelhetens skull)

Mycket av skärningsdokumentationen fokuserar på HA/DR. Med användarupplevelse och regional efterlevnad ligger fokus på lokalitet istället för lastfördelning.

Det här exemplet kommer att helt ignorera HA/DR, läsa preferenser och skriva problem, men dessa måste åtgärdas om POC är mognat. Exemplet ignorerar dessa till förmån för att klarhet ska uppfylla målet:lokalt läser/skriver.

Referenser

Knep

Vi vet

  • Vi vill ha en applikationsdatabas så att all data är tillgänglig
  • Vi vill att användare ska läsa/skriva lokalt så vi behöver en databas nära varje användargrupp; vi behöver ett replikset
  • Skrivningar kan endast göras till primära replikuppsättningsnoder, så för att få primära noder bredvid varje användargrupp behöver vi flera repliker; ett splittrat kluster

Inom standardkunskapen ReplicaSet och Sharding finns det två nycklar till denna konfiguration:

  • Tilldela en prioritet till den regionalt lokala ReplicaSet-noden för att säkerställa att den blir primär.
  • Använd platsmedveten shard-nyckeltaggning för att säkerställa att data skrivs till lokala shards

Shard-nycklar kan vara vad som helst:vi är bara angelägna om att användare ska kunna läsa/skriva lokalt i motsats till effektiv belastningsdelning.

Varje samling måste klippas, eller så går skrivningarna till shard noll.

Önskad konfiguration

Konfigurationen

#!/usr/bin/env bash

echo ">>> Clean up processes and files from previous runs"
echo ">>> killAll mongod mongos"
killall mongod mongos

echo ">>> Remove db files and logs"
rm -rf data
rm -rf log

# Create the common log directory
mkdir log

echo ">>> Start replica set for shard US-East"
mkdir -p data/shard-US-East/rsMemberEast data/shard-US-East/rsMemberWest
mongod --replSet shard-US-East --logpath "log/shard-US-East-rsMemberEast.log" --dbpath data/shard-US-East/rsMemberEast --port 37017 --fork --shardsvr --smallfiles
mongod --replSet shard-US-East --logpath "log/shard-US-East-rsMemberWest.log" --dbpath data/shard-US-East/rsMemberWest --port 37018 --fork --shardsvr --smallfiles

echo ">>> Sleep 15s to allow US-East replica set to start"
sleep 15

# The US-East replica set member is assigned priority 2 so that it becomes primary
echo ">>> Configure replica set for shard US-East"
mongo --port 37017 << 'EOF'
config = { _id: "shard-US-East", members:[
         { _id : 0, host : "localhost:37017", priority: 2 },
         { _id : 1, host : "localhost:37018" }]};
rs.initiate(config)
EOF

echo ">>> Start replica set for shard-US-West"
mkdir -p data/shard-US-West/rsMemberEast data/shard-US-West/rsMemberWest
mongod --replSet shard-US-West --logpath "log/shard-US-West-rsMemberEast.log" --dbpath data/shard-US-West/rsMemberEast --port 47017 --fork --shardsvr --smallfiles
mongod --replSet shard-US-West --logpath "log/shard-US-West-rsMemberWest.log" --dbpath data/shard-US-West/rsMemberWest --port 47018 --fork --shardsvr --smallfiles

echo ">>> Sleep 15s to allow US-West replica set to start"
sleep 15

# The US-West replica set member is assigned priority 2 so that it becomes primary
echo ">>> Configure replica set for shard-US-West"
mongo --port 47017 << 'EOF'
config = { _id: "shard-US-West", members:[
         { _id : 0, host : "localhost:47017" },
         { _id : 1, host : "localhost:47018", priority: 2 }]};
rs.initiate(config)
EOF

# Shard config servers: should be 3 and all must be up to deploy a shard cluster
# These are the mongos backing store for routing information
echo ">>> Start config servers"
mkdir -p data/config/config-us-east data/config/config-us-west data/config/config-redundant
mongod --logpath "log/cfg-us-east.log"   --dbpath data/config/config-us-east   --port 57040 --fork --configsvr --smallfiles
mongod --logpath "log/cfg-us-west.log"   --dbpath data/config/config-us-west   --port 57041 --fork --configsvr --smallfiles
mongod --logpath "log/cfg-redundant.log" --dbpath data/config/config-redundant --port 57042 --fork --configsvr --smallfiles

echo ">>> Sleep 5 to allow config servers to start and stabilize"
sleep 5

# All mongos's must point at the same config server, a coordinator dispatches writes to each
echo ">>> Start mongos"
mongos --logpath "log/mongos-us-east.log" --configdb localhost:57040,localhost:57041,localhost:57042 --port 27017 --fork
mongos --logpath "log/mongos-us-west.log" --configdb localhost:57040,localhost:57041,localhost:57042 --port 27018 --fork

echo ">>> Wait 60 seconds for the replica sets to stabilize"
sleep 60

# Enable sharding on the 'sales' database and 'sales.users' collection
# Every collection in 'sales' must be sharded or the writes will go to shard 0
# Add a shard tag so we can associate shard keys with the tag (region)
# Shard tag range main and max cannot be the same so we use a region id for US-East = 1
# and US-West = 2. sh.addTagRange() is inclusive of minKey and exclusive of maxKey.
# We only need to configure one mongos - config will be propogated to all mongos through
# the config server
echo ">>> Add shards to mongos"
mongo --port 27017 <<'EOF'
db.adminCommand( { addshard : "shard-US-East/"+"localhost:37017" } );
db.adminCommand( { addshard : "shard-US-West/"+"localhost:47017" } );

db.adminCommand({enableSharding: "sales"})
db.adminCommand({shardCollection: "sales.users", key: {region:1}});

sh.addShardTag("shard-US-East", "US-East")
sh.addShardTag("shard-US-West", "US-West")
sh.addTagRange("sales.users", { region: 1 }, { region: 2 }, "US-East")
sh.addTagRange("sales.users", { region: 2 }, { region: 3 }, "US-West")
EOF

Testning

Verifiera att vår konfiguration är korrekt med sh.status() . Anteckningsskärvor är korrekt tilldelade och taggar och regionala shardnycklar är korrekt tilldelade.

[[email protected] RegionalSharding 14:38:50]$ mongo --port 27017 sales
...
rakshasa(mongos-3.0.5)[mongos] sales> sh.status()
  sharding version: {
    "_id": 1,
    "minCompatibleVersion": 5,
    "currentVersion": 6,
    "clusterId": ObjectId("55fdddc5746e30dc3651cda4")
  }
  shards:
    {  "_id": "shard-US-East",  "host": "shard-US-East/localhost:37017,localhost:37018",  "tags": [   "US-East" ] }
    {  "_id": "shard-US-West",  "host": "shard-US-West/localhost:47017,localhost:47018",  "tags": [   "US-West" ] }
  balancer:
    Currently enabled:  yes
    Currently running:  no
    Failed balancer rounds in last 5 attempts:  0
    Migration Results for the last 24 hours: 
        1 : Success
  databases:
    {  "_id": "admin",  "partitioned": false,  "primary": "config" }
    {  "_id": "test",  "partitioned": false,  "primary": "shard-US-East" }
    {  "_id": "sales",  "partitioned": true,  "primary": "shard-US-East" }
    sales.users
      shard key: { "region": 1 }
      chunks:
        shard-US-East: 2
        shard-US-West: 1
        { "region": { "$minKey" : 1 } } -> { "region": 1 } on: shard-US-East Timestamp(2, 1) 
        { "region": 1 } -> { "region": 2 } on: shard-US-East Timestamp(1, 3) 
        { "region": 2 } -> { "region": { "$maxKey" : 1 } } on: shard-US-West Timestamp(2, 0) 
        tag: US-East  {
  "region": 1
} -> {
  "region": 2
}
        tag: US-West  {
  "region": 2
} -> {
  "region": 3
}

Verifiera att skrivningar görs till höger shard och primär.Skapa en post i varje region

db.users.insert({region:1, name:"us east user"})
db.users.insert({region:2, name:"us west user"})

Du kan logga in på varje medlem i varje replikuppsättning och se östanvändaren endast på US-East shard och den västra användaren endast på US-West shard.



  1. Hur tillämpar man villkor på $lookup-resultat i mongoDB?

  2. fjäderdata - Mongodb - findBy Method för kapslade objekt

  3. Dokumentdatabaser:Redundanta data, referenser etc. (MongoDB specifikt)

  4. Lagra ett JSON-schema i mongodb med spring