MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Набор от регионални реплики на MongoDb - основен възел във всеки регион?

Благодаря @avanti, @MarkusWMalhberg - обмислянето как да отговоря на коментарите ме тласна в правилната посока. Това отне малко време, за да се събере, така че ще бъда малко подробен, обяснявайки конфигурацията.

Общ преглед

Фокусирайки се върху потребителското изживяване, ние искаме да създадем конфигурация на база данни на Mongo, която позволява четене и запис да се извършват най-близо до потребителя.

Предположения

  • Потребителите почти винаги четат и пишат документи в своя регион и нямат нищо против, ако редките четения на данни в друг регион са по-бавни.
  • Всеки документ съдържа ключ, който показва техния регион (за простота/яснота)

Голяма част от документацията за шардинг се фокусира върху HA/DR. С потребителското изживяване и регионалното съответствие фокусът е върху локалността вместо върху разпределението на товара.

Този пример напълно ще игнорира проблемите с HA/DR, предпочитанията за четене и писане, но те трябва да бъдат разгледани, ако POC е узрял. Примерът ги игнорира в полза на яснотата, отговаряща на целта:локално четене/запис.

Препратки

Трикове

Ние знаем

  • Искаме една база данни за приложения, така че всички данни да са налични
  • Искаме потребителите да четат/пишат локално, така че имаме нужда от база данни близо до всяка потребителска група; имаме нужда от комплект реплики
  • Записите могат да се извършват само към основни възли на набор от реплики, така че, за да получим първични възли до всяка потребителска група, имаме нужда от множество реплики; разделен клъстер

В стандартните знания за ReplicaSet и Sharding има 2 ключа за тази конфигурация:

  • Задайте приоритет на регионално локалния възел ReplicaSet, за да сте сигурни, че ще стане основен.
  • Използвайте маркиране на ключа за шард, за да се гарантира, че данните се записват в локални шардове

Shard ключовете могат да бъдат всякакви:ние се интересуваме само от това потребителите да могат да четат/пишат локално за разлика от ефективното споделяне на натоварването.

Всяка колекция ще трябва да бъде шардирана или записите ще преминат към шард нула.

Желана конфигурация

Конфигурацията

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

Тестване

Проверете дали нашата конфигурация е правилна с sh.status() . Частите на бележките са правилно присвоени, а етикетите и регионалните ключове на фрагменти са правилно присвоени.

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

Проверете дали записите са направени в правилния шард и основния. Създайте запис във всеки регион

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

Можете да влезете във всеки член на всеки набор от реплики и да видите източния потребител само на шарда US-East и западния потребител само на сегмента US-West.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Draft.js - Не може да се получат данни от базата данни. Грешка в кръстосания произход

  2. Изпълнението на Mongodb заявка отнема твърде много време

  3. Когато защитавате формуляр за коментари и свързаната крайна точка на API, трябва ли входът да бъде дезинфекциран, валидиран и кодиран в браузър, сървър или и двете?

  4. Как да ограничите максималната референция на родителския възел в mongodb

  5. Не може да се предаде стойност на параметъра в хранилището на findOneBy Symfony