MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可
靠、高可用还有些距离,所以有了” Replica Sets + Sharding”的解决方案:
Shard:
使用 Replica Sets,确保每个数据节点都具有备份、自动容错转移、自动恢复能力。
Config:
使用3 个配置服务器,确保元数据完整性
Route:
使用3 个路由进程,实现负载平衡,提高客户端接入性能
以下我们配置一个 Replica Sets + Sharding 的环境如下:
开放的端口如下:
主机 IP 服务及端口
Server A 192.168.0.199 mongod shard1_1:27017
mongod shard2_1:27018
mongod config1:20000
mongos1:30000
Server B 192.168.0.171 mongod shard1_2:27017
mongod shard2_2:27018
mongod config2:20000
mongos2:30000
Server C 192.168.0.170 mongod shard1_3:27017
mongod shard2_3:27018
mongod config3:20000
mongos3:30000
创建数据目录
在Server A 上:
D:\db\data\shard1_1
D:\db\data\shard2_1
D:\db\data\config
在Server B 上:
D:\db\data\shard1_2
D:\db\data\shard2_2
D:\db\data\config
在Server C 上:
D:\db\data\shard1_3
D:\db\data\shard2_3
D:\db\data\config
我用配置文件启动需要在A、B、C服务器上D:\db\data\新建以下目录
mongo1.conf内容如下:
#common conf
#port 端口号
port=27017
#dbpath 数据库存储文件目录
dbpath=d:/db/data/shard1_1
#logpath 日志路径
logpath=d:/db/data/shard1.log
#logappend 日志追加形式 false:重新启动覆盖文件
logappend=true
#relica set 配置
#replSet指定复制集为shard1
replSet=shard1
#oplogSize
oplogSize=100
Mongo2.conf内容如下:
#common conf
#port 端口号
port=27018
#dbpath 数据库存储文件目录
dbpath=d:/db/data/shard2_1
#logpath 日志路径
logpath=d:/db/data/shard2.log
#logappend 日志追加形式 false:重新启动覆盖文件
logappend=true
#relica set 配置
#replSet指定复制集为shard1
replSet=shard2
#oplogSize
oplogSize=100
Mongoc.conf内容如下:
#common conf
#port 端口号
port=20000
#dbpath 数据库存储文件目录
dbpath=d:/db/data/config
#configsvr
configsvr=true
#logpath 日志路径
logpath=d:/db/data/config.log
#logappend 日志追加形式 false:重新启动覆盖文件
logappend=true
Mongos.conf内容如下
#common conf
#port 端口号
port=30000
#logpath 日志路径
logpath=d:/db/data/mongos.log
#logappend 日志追加形式 false:重新启动覆盖文件
logappend=true
#configdb
configdb=192.168.0.170:20000,192.168.0.171:20000,192.168.0.199:20000
2 配置Replica Sets
2.1 配置shard1所用到的Replica Sets
在Server A 上:
Mongod -f d:\db\data\mongo1.conf
在Server B 上:
Mongod -f d:\db\data\mongo1.conf
在Server C 上:
Mongod -f d:\db\data\mongo1.conf
用mongo 连接其中一台机器的27017 端口的mongod,初始化Replica Sets“shard1”,执行:
mongo --port 27017
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27017/test
> config = {_id: 'shard1', members: [
... {_id: 0, host: '192.168.0.170:27017'},
... {_id: 1, host: '192.168.0.171:27017'},
... {_id: 2, host: '192.168.0.199:27017'}]
... }
……
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
3 配置shard2所用到的Replica Sets
在Server A 上:
Mongod -f d:\db\data\mongo2.conf
在Server B 上:
Mongod -f d:\db\data\mongo2.conf
在Server C 上:
Mongod -f d:\db\data\mongo2.conf
用mongo 连接其中一台机器的27018 端口的mongod,初始化Replica Sets “shard2”,执行:
[root@localhost bin]# ./mongo --port 27018
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27018/test
> config = {_id: 'shard2', members: [
... {_id: 0, host: '192.168.0.170:27018'},
... {_id: 1, host: '192.168.0.171:27018'},
... {_id: 2, host: '192.168..0.199:27018'}]
... }
……
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
3 配置3 台Config Server
在Server A、B、C上执行:
Mongod -f d:\db\data\mongoc.conf
4 配置3 台Route Process
在Server A、B、C上执行:
Mongod -f d:\db\data\mongos.conf
5 配置Shard Cluster
连接到其中一台机器的端口30000 的mongos 进程,并切换到admin 数据库做以下配置
[root@localhost bin]# ./mongo --port 30000
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:30000/test
> use admin
switched to db admin
>db.runCommand({addshard:"shard1/192.168.0.170:27017,192.168.0.171:27017,192.168.0.199:
27017"});
{ "shardAdded" : "shard1", "ok" : 1 }
>db.runCommand({addshard:"shard2/192.168.0.170:27018,192.168.0.171:27018,192.168.0.199:
27018"});
{ "shardAdded" : "shard2", "ok" : 1 }
>
激活数据库及集合的分片
db.runCommand({ enablesharding:"test" })
db.runCommand({ shardcollection: "test.users", key: { _id:1 }})
6 验证Sharding正常工作
连接到其中一台机器的端口30000 的mongos 进程,并切换到test 数据库,以便添加测试数
据
use test
for(var i=1;i<=200000;i++) db.users.insert({id:i,addr_1:"Beijing",addr_2:"Shanghai"});
},
"ok" : 1
}
可以看到Sharding搭建成功了,跟我们期望的结果一致,至此我们就将Replica Sets与Sharding
结合的架构也学习完毕了。