mongodb為什么要選擇奇數(shù)個(gè)節(jié)點(diǎn)

mongodb為什么要選擇奇數(shù)個(gè)節(jié)點(diǎn)

#in

MongoDB 是什么?看完你就知道了

點(diǎn)擊上方 藍(lán)色字體 ,選擇“置頂公眾號(hào)” 優(yōu)質(zhì)文章,**時(shí)間送達(dá) 鏈接 | blog.csdn.net/hayre/article/details/80628431 1.MongoDB是什么?用一句話總結(jié) MongoDB是一款為web應(yīng)用程序和互聯(lián)網(wǎng)基礎(chǔ)設(shè)施設(shè)計(jì)的數(shù)據(jù)庫管理系統(tǒng)。沒錯(cuò)MongoDB就是數(shù)據(jù)庫,是NoSQL類型的數(shù)據(jù)庫。

(1)MongoDB提出的是文檔、**的概念,使用BSON(類JSON)作為其數(shù)據(jù)模型結(jié)構(gòu),其結(jié)構(gòu)是面向?qū)ο蟮亩皇嵌S表,存儲(chǔ)一個(gè)用戶在MongoDB中是這樣子的。

使用這樣的數(shù)據(jù)模型,使得MongoDB能在生產(chǎn)環(huán)境中提供高讀寫的能力,吞吐量較于mysql等SQL數(shù)據(jù)庫大大增強(qiáng)。 (2)易伸縮,自動(dòng)故障轉(zhuǎn)移。易伸縮指的是提供了分片能力,能對(duì)數(shù)據(jù)集進(jìn)行分片,數(shù)據(jù)的存儲(chǔ)壓力分?jǐn)偨o多臺(tái)服務(wù)器。自動(dòng)故障轉(zhuǎn)移是副本集的概念,MongoDB能檢測(cè)主節(jié)點(diǎn)是否存活,當(dāng)失活時(shí)能自動(dòng)提升從節(jié)點(diǎn)為主節(jié)點(diǎn),達(dá)到故障轉(zhuǎn)移。

(3)數(shù)據(jù)模型因?yàn)槭敲嫦驅(qū)ο蟮?,所以可以表示豐富的、有層級(jí)的數(shù)據(jù)結(jié)構(gòu),比如博客系統(tǒng)中能把“評(píng)論”直接懟到“文章“的文檔中,而不必像myqsl一樣創(chuàng)建三張表來描述這樣的關(guān)系。 3.主要特性 (1)文檔數(shù)據(jù)類型 SQL類型的數(shù)據(jù)庫是正規(guī)化的,可以通過主鍵或者外鍵的約束保證數(shù)據(jù)的完整性與**性,所以SQL類型的數(shù)據(jù)庫常用于對(duì)數(shù)據(jù)完整性較高的系統(tǒng)。MongoDB在這一方面是不如SQL類型的數(shù)據(jù)庫,且MongoDB沒有固定的Schema,正因?yàn)镸ongoDB少了一些這樣的約束條件,可以讓數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)更靈活,存儲(chǔ)速度更加快。

(2)即時(shí)查詢能力 MongoDB保留了關(guān)系型數(shù)據(jù)庫即時(shí)查詢的能力,保留了索引(底層是基于B tree)的能力。這一點(diǎn)汲取了關(guān)系型數(shù)據(jù)庫的優(yōu)點(diǎn),相比于同類型的NoSQL redis 并沒有上述的能力。 (3)**能力 MongoDB自身提供了副本集能將數(shù)據(jù)分布在多臺(tái)機(jī)器上實(shí)現(xiàn)冗余,目的是可以提供自動(dòng)故障轉(zhuǎn)移、擴(kuò)展讀能力。

(4)速度與持久性 MongoDB的驅(qū)動(dòng)實(shí)現(xiàn)一個(gè)寫入語義 fire and forget ,即通過驅(qū)動(dòng)調(diào)用寫入時(shí),可以立即得到返回得到成功的結(jié)果(即使是報(bào)錯(cuò)),這樣讓寫入的速度更加快,當(dāng)然會(huì)有一定的不安全性,完全依賴**。 MongoDB提供了Journaling日志的概念,實(shí)際上像mysql的bin-log日志,當(dāng)需要插入的時(shí)候會(huì)先往日志里面寫入記錄,再完成實(shí)際的數(shù)據(jù)操作,這樣如果出現(xiàn)停電,進(jìn)程突然中斷的情況,可以保障數(shù)據(jù)不會(huì)錯(cuò)誤,可以通過修復(fù)功能讀取Journaling日志進(jìn)行修復(fù)。 (5)數(shù)據(jù)擴(kuò)展 MongoDB使用分片技術(shù)對(duì)數(shù)據(jù)進(jìn)行擴(kuò)展,MongoDB能自動(dòng)分片、自動(dòng)轉(zhuǎn)移分片里面的數(shù)據(jù)塊,讓每一個(gè)服務(wù)器里面存儲(chǔ)的數(shù)據(jù)都是一樣大小。

