Mongodb安装配置

1. 下载

mkdir /usr/local/src/mongodb

cd /usr/local/src/mongodb

wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz

2.解压

tar zxvf mongodb-linux-x86_64-2.0.4.tgz

mv mongodb-linux-x86_64-2.0.4  /usr/local/mongodb

3.运行

需要创建一个存放数据的目录(默认是/data/db/),创建目录并启动:

mkdir -p /data/db/

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --fork

如果想使用自己指定的目录来存储数据,加上 --dbpath 选项:

/usr/local/mongodb/bin/mongod --dbpath /path/to/data/dir

4、登录客户端

默认链接的是test数据库

[root@localhost mongodb]# /usr/local/mongodb/bin/mongo

5.通过28017端口查看mongodb状态

http://192.168.0.102:28017/

mongodb管理工具RockMongo

参考网站: http://code.google.com/p/rock-php/wiki/rock_mongo_zh

1.       下载安装包

wget http://rock-php.googlecode.com/files/rockmongo-v1.1.0.zip

2.       解压到你的网站目录下

mkdir /data/sites/xizi.com/rockmongo

mv rockmongo-v1.1.0.zip /data/sites/xizi.com/rockmongo/

unzip rockmongo-v1.1.0.zip

3.用编辑器打开config.php (v1.0.5版本以前是index.php),修改host, port, admins等参数

在浏览器中访问index.php,比如说:http://192.168.0.102/rockmongo/index.php

提示错误:

To make things right, you must install php_mongo module. Here for installation documents on PHP.net.

解决方法:

wget --no-check-certificate https://github.com/mongodb/mongo-php-driver/tarball/master/mongodb-mongo-php-driver-1.2.10-130-g2ca8000.tar.gz

tar zxvf mongodb-mongo-php-driver-1.2.10-130-g2ca8000.tar.gz

cd mongodb-mongo-php-driver-2ca8000/

/usr/local/php5.2.14/bin/phpize

./configure --with-php-config=/usr/local/php5.2.14/bin/php-config

make install

修改php.ini文件,添加扩展

extension=mongo.so

4. http://192.168.0.102/rockmongo/index.php

使用用户名和密码登录,默认为"admin""admin"

开始玩转MongoDB!

5.为了方便可以修改rockmongo/config.php中的ip地址

$MONGO["servers"][$i]["mongo_name"] = "192.168.0.102";//mongo server name

$MONGO["servers"][$i]["mongo_host"] = "192.168.0.102";//mongo host

Mongodb权限管理

mongod没有加--auth的情况下(如果加了,你添加权限的话 会出现下面的情况)。

> use admin    

switched to db admin    

> db.addUser('root','root')    

Fri Jul 22 14:31:13 uncaught exception: error {    

"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",    

"code" : 10057    

}    

>    

所以我们添加用户时必须先在没有加--auth的时候添加个super  admin

服务起来后,进入./mongo

[root@:/usr/local/mongodb/bin]#./mongo    

MongoDB shell version: 1.8.2    

connecting to: test    

> use admin    

switched to db admin    

> db.adduser('root','root')    

Fri Jul 22 14:34:24 TypeError: db.adduser is not a function (shell):1    

> db.addUser('root','root')    

{    

"_id" : ObjectId("4e2914a585178da4e03a16c3"),    

"user" : "root",    

"readOnly" : false,    

"pwd" : "75692b1d11c072c6c79332e248c4f699"    

}    

>    

这样就说明 已经成功建立了,然后我们试一下权限。

> show collections    

system.indexes    

system.users   

在没有加--auth的情况下 可以正常访问admin默认的两个表,就算在admin表添加了用户一样不需验证。

> db.system.users.find()    

{ "_id" : ObjectId("4e2914a585178da4e03a16c3"), "user" : "root", "readOnly" : false, "pwd" : "75692b1d11c072c6c79332e248c4f699" }>    

已经成功建立。

下面把服务加上--auth的选项,再进入./mongo

MongoDB shell version: 1.8.2    

connecting to: test    

> use admin    

