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

部署环境:

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 python

from pymongo import Connection
import time,datetime
import random

connection = 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_time
def 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 = 20000000
	insert(num)

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

查询:
#!/usr/bin/env python

from pymongo import Connection
import time,datetime
import random

connection = 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_time
def randy():
                rand = random.randint(1,5000000)
                return rand

@func_time
def 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 = 1
		for 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秒左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值