CentOS 编译安装 MongoDB与mongoDB的php扩展
下载mongo源码包,pcre,epel,js
1 #wget http://downloads.mongodb.org/src/mongodb-src-r1.8.1.tar.gz
#wget http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
#wget http://sourceforge.net/projects/pcre/files/pcre/8.12/pcre-8.12.tar.bz2
安装 python :
#yum install -y python-devel
安装scons: 下载scons
tar zxf scons-2.0.1.tar.gz
cd scons-2.0.1
python setup.py install
安装spidermonkey库,下载支持c的js api库 点此下载js-1.7.0.tar.gz
yum install -y boost boost-devel
tar zxvf js-1.7.0.tar.gz
cd js/src/
export CFLAGS="-DJS_C_STRINGS_ARE_UTF8"
make -f Makefile.ref
JS_DIST=/usr gmake -f Makefile.ref export
cd ../..
安装pcre
tar zxf pcre-8.12.tar.gz
cd pcre-8.12
./configure --enable-utf8 --enable-unicode-properties
make && make install
cd ..
安装MongoDB
tar zxf mongodb-src-r1.8.1.tar.gz
cd mongodb-src-r1.8.1
scons all // scons可能出现找不到pcre库的现象(修改/etc/ld.so.conf也无用,是scons自身的问题),这时需要打开mongodb-src-r1.8.0下的SConstruct,查找【 linux2"== os.sys.platform:】,在LIBPATH后面添加上pcrecpp库的安装路径,在LIBS后添加上pcrecpp库名,再重新scons all即可(操作:vim SConstruct;原来:env.Append( LIBPATH=["/usr/lib64" , "/lib64" ] ) ;修改后env.Append( LIBPATH=["/usr/lib64" , "/lib64" ,"/usr/local/pcre/lib"]); 接下来在env.Append( LIBS=["pthread"] )后面添加 env.Append( LIBS=["libpcrecpp"] ) )
scons --prefix=/usr/local/mongo install
如果需要安装lib和head,使用如下方式安装
scons --prefix=/usr/local/mongo --full install
创建配置文件
mkdir -p /usr/local/mongo/etc /usr/local/mongo/data /usr/local/mongo/log/ /usr/local/mongo/repair
vim /usr/local/mongo/etc/mongo.conf
在mongo.conf中添加下面的内容
dbpath = /usr/local/mongo/data
logpath = /usr/local/mongo/mongodb.log
repairpath = /usr/local/mongo/repair
pidfilepath = /usr/local/mongo/mongodb.pid
directoryperdb = true
logappend = true
noauth = true
port = 27017
maxConns = 1024
fork = true
rest = true
quota = true
quotaFiles = 1024
nssize = 16
启动mongodb
ln -s /usr/local/mongo/bin/mongod /usr/bin/mongod
mongod -f /usr/local/mongo/etc/mongo.conf
看看是不是启动起来了,但是使用这种方式管理mongodb服务器很不明智,我们完善一下:
mkdir -p /usr/local/mongo/srv
vim /usr/local/mongo/srv/mongodb-start
添加下面的内容
#!/bin/sh
mongod -f /usr/local/mongo/etc/mongo.conf
vim /usr/local/mongo/srv/mongodb-stop
添加下面的内容
#!/bin/bash
pid=`ps -o pid,command ax | grep mongod | awk '!/awk/ && !/grep/ {print $1}'`;
if [ "${pid}" != "" ]; then
kill -2 ${pid};
fi
添加执行权限
chmod a+x /usr/local/mongo/srv/mongodb-start
chmod a+x /usr/local/mongo/srv/mongodb-stop
vim /etc/rc.d/init.d/mongodb
添加下面的内容
#! /bin/sh
#
# mongodb – this script starts and stops the mongodb daemon
#
# chkconfig: - 85 15
# description: MongoDB is a non-relational database storage system.
# processname: mongodb
# config: /usr/local/mongo/etc/mongo.conf
# pidfile: /usr/local/mongo/mongodb.pid
PATH=/usr/local/mongo/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=mongodb
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting MongoDB... "
/usr/local/mongo/srv/mongodb-start
;;
stop)
echo -n "Stopping MongoDB... "
/usr/local/mongo/srv/mongodb-stop
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop}" >&2
exit 1
;;
esac
exit 0
添加服务
chmod a+x /etc/rc.d/init.d/mongodb
chkconfig --add mongodb
chkconfig --level 345 mongodb on
/etc/rc.d/init.d/mongodb start
MongoDB查询超时异常SocketTimeoutException
在对超过百万条记录的集合进行聚合操作。
DBObject match=(DBObject)JSON.parse("{$match:{logType:{'$in':[5,9]}}}");
DBObject group=(DBObject)JSON.parse("{$group:{'_id':'$domainUrl','count':{'$sum':1}}}");
AggregationOutput output = logCollection.aggregate(match,group);
偶尔会发生Read timed out 异常。
com.mongodb.MongoException$Network: Read operation to server /192.168.10.202:27017 failed on database adLogTable
at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:253)
at com.mongodb.DB.command(DB.java:261)
at com.mongodb.DB.command(DB.java:243) ...
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
通过多次测试,发现执行一次聚合平均时间为5s,超过5s时就会报错!
然后查看MongoDB的配置信息:
socket-timeout="5000" //5s
socket-timeout的默认配置为0,也就是没有限制。
没有超时限制,系统出了问题也不容易发现,应该根据实际情况,给出合理的超时时间。
通过多次测试发现最长执行时间为6秒,就把超时时间设置成了10000。
socket-timeout="10000" //10s
注意:MongoDB在与Spring整合时,如果要配置多个MongDB源,只会启用最后一个
应该把参数配置信息存储在properties文件中。
connect-timeout="1000"
max-wait-time="1000"
auto-connect-retry="true"
socket-keep-alive="true"
socket-timeout="10000"
slave-ok="true"
write-number="1"
write-timeout="0"
write-fsync="true" />
通过Java API获取配置参数
DBCollection logCollection = mongoTemplate.getCollection(collName);
MongoOptions mongoOptions = logCollection.getDB().getMongo().getMongoOptions();
System.out.println(mongoOptions.getSocketTimeout());
最后一点: ConnectionTimeOut和SocketTimeOut的区别:
一次完整的请求包括三个阶段:1、建立连接 2、数据传输 3、断开连接
如果与服务器(这里指数据库)请求建立连接的时间超过ConnectionTimeOut,就会抛 ConnectionTimeOutException,即服务器连接超时,没有在规定的时间内建立连接。
如果与服务器连接成功,就开始数据传输了。
如果服务器处理数据用时过长,超过了SocketTimeOut,就会抛出SocketTimeOutExceptin,即服务器响应超时,服务器没有在规定的时间内返回给客户端数据。