ITPub博客

首页 > 数据库 > NoSQL > mongodb分片

mongodb分片

NoSQL 作者:celestezhang 时间:2015-09-06 16:35:18 0 删除 编辑
三台机器做mongos和config
172.30.5.22
172.30.5.23
172.30.5.24
172.30.5.26
172.30.5.27
172.30.5.28


三台机器做shard1
172.30.5.22
172.30.5.23
172.30.5.24


三台机器做shard2
172.30.5.22
172.30.5.23
172.30.5.24


三台机器做shard3
172.30.5.26
172.30.5.27
172.30.5.28


numactl --interleave=all /data/mongodb/mongodb/bin/mongod --config /data/mongodb/mongodb/bin/mongodb.conf




1,在5.22/23/24机器上分别启动相关进程
server1 172.30.5.22  /5.23 /5.24
mkdir -p /data/27020
mkdir -p /data/27021
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard1 --shardsvr --dbpath /data/27020 --port 27020 &  
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard2 --shardsvr --dbpath /data/27021 --port 27021 & 


server2 172.30.5.23
mkdir -p /data/27020
mkdir -p /data/27021
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard1 --shardsvr --dbpath /data/27020 --port 27020 &  
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard2 --shardsvr --dbpath /data/27021 --port 27021 & 




server3 172.30.5.24
mkdir -p /data/27020
mkdir -p /data/27021
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard1 --shardsvr --dbpath /data/27020 --port 27020 &  
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard2 --shardsvr --dbpath /data/27021 --port 27021 & 


在5.26/27/28上启动:
mkdir -p /data/27022
numactl --interleave=all /usr/local/mongodb/bin/mongod --replSet shard3 --shardsvr --dbpath /data/27022 --port 27022 &  






2.在server1 172.30.5.22(shard1)上
初始化replica set
用mongo连接shard1的mongod,
/usr/local/mongodb/bin/mongo --port 27020
执行: #id要和启动时--replSet shard1的shard1匹配
config = {_id: 'shard1', members: [{_id:0, host: '172.30.5.22:27020'},{_id:1, host: '172.30.5.23:27020'},{_id:2, host: '172.30.5.24:27020'}]}   
rs.initiate(config);
#如要新增replSet,执行操作
rs.add ("新增IP:27020")
rs.status()




在server4 172.30.5.22(shard2)上
用mongo连接shard2的mongod,
/usr/local/mongodb/bin/mongo --port 27021
执行:
config = {_id: 'shard2', members: [{_id: 0, host: '172.30.5.22:27021'},{_id:1, host: '172.30.5.23:27021'},{_id:2, host: '172.30.5.24:27021'}]}
rs.initiate(config);


在shard3上 172.30.5.26
/usr/local/mongodb/bin/mongo --port 27022
执行:
config = {_id: 'shard3', members: [{_id: 0, host: '172.30.5.26:27022'},{_id:1, host: '172.30.5.27:27022'},{_id:2, host: '172.30.5.28:27022'}]}
rs.initiate(config);






3.配置6台config server
再172.30.5.22/23/24/26/27/28上:
mkdir -p /data/27000
/usr/local/mongodb/bin/mongod --configsvr --dbpath /data/27000 --port 27000 &




4.配置mongs
在172.30.5.22/23/24/26/27/28上分别执行:
/usr/local/mongodb/bin/mongos --configdb  172.30.5.22:27000,172.30.5.23:27000,172.30.5.24:27000 --port 30000 --logpath /data/mongos.log --logappend --fork
#mongs不需要dbpath


5.Configuring the Shard Cluster
连接到其中一个mongos进程,并切换到admin数据库做以下配置
a. 连接到mongs,并切换到admin
./mongo  172.30.5.22/admin
>db
Admin
b. 加入shards
如果shard是replica sets,用replicaSetName/<serverhostname>[:port] [,serverhostname2[:port],…]这样的格式表示,例如本例执行:
db.runCommand( { addshard : "shard1/172.30.5.22:27020,172.30.5.23:27020,172.30.5.24:27020"} );
db.runCommand( { addshard : "shard2/172.30.5.22:27021,172.30.5.23:27021,172.30.5.24:27021"} );
db.runCommand( { addshard : "shard3/172.30.5.26:27022,172.30.5.27:27022,172.30.5.28:27022"} );