MongoDB核心服務(wù)器主要是通過mongod程序啟動(dòng)的,而且在啟動(dòng)時(shí)不需對(duì)MongoDB使用的內(nèi)存進(jìn)行配置,因?yàn)槠湓O(shè)計(jì)哲學(xué)是內(nèi)存管理**是交給操作系統(tǒng),缺少內(nèi)存配置是MongoDB的設(shè)計(jì)亮點(diǎn),另外,還可通過mongos路由服務(wù)器使用分片功能。 MongoDB的主要客戶端是可以交互的js shell 通過mongo啟動(dòng),使用js shell能使用js直接與MongoDB進(jìn)行交流,像使用sql語句查詢mysql數(shù)據(jù)一樣使用js語法查詢MongoDB的數(shù)據(jù),另外還提供了各種語言的驅(qū)動(dòng)包,方便各種語言的接入。 mongodump和mongorestore,備份和恢復(fù)數(shù)據(jù)庫的標(biāo)準(zhǔn)工具。輸出BSON格式,遷移數(shù)據(jù)庫。

mongoexport和mongoimport,用來導(dǎo)入導(dǎo)出JSON、CSV和TSV數(shù)據(jù),數(shù)據(jù)需要支持多格式時(shí)有用。mongoimport還能用與大數(shù)據(jù)集的初始導(dǎo)入,但是在導(dǎo)入前順便還要注意一下,為了能充分利用好mongoDB通常需要對(duì)數(shù)據(jù)模型做一些調(diào)整。 mongosniff,**嗅探工具,用來觀察發(fā)送到數(shù)據(jù)庫的操作。基本就是把**上傳輸?shù)腂SON轉(zhuǎn)換為易于人們閱讀的shell語句。

因此,可以總結(jié)得到,MongoDB結(jié)合鍵值存儲(chǔ)和關(guān)系數(shù)據(jù)庫的**特性。因?yàn)楹?jiǎn)單,所以數(shù)據(jù)極快,而且相對(duì)容易伸縮還提供復(fù)雜查詢機(jī)制的數(shù)據(jù)庫。MongoDB需要跑在64位的服務(wù)器上面,且**單獨(dú)部署,因?yàn)槭菙?shù)據(jù)庫,所以也需要對(duì)其進(jìn)行熱備、冷備處理。 因?yàn)楸酒恼虏皇茿PI手冊(cè),所有這里對(duì)shell的使用也是基礎(chǔ)的介紹什么功能可以用什么語句,主要是為了展示使用MongoDB shell的方便性,如果需要知道具體的MongoDB shell語法可以查閱**文檔。

創(chuàng)建數(shù)據(jù)庫并不是必須的操作,數(shù)據(jù)庫與**只有在**次插入文檔時(shí)才會(huì)被創(chuàng)建,與對(duì)數(shù)據(jù)的動(dòng)態(tài)處理方式是一致的。簡(jiǎn)化并加速開發(fā)過程,而且有利于動(dòng)態(tài)分配命名空間。如果擔(dān)心數(shù)據(jù)庫或**被意外創(chuàng)建,可以開啟嚴(yán)格模式。

以上的命令只是簡(jiǎn)單實(shí)例,假設(shè)如果你之前沒有學(xué)習(xí)過任何數(shù)據(jù)庫語法,同時(shí)開始學(xué)sql查詢語法和MongoDB 查詢語法,你會(huì)發(fā)現(xiàn)哪一個(gè)更簡(jiǎn)單呢?如果你使用的是java驅(qū)動(dòng)去操作MongoDB,你會(huì)發(fā)現(xiàn)任何的查詢都像Hibernate提供出來的查詢方式一樣,只要構(gòu)建好一個(gè)查詢條件對(duì)象,便能輕松查詢(接下來會(huì)給出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成沒問題,也正因?yàn)檫@樣簡(jiǎn)潔,完善的查詢機(jī)制,深深的愛上了MongoDB。 使用java驅(qū)動(dòng)鏈接MongoDB是一件非常簡(jiǎn)單的事情,簡(jiǎn)單的引用,簡(jiǎn)單的做增刪改查。在使用完java驅(qū)動(dòng)后我才發(fā)現(xiàn)spring 對(duì)MongoDB 的封裝還不如**自身提供出來的東西好用,下面簡(jiǎn)單的展示一下使用。