switched to db admin    

> show collections    

Fri Jul 22 14:38:49 uncaught exception: error: {    

"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",    

"code" : 10057    

}    

>    

可以看出已经没有访问权限了。

我们就用自己的密钥登录下:

> db.auth('root','root')    

1   

返回1说明验证成功!

show collections下就成功了。

.....

我们登录其它表试试:

[root@:/usr/local/mongodb/bin]#./mongo    

MongoDB shell version: 1.8.2    

connecting to: test    

> use test    

switched to db test    

> show collections    

Fri Jul 22 14:40:47 uncaught exception: error: {    

"$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",    

"code" : 10057    

}   

也需要验证,试试super admin登录:

[root@:/usr/local/mongodb/bin]#./mongo    

MongoDB shell version: 1.8.2    

connecting to: test    

> use test    

switched to db test    

> show collections    

Fri Jul 22 14:40:47 uncaught exception: error: {    

"$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",    

"code" : 10057    

}     

> db.auth('root','root')     

0   

返回0验证失败。 

好吧,不绕圈子,其实super admin必须从admin那么登录 然后 use其它表才可以

> use admin    

> use admin  

switched to db admin    

> db.auth('root','root')    

1    

> use test    

switched to db test    

> show collections    

>    

如果想单独访问一个表,用独立的用户名,就需要在那个表里面建相应的user

[root@:/usr/local/mongodb/bin]#./mongo    

MongoDB shell version: 1.8.2    

connecting to: test    

> use admin    

switched to db admin    

> db.auth('root','root')    

1    

> use test    

switched to db test    

> db.addUser('test','test')    

{    

"user" : "test",    

"readOnly" : false,    

"pwd" : "a6de521abefc2fed4f5876855a3484f5"    

}    

>    

当然必须有相关权限才可以建立。

再登录看看:

[root@:/usr/local/mongodb/bin]#./mongo    

 MongoDB shell version: 1.8.2    

 connecting to: test    

 > show collections    

 Fri Jul 22 14:45:08 uncaught exception: error: {    

"$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",    

 "code" : 10057    

 }    

 > db.auth('test','test')    

 1    

 > show collections    

 system.indexes    

 system.users    

 >    

加了用户认证之后,需要修改rockmongo/config.php,否则反而无法登录。

//$MONGO["servers"][$i]["mongo_auth"] = false;//enable mongo authentication?

$MONGO["servers"][$i]["mongo_auth"] = true;//enable mongo authentication?

 登录其他mongodb服务器

登录其他mongodb服务器:

/usr/local/mongodb/bin/mongo --host 192.168.0.102 admin -u root –p

要指定登录admin数据库,否则无法通过验证。

/usr/local/mongodb/bin/mongo admin -u root –p

或者我们可以这样登录

/usr/local/mongodb/bin/mongo

然后use admin

db.auth('root','password')

这样才能操作数据库

Mongodb备份和主从同步

 

1)首先我们备份好数据库

/usr/local/mongodb/bin/mongodump -uroot -p -d xz_ad -o /data/backup/database/

/usr/local/mongodb/bin/mongodump -uroot -p -o /data/backup/database/

2)主从带认证:

主服务器和从服务器必须开启安全认证:--auth, 主服务器和从服务器的admin数据库中必须有全局用户, 然后主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。

注:local:本地数据库 这个数据库不会同步,主要存放同步的信息。MongoDB2.0.2版本测试时,从服务器的admin数据库中没有全局用户时也能进行复制(Deven:我们就是采用这个方式,从服务器admin数据库没有建立用户),尽管admin中无用户,客户端连接此服务器不进行验证(即--auth参数失效),但从服务器的--auth必须指定。既然启用了--auth,就应该在从服务器的admin中增加一个用户。

3)主服务器设置

/usr/local/mongodb/bin/mongo admin -uroot -p

   >use admin

   >db.addUser('root','root')

   >use local

   >db.addUser('repl','repl')

   > use admin;

switched to db admin

> db.shutdownServer()

