将mongodb复制集转换为shard集群
1. 假设replica set使用以下配置文件启动
storage:
dbPath: /data/replSet/mongo${1}
journal:
enabled: true
engine: wiredTiger
systemLog:
destination: file
path: /data/log/mongod${1}.log
logAppend: true
net:
port: 2800${1}
bindIp: 127.0.0.1
processManagement:
fork: true
pidFilePath: /data/tmp/mongod${1}.pid
replication:
replSetName: ${2}
注:${1}
和${2}
根据自己的实际情况赋值。
假设我们启动三节点复制集,监听以下端口28001、28002、28003,复制集名称为rs0
,启动完成后,需要对复制集进行初始化:
# 连接任一节点
mongo 127.0.0.1:28001
// 在mongo shell中,执行以下代码:
rs.initiate({
_id: 'rs0',
members: [
{_id: 0, host: '127.0.0.1:28001'},
{_id: 1, host: '127.0.0.1:28002'},
{_id: 2, host: '127.0.0.1:28003'},
],
});
2. 将replica set重启为shard
首先将secondary节点启动为shard,虽然可以通过在启动命令中增加参数--shardsvr
来达到这个目的,但我觉得通过配置文件来启动是个更好的习惯,这样可以更好地跟踪变化。
修改配置文件,增加以下内容:
sharding:
clusterRole: shardsvr
两个secondary节点都启动完毕之后,在primary节点上执行降级命令,将primary节点降为secondary节点:
rs.stepDown();
然后以同样的方式重启该节点。
3. 启动config server复制集
storage:
dbPath: /data/configdb/mongo${1}
journal:
enabled: true
engine: wiredTiger
systemLog:
destination: file
path: /data/log/mongodConfigServer${1}.log
logAppend: true
net:
port: 2900${1}
bindIp: 127.0.0.1
processManagement:
fork: true
pidFilePath: /data/tmp/mongodConfigServer${1}.pid
replication:
replSetName: configServerReplSet
sharding:
clusterRole: configsvr
假设我们启动三节点复制集,监听以下端口29001、29002、29003,复制集名称为configServerReplSet
,启动完成后,需要对复制集进行初始化:
# 连接任一节点
mongo 127.0.0.1:29001
// 在mongo shell中,执行以下代码:
rs.initiate({
_id: 'configServerReplSet',
configsvr: true,
members: [
{_id: 0, host: '127.0.0.1:29001'},
{_id: 1, host: '127.0.0.1:29002'},
{_id: 2, host: '127.0.0.1:29003'},
],
});
4. 启动mongos
systemLog:
destination: file
path: /data/log/mongos.log
logAppend: true
net:
port: 30001
bindIp: 127.0.0.1
processManagement:
fork: true
pidFilePath: /data/tmp/mongos.pid
sharding:
configDB: configServerReplSet/127.0.0.1:29001,127.0.0.1:29002,127.0.0.1:29003
在30001端口上启动mongos,并且使用之前启动的config server复制集作为configDB。
mongos --config mongos.conf
5. 将之前的复制集加入到shard集群
使用以下命令连接mongos:
mongo 127.0.0.1:30001/admin
加入shard集群:
sh.addShard("rs0/127.0.0.1:28001,127.0.0.1:28002,127.0.0.1:28003")
6. 根据之前提供的配置文件模板启动第二个复制集
初始化:
rs.initiate({
_id: 'rs1',
members: [
{_id: 0, host: '127.0.0.1:28004'},
{_id: 1, host: '127.0.0.1:28005'},
{_id: 2, host: '127.0.0.1:28006'},
],
});
7. 将第二个复制集加入shard
sh.addShard("rs1/127.0.0.1:28004,127.0.0.1:28005,127.0.0.1:28006")
8. 配置shard集群
主要用到的一些命令:
sh.enableSharding( "test" )
use test;
// shard key必须要有索引
db.testColl.createIndex({_id: 1})
sh.shardCollection( "test.testColl", { "_id" : 1 } )
sh.shardCollection( "test.testColl", { "_id" : "hashed" } )
db.testColl.createIndex({name: 1})
sh.shardCollection( "test.testColl", { "name" : 1 } )