一、為什么要把web服務(wù)器和數(shù)據(jù)庫服務(wù)器運(yùn)行在不同機(jī)器上
硬件故障
基本上現(xiàn)在大型的軟件都是搞分布式部署、分布式計(jì)算,生產(chǎn)環(huán)境最忌諱的就是單點(diǎn)故障,所以現(xiàn)在云計(jì)算、虛擬化得以大行其道,哪怕是一個簡單的計(jì)算微服務(wù),也應(yīng)該最少要有2份以上的副本,而且較好是要求這些副本不同機(jī)器、不同機(jī)架甚至是不同的數(shù)據(jù)中心,這樣在發(fā)生意外時另外有效的副本可以馬上接上繼續(xù)工作,一個簡單的服務(wù)尚且如此,更何況是重量級的web服務(wù)器和數(shù)據(jù)庫服務(wù)器,部署在同一臺物理機(jī)器上是及其不合理的
軟件定位
每個軟件的專注的功能不同,必然導(dǎo)致它們對各種軟硬件資源的利用效率不一樣。web服務(wù)器主要是用來處理網(wǎng)絡(luò)連接和資源請求的,因此要求就是高帶寬,高并發(fā),對CPU的要求其實(shí)不高,對內(nèi)存的要求高,因?yàn)樵谶@一層面需要緩存大量的信息以及線程池來追求速度,對磁盤IO要求不高,因此可以專門優(yōu)化為大內(nèi)存的多核服務(wù)器,結(jié)合具體使用的服務(wù)器(如Apache、Tomcat、Nginx等)做極致的優(yōu)化,然而為web服務(wù)器所做的優(yōu)化顯然不適合數(shù)據(jù)庫服務(wù)器。數(shù)據(jù)庫服務(wù)器的主要職責(zé)是處理SQL語句,管理磁盤上存儲的數(shù)據(jù),要求大量的磁盤IO,對緩沖池要求極高,拿MySQL的Innodb引擎來講,基本上較好內(nèi)存的80%都分配給innodb_buffer_pool_size,用來緩存索引信息,磁盤臟頁,臨時表等,但是并發(fā)程度是遠(yuǎn)遠(yuǎn)低于web服務(wù)器的,比如對于一個秒殺系統(tǒng)而言,如果web服務(wù)器在1秒內(nèi)收到了100萬請求需要處理,而庫存只有1萬個,這時會落到數(shù)據(jù)庫的請求就是非常多1萬個,當(dāng)然,生產(chǎn)環(huán)境中甚至不應(yīng)該使用數(shù)據(jù)庫來查這些實(shí)時數(shù)據(jù)??偨Y(jié),web服務(wù)器和數(shù)據(jù)庫服務(wù)器定位不同,優(yōu)化點(diǎn)也不同,強(qiáng)行放一起會嚴(yán)重影響兩者的性能
安全
一般企業(yè)的數(shù)據(jù)庫都是部署在內(nèi)網(wǎng),端口不會開放的,以防止黑客攻擊,只能通過內(nèi)網(wǎng)跳板機(jī)去訪問,由專業(yè)的DBA管理,而web服務(wù)器是開放的,容易造成誤操作或者被攻擊導(dǎo)致數(shù)據(jù)損壞什么的
延伸閱讀:
二、MongoDB是什么
非關(guān)系型數(shù)據(jù)庫(nosql ),屬于文檔型數(shù)據(jù)庫。MongoDB采用類JSON的documents來存儲數(shù)據(jù)。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。
MongoDB采用動態(tài)數(shù)據(jù)模型schema,這意味著不需要預(yù)先定義表的數(shù)據(jù)類型和字段名。當(dāng)MongoDB需要更新文檔documents的時候,可以輕松增加新的字段名或者刪除舊的字段。MongoDB讓數(shù)據(jù)結(jié)構(gòu)更加層級化,因而存儲數(shù)組等復(fù)雜數(shù)據(jù)結(jié)構(gòu)。 在同一個集合collection中,文檔document對字段也沒有強(qiáng)約束,因此更容易設(shè)計(jì)差異化的數(shù)據(jù)結(jié)構(gòu)。