這里只舉例了簡(jiǎn)單的鏈接與簡(jiǎn)單的MongoDB操作,可見其操作的容易性。使用驅(qū)動(dòng)時(shí)是基于TCP套接字與MongoDB進(jìn)行通信的,如果查詢結(jié)果較多,恰好無法全部放進(jìn)**服務(wù)器中,將會(huì)向服務(wù)器發(fā)送一個(gè)getmore指令獲取下一批查詢結(jié)果。 插入數(shù)據(jù)到服務(wù)器時(shí)間,不會(huì)等待服務(wù)器的響應(yīng),驅(qū)動(dòng)會(huì)假設(shè)寫入是成功的,實(shí)際是使用客戶端生成對(duì)象id,但是該行為可以通過配置配置,可以通過安全模式開啟,安全模式可以校驗(yàn)服務(wù)器端插入的錯(cuò)誤。 要清楚了解MongoDB的基本數(shù)據(jù)單元。

在關(guān)系型數(shù)據(jù)庫中有帶列和行的數(shù)據(jù)表。而MongoDB數(shù)據(jù)的基本單元是BSON文檔,在鍵值中有指向不定類型值的鍵,MongoDB擁有即時(shí)查詢,但不支持聯(lián)結(jié)操作,簡(jiǎn)單的鍵值存儲(chǔ)只能根據(jù)單個(gè)鍵來獲取值,不支持事務(wù),但支持多種原子更新操作。 如讀寫比是怎樣的,需要何種查詢,數(shù)據(jù)是如何更新的,會(huì)不會(huì)存在什么并發(fā)問題,數(shù)據(jù)結(jié)構(gòu)化的程度是要求高還是低。

系統(tǒng)本身的需求決定mysql還是MongoDB。 在關(guān)于schema 的設(shè)計(jì)中要注意一些原則,比如: 數(shù)據(jù)庫是**的邏輯與物理分組,MongoDB沒有提供創(chuàng)建數(shù)據(jù)庫的語法,只有在插入**時(shí),數(shù)據(jù)庫才開始建立。創(chuàng)建數(shù)據(jù)庫后會(huì)在磁盤分配一組數(shù)據(jù)文件,所有**、索引和數(shù)據(jù)庫的其他元數(shù)據(jù)都保存在這些文件中,查閱數(shù)據(jù)庫使用磁盤狀態(tài)可通過。 **是結(jié)構(gòu)上或概念上相似得文檔的容器,**的名稱可以包含數(shù)字、字母或 . 符號(hào),但必須以字母或數(shù)字開頭,完全。

限定**名不能超過128個(gè)字符,實(shí)際上 . 符號(hào)在**中很有用,能提供某種虛擬命名空間,這是一種組織上的原則,和其他**是一視同仁的。在**中可以使用。 其次是鍵值,在MongoDB里面所有的字符串都是UTF-8類型。

數(shù)字類型包括double、int、long。日期類型都是UTC格式,所以?。

為什么 要 mongodb

mongodb不是在實(shí)驗(yàn)室設(shè)計(jì)出來的。利用自己開發(fā)大型,高可用性和健壯性系統(tǒng)的經(jīng)驗(yàn),我們開發(fā)了mongodb。

我們并不是從零開始,而是發(fā)現(xiàn)哪些地方有問題,然后嘗試解決它。

所以在我眼中,mongodb讓你從使用mysql的基于關(guān)系的數(shù)據(jù)模型轉(zhuǎn)變?yōu)榛谖臋n的模型,從而獲得如快速的嵌入式文檔,易管理,使用無模式數(shù)據(jù)庫進(jìn)行敏捷開發(fā),易于橫向擴(kuò)展和伸縮(因?yàn)閖oin不再重要)等大量特性。使用關(guān)系型數(shù)據(jù)時(shí)有很多東西工作的很好,比如索引,動(dòng)態(tài)查詢和動(dòng)態(tài)更新等,這些在mongodb中也沒怎么變化。比如,在mongodb里設(shè)計(jì)索引應(yīng)該和你在mysql或oracle里一樣,你有選擇在一個(gè)內(nèi)嵌的域上建索引的能力。百科

