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 mongoInitialize replica sets
Config servers (run once):
bash
docker exec -it $(docker ps -q --filter name=mongo-config-eu) mongosh --host mongo-config-eu:27019js
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:27018js
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:27017js
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}:27017This keeps API traffic local to the region.