Mongo6 分片集群(单机)

4 阅读5分钟

准备目录

mkdir -p /root/Mongo6_Sharding
chmod 777 -R /root/Mongo6_Sharding
cd /root/Mongo6_Sharding
# 生成证书
openssl rand -base64 128 > /root/Mongo6_Sharding/keyFile
chmod 600 /root/Mongo6_Sharding/keyFile

搭建Config Server

# 创建目录并拷贝证书
sudo mkdir -p /root/Mongo6_Sharding/mongo6-config-0/db
sudo mkdir -p /root/Mongo6_Sharding/mongo6-config-0/configdb
sudo chmod -R 777 /root/Mongo6_Sharding/mongo6-config-0
cp -a /root/Mongo6_Sharding/keyFile /root/Mongo6_Sharding/mongo6-config-0/configdb/
# 配置文件
cat > /root/Mongo6_Sharding/mongo6-config-0/configdb/mongod.conf <<EOF
net:
  port: 21000
  bindIpAll: true
 
security:
  keyFile: /data/configdb/keyFile
  authorization: enabled
 
replication:
   replSetName: rs-conf-0
 
sharding:
   clusterRole: configsvr
 
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5
EOF

搭建Shard-0

# 创建目录并拷贝证书
mkdir -p /root/Mongo6_Sharding/mongo6-shard-0/db
mkdir -p /root/Mongo6_Sharding/mongo6-shard-0/configdb
chmod -R 777 /root/Mongo6_Sharding/mongo6-shard-0
cp -a /root/Mongo6_Sharding/keyFile /root/Mongo6_Sharding/mongo6-shard-0/configdb/

# 配置文件
cat > /root/Mongo6_Sharding/mongo6-shard-0/configdb/mongod.conf <<EOF
net:
  port: 22000
  bindIpAll: true
 
security:
  keyFile: /data/configdb/keyFile
  authorization: enabled
 
replication:
   replSetName: rs-shard-0
 
sharding:
   clusterRole: shardsvr 
 
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5
EOF

搭建Shard-1

# 创建目录并拷贝证书
mkdir -p /root/Mongo6_Sharding/mongo6-shard-1/db
mkdir -p /root/Mongo6_Sharding/mongo6-shard-1/configdb
chmod -R 777 /root/Mongo6_Sharding/mongo6-shard-1
cp -a /root/Mongo6_Sharding/keyFile /root/Mongo6_Sharding/mongo6-shard-1/configdb/

# 配置文件
cat > /root/Mongo6_Sharding/mongo6-shard-1/configdb/mongod.conf <<EOF
net:
  port: 23000
  bindIpAll: true
 
security:
  keyFile: /data/configdb/keyFile
  authorization: enabled
 
replication:
   replSetName: rs-shard-1
 
sharding:
   clusterRole: shardsvr 
 
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5
EOF

搭建Shard-2

# 创建目录并拷贝证书
mkdir -p /root/Mongo6_Sharding/mongo6-shard-2/db
mkdir -p /root/Mongo6_Sharding/mongo6-shard-2/configdb
chmod -R 777 /root/Mongo6_Sharding/mongo6-shard-2
cp -a /root/Mongo6_Sharding/keyFile /root/Mongo6_Sharding/mongo6-shard-2/configdb/
# 配置文件
cat > /root/Mongo6_Sharding/mongo6-shard-2/configdb/mongod.conf <<EOF
net:
  port: 24000
  bindIpAll: true
 
security:
  keyFile: /data/configdb/keyFile
  authorization: enabled
 
replication:
   replSetName: rs-shard-2
 
sharding:
   clusterRole: shardsvr 
 
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5
EOF

搭建Mongos-0

# 创建目录并拷贝证书
mkdir -p /root/Mongo6_Sharding/mongos6-0/db
mkdir -p /root/Mongo6_Sharding/mongos6-0/configdb
chmod -R 777 /root/Mongo6_Sharding/mongos6-0
cp -a /root/Mongo6_Sharding/keyFile /root/Mongo6_Sharding/mongos6-0/configdb/
chown 999 /root/Mongo6_Sharding/mongos6-0/configdb/keyFile

# 配置文件
cat > /root/Mongo6_Sharding/mongos6-0/configdb/mongos.conf <<EOF
net:
  port: 27027
  bindIpAll: true
 
security:
  keyFile: /data/configdb/keyFile
 
 
sharding:
   configDB: rs-conf-0/172.19.40.9:21000
 
EOF

docker-compose

