Skip to content

MongoDB (Sharded, multi-region)

This setup runs a single sharded MongoDB cluster across the three regions and keeps user-centric collections pinned by homeRegion.

Deploy

From the swarm manager:

bash
export MONGO_DATA_ROOT=/var/lib/uebliche/mongo

docker stack deploy -c docker-stack-mongo.yml mongo

Initialize replica sets

Config servers (run once):

bash
docker exec -it $(docker ps -q --filter name=mongo-config-eu) mongosh --host mongo-config-eu:27019
js
rs.initiate({
  _id: "config-rs",
  configsvr: true,
  members: [
    { _id: 0, host: "mongo-config-eu:27019" },
    { _id: 1, host: "mongo-config-us:27019" },
    { _id: 2, host: "mongo-config-ap:27019" }
  ]
})

Shard replica sets (run once per region):

bash
docker exec -it $(docker ps -q --filter name=mongo-shard-eu) mongosh --host mongo-shard-eu:27018
js
rs.initiate({ _id: "shard-eu", members: [ { _id: 0, host: "mongo-shard-eu:27018" } ] })

Repeat for shard-us and shard-ap with the matching hostnames.

Add shards + shard collections

Connect to a mongos:

bash
docker exec -it $(docker ps -q --filter name=mongos-eu) mongosh --host mongos-eu:27017
js
sh.addShard("shard-eu/mongo-shard-eu:27018")
sh.addShard("shard-us/mongo-shard-us:27018")
sh.addShard("shard-ap/mongo-shard-ap:27018")

sh.addShardTag("shard-eu", "eu")
sh.addShardTag("shard-us", "us")
sh.addShardTag("shard-ap", "ap")

sh.enableSharding("uebliche")

sh.shardCollection("uebliche.user", { homeRegion: 1, _id: 1 })
sh.shardCollection("uebliche.friends", { homeRegion: 1, userId: 1 })
sh.shardCollection("uebliche.friend_requests", { homeRegion: 1, recipientId: 1 })
sh.shardCollection("uebliche.public_server_favorites", { homeRegion: 1, userId: 1 })

sh.addTagRange("uebliche.user", { homeRegion: "eu", _id: MinKey }, { homeRegion: "eu", _id: MaxKey }, "eu")
sh.addTagRange("uebliche.user", { homeRegion: "us", _id: MinKey }, { homeRegion: "us", _id: MaxKey }, "us")
sh.addTagRange("uebliche.user", { homeRegion: "ap", _id: MinKey }, { homeRegion: "ap", _id: MaxKey }, "ap")

sh.addTagRange("uebliche.friends", { homeRegion: "eu", userId: MinKey }, { homeRegion: "eu", userId: MaxKey }, "eu")
sh.addTagRange("uebliche.friends", { homeRegion: "us", userId: MinKey }, { homeRegion: "us", userId: MaxKey }, "us")
sh.addTagRange("uebliche.friends", { homeRegion: "ap", userId: MinKey }, { homeRegion: "ap", userId: MaxKey }, "ap")

sh.addTagRange("uebliche.friend_requests", { homeRegion: "eu", recipientId: MinKey }, { homeRegion: "eu", recipientId: MaxKey }, "eu")
sh.addTagRange("uebliche.friend_requests", { homeRegion: "us", recipientId: MinKey }, { homeRegion: "us", recipientId: MaxKey }, "us")
sh.addTagRange("uebliche.friend_requests", { homeRegion: "ap", recipientId: MinKey }, { homeRegion: "ap", recipientId: MaxKey }, "ap")

sh.addTagRange("uebliche.public_server_favorites", { homeRegion: "eu", userId: MinKey }, { homeRegion: "eu", userId: MaxKey }, "eu")
sh.addTagRange("uebliche.public_server_favorites", { homeRegion: "us", userId: MinKey }, { homeRegion: "us", userId: MaxKey }, "us")
sh.addTagRange("uebliche.public_server_favorites", { homeRegion: "ap", userId: MinKey }, { homeRegion: "ap", userId: MaxKey }, "ap")

API connectivity

In the public-api stack, MONGODB_URI is set to:

mongodb://mongos-${PUBLIC_API_REGION}:27017

This keeps API traffic local to the region.