"The palest ink is better than the best memory"——好记性不如烂笔头。2013~2015补记
题记 :
2013.3月时公司用户通讯录记录近8000W(Mysql单表),读写奇慢。
考虑到业务应用场景和数据结构形态(用户通讯录、第三方社交平台好友数据)——无固定Schema ,结构松散;且对数据一致性要求不高。
另这些数据适合直接使用JSON存储(当时生产环境Mysql5.1中一些字段硬是存储一个JSON字符串,无法做到修改JSON中某一个节点的数据)。而Mongodb面向集合存储:适合存储对象及JSON形式的数据;支持动态查询,查询指令使用JSON形式标记,可轻易查询文档中内嵌的对象及数组;完整的索引支持:包括文档内嵌对象及数组。
应用场景:
通讯录、名片夹、第三方社交平台好友数据存储
附近人脉(Geo特性)
内部API系统
Mongodb安装:
1.在线下载:
curl http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.4.2.tgz > mongodb.tgz
2.解压安装:
tar -zxvf mongodb.tgz
3.重命名:
mv mongodb-linux-x86_64-2.4.2 mongodb64_2.4.2
4.随机启动(vi编辑器打开配置文件,并在其中加入):
vi /etc/rc.local
/usr/local/mongodb64_2.4.2/bin/mongod -dbpath=/usr/local/mongodb64_2.4.2/data/db --port 27017 -logpath=/var/log/mongodb_log/log --logappend
5.启动mongodb:
./mongod-dbpath=/usr/local/mongodb64_2.4.2/data/db--logpath=/var/log/mongodb_log/mongodb.log
6.查看端口:
netstat -tnl
7.查看进程:
ps -ef | grep 'mongod'
8.本地测试:
wget http://127.0.0.1:28017/
9.进入Shell:
/bin/mongo
另外,我们使用mongo命令登录 MongoDB还要转到mongo命令所在目录再执行./mongo,这样是不是有些麻烦?因此,我们可以简化这点,将该命令文件copy到/usr/bin下,这样就可以在任何目录下使用mongo命令
10.关闭服务:
官方文档说明要使用 kill -15或killall mongod或在client的shell里,use admin,执行db.shutdownServer()即可!
11.Mongo运行监控:
[root@testServer bin]# ./mongostat
connected to: 127.0.0.1
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 5 *0 *0 0 1|0 0 448m 1.16g 7m 17 9tong:0.0% 0 0|0 0|0 62b 3k 1 14:11:54
*0 *0 *0 *0 0 1|0 0 448m 1.16g 7m 0 test:0.0% 0 0|0 0|0 62b 3k 1 14:11:55
*0 *0 *0 *0 0 1|0 0 448m 1.16g 7m 0 test:0.0% 0 0|0 0|0 62b 3k 1 14:11:56
12.启动脚本:
[root@testServer bin]# cat mongod.conf
##################################################################################
# #
# Descrition: configuration Options for MongoDB #
# Author: Ares.yi #
# Createtime: 2013-06-01 #
# Reference: http://docs.mongodb.org/manual/reference/program/mongod/ #
# #
##################################################################################
#auth = true
dbpath = /data_pic/mongodata
logpath = /data_pic/mongodb_log/mongodb.log
fork = true
[root@testServer bin]# cat start-mongod.sh
#!/bin/bash
##################################################################################
# #
# Descrition: Start MongoDB #
# Author: Ares.yi #
# Createtime: 2013-06-01 #
# #
##################################################################################
/usr/local/server/mongodb64_2.4.2/bin/mongod --config
索引管理:
1.查看索引:
db.runCommand({deleteIndexes:”user_contacts”,index:”numberSet_1”})
2.创建索引(后台创建、松散索引):
db.user_contacts.ensureIndex({numberSet:1},{sparse:true},{backgroud:true})
建立组合索引
db.data.ensureIndex({“info.url”:1, “info.city”:1});
创建唯一索引(删除已经重复的数据,保留一条):
db.user_contacts.ensureIndex({“id”:1},{“unique”:true,”dropDups”:true})
3.删除索引:
db.runCommand({deleteIndexes:”user_contacts”,index:”numberSet_1”})
4.命令行下提供了一个命令来返回指定Collection的索引大小:
db.user_contacts.totalIndexSize();
重要命令:
1.db.serverStatus():
> db.serverStatus().connections;
{ "current" : 3, "available" : 816, "totalCreated" : NumberLong(1217) }
mongodb最大的连接数是819,在启动里面加参数 –maxConns=3000重启mongodb服务后最大连接数还是819。
最后通过排查发现是linux系统的限制,Linux系统默认一个进程最大文件打开数目为1024。需要修改此限制
因为已经将mongodb添加到开机启动里面,所以需要在rc.local文件下面加ulimit -n 的限制 :
[root@testServer bin]# vi /etc/rc.local
2.db.currentOp():
Mongodb 的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,你可以通过db.currentOp()获取当前正在执行的操作。
在没有负载的机器上,该命令基本上都是返回空,如下:
> db.currentOp();
{ "inprog" : [ ] }
一个有负载的机器上得到的返回值样例:
{ "opid" : "s4664", "active" : false, "waitingForLock" : false, "op" : "query", "ns" : "sd.userEmail", "query" : { }, "client_s" : "10.121.13.8:34473", "desc" : "conn" }
如果你发现一个操作太长,把数据库卡死的话,可以用这个命令杀死他:
db.killOp(“s4664”)
FAQ:
》mongoDB非正常关闭后无法启动问题
解决方法:
1、删除%MONGO_HOME%/db下的.lock文件
2、输入命令 mongod –repair
3、重启mongoDB
》WARN处理:
解决方法:
(http://docs.mongodb.org/manual/administration/production-notes/#production-numa)
(http://blog.nosqlfan.com/html/2772.html)
numactl --interleave=all ./mongod -dbpath=/usr/local/mongodb64_2.4.2/data/db -logpath=/var/log/mongodb_log/mongodb.log
》./bin/mongod 启动 MongoDB 服务时,屏幕会输出很多运行信息,并不会回到 shell 提示符。除非 Ctrl + C,但是这样会停止 MongoDB 服务进程。
解决方法(使用Daemon方式):
方法1:使用&符号
如:./mongod -dbpath=/usr/local/mongodb64_2.4.2/data/db -logpath=/var/log/mongodb_log/mongodb.log &
方法2:使用fork参数符号
如:./mongod -dbpath=/usr/local/mongodb64_2.4.2/data/db -logpath=/var/log/mongodb_log/mongodb.log –fork
资料参考:
1.MongoDB Shell 常用操作:
http://www.csser.com/board/4f4e9315eb0defac57000129
2.mongodb.conf配置:
http://docs.mongodb.org/manual/reference/configuration-options/
3.博客:
http://chenzhou123520.iteye.com/category/232023
http://xiayuanfeng.iteye.com/category/149973
4.MongoDB基本使用
http://www.cnblogs.com/TankMa/archive/2011/06/08/2074947.html
5.MongoDB监控:
http://tech.lezi.com/archives/290
6.索引:
http://blog.nosqlfan.com/html/3656.html
http://blog.nosqlfan.com/html/271.html
http://www.cnblogs.com/stephen-liu74/archive/2012/08/01/2561557.html
7.权限用户:
http://space.itpub.net/22664653/viewspace-715617
http://hi.baidu.com/ixigua/item/69eabbcc5a078625a0b50a5e
http://www.qttc.net/201304299.html
http://www.cnblogs.com/dennisit/archive/2013/02/22/2922906.html
8.数组查询:
http://blog.csdn.net/drifterj/article/details/7833883
9.备份:
http://blog.chinaunix.net/uid-15795819-id-3381684.html
http://www.netingcn.com/mongodb-start-stop-scripts.html
10.Mongod
http://docs.mongodb.org/manual/reference/program/mongod/