MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tập bản sao khu vực MongoDb - nút chính trong mỗi khu vực?

Cảm ơn @avanti, @MarkusWMalhberg - cân nhắc cách trả lời các nhận xét đã đẩy tôi đi đúng hướng. Điều này mất một chút để tổng hợp lại vì vậy tôi sẽ giải thích một chút chi tiết về cấu hình.

Tổng quan

Tập trung vào trải nghiệm người dùng, chúng tôi muốn tạo cấu hình cơ sở dữ liệu Mongo cho phép đọc và ghi diễn ra gần nhất với người dùng.

Các giả định

  • Người dùng hầu như luôn đọc và viết tài liệu trong khu vực của họ và không phiền nếu dữ liệu của khu vực khác đọc thường xuyên chậm hơn.
  • Mỗi tài liệu chứa một khóa cho biết khu vực của chúng (để đơn giản / rõ ràng)

Phần lớn tài liệu về sharding tập trung vào HA / DR. Với trải nghiệm người dùng và sự tuân thủ theo khu vực, trọng tâm là địa phương thay vì phân phối tải.

Ví dụ này sẽ hoàn toàn bỏ qua HA / DR, các tùy chọn đọc và viết các mối quan tâm nhưng chúng cần được giải quyết nếu POC đã đáo hạn. Ví dụ bỏ qua những điều này vì sự rõ ràng đáp ứng mục tiêu:đọc / ghi cục bộ.

Tài liệu tham khảo

Thủ thuật

Chúng tôi biết

  • Chúng tôi muốn có một cơ sở dữ liệu ứng dụng để tất cả dữ liệu đều có sẵn
  • Chúng tôi muốn người dùng đọc / ghi cục bộ vì vậy chúng tôi cần một cơ sở dữ liệu gần mỗi nhóm người dùng; chúng ta cần một tập hợp bản sao
  • Ghi chỉ có thể được thực hiện cho các nút tập hợp bản sao chính, vì vậy, để có được các nút chính bên cạnh mỗi nhóm người dùng, chúng ta cần nhiều bản sao; một cụm phân đoạn

Trong kiến ​​thức ReplicaSet và Sharding tiêu chuẩn, có 2 chìa khóa cho cấu hình này:

  • Chỉ định mức độ ưu tiên cho nút ReplicaSet cục bộ theo khu vực để đảm bảo nút này trở thành nút chính.
  • Sử dụng gắn thẻ khóa phân đoạn nhận biết vị trí để đảm bảo dữ liệu được ghi vào các phân đoạn cục bộ

Các khóa phân đoạn có thể là bất kỳ thứ gì:chúng tôi chỉ quan tâm đến việc người dùng có thể đọc / ghi cục bộ ngược lại với việc chia sẻ tải hiệu quả.

Mỗi bộ sưu tập sẽ phải được phân đoạn, hoặc các lần ghi sẽ chuyển đến phân đoạn bằng không.

Cấu hình mong muốn

Cấu hình

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

Thử nghiệm

Xác minh cấu hình của chúng tôi là đúng với sh.status() . Các phân đoạn ghi chú được chỉ định chính xác và các thẻ cũng như các khóa phân đoạn khu vực được chỉ định chính xác.

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

Xác minh ghi được thực hiện cho đúng phân đoạn và chính. Tạo bản ghi trong từng khu vực

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

Bạn có thể đăng nhập vào từng thành viên của mỗi nhóm bản sao và chỉ thấy người dùng phía đông trên phân đoạn Đông Hoa Kỳ và người dùng phương tây chỉ trên phân đoạn Hoa Kỳ-Tây.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Spring Boot và cách cấu hình chi tiết kết nối với MongoDB?

  2. Tìm kiếm trong MongoDB cho từng mệnh lệnh trong danh sách trong bộ sưu tập

  3. Không thể tra cứu bản ghi TXT cho máy chủ Cluster0-XXXXX.mongodb.net

  4. mongoexport lỗi phân tích cú pháp JSON

  5. Mongoose chọn các trường phụ