CentOS編譯安裝mongoDB的php擴充 MongoDB查詢逾時異常SocketTimeoutException

來源:互聯網
上載者:User

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,即伺服器響應逾時,伺服器沒有在規定的時間內返回給用戶端資料。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.