参考官方连接:
https://docs.mongodb.com/v3.4/
https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/
1. 首先下载 3.4版的Mongodb
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.21.tgz
注: 下文中所有的命令,均是下载解压好后在对应的bin目录下执行
2. 准备3台物理机器 ServerA (192.168.5.13) ServerB(192.168.5.12) ServerC(192.168.5.14)
在ServerA 创建文件夹 /data/shard1-1 /data/shard2-1 /data/config
在ServerB 创建文件夹 /data/shard1-2 /data/shard2-2 /data/config
在ServerC 创建文件夹 /data/shard1-3 /data/shard2-3 /data/config
注:该篇教程,启动两个Shard,下文描述分别命名为 Shard1和Shard2
3. 启动 Shard1,在ServerA, ServerB, ServerC 进入mongodb对应可执行文件目录,执行下列操作
# 在ServerA启动 Shard1-1:
./mongod --fork --shardsvr --bind_ip 0.0.0.0 --port 27018 --dbpath /data/shard1-1/ --logpath /data/shard1-1/shard1-1.log --logappend --replSet shard1 --directoryperdb
# 在ServerB上启动 Shard1-2:
./mongod --fork --shardsvr --bind_ip 0.0.0.0 --port 27018 --dbpath /data/shard1-2/ --logpath /data/shard1-2/shard1-2.log --logappend --replSet shard1 --directoryperdb
# 在 ServerC上启动 Shard1-3:
./mongod --fork --shardsvr --bind_ip 0.0.0.0 --port 27018 --dbpath /data/shard1-3/ --logpath /data/shard1-3/shard1-3.log --logappend --replSet shard1 --directoryperdb
# 选择 ServerB(任意选择一台),用 mongo 127.0.0.1:27018 进入,输入如下:
config={ _id:'shard1',members:[{_id:0,host:'192.168.5.12:27018',priority:2},{_id:1,host:'192.168.5.13:27018',priority:1},{_id:2,host:'192.168.5.14:27018',arbiterOnly:true}] }
rs.initiate(config)
4. 启动 Shard2,在ServerA, ServerB, ServerC 进入mongodb对应可执行文件目录,执行下列操作
# 在ServerA上启动 Shard2-1
./mongod --fork --shardsvr --bind_ip 0.0.0.0 --port 27019 --dbpath /data/shard2-1/ --logpath /data/shard2-1/shard2-1.log --logappend --replSet shard2 --directoryperdb
# 在ServerB上启动 Shard2-2
./mongod --fork --shardsvr --bind_ip 0.0.0.0 --port 27019 --dbpath /data/shard2-2/ --logpath /data/shard2-2/shard2-2.log --logappend --replSet shard2 --directoryperdb
# 在ServerC上启动 Shard2-3
./mongod --fork --shardsvr --bind_ip 0.0.0.0 --port 27019 --dbpath /data/shard2-3/ --logpath /data/shard2-3/shard2-3.log --logappend --replSet shard2 --directoryperdb
# 选择 ServerB(任意选择一台),用 mongo 127.0.0.1:27019 进入,输入如下:
config={ _id:'shard2',members:[{_id:0,host:'192.168.5.12:27019',priority:2},{_id:1,host:'192.168.5.13:27019',priority:1},{_id:2,host:'192.168.5.14:27019',arbiterOnly:true}] }
rs.initiate(config)
5. 配置 ConfigServer
在 ServerA,ServerB,ServerC 分别输入下面一行命令:
./mongod --configsvr --bind_ip 0.0.0.0 --port 20000 --dbpath /data/config/ --logpath /data/config/config.log --replSet docdetection --logappend --fork
# 选择 ServerB(任意选择一台),用 mongo 127.0.0.1:20000 进入,输入如下:
configdb1={ _id:'docdetection',members:[{_id:0,host:'192.168.5.14:20000',priority:3},{_id:1,host:'192.168.5.13:20000',priority:1},{_id:2,host:'192.168.5.12:20000',priority:2}] }
rs.initiate(configdb1)
6. 在ServerA, ServerB, ServerC 分别运行 mongos 服务
./mongos --configdb docdetection/192.168.5.12:20000,192.168.5.13:20000,192.168.5.14:20000 --bind_ip 0.0.0.0 --port 27017 --logpath /data/mongos.log --logappend --fork
7. 选择 ServerB(任意选择一台),用 mongo进入 开始配置分片 输入如下命令
use admin;
db.runCommand({addshard:"shard1/192.168.5.12:27018,192.168.5.13:27018,192.168.5.14:27018"})
db.runCommand({addshard:"shard2/192.168.5.12:27019,192.168.5.13:27019,192.168.5.14:27019"})
8. 测试
# 设置分片chunk大小 设置1M是为了测试,否则要插入大量数据才能分片
use config
db.settings.save({ "_id" : "chunksize", "value" : 1 })
# 指定test分片生效
sh.enableSharding("test")
# 创建索引
use test
db.users.createIndex({user_id : 1})
# 指定数据库里需要分片的集合和片键
use admin
sh.shardCollection("test.users", {user_id: 1})
# 插入数据
use test;
for (var i = 1; i <=10000; i++){
db.users.save({user_id: i, username: "user"+i});
}
# 查看分片结果
sh.status(true)
注: 这样分片的好处在于,如果你一次不成功 只要把ServerA,ServerB,ServerC对应的目录全部删除,就可以从头再来试一遍