准备目录
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")