注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,用db.dropDatabase()命令把test数据库给删除然后就可加入


c. Listing shards
>db.runCommand( { listshards : 1 } )
如果列出了以上二个你加的shards,表示shards已经配置成功


6.对库进行分片,必须为分片enable一个数据库
http://www.mongodb.org/display/DOCS/Sharding+FAQ#ShardingFAQ-Wheredounshardedcollectionsgoifshardingisenabledforadatabase?
官方解释:现在的版本,对库分片后,不会自动将不同的collections放到不同的sharding中,以后版本会改
db.runCommand({enablesharding:"zlrd2013"}) 
db.printShardingStatus();


7.对需要分片的collections进行分片,用shardcollection 命令分隔数据集,key自动生成
db.runCommand({shardcollection : "zlrd2013.zhaopin.resume","key":{"campus_id":"hashed"}})
db.runCommand({shardcollection : "zlrd2013.zhaopin.campusmodel","key":{"campus_id":"hashed"}})






查看分片状态:
再172.30.5.22(mongos)上:
[root@localhost ~]# /usr/local/mongodb/bin/mongo --port 30000
MongoDB shell version: 2.2.5
connecting to: 127.0.0.1:30000/test
mongos> use zlrd2013
switched to db zlrd2013
mongos> db.zhaopin.campusmodel.stats()db.runCommand({shardcollection : "zlrd2013.zhaopin.campusmodel","key":{"campus_id":"hashed"}})
{
        "sharded" : true,
        "ns" : "zlrd2013.zhaopin.campusmodel",
        "count" : 11181250,
        "numExtents" : 74,
        "size" : 67975307480,
        "storageSize" : 70922890848,
        "totalIndexSize" : 1126276704,
        "indexSizes" : {
                "_id_" : 418946416,
                "root_company_id_1_campus_id_1_language_id_1" : 707330288
        },
        "avgObjSize" : 6079.401451537172,
        "nindexes" : 2,
        "nchunks" : 1148,
        "shards" : {
                "shard1" : {
                        "ns" : "zlrd2013.zhaopin.campusmodel",
                        "count" : 5833402,
                        "size" : 35714294652,
                        "avgObjSize" : 6122.378442630904,
                        "storageSize" : 37911355168,
                        "numExtents" : 38,
                        "nindexes" : 2,
                        "lastExtentSize" : 2146426864,
                        "paddingFactor" : 1,
                        "systemFlags" : 1,
                        "userFlags" : 0,
                        "totalIndexSize" : 587200320,
                        "indexSizes" : {
                                "_id_" : 224938112,
                                "root_company_id_1_campus_id_1_language_id_1" : 362262208
                        },
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "zlrd2013.zhaopin.campusmodel",
                        "count" : 5347848,
                        "size" : 32261012828,
                        "avgObjSize" : 6032.522395550509,
                        "storageSize" : 33011535680,
                        "numExtents" : 36,
                        "nindexes" : 2,
                        "lastExtentSize" : 2146426864,
                        "paddingFactor" : 1,
                        "systemFlags" : 1,
                        "userFlags" : 0,
                        "totalIndexSize" : 539076384,
                        "indexSizes" : {
                                "_id_" : 194008304,
                                "root_company_id_1_campus_id_1_language_id_1" : 345068080
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}




use zlrd2013
db.zhaopin.resume.stats()






8.导入数据库信息 再mongos机器上
导出:/usr/local/mongodb/bin/mongodump --db wiyundb
导入:/usr/local/mongodb/bin/mongorestore --db zlrd2013 /home/y/dump/testdb/
应该可以看到分片,并且其他两台机器的data目录下已经也有了备份数据。


查看
在172.30.5.202的机器上:
[y@static ~]$ /usr/local/mongodb/bin/mongo --port 27020
MongoDB shell version: 1.6.4
connecting to: 127.0.0.1:27020/test
> rs.status()
{
        "set" : "shard1",
        "date" : "Thu Nov 18 2010 15:34:01 GMT+0800 (CST)",
        "myState" : 1,               #说明当前机器是master
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.1.1:27020",
                        "health" : 1,
                        "state" : 1,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "192.168.1.2:27020",
                        "health" : 1,
                        "state" : 2,
                        "uptime" : 5088,
                        "lastHeartbeat" : "Thu Nov 18 2010 15:34:00 GMT+0800 (CST)"
                },
                {
                        "_id" : 2,
                        "name" : "192.168.1.3:27020",
                        "health" : 1,
                        "state" : 3,
                        "uptime" : 5088,
                        "lastHeartbeat" : "Thu Nov 18 2010 15:34:00 GMT+0800 (CST)"
                }
        ],
        "ok" : 1
}


如果"errmsg" : "error RS102 too stale to catch up",那么就把id所指的机器上的对应文件夹删掉,重启其mongod和mongos服务。
[y@static ~]$ /usr/local/mongodb/bin/mongo
MongoDB shell version: 1.6.4
connecting to: test
> use admin
switched to db admin
> db.runCommand( { listshards : 1 } )
{
        "shards" : [
                {
                        "_id" : "s1",
                        "host" : "shard1/192.168.1.1:27020,192.168.1.2:27020,192.168.1.3:27020"
                },
                {
                        "_id" : "s2",
                        "host" : "shard2/192.168.1.1:27021,192.168.1.2:27021,192.168.1.3:27021"
                }
        ],
        "ok" : 1
}


我查的结果是对collections的分片不可逆,想要取消collections的分片,只能删除表,然后重新导入数据。










集群测试步骤:
1.down掉任意一个节点,测试访问和写入(非主节点)
2.down掉任意两个节点,测试访问和写入(非主节点)
3.down掉shard1的主节点,测试slave是否正确接管,并正常写入和访问
4.down掉shard2的主节点,测试slave是否正确接管,并正常写入和访问
5.down掉shard1和shard2的主节点,测试两个shard的slave是否正确接管,并正常写入和访问
6.新增一个分片,配置完成后,查看数据是否能自己分到第三个shard上,并且,在此之间,对数据写入和访问无影响。


新增分片步骤如下:
如果想增加分片,先增加三台机器,例如:
三台机器做shard3
172.30.5.1
172.30.5.2
172.30.5.3




1,在三台shard3机器上分别启动相关进程
server1 172.30.5.1
mkdir -p /data/27020
/usr/local/mongodb/bin/mongod --replSet shard3 --shardsvr --dbpath /data/27020 --port 27020 &  


server1 172.30.5.2
mkdir -p /data/27020
/usr/local/mongodb/bin/mongod --replSet shard3 --shardsvr --dbpath /data/27020 --port 27020 &  


server1 172.30.5.3
mkdir -p /data/27020
/usr/local/mongodb/bin/mongod --replSet shard3 --shardsvr --dbpath /data/27020 --port 27020 &  


2.在172.30.5.1(shard3)上
初始化replica set
用mongo连接shard3的mongod,
/usr/local/mongodb/bin/mongo --port 27020
执行:
config = {_id: 'shard3', members: [{_id:0, host: '172.30.5.1:27020'},{_id:1, host: '172.30.5.2:27020'},{_id:2, host: '172.30.5.3:27020'}]}  #id要和启动时--replSet shard1的shard3匹配
rs.initiate(config);
rs.status()


3. 连接到之前的mongs,并切换到admin
./mongo  172.30.5.201/admin
>db
Admin
a. 加入shards
>db.runCommand( { addshard : "shard1/172.30.5.202:27020,172.30.5.205:27020,172.30.5.208:27020"} );
>db.runCommand( { addshard : "shard2/172.30.5.203:27020,172.30.5.206:27020,172.30.5.209:27020"} );   #这两个之前的
>db.runCommand( { addshard : "shard3/172.30.5.1:27020,172.30.5.2:27020,172.30.5.3:27020"} );  #这是新增的


b. Listing shards
>db.runCommand( { listshards : 1 } )
如果列出了以上三个你加的shards,表示shards已经配置成功




shard1:PRIMARY> db.zhaopin.campusmodel.count()
3987431
shard1:PRIMARY> db.zhaopin.campusmodel.count()
3957657


shard2:PRIMARY> db.zhaopin.campusmodel.count()
3303255
shard2:PRIMARY> db.zhaopin.campusmodel.count()
3215282


shard3:PRIMARY> db.zhaopin.campusmodel.count()
199045
shard3:PRIMARY> db.zhaopin.campusmodel.count()
291560








需要测试
导出需要在各个shard上,然后再通过mongos导入






查看分片是否平均,在mongos下
>use zlrd2013
>db.printShardingStatus();
        {  "_id" : "zlrd2013",  "partitioned" : true,  "primary" : "shard2" }
                zlrd2013.zhaopin.campusmodel chunks:
                                shard3  173
                                shard2  174
                                shard1  173


可以看到chunks分布的很平均


再刚插入数据未达到chunks大小之前,不会分片。查看chunks大小命令:
[root@localhost ~]# /usr/local/mongodb/bin/mongo --port 27000
MongoDB shell version: 2.2.5
connecting to: 127.0.0.1:27000/test
configsvr> use config
switched to db config
configsvr> db.config.find()
configsvr> db.settings.find()
{ "_id" : "chunksize", "value" : 64 }








增加分片测试:
2.4的分片测试以及在线增加分片
2.4的hashed分片:
db.runCommand({shardcollection : "zlrd2013.zhaopin.resume","key":{"_id":"hashed"}})  #使用hashed分片,可以实现数据在各节点的均匀分布。当MongoDB 单条记录的访问比较随机时,可以考虑采用这种模式。


之前两片数据都是150W,分配的非常平均
新增一片后,我就插入了100W数据
结果:


                "shard1" : {
                        "ns" : "zlrd2013.zhaopin.resume",
                        "count" : 1319995,


                "shard2" : {
                        "ns" : "zlrd2013.zhaopin.resume",
                        "count" : 1541189,


                "shard3" : {
                        "ns" : "zlrd2013.zhaopin.resume",
                        "count" : 1138816,


其实也是比较平均的
但是在增加分片后,数据量的变化:
mongos> db.zhaopin.resume.count()
4302662
......
mongos> db.zhaopin.resume.count()
4000000
这数据就正常了




在线分片测试:http://www.haogongju.net/art/1733224
之前的collections里面有大量数据,但是未进行分片,现在也需要在线对此表进行分片
db.zlrd2013.ensureIndex({"_id": hashed})
db.runCommand({shardcollection: "zlrd2013.newcollections", key: {"_id": "hashed"}})






注意的问题:
一:
2.0(dump)----2.4(restore)
所有的主流语言的驱动会在传送数据之前进行一些数据的有效性检查(文档是否超长,是否含非utf-8的字符,


是否使用了未知类型).同样也可以启动数据库服务器的时候使用--objcheck选项,这样服务器就会在插入


之前先检验文档结构的有效性,当然这样要牺牲性能.


/usr/local/mongodb/bin/mongorestore --noobjcheck --port 30000 --db zlrd2013 /data/zlrd2013/zlrd2013_20130704_12/zlrd2013/


二:
时间必须同步
报错:Error locking distributed lock for split




三:
启动加入--directoryperdb 参数
可以将不同的库放入不同的文件夹下








模拟插入数据
 for(var i = 1;i<10000;i++){
   db.test.insert({"age":i+10,"age222":i+10,"age333":i+10,"age444":i+10,"name":"jim"})
 }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29898569/viewspace-1792534/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: excel导入postgre
请登录后发表评论 登录
全部评论

注册时间:2014-09-19

  • 博文量
    39
  • 访问量
    125981