# 创建并启动
version: '3.8'
services:
  mongo6-config-0:
    container_name: mongo6-config-0
    image: mongo:6
    restart: always
    network_mode: host
    volumes:
      - /root/Mongo6_Sharding/mongo6-config-0/db:/data/db
      - /root/Mongo6_Sharding/mongo6-config-0/configdb:/data/configdb
      - /etc/localtime:/etc/localtime:ro
    command: mongod -f /data/configdb/mongod.conf

  mongo6-shard-0:
    container_name: mongo6-shard-0
    image: mongo:6
    restart: always
    network_mode: host
    volumes:
      - /root/Mongo6_Sharding/mongo6-shard-0/db:/data/db
      - /root/Mongo6_Sharding/mongo6-shard-0/configdb:/data/configdb
      - /etc/localtime:/etc/localtime:ro
    command: mongod -f /data/configdb/mongod.conf

  mongo6-shard-1:
    container_name: mongo6-shard-1
    image: mongo:6
    restart: always
    network_mode: host
    volumes:
      - /root/Mongo6_Sharding/mongo6-shard-1/db:/data/db
      - /root/Mongo6_Sharding/mongo6-shard-1/configdb:/data/configdb
      - /etc/localtime:/etc/localtime:ro
    command: mongod -f /data/configdb/mongod.conf

  mongo6-shard-2:
    container_name: mongo6-shard-2
    image: mongo:6
    restart: always
    network_mode: host
    volumes:
      - /root/Mongo6_Sharding/mongo6-shard-2/db:/data/db
      - /root/Mongo6_Sharding/mongo6-shard-2/configdb:/data/configdb
      - /etc/localtime:/etc/localtime:ro
    command: mongod -f /data/configdb/mongod.conf

  mongos6-0:
    container_name: mongos6-0
    image: mongo:6
    restart: always
    network_mode: host
    volumes:
      - /root/Mongo6_Sharding/mongos6-0/db:/data/db
      - /root/Mongo6_Sharding/mongos6-0/configdb:/data/configdb
      - /etc/localtime:/etc/localtime:ro
    command: mongos -f /data/configdb/mongos.conf

初始化Config Server

#进入容器
docker exec -it mongo6-config-0 /bin/bash
#进入mongo
mongosh --port 21000
#切换到admin数据库
use admin
#初始confi server复制集配置
rs.initiate(
  {
    _id: "rs-conf-0",
    members: [
      { _id : 0, host : "172.19.40.9:21000"}
    ]
  }
)
db.createUser(
  {
    user: "admin",
    pwd: "123456",
    roles: [ { role: "root", db: "admin" } ]
  }
);

初始化shard-0复制集

#进入容器
docker exec -it mongo6-shard-0 /bin/bash
#进入mongo
mongosh --port 22000
#切换到admin数据库
use admin
#初始confi server复制集配置
rs.initiate(
  {
    _id: "rs-shard-0",
    members: [
      { _id : 0, host : "172.19.40.9:22000"}
    ]
  }
)
db.createUser(
  {
    user: "admin",
    pwd: "123456",
    roles: [ { role: "root", db: "admin" } ]
  }
);

初始化shard-1复制集

#进入容器
docker exec -it mongo6-shard-1 /bin/bash
#进入mongo
mongosh --port 23000
#切换到admin数据库
use admin
#初始confi server复制集配置
rs.initiate(
  {
    _id: "rs-shard-1",
    members: [
      { _id : 0, host : "172.19.40.9:23000"}
    ]
  }
)
 
 
db.createUser(
  {
    user: "admin",
    pwd: "123456",
    roles: [ { role: "root", db: "admin" } ]
  }
);

初始化shard-2复制集

#进入容器
docker exec -it mongo6-shard-2 /bin/bash
#进入mongo
mongosh --port 24000
#切换到admin数据库
use admin
#初始confi server复制集配置
rs.initiate(
  {
    _id: "rs-shard-2",
    members: [
      { _id : 0, host : "172.19.40.9:24000"}
    ]
  }
)
 
db.createUser(
  {
    user: "admin",
    pwd: "123456",
    roles: [ { role: "root", db: "admin" } ]
  }
);

初始化mongos-0配置文件

#登录mongos-0,进行分片配置
#进入容器
docker exec -it mongos6-0 /bin/bash
#进入mongo
mongosh --port 27027
#切换到admin数据库
use admin
#登录
db.auth('admin','123456')
#添加分片
sh.addShard("rs-shard-0/172.19.40.9:22000");
sh.addShard("rs-shard-1/172.19.40.9:23000");
sh.addShard("rs-shard-2/172.19.40.9:24000");

#对指定库进行分片
sh.enableSharding("testdb")
 
# 使用hash分片键
sh.shardCollection('testdb.collection', {'field':'hashed'})

#移除分片
db.adminCommand(
   {
     removeShard : <shardToRemove>
   }
)

#分片集群中的每个数据库都有一个主分片。如果您要删除的分片也是集群数据库之一的主分片,则在迁移分片中的所有数据后,您必须手动将数据库移至新分片。
#当您删除集群中块分布不均匀的分片时,平衡器首先从排出分片中删除块,然后平衡剩余的不均匀块分布。

分片相关命令,在mongos上使用

# 启用数据库分片:
sh.enableSharding("<database>")
 
# 使用hash分片键
sh.shardCollection('db.collection', {'field':'hashed'})
 
# 使用递增分片键
sh.shardCollection('db.collection', { field: 1})
 
# 查看分片是否成功
db.collection.stats().sharded
 
# 查看数据分布
db.collection.getShardDistribution()

设置平衡器运行窗口时间

use config
 
#设置平衡器窗口时间
db.settings.updateOne(
   { _id: "balancer" },
   { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } },
   { upsert: true }
);

#将<开始时间>和<结束时间>替换为使用两位数小时和分钟值(即HH:MM)的时间值,该值指定平衡窗口的开始和结束边界。
#对于HH值,使用00-23之间的小时值。
#对于MM值,请使用00-59之间的分钟值。
#对于内部部署或自管理的分片集群,MongoDB评估相对于配置服务器副本集中主要成员的时区的开始和停止时间。
#块只有在到达指定大小才会进行分裂,默认128MB

#获取平衡器状态
sh.getBalancerState()

#启动平衡器
sh.startBalancer()

#停止平衡器
sh.stopBalancer()

分片操作相关命令

#获取所有分片相关信息
db.runCommand("getShardMap")