sql >> Database >  >> NoSQL >> MongoDB

MongoDb regionale replicaset - primair knooppunt in elke regio?

Bedankt @avanti, @MarkusWMalhberg - nadenken over hoe te reageren op de opmerkingen duwde me in de goede richting. Dit kostte wat tijd om bij elkaar te komen, dus ik zal een beetje uitgebreid zijn om de configuratie uit te leggen.

Overzicht

We richten ons op de gebruikerservaring en willen een Mongo-databaseconfiguratie maken waarmee lezen en schrijven het dichtst bij de gebruiker kan plaatsvinden.

Aannames

  • Gebruikers lezen en schrijven bijna altijd documenten in hun regio en vinden het niet erg als de gegevens van een andere regio niet vaak worden gelezen.
  • Elk document bevat een sleutel die hun regio aangeeft (voor de eenvoud/duidelijkheid)

Veel van de sharding-documentatie is gericht op HA/DR. Met gebruikerservaring en regionale naleving ligt de focus op plaats in plaats van verdeling van de belasting.

In dit voorbeeld worden HA/DR, leesvoorkeuren en schrijfproblemen volledig genegeerd, maar deze moeten worden aangepakt als de POC volwassen is. Het voorbeeld negeert deze ten gunste van duidelijkheid om het doel te bereiken:lokaal lezen/schrijven.

Referenties

Tricks

We weten

  • We willen één applicatiedatabase zodat alle gegevens beschikbaar zijn
  • We willen dat gebruikers lokaal kunnen lezen/schrijven, dus we hebben een database nodig in de buurt van elke gebruikersgroep; we hebben een replicaset nodig
  • Schrijven kunnen alleen worden gemaakt naar primaire replicasetknooppunten, dus om primaire knooppunten naast elke gebruikersgroep te krijgen, hebben we meerdere replica's nodig; een geshard cluster

Binnen de standaard kennis van ReplicaSet en Sharding zijn er 2 sleutels voor deze configuratie:

  • Wijs een prioriteit toe aan het regionaal lokale ReplicaSet-knooppunt om ervoor te zorgen dat het primair wordt.
  • Gebruik locatiebewuste shard-sleuteltagging om ervoor te zorgen dat gegevens naar lokale shards worden geschreven

Shard-sleutels kunnen van alles zijn:we houden ons alleen bezig met gebruikers die lokaal kunnen lezen/schrijven, in tegenstelling tot effectieve load-sharing.

Elke verzameling moet worden geshard, anders gaan schrijfacties naar shard nul.

Gewenste configuratie

De configuratie

#!/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

Testen

Controleer of onze configuratie correct is met sh.status() . Notitiescherven zijn correct toegewezen en tags en regionale shardsleutels zijn correct toegewezen.

[[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
}

Controleer of er naar de juiste shard en de juiste shard is geschreven. Maak een record in elke regio

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

U kunt zich aanmelden bij elk lid van elke replicaset en de oost-gebruiker alleen zien op de US-East-shard en de west-gebruiker alleen op de US-West-shard.



  1. Veld van array-element toevoegen in MongoDB-aggregatie

  2. Belangrijkste verschillen/kenmerken van de meest bekende NoSQL-systemen

  3. Mongoose Virtuals in MongoDB Aggregate

  4. Duw waarden in de array van mongodb-database via (sails js) waterlijn