mongodb的基本概念

(1)文檔文檔是 MongoDB 中數(shù)據(jù)的基本單位,類似于關(guān)系數(shù)據(jù)庫中的行(但是比行復(fù)雜)。多個(gè)鍵及其關(guān)聯(lián)的值有序地放在一起就構(gòu)成了文檔。

不同的編程語言對(duì)文檔的表示方法不同,在JavaScript 中文檔表示為:{“greeting”:“hello,world”}這個(gè)文檔只有一個(gè)鍵“greeting”,對(duì)應(yīng)的值為“hello,world”。

多數(shù)情況下,文檔比這個(gè)更復(fù)雜,它包含多個(gè)鍵/值對(duì)。例如:{“greeting”:“hello,world”,“foo”: 3}文檔中的鍵/值對(duì)是有序的,下面的文檔與上面的文檔是完全不同的兩個(gè)文檔。{“foo”: 3 ,“greeting”:“hello,world”}文檔中的值不僅可以是雙引號(hào)中的字符串,也可以是其他的數(shù)據(jù)類型,例如,整型、布爾型等,也可以是另外一個(gè)文檔,即文檔可以嵌套。文檔中的鍵類型只能是字符串。

(2)****就是一組文檔,類似于關(guān)系數(shù)據(jù)庫中的表。**是無模式的,**中的文檔可以是各式各樣的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它們的鍵不同,值的類型也不同,但是它們可以存放在同一個(gè)**中,也就是不同模式的文檔都可以放在同一個(gè)**中。

既然**中可以存放任何類型的文檔,那么為什么還需要使用多個(gè)**?這是因?yàn)樗形臋n都放在同一個(gè)**中,無論對(duì)于開發(fā)者還是管理員,都很難對(duì)**進(jìn)行管理,而且這種情形下,對(duì)**的查詢等操作效率都不高。所以在實(shí)際使用中,往往將文檔分類存放在不同的**中,例如,對(duì)于網(wǎng)站的日志記錄,可以根據(jù)日志的級(jí)別進(jìn)行存儲(chǔ),Info級(jí)別日志存放在Info **中,Debug 級(jí)別日志存放在Debug **中,這樣既方便了管理,也提供了查詢性能。但是需要注意的是,這種對(duì)文檔進(jìn)行劃分來分別存儲(chǔ)并不是MongoDB 的強(qiáng)制要求,用戶可以靈活選擇。

可以使用“.”按照命名空間將**劃分為子**。例如,對(duì)于一個(gè)博客系統(tǒng),可能包括blog.user 和blog.article 兩個(gè)子**,這樣劃分只是讓組織結(jié)構(gòu)更好一些,blog **和blog.user、blog.article 沒有任何關(guān)系。雖然子**沒有任何特殊的地方,但是使用子**組織數(shù)據(jù)結(jié)構(gòu)清晰,這也是MongoDB 推薦的方法。

(3)數(shù)據(jù)庫MongoDB 中多個(gè)文檔組成**,多個(gè)**組成數(shù)據(jù)庫。一個(gè)MongoDB 實(shí)例可以承載多個(gè)數(shù)據(jù)庫。它們之間可以看作相互獨(dú)立,每個(gè)數(shù)據(jù)庫都有獨(dú)立的權(quán)限控制。在磁盤上,不同的數(shù)據(jù)庫存放在不同的文件中。

MongoDB 中存在以下系統(tǒng)數(shù)據(jù)庫?!?Admin 數(shù)據(jù)庫:一個(gè)權(quán)限數(shù)據(jù)庫,如果創(chuàng)建用戶的時(shí)候?qū)⒃撚脩籼砑拥絘dmin 數(shù)據(jù)庫中,那么該用戶就自動(dòng)繼承了所有數(shù)據(jù)庫的權(quán)限?!?Local 數(shù)據(jù)庫:這個(gè)數(shù)據(jù)庫永遠(yuǎn)不會(huì)被負(fù)責(zé),可以用來存儲(chǔ)本地單臺(tái)服務(wù)器的任意**?!?Config 數(shù)據(jù)庫:當(dāng)MongoDB 使用分片模式時(shí),config 數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的信息。