mongodb分布式部署 多分片部署 复制集

来源:互联网 发布:vb自动登录网页弹框 编辑:程序博客网 时间:2024/06/06 20:51

部署环境:

9个节点, 分别为

node79(192.168.136.79),

node78(192.168.136.78),

node77(192.168.136.77),

 

node76(192.168.136.76),

node75(192.168.136.75),

node74(192.168.136.74),

 

node73(192.168.136.73),

node72(192.168.136.72)

node71(192.168.136.71),

每个节点的配置如下:

操作系统:ubuntu 11.10, 内存32G, 磁盘4T,CPU16核

 

 

目标部署结构:

node79和node78和node77 组成第一个复制集,为shard1,

注意:一个复制集中最好有奇数个工作节点,这样当某个节点挂掉的时候,其他节点可以通过选举的方式推选出新的主节点。

如果没有奇数个工作节点,也可以通过添加仲裁进程的方式来实现。

node76和node75和node74 组成第二个复制集,为shard2,

node73和node72和node71 组成第三个复制集,为shard3,



configre server 一共三个,分别运行在node72, node74和node78上

mongos服务运行在node79服务器上。


部署按下述步骤进行

(1)在每台服务器上都安装mongodb程序
sudo apt-get install mongodb

(2)配置shard1,shard2和shard3

配置shard1:
在node79和node78和node77上分别执行
./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard11 –logpath /home/mongodb/data/shard11.log –fork

接下来我们配置shard1
在node79上运行:
mongo -port 27017
进入到mongodb CLI 界面

> config = {_id: ‘shard1′, members: [
{_id: 0, host: '192.168.136.79:27017'},
{_id: 2, host: '192.168.136.78:27017'},
{_id: 3, host: '192.168.136.77:27017'},]

}

> rs.initiate(config);

以同样的方式配置shard2 和 shard3

 

(3)启动configure server

在node72,node74和node78上,分别运行如下:

./mongod –configsvr –dbpath /home/mongodb/data/config –port 20000 –logpath /home/mongodb/data/config.log –fork   #config server也需要dbpath

 

(4)启动mongos服务

在node79上运行:

./mongos –configdb 192.168.136.72:20000,192.168.136.74:20000,192.168.136.78:20000 –port 30000  –logpath /home/mongodb/data/mongos.log –fork

 

接下来是对该分布式mongodb的配置

(1)添加shard server

在任何一台客户端机器上

./mongo 192.168.136.79:30000/admin

>db

admin

>db.runCommand( { addshard : “shard1/192.168.136.79:27017,192.168.136.78:27017″,name:”s2″} );

同样的方法再加入shard2和shard3

查看当前的shard情况
>db.runCommand( { listshards : 1 } )

激活数据库分片:
> db.runCommand( { enablesharding : “test” } );
激活collection分片:
>db.runCommand( { shardcollection : “test.people″,key : {id: 1} } )
该命令激活了test数据库中people数据集的分片


mongodb的测试:

首先是插入测数数据:
#!/usr/bin/env pythonfrom pymongo import Connectionimport time,datetimeimport randomconnection = Connection('192.168.136.79', 27017)db = connection['test']def func_time(func):        def _wrapper(*args,**kwargs):                start = time.time()                func(*args,**kwargs)                print func.__name__,'run:',time.time()-start        return _wrapper@func_timedef insert(num):        posts = db.people        for x in range(num):                post = {"_id" : str(x),                        "author": str(x)+"Mike","number": random.randint(0,100),                        "text": "My first blog post!",                        "tags": ["mongodb", "python", "pymongo"],                        "date": datetime.datetime.utcnow()}print x                posts.insert(post)if __name__ == "__main__":num = 20000000insert(num)

该程序在people数据集中插入了2千万条数据记录

查询:
#!/usr/bin/env pythonfrom pymongo import Connectionimport time,datetimeimport randomconnection = Connection('192.168.136.79', 27017)db = connection['test']def func_time(func):                def _wrapper(*args,**kwargs):                                start = time.time()                                func(*args,**kwargs)                                print func.__name__,'run:',time.time()-start                return _wrapper#@func_timedef randy():                rand = random.randint(1,5000000)                return rand@func_timedef mread(num):                find = db.people                #find.find({"author": str(rand)+"Mike"})#for x in range(num):#rand = randy()#find.find({"author": str(rand)+"Mike"})#print find.find({"number":189}).count()x = 1for post in find.find({"number":19}):x =x+1#print x#post.number = 19#print post#for x in range(num):#find.findone({"author":str()})if __name__ == "__main__":                num = 10000000                mread(num)

测试的大概结果
4千万条记录中 ,在建立索引的情况下,查询并取出40万条结果记录,需时16秒左右。

原创粉丝点击