MongoDB sharding 架設 (Bitnami yaml 產生器)

Posted on Sun, Jan 23, 2022 MongoDB Docker

所需知識

yaml檔案撰寫環境

OS

Tools

架設環境

MongoDB Sharding架構

筆者使用1個mongos,1個僅有primary的cfg,2個PSA Shards。

1 Router, 1 Config server, 2 PSA

docker-compose.yaml 撰寫

安裝docker-compose.yaml產生器

請確定環境已有npm來安裝產生器

npm install -g mongodb-sharding-bitnami-yaml-generator

撰寫docker-compose.yaml產生器設定檔

{
    "generator": {
        "projectName": "", //e.g. `hello` 將會產生`hello-mongodb-monogos`service名稱,空白則產生`mongodb-mongos`
        "shardCount": 1, //要產生的shard數量
        "useSameShardConfig": true //是否所有shard都用與第一項一樣的設定(PSA,PSS),如果為否,請在`shards`設定與`shardCount`數量一樣的設定
    },
    "mongos": {
        "replicaSetKey": "replicaSet123", //請設定至少5個字,並不包含特殊字元。
        "rootPassword": "password" //密碼
    },
    "shards": [
        {
            "secondaryCount": 1, //secondary的數量
            "enableArbiter": true //是否要有arbiter
        }
    ],
    "cfg": {
        "secondaryCount": 0 //secondary的數量
    }
}

執行docker-compose.yaml產生器

mongodb-sharding-bitnami-yaml-generator -c mongo-sharding.config.json -o docker-compose.yaml

產生之docker-compose.yaml

version: '3.4'
services:
  mongodb-mongos:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-mongos
      - MONGODB_SHARDING_MODE=mongos
      - MONGODB_CFG_PRIMARY_HOST=mongodb-cfg-primary
      - MONGODB_CFG_REPLICA_SET_NAME=replicaSet-cfg
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_ROOT_PASSWORD=password
    volumes:
      - ./mongodb-shard/mongos-data:/bitnami
    ports:
      - '27017:27017'
  mongodb-cfg-primary:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-cfg-primary
      - MONGODB_SHARDING_MODE=configsvr
      - MONGODB_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=primary
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-cfg
    volumes:
      - ./mongodb-shard/cfg-data:/bitnami
  mongodb-shard0-primary:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-shard0-primary
      - MONGODB_SHARDING_MODE=shardsvr
      - MONGODB_MONGOS_HOST=mongodb-mongos
      - MONGODB_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=primary
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-shard0
    volumes:
      - ./mongodb-shard/shard0-primary-data:/bitnami
  mongodb-shard0-secondary0:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-shard0-secondary0
      - MONGODB_SHARDING_MODE=shardsvr
      - MONGODB_MONGOS_HOST=mongodb-mongos
      - MONGODB_INITIAL_PRIMARY_HOST=mongodb-shard0-primary
      - MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
      - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=secondary
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-shard0
    volumes:
      - ./mongodb-shard/shard0-secondary0-data:/bitnami
  mongodb-shard0-arbiter:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-shard0-arbiter
      - MONGODB_SHARDING_MODE=shardsvr
      - MONGODB_MONGOS_HOST=mongodb-mongos
      - MONGODB_INITIAL_PRIMARY_HOST=mongodb-shard0-primary
      - MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
      - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=arbiter
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-shard0
    volumes:
      - ./mongodb-shard/shard0-arbiter-data:/bitnami
  mongodb-shard1-primary:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-shard1-primary
      - MONGODB_SHARDING_MODE=shardsvr
      - MONGODB_MONGOS_HOST=mongodb-mongos
      - MONGODB_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=primary
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-shard1
    volumes:
      - ./mongodb-shard/shard1-primary-data:/bitnami
  mongodb-shard1-secondary0:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-shard1-secondary0
      - MONGODB_SHARDING_MODE=shardsvr
      - MONGODB_MONGOS_HOST=mongodb-mongos
      - MONGODB_INITIAL_PRIMARY_HOST=mongodb-shard1-primary
      - MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
      - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=secondary
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-shard1
    volumes:
      - ./mongodb-shard/shard1-secondary0-data:/bitnami
  mongodb-shard1-arbiter:
    image: docker.io/bitnami/mongodb-sharded:4.4
    environment:
      - MONGODB_ADVERTISED_HOSTNAME=mongodb-shard1-arbiter
      - MONGODB_SHARDING_MODE=shardsvr
      - MONGODB_MONGOS_HOST=mongodb-mongos
      - MONGODB_INITIAL_PRIMARY_HOST=mongodb-shard1-primary
      - MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
      - MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password
      - MONGODB_REPLICA_SET_MODE=arbiter
      - MONGODB_REPLICA_SET_KEY=replicaSet123
      - MONGODB_REPLICA_SET_NAME=replicaSet-shard1
    volumes:
      - ./mongodb-shard/shard1-arbiter-data:/bitnami

架設

docker-compose.yaml寫完了,開始來啟動mongodb-sharding的服務吧。

新建volume資料夾

ℹ️

(ie. mkdir [directory] && chown 1001:1001 [directory] && chmod 777 [directory]) to all directories.

mkdir mongodb-shard && mkdir mongodb-shard/mongos-data \
mongodb-shard/cfg-data \
mongodb-shard/shard0-primary-data \
mongodb-shard/shard0-secondary0-data \
mongodb-shard/shard0-arbiter-data \
mongodb-shard/shard1-primary-data \
mongodb-shard/shard1-secondary0-data \
mongodb-shard/shard1-arbiter-data
chown -R 1001:1001 mongodb-shard && chmod -R 777 mongodb-shard

啟動服務

docker-compose up

結果

可以看到各元件都已經運行中

測試Sharding

use users
sh.enableSharding("users")
sh.shardCollection("users.users" , {
    _id : "hashed"
})
for(var i=1;i<10000; i++) {
    db.users.insert({
        userid:"user_"+i,
        username:"name_"+i,
        age: NumberInt(_rand()*100)
    })
}
use users
db.users.getShardDistribution()

參考資料