CentOS编译安装mongoDB的php扩展 MongoDB查询超时异常SocketTimeoutException

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源,只会启用最后一个<mongo:options>配置。

应该把参数配置信息存储在properties文件中。

<mongo:mongo host="${mongodb.ip}" id="mongo202" port="${mongodb.port}">
    <mongo:options connections-per-host="200"
        threads-allowed-to-block-for-connection-multiplier="100"
        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" />
</mongo:mongo>

通过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,即服务器响应超时,服务器没有在规定的时间内返回给客户端数据。

时间: 2024-08-03 10:34:40

CentOS编译安装mongoDB的php扩展 MongoDB查询超时异常SocketTimeoutException的相关文章

CENTOS编译安装APACHE2.4+PHP5.6的教程

1.下载Apache2.4+PHP5.6源码包 从http://httpd.apache.org/download.cgi#apache24下载httpd-2.4.17.tar.gz和other file下载httpd-2.4.17-deps.tar.gz 从http://php.net/downloads.php下载php-5.6.16.tar.gz源码包 从http://sourceforge.net/projects/pcre/files/pcre/8.32/ 下载pcre-8.32.ta

linux(centos)下安装PHP的PDO扩展

PHP 数据对象PDO扩展为PHP访问数据库定义了一个轻量级的一致接口.PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据.最近在我们的建站和OA系统交流群中,有对服务器运维不熟悉的朋友问到关于PHP的PDO扩展安装的问题.本文我们将和大家一起分享如何在服务器上安装PDO扩展. 环境: 服务器系统:Centos6.5 (虚拟机演示) PHP软件包存放目录:/data/php-5.6.14/ PHP安装目录:/usr/local/php/ m

centos编译安装nodejs的例子

今天我们来单独说说怎么编译安装nodejs,如果会的就看最后,不会的就跟着一步一步的安装走吧.   系统:centos 6.x(64位)   软件版本:nodejs 5.3.0 1.先升级gcc版本 级gcc请看这篇文章linux快速升级gcc版本,这里就不重复说了. 2.下载node wget http://nodejs.org/dist/v5.3.0/node-v5.3.0.tar.gz 或 wget http://download.slogra.com/nodejs/node-v5.3.0

centos编译安装mysql(以mysql-5.6.26为例)

1)安装前准备 ①下载mysql,从官网获取源码包,http://dev.mysql.com/downloads/mysql #wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.27.tar.gz #tar xvf mysql-5.6.27.tar.gz #cd mysql-5.6.27 ②检查是否存在mysql #rpm -qa | grep mysql 存在的话就删除 rpm -e mysql   //普通删除模式 rpm -e

在CENTOS上安装APACHE,MUNIN(对MONGODB的PLUGIN未成功)

最近公司忙死, 为了配合大家公司,在ESX上的CENTOS里,再上一个作网站资源监控的MUNIN. (NTOP,在考虑当中,测试已通过) 由于对APACHE执行CGI不甚清楚,搞了很久的这些权限问题. 最后,在一篇最简单的参考文档里搞定. 看来,PYTHON和APACHE的CGI,FASTCGI也要去了解一下了.. URL: http://www.tecmint.com/install-munin-network-monitoring-in-rhel-cent-6-3-fedora-17/ In

CentOS编译安装gcc

1.下载源码 wget ftp://mirrors.kernel.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2 2.解压文件 tar -xvf gcc-4.9.2.tar.bz2 3.进入文件夹 cd gcc-4.9.2.tar.bz2 4.下载依赖项 ./contrib/download_prerequisites (网速慢的话可以解析该文件内的ftp下载地址,在Windows上用迅雷下载,然后ftp上传到Linux服务器) 5.返回上一级 cd ../ 6.

Centos中安装PHP模块/exif扩展(不需要重装PHP)

安装exif不需要另外安装库,所以省略掉了安装库的步骤. 比如php的安装目录为:/root/lnmp0.4-full/php-5.2.10/ 则执行:cd /root/lnmp0.4-full/php-5.2.10/ext/ 我们要安装exif模块,执行cd exif/ 再执行 /usr/local/php/bin/phpize 会返回如下信息: Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Ze

CentOS 7.0编译安装lnmp教程(Nginx1.6.0+MySQL5.6.19+PHP5.5.14)_Linux

准备篇: CentOS 7.0系统安装配置图解教程 http://www.jb51.net/os/188487.html 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 2.安装iptab

centos系统编译安装nginx+php环境另加独立mysql教程

  前端(nginx+php)ip:192.168.10.8 后端(独立mysql)ip:192.168.10.5 软件版本:libiconv-1.14.tar.gz mysql-5.1.63.tar.gz php-5.2.17.tar.gz php-5.2.17-fpm-0.5.14.diff.gz php-5.2.17-max-input-vars.patch 1.先在后端安装mysql 在192.168.10.5上只安装mysql.方法可以去看centos编译安装nginx+php-fpm