十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
package main
從事成都服務(wù)器托管,服務(wù)器租用,云主機(jī),網(wǎng)頁(yè)空間,國(guó)際域名空間,CDN,網(wǎng)絡(luò)代維等服務(wù)。
import (
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
type DB struct {
Session *mgo.Session
Collection *mgo.Collection
}
type Digapp struct {
App_id string
Fetch_url string
From string //
Fetch_state bool
Fetch_priority int32 //
Create_time int64 //
Invalid bool // + app is access now ?
}
func main() {
db := new(DB)
if err := db.DBInit(); err != nil {
fmt.Println("初始化數(shù)據(jù)庫(kù)失敗!錯(cuò)誤為:" + err.Error())
return
}
defer db.Close()
var digapp Digapp
//{"fetch_priority": 5, "
安裝文件:官方網(wǎng)站
選擇對(duì)應(yīng)系統(tǒng)的文件下載。
一、解壓縮文件。
將壓縮包解壓,在D盤創(chuàng)建文件夾MongoDB,將壓縮包中所有的.exe文件拷到D:MongoDB文件夾中。
二、建立工作目錄。
1、建立數(shù)據(jù)存放目錄 D:\mongodb\data
2、建立日志文件 ? ? ? D:\mongodb\log\mongodb.log
三、設(shè)置系統(tǒng)變量。為了方便從控制臺(tái)中管理mongodb,不用每次都進(jìn)入到D:MongoDB中。
我的電腦--屬性--高級(jí)--環(huán)境變量--系統(tǒng)變量中的path,加上;D:\MongoDB ,注意前面加上分號(hào)。如下圖:
三、啟動(dòng)mongdb服務(wù)。
進(jìn)入控制臺(tái)中,輸入mongod.exe --dbpath=D:\MongoDB\data 。如下圖:
這樣服務(wù)就啟動(dòng)了,正常情況下會(huì)顯示如下:
在瀏覽器中輸入。會(huì)出現(xiàn)
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
表面服務(wù)已經(jīng)啟動(dòng)。
不要關(guān)閉當(dāng)前這個(gè)控制臺(tái)窗口,另起一個(gè)控制臺(tái),輸入mongo.如下圖:
表明已成功連接到mongdb.
四、將mongdb作為windows服務(wù)隨機(jī)啟動(dòng)。
控制臺(tái)中輸入:mongod.exe --dbpath=D:\mongodb\data --logpath=D:\mongodb\logs\mongodb.log --install
正常情況下會(huì)顯示
五、連接mongodb
在控制臺(tái)中輸入net start mongodb,會(huì)出現(xiàn) “Mongo DB 服務(wù)已經(jīng)啟動(dòng)成功”的提示。
輸入mongo,就會(huì)連接到test.在我的電腦--管理--服務(wù)和應(yīng)用程序中可以看到MongoDB 服務(wù)已經(jīng)成功啟動(dòng)
六、異常處理
如果出現(xiàn)下圖的錯(cuò)誤:
先看服務(wù)啟動(dòng)沒(méi)有,如果沒(méi)有啟動(dòng)服務(wù)先啟動(dòng)服務(wù),如果服務(wù)已經(jīng)啟動(dòng)了,那有可能是上次不正常關(guān)閉mongo,導(dǎo)致存放數(shù)據(jù)的文件被占用了,被鎖住了。只需將D:\MongoDB\data中的mongod.lock文件刪除掉。重新啟動(dòng)服務(wù)即可。
連接是要消耗資源的,而且消耗的并不少。
內(nèi)存:MongoDB為例,每個(gè)線程都要分配1MB的棧內(nèi)存出來(lái)。1000個(gè)連接,1G內(nèi)存就這么沒(méi)了,甭管是否是活躍連接
文件句柄:每個(gè)連接都要打開(kāi)一個(gè)文件句柄,當(dāng)然從成本上講,這個(gè)消耗相對(duì)內(nèi)存是小了很多。但換個(gè)角度,文件句柄也被其他模塊消耗著,比如WT存儲(chǔ)引擎,就需要消耗大量的文件句柄
是否真的需要這么多的鏈接,一般的業(yè)務(wù)場(chǎng)景下請(qǐng)求壓力在1000QPS左右,按照每個(gè)請(qǐng)求50ms計(jì)算,最多也就需要1000/(1000/50)==50個(gè)鏈接即可滿足需求,并且是整個(gè)系統(tǒng)50個(gè)鏈接即可。
很多人平時(shí)沒(méi)有怎么注意過(guò)鏈接數(shù)概念,上云后發(fā)現(xiàn)居然有這樣的限制,心里很不舒服,可能非常不理解。這里說(shuō)下常見(jiàn)的兩種情況:
短鏈接:一般都是PHP環(huán)境,因?yàn)镻HP的框架決定了PHP短鏈接的特性,并且鏈接數(shù)的需求一般是在1000-3000左右,具體多少還要根據(jù)業(yè)務(wù)部署的PHP數(shù)量來(lái)計(jì)算。并且MongoDB開(kāi)源版本在短鏈接Auth處理上并不優(yōu)雅,會(huì)消耗非常多的CPU資源,3000鏈接即可跑滿24Core的CPU。PHP大拿Facebook也有同樣的問(wèn)題,所以他們用go語(yǔ)言自行開(kāi)發(fā)了一套Proxy代理,來(lái)解決對(duì)MongoDB的短鏈接請(qǐng)求問(wèn)題,但這畢竟帶來(lái)部署成本和兼容性問(wèn)題。阿里云的解決方案是從MongoDB源碼優(yōu)化下手,可以參考文章
長(zhǎng)鏈接:比較健康合理的使用方式,但是也要正確的配置客戶端,相關(guān)的參數(shù)為maxPoolSize=xx 在ConnectionURI上追加上去即可,否則默認(rèn)每個(gè)客戶端就是高處100來(lái)個(gè),平白的浪費(fèi)資源
鏈接數(shù)的上限需要綜合考慮性能,穩(wěn)定性,業(yè)務(wù)需求。多方面去考慮,缺一不可。超低的內(nèi)存,配置超高的鏈接數(shù),得到的只能是OOM。
執(zhí)行啟動(dòng)操作后,mongodb 在輸出一些必要信息后不會(huì)輸出任何信息,之后就等待連接的建立,當(dāng)連接被建立后,就會(huì)開(kāi)始打印日志信息。 你可以使用 MongoDB shell 來(lái)連接 MongoDB 服務(wù)器。你也可以使用 PHP 來(lái)連接 MongoDB。本教程我們會(huì)使用 MongoDB shell 來(lái)連接 Mongodb 服務(wù),之后的章節(jié)我們將會(huì)介紹如何通過(guò)php 來(lái)連接MongoDB服務(wù)。 標(biāo)準(zhǔn) URI 連接語(yǔ)法: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] mongodb:// 這是固定的格式,必須要指定。 username:password@ 可選項(xiàng),如果設(shè)置,在連接數(shù)據(jù)庫(kù)服務(wù)器之后,驅(qū)動(dòng)都會(huì)嘗試登陸這個(gè)數(shù)據(jù)庫(kù) host1 必須的指定至少一個(gè)host, host1 是這個(gè)URI唯一要填寫的。它指定了要連接服務(wù)器的地址。如果要連接復(fù)制集,請(qǐng)指定多個(gè)主機(jī)地址。 portX 可選的指定端口,如果不填,默認(rèn)為27017 /database 如果指定username:password@,連接并驗(yàn)證登陸指定數(shù)據(jù)庫(kù)。若不指定,默認(rèn)打開(kāi) test 數(shù)據(jù)庫(kù)。 ?options 是連接選項(xiàng)。如果不使用/database,則前面需要加上/。所有連接選項(xiàng)都是鍵值對(duì)name=value,鍵值對(duì)之間通過(guò)或;(分號(hào))隔開(kāi)