然后重新启动mongodb,具体参数可以用/usr/local/mongodb/bin/mongod –h查看:

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --master --oplogSize 1024 --fork --auth

4)从服务器设置,有2种方案。

 方案1,启动时直接指定为从数据库(线上按照方案1实施):

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork --auth

提示错误:

Fri Jul 20 10:41:31 [replslave] replauthenticate: no user in local.system.users to use for authentication

repl:

Fri Jul 20 10:41:31 [replslave] repl: sleep 3 sec before next pass

因为这个时候admin并没有同步过来,所以可以不用验证权限。

/usr/local/mongodb/bin/mongo

>use local

>db.addUser('repl', 'repl')

过几分钟之后数据就会自动同步过来了,包括admin数据库,重新登录就会发现权限验证已经生效。

方案2

先初始mongodb

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --fork

建立同步账号和admin账号

/usr/local/mongodb/bin/mongo

>use local

>db.addUser('repl', 'repl')

> use admin

switched to db admin

> db.addUser('root','root')

> db.shutdownServer();

然后重新启动mongodb就行了

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork --auth

5 )查看数据是否全部同步过来了

 在主服务器上看数据集大小

> db.ad_click.count()

1279390

在从服务器也查看数据集大小

> db.ad_click.count()

1279390

多观察几次,如果值都一样,证明数据已经正常同步。

(6)测试更新数据是否会同步(如果是线上服务器可以跳过)

在主服务器:

>use plus

>db.blog.insert({"b":"b"});

>db.blog.find()

在从服务器上查看是否同步过去了

>use plus

>db.blog.find()

同样在主服务器删除数据,看从服务器是否同步

> db.blog.remove();

> db.blog.drop();

7)查看同步情况状态

> db.printReplicationInfo();

this is a slave, printing slave replication info.

source:   192.168.0.102:27017

         syncedTo: Fri Jul 20 2012 10:45:37 GMT+0800 (CST)

                 = 10 secs ago (0hrs)

0hrs好像是同步延时多少,不确定。

8如果发现主从不同步,从上手动同步:

use admin;

db.runCommand ( { "resync": 1 } )

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --master --oplogSize 1024 --fork --auth

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork --auth

主从不带认证同步步骤

1)主服务器设置

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --master --oplogSize 1024 --fork

2)从服务器设置

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork

 

这样主从就会自动同步了。

 

遇到的错误:

1.[root@centos-5 db]# /usr/local/mongodb/bin/mongo

MongoDB shell version: 2.0.4

connecting to: test

Wed Jul 18 11:36:51 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84

exception: connect failed

原因:mongodb不正常关闭造成的mongodb被锁定,这算是一个Mongod 启动的一个常见错误,非法关闭的时候,lock 文件没有干掉,第二次启动的时候检查到有lock 文件的时候,就报这个错误了。

正确关闭mongod 的方法:进入mongo shell

use admin

db.shutdownServer()

也可以按照文档粗暴的杀掉它,它内部应该有KILL信号处理程序。killall mongod

请不要 kill -9 ,会造成文件数据混乱丢失 repair 也无力回天。

解决方法:

(1)进入 mongod 上一次启动的时候指定的 data 目录  删除掉该文件:

rm /data/db/mongo.lock

(2)再执行:

 ./mongod  --repair

(3)重新启动mongodb

2. Logstream::get called in uninitialized state

Thu Jul 19 14:16:34 ERROR: Client::~Client _context should be null but is not; client:replslave

将从服务器数据目录清空然后再启动就行了

rm -rf /daba/db/*

3.在虚拟机测试时,启动主从之后无法同步。

是因为刚开始主从服务器相差很远,两台服务器的时间要调为一致,最好设定定时同步时间。

4.执行db.runCommand({"fsync":1,"lock":1})之后,竟然无法登录mongodb了,不知道哪里出问题了

备注:

这里在简单的介绍一下Master Slave/ Replica Sets 备份机制,这两种模式都是基于主服务器的oplog 来实现所有从服务器的同步。
oplog
记录了增删改操作的记录信息(不包含查询的操作),但是oplog有大小限制,当超过指定大小,oplog会清空之前的记录,重新开始记录。(太坑爹了!!!)
Master Slave
方式 主服备器会产生 oplog.$main 的日志集合
Replica Sets  
方式 所有服务器都会产生oplog.rs 日志集合
两种机制下,所有从服务器都会去轮询主服务器oplog日志,若主服务器的日志较新,就会同步这些新的操作记录。但是这里有个很重要的问题,从服务器由于网络阻塞,死机等原因无法极时同步主服务器oplog记录:
一种情况: 主服务器oplog不断刷新,这样从服务器永远无法追上主服务器。
另外一种情况:刚好主服务器oplog超出大小,清空了之前的oplog,这样从服务器就与主服务器数据就可能会不一致了,这第二种情况,我是推断的,没有证实。
另外要说明一下Replica Sets 备份的缺点,当主服务器发生故障时,一台从服务器被投票选为了主服务器,但是这台从服务的oplog 如果晚于之前的主服务器oplog的话,那之前的主服务器恢复后,会回滚自己的oplog操作和新的主服务器oplog保持一致。由于这个过程是自动切换 的,所以在无形之中就导致了部分数据丢失。

编写备份脚本

#!/bin/bash

# Power by xizi

# Edit by deven

# Make Day:2012-07-20

# Update Day:2012-07-20

#######################  Set var

today=$(date +"%Y%m%d")

old7day=$(date -d "7 days ago" +"%Y%m%d")

#######################  Copy Database

cd /data/backup/database/

/usr/local/mongodb/bin/mongodump -uroot -ppassword -o /data/backup/database/

zip -rP 888888 /data/backup/database/xz_ad_db_${today}.zip xz_ad

zip -rP 888888 /data/backup/database/admin_db_${today}.zip admin

rm -rf /data/backup/database/xz_ad

rm -rf /data/backup/database/admin

Mongod文档操作命令

插入文档:

db.blog.insert({"id":1,"sex":"m"})

文档替换:

db.blog.insert({"name":"deven","friends":32,"enemies":2})

var deven=db.blog.findOne({"name":"deven"});

deven.relationships={"friends":deven.friends,"enemies":deven.enemies};

deven.username=deven.name

delete deven.friends;

delete deven.enemies;

db.blog.update({"name":"deven"},deven)

db.blog.insert({"url":"www.xizi.com","pv": 50})

db.blog.update({"url":"www.xizi.com"},{"$inc":{"pv":1}})

db.blog.find()

“$set”修改器

db.blog.update({"_id" : ObjectId("4f94d7f61c187e4c476fd62a")},{"$set":{"bd":"1980"}})

db.blog.update({"id":1},{"$set":{"bd":"1985"}})

db.blog.update({"id":1},{"$set":{"sex":["g","b"]}})

增加或者减少:

db.blog.insert({"game":"pinball","user":"deven"})

db.blog.update({"game":"pinball","user":"deven"},{"$inc":{"score":100}})

db.blog.update({"game":"pinball","user":"deven"},{"$inc":{"score":10000}})

upsert

db.blog.update({"url":"/blog"},{"$inc":{"visits":1}},true)

查找特定条件:

db.blog.find({"user":"deven"})

指定返回键:

db.blog.find({},{"game":1})

查找pv小于等于62的文档

db.blog.find({"pv":{"$lte":62}})

游标:

for(i=0;i<100;i++){

db.blog.insert({x:i});

}

参考文档:

http://blog.sina.com.cn/s/blog_a34f10a4010113df.html *****MongoDB主从复制认证要点,主要

参考

http://hi.baidu.com/_sunlight/item/db03c229f2c1dcf851fd8763 ****主要参考

http://www.open-open.com/lib/view/open1341304885621.html ****MongoDB实战系列之三:MongoDB的主从部署

http://xiaoshan5634.iteye.com/blog/1117702 *****很不错 mongod的启动参

http://www.itpub.net/thread-1584381-1-1.html ****MongoDB资料汇