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