MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Kumpulan replika regional MongoDb - simpul utama di setiap wilayah?

Terima kasih @avanti, @MarkusWMalhberg - merenungkan bagaimana menanggapi komentar mendorong saya ke arah yang benar. Ini membutuhkan sedikit waktu untuk menyatukannya sehingga saya akan sedikit bertele-tele menjelaskan konfigurasinya.

Ringkasan

Berfokus pada pengalaman pengguna, kami ingin membuat konfigurasi database Mongo yang memungkinkan pembacaan dan penulisan terjadi paling dekat dengan pengguna.

Asumsi

  • Pengguna hampir selalu membaca dan menulis dokumen di wilayah mereka dan tidak keberatan jika pembacaan yang jarang ke data wilayah lain lebih lambat.
  • Setiap dokumen berisi kunci yang menunjukkan wilayahnya (untuk kesederhanaan/kejelasan)

Sebagian besar dokumentasi sharding berfokus pada HA/DR. Dengan pengalaman pengguna dan kepatuhan regional, fokusnya adalah pada lokalitas, bukan distribusi beban.

Contoh ini akan sepenuhnya mengabaikan HA/DR, membaca preferensi, dan menulis masalah tetapi ini perlu ditangani jika POC matang. Contoh mengabaikan ini demi kejelasan memenuhi tujuan:baca/tulis lokal.

Referensi

Trik

Kami tahu

  • Kami menginginkan satu database aplikasi sehingga semua data tersedia
  • Kami ingin pengguna membaca/menulis secara lokal sehingga kami memerlukan database di dekat setiap grup pengguna; kami membutuhkan satu set replika
  • Penulisan hanya dapat dilakukan pada node kumpulan replika utama, jadi, untuk mendapatkan node utama di sebelah setiap grup pengguna, kita memerlukan beberapa replika; kluster yang di-shard

Dalam pengetahuan ReplicaSet dan Sharding standar, ada 2 kunci untuk konfigurasi ini:

  • Tetapkan prioritas ke node ReplicaSet lokal regional untuk memastikannya menjadi yang utama.
  • Gunakan penandaan kunci shard yang sadar lokasi untuk memastikan data ditulis ke shard lokal

Kunci shard dapat berupa apa saja:kami hanya peduli dengan pengguna yang dapat membaca/menulis secara lokal, berbeda dengan pembagian beban yang efektif.

Setiap koleksi harus di-sharding, atau penulisan akan menjadi shard nol.

Konfigurasi yang diinginkan

Konfigurasi

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

Pengujian

Pastikan konfigurasi kita benar dengan sh.status() . Pecahan catatan ditetapkan dan diberi tag dengan benar, dan kunci pecahan regional ditetapkan dengan benar.

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

Verifikasi bahwa penulisan dilakukan pada pecahan kanan dan utama.Buat catatan di setiap wilayah

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

Anda dapat masuk ke setiap anggota dari setiap kumpulan replika dan melihat pengguna timur hanya di pecahan AS-Timur dan pengguna barat hanya di pecahan AS-Barat.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. (MongoDB Compass) pencarian menggunakan biarkan tidak berfungsi

  2. Elemen array pembaruan dokumen MongoDB menggunakan metode findOneAndUpdate di Java

  3. Hitung jumlah contoh string dalam bidang di seluruh dokumen yang dikelompokkan di bidang lain di MongoDB?

  4. Bagaimana agregasi MongoDB di Node.js

  5. Basis data NoSQL - kandidat yang baik untuk pemrosesan log/agregasi dan rollup?