MongoDB Sharding实践

来源:互联网 发布:汉仪小麦体简 mac 编辑:程序博客网 时间:2024/06/03 17:20
分片(Sharding)应用场景
1. 单个磁盘分区达大小限制,不能扩容,需要存储在多个磁盘分区上。(单机模式的扩充)
2. 数据分片存储在不同机器上,通常每个分片是一个复制集(Replica Set)。

搭建MongoDB分片服务实践
1)数据分片存储在不同磁盘分区。
2)单机数据库向分片集群中迁移。
3)每个分片没有复制集合,仅一个实例。

参考:
http://www.lanceyan.com/tech/arch/mongodb_shard1.html
http://www.cnblogs.com/magialmoon/archive/2013/04/11/3015394.html

1. 分片模式下需要运行如下服务实例:mongos 、config、 shard1 、shard2、...  
   分配端口,如 mongos为 20000, config server 为 21000, shard1为 22001, shard2为22002

2. 创建数据和日志目录

测试目录
# cd /opt/mongodb/sharding
路由服务目录
# mkdir -p mongos/log
配置服务目录
# mkdir -p config/data
# mkdir -p config/log
分片1服务目录
# mkdir -p shard1/data
# mkdir -p shard1/log
分片2服务目录
# mkdir -p shard2/data
# mkdir -p shard2/log

3. 启动mongodb分片集群各服务实例

启动配置服务
# mongod --configsvr --dbpath /opt/mongodb/sharding/config/data --port 21000 --logpath /opt/mongodb/sharding/config/log/config.log --fork

启动集群路由服务
# mongos --configdb 10.101.1.140:21000 --port 20000 --logpath /opt/mongodb/sharding/mongos/log/mongos.log --fork

启动shard1分片服务(此时还未加入集群)
# mongod --shardsvr --replSet shard1 --port 22001 --dbpath /opt/mongodb/sharding/shard1/data --logpath /opt/mongodb/sharding/shard1/log/shard1.log --fork --nojournal --oplogSize 10

注意,这里测试环境,nojournal是关闭日志信息;oplogsize (M) ”local”数据库文件的大小,oplog是一个固定长度,用于记录Replica Sets操作日志。 

启动shard2分片服务(此时还未加入集群)
# mongod --shardsvr --replSet shard2 --port 22002 --dbpath /opt/mongodb/sharding/shard2/data --logpath /opt/mongodb/sharding/shard2/log/shard2.log --fork --nojournal --oplogSize 10

4. 设置各分片的复制集(Replica Set),这里每个分片仅一个实例。

连接shard1服务,并设置复制集
# mongo 127.0.0.1:22001
use admin
config = { _id:"shard1", members:[
                     {_id:0,host:"10.101.1.140:22001"}
                ]
         }
rs.initiate(config);

连接shard2服务,并设置复制集
# mongo 127.0.0.1:22002
use admin
config = { _id:"shard2", members:[
                     {_id:0,host:"10.101.1.140:22002"}
                ]
         }
rs.initiate(config);

5. 设置(添加)分片配置

连接mongodb分片集群:
#mongo  127.0.0.1:20000

需要在admin中操作:
mongos> use admin
switched to db admin

列出分片集合:
mongos> db.runCommand( { listshards : 1 } );
{ "shards" : [ ], "ok" : 1 }

添加分片实例:
mongos> db.runCommand( { addshard : "shard1/10.101.1.140:22001" } );
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand( { addshard : "shard2/10.101.1.140:22002" } );
{ "shardAdded" : "shard2", "ok" : 1 }

mongos> db.runCommand( { listshards : 1 } );
{
"shards" : [
{
"_id" : "shard1",
"host" : "shard1/10.101.1.140:22001"
},
{
"_id" : "shard2",
"host" : "shard2/10.101.1.140:22002"
}
],
"ok" : 1
}

6. 测试分片服务

# mongo 127.0.0.1:22002
mongos> use admin

让指定数据库testsh的分片功能打开(还需要指定分片的表或集合)
mongos> db.runCommand( { enablesharding :"testsh" } );

让指定数据库testsh里的集合(表)table1, 按片键id进行分片
mongos> db.runCommand( { shardcollection : "testsh.table1", key : {id: 1} } )

sh.shardCollection( "testsh.table1", {id: 1} )

这里片键可以指定组合键, 组合键必须是组合的唯一索引,跟先后顺序有关:
db.runCommand( { shardcollection : "testsh.table1", key : {id: 1, name: 1} } )
db.runCommand( { shardcollection : "testsh.table1", key : {name: 1, id: 1} } )

批量插入数据到表testsh.table1
mongos> use testsh
for (var i = 1; i <= 10000; i++) db.table1.save({id:i,"test":"testval"});

查看分片数据状态:
mongos> db.table1.stats();

6. 将mongodb原单机数据库添加到分片集群(原数据库作为一个新的分片加入集群)。

添加shard3服务,并添加原数据库data:
# mkdir -p shard3/data  # 使用原单机mongodb的data,或只保留某个db的数据db.*, 加入的数据库不能在分片集群中存在。
# mkdir -p shard3/log

# mongod --shardsvr --replSet shard3 --port 22003 --dbpath /opt/mongodb/sharding/shard3/data --logpath /opt/mongodb/sharding/shard3/log/shard3.log --fork --oplogSize 10
这里没加 --nojournal 不关闭日志信息

设置shard3的分片配置,这里仍只有一个实例。
# mongo 127.0.0.1:22003
use admin
config = { _id:"shard3", members:[
                     {_id:0,host:"10.101.1.140:22003"}
                ]
         }  
rs.initiate(config);

将shard3添加到分片集群
# mongo 127.0.0.1:20000
use admin
db.runCommand( { addshard : "shard3/10.101.1.140:22003"});

如果shard3中的数据库,已经在分片集群中存在,shard3将不能成功加入集群,需要先删除同名数据库。
"errmsg" : "can't add shard shard3/10.101.1.140:22003 because a local database 'test' exists in another shard1:shard1/10.101.1.140:22001"
-------
# mongo 127.0.0.1:22003
shard3:PRIMARY> use test
shard3:PRIMARY> db.dropDatabase();
-------

添加成功
# mongo 127.0.0.1:20000
mongos> use admin
mongos> db.runCommand( { addshard : "shard3/10.101.1.140:22003"});
{ "shardAdded" : "shard3", "ok" : 1 }

mongos> db.runCommand( { listshards : 1 } );
{
"shards" : [
{
"_id" : "shard1",
"host" : "shard1/10.101.1.140:22001"
},
{
"_id" : "shard2",
"host" : "shard2/10.101.1.140:22002"
},
{
"_id" : "shard3",
"host" : "shard3/10.101.1.140:22003"
}
],
"ok" : 1
}

这时,可以在集群中看到从shard3加入的数据库。
mongos> show databases;

7. 让指定数据库的指定表(collection)的分片生效,并进行自动数据迁移(进行auto-rebalancing)

查看需要分片数据库的集合状态,未分片未生效:
mongos> use mydb
mongos> db.mytable.stats()

使数据库的指定集合分片生效:
mongos> use admin
mongos> db.runCommand( { enablesharding :"mydb"});
mongos> db.runCommand( { shardcollection : "mydb.mytable", key : { "id" : 1, "name" : 1 } } ) #组合分片键

查看状态,分片生效,且开始auto-rebalance
mongos> use mydb
mongos> db.mytable.stats()

如果需要使用原单机mongodb的端口,停止mongos以原端口启动即可。


========================================
其他操作:

添加用户
mongos> use mydb
mongos> db.addUser("root","password");

移除切片
mongos> db.runCommand( { removeshard: "shard3" } )

mongodb 删除数据库
use mydb; 
db.dropDatabase(); 

mongodb删除表 
db.mytable.drop();

建立索引

db.externalResumeStorage.ensureIndex({"rid":1,"sourceId":1})


0 0
原创粉丝点击