久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MongoDB中怎么實(shí)現(xiàn)集群

共計(jì) 5241 個(gè)字符,預(yù)計(jì)需要花費(fèi) 14 分鐘才能閱讀完成。

本篇文章給大家分享的是有關(guān) MongoDB 中怎么實(shí)現(xiàn)集群,丸趣 TV 小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。

基本概念

文檔(document):文檔是 MongoDB 的核心概念,是數(shù)據(jù)的基本單元,類似于關(guān)系數(shù)據(jù)庫中的行。在 MongoDB 中,文檔表示為鍵值對(duì)的一個(gè)有序集。文檔一般使用如下的樣式來標(biāo)記:

{title : hello!} {title : hello! , recommend :5} {title : hello! , recommend :5, author :{ firstname : paul , lastname : frank}}

從上面的例子可以看到,文檔的值有不同的數(shù)據(jù)類型,甚至可以是一個(gè)完整的內(nèi)嵌文檔(*** 一個(gè)示例的 author 就是一個(gè)文檔)

集合(collection):集合是一組文檔的集合,相當(dāng)于關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)表,MongoDB 數(shù)據(jù)庫不是關(guān)系型數(shù)據(jù)庫,沒有模式的概念。同一集合中的文檔可以有不同的形式。比如:

{name : jack , age :19} {name : wangjun , age :22, sex : 1}

可以存在同一個(gè)集合當(dāng)中。

數(shù)據(jù)庫(database):多個(gè)文檔構(gòu)成集合,多個(gè)集合組成數(shù)據(jù)庫。一個(gè) MongoDB 實(shí)例可以承載多個(gè)數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫可以擁有 0 到多個(gè)集合。

MongoDB 的主要目標(biāo)是在鍵值對(duì)存儲(chǔ)方式(提供了高性能和高度伸縮性)以及傳統(tǒng)的 RDBMS(關(guān)系性數(shù)據(jù)庫)系統(tǒng),集兩者的優(yōu)勢(shì)于一身。MongoDB 適用于以下場(chǎng)景:

網(wǎng)站數(shù)據(jù):Mongo 非常適合實(shí)時(shí)的插入,更新與查詢,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。

緩存:由于性能很高,Mongo 也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由 Mongo 搭建的持久化緩存可以避免下層的數(shù)據(jù)源過載。 

大尺寸、低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系數(shù)據(jù)庫存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較貴,在此之前,很多程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)。

高伸縮性的場(chǎng)景:Mongo 非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫

用于對(duì)象及 JSON 數(shù)據(jù)的存儲(chǔ):Mongo 的 BSON 數(shù)據(jù)格式非常適合文檔格式化的存儲(chǔ)及查詢。

當(dāng)然 MongoDB 也有不適合的場(chǎng)景:

高度事務(wù)性的系統(tǒng):例如銀行或會(huì)計(jì)系統(tǒng)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫目前還是更適用于需要大量事務(wù)的應(yīng)用程序。

傳統(tǒng)的商業(yè)智能應(yīng)用:針對(duì)特定問題的 BI 數(shù)據(jù)庫能夠提供高度優(yōu)化的查詢方式。對(duì)于此類應(yīng)用,數(shù)據(jù)倉庫可能時(shí)更適合的選擇(如 Hadoop 套件中的 Hive)。

需要 SQL 的問題。 

集群攻略

MongoDB 在商用環(huán)境中,為了高可用性,通常都是以集群形式使用的,MongoDB 的集群環(huán)境搭建非常簡(jiǎn)單,下面就作一個(gè)介紹。

主從模式

我們?cè)谑褂?MySQL 數(shù)據(jù)庫時(shí)廣泛采用的模式,采用雙機(jī)備份后主節(jié)點(diǎn)掛掉了后從節(jié)點(diǎn)可以接替主機(jī)繼續(xù)服務(wù)。所以這種模式比單節(jié)點(diǎn)的要可靠得多。

下面看一下怎么一步步搭建 MongoDB 的主從復(fù)制節(jié)點(diǎn):

1. 準(zhǔn)備兩臺(tái)機(jī)器 10.43.159.56 和 10.43.159.58。10.43.159.56 當(dāng)作主節(jié)點(diǎn),10.43.159.58 作為從節(jié)點(diǎn)。

2. 分別下載 MongoDB 安裝程序包。在 10.43.159.56 上建立文件夾 /data/MongoDBtest/master,10.43.159.58 建立文件夾 /data/MongoDBtest/slave。

3. 在 10.43.159.56 啟動(dòng) MongoDB 主節(jié)點(diǎn)程序。注意后面的這個(gè)“ndash;master”參數(shù),標(biāo)示主節(jié)點(diǎn):

mongod  ndash;dbpath /data/MongoDBtest/master ndash;master

輸出日志如下,成功:

[initandlisten] MongoDB starting :pid=18285 port=27017 dbpath=/data/MongoDBtest/master master=1

4. 在 10.43.159.58 啟動(dòng) MongoDB 從節(jié)點(diǎn)程序。關(guān)鍵配置:指定主節(jié)點(diǎn) ip 地址和端口 ndash;source 10.43.159.56:27017 和標(biāo)示從節(jié)點(diǎn) ndash;slave 參數(shù):

mongod  ndash;dbpath /data/MongoDBtest/slave ndash;slave  ndash;source 10.43.159.56:27017

輸出日志如下,成功:

[initandlisten] MongoDB starting : pid=17888port=27017 dbpath=/data/MongoDBtest/slave slave=1

日志顯示從節(jié)點(diǎn)從主節(jié)點(diǎn)同步復(fù)制數(shù)據(jù):

[replslave] repl: from host: 10.43.159.56:27017

這樣,主從結(jié)構(gòu)的 MongoDB 集群就搭建好了,是不是很簡(jiǎn)單?

下面我們來看看這個(gè)集群能做什么?先登錄到從節(jié)點(diǎn) shell 上,執(zhí)行插入數(shù)據(jù):

mongo 127.0.0.1:27017  db.testdb.insert({test3 : testval3}); not master

可以看到 MongoDB 的從節(jié)點(diǎn)是只能讀,不能執(zhí)行寫操作的。

那么如果主服務(wù)器掛掉,從服務(wù)器可以接替工作嗎?

可以試一下,強(qiáng)制關(guān)掉主節(jié)點(diǎn)上的 MongoDB 進(jìn)程,登錄在從節(jié)點(diǎn)上,再次執(zhí)行插入數(shù)據(jù):

 db.testdb.insert({test3 : testval3}); not master

看來從節(jié)點(diǎn)并沒有自動(dòng)接替主節(jié)點(diǎn)的工作,那就只有人工處理了,停止從節(jié)點(diǎn),再以 master 的方式啟動(dòng)從節(jié)點(diǎn),由于從節(jié)點(diǎn)上數(shù)據(jù)跟主節(jié)點(diǎn)一樣,此時(shí)從節(jié)點(diǎn)是可以替代主節(jié)點(diǎn)工作的,這屬于人工切換。

此外,我們可以搭建多個(gè)從節(jié)點(diǎn),實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,比如主節(jié)點(diǎn)負(fù)責(zé)寫,多個(gè)從節(jié)點(diǎn)負(fù)責(zé)讀,對(duì)于移動(dòng) APP,絕大部分操作都是讀操作,可以實(shí)現(xiàn)負(fù)荷分擔(dān)。

那么,搭建了這套主從結(jié)構(gòu)的集群是不是就能應(yīng)付商用環(huán)境呢?我們發(fā)現(xiàn)還是有幾個(gè)問題亟待解決的:

主節(jié)點(diǎn)掛了能否自動(dòng)切換連接?目前需要手工切換。

主節(jié)點(diǎn)的寫壓力過大如何解決?

從節(jié)點(diǎn)每個(gè)上面的數(shù)據(jù)都是對(duì)數(shù)據(jù)庫全量拷貝,從節(jié)點(diǎn)壓力會(huì)不會(huì)過大?

就算對(duì)從節(jié)點(diǎn)路由實(shí)施路由訪問策略能否做到自動(dòng)擴(kuò)展?

解決這幾個(gè)問題就要靠下面介紹的副本集模式了。

副本模式

MongoDB 官方已經(jīng)不建議使用主從模式了,替代方案是采用副本集的模式,那什么是副本集呢?簡(jiǎn)單地說,副本集就是有自動(dòng)故障恢復(fù)功能的主從集群,或者說主從模式其實(shí)就是一個(gè)單副本的應(yīng)用,沒有很好的擴(kuò)展性和容錯(cuò)性。而副本集具有多個(gè)副本保證了容錯(cuò)性,就算一個(gè)副本掛掉了還有很多副本存在,更棒的是副本集很多地方都是自動(dòng)化的,它為你做了很多管理工作。聰明的讀者已經(jīng)發(fā)現(xiàn),主從模式的 *** 個(gè)問題手工切換已經(jīng)得到解決了,難怪 MongoDB 官方強(qiáng)烈推薦使用這種模式。我們來看看 MongoDB 副本集的架構(gòu)圖:

由圖可以看到客戶端連接到整個(gè)副本集,不關(guān)心具體哪一臺(tái)機(jī)器是否掛掉。主服務(wù)器負(fù)責(zé)整個(gè)副本集的讀寫,副本集定期同步數(shù)據(jù)備份,一旦主節(jié)點(diǎn)掛掉,副本節(jié)點(diǎn)就會(huì)選舉一個(gè)新的主服務(wù)器,這一切對(duì)于應(yīng)用服務(wù)器不需要關(guān)心。我們看一下主服務(wù)器掛掉后的架構(gòu):

副本集中的副本節(jié)點(diǎn)通過心跳機(jī)制檢測(cè)到主節(jié)點(diǎn)掛掉后,就會(huì)在集群內(nèi)發(fā)起主節(jié)點(diǎn)的選舉機(jī)制,自動(dòng)選舉一位新的主服務(wù)器。So Cool!讓我們趕緊來部署一下!

官方推薦的副本集機(jī)器數(shù)量為至少 3 個(gè)(官方說副本集數(shù)量 *** 是奇數(shù)),那我們也按照這個(gè)數(shù)量配置測(cè)試。

1. 準(zhǔn)備三臺(tái)機(jī)器 10.43.159.56、10.43.159.58、10.43.159.60。10.43.159.56 當(dāng)作副本集主節(jié)點(diǎn),10.43.159.58、10.43.159.60 作為副本集副本節(jié)點(diǎn)。

2. 分別在每臺(tái)機(jī)器上建立 MongoDB 副本集測(cè)試文件夾

3. 下載安裝 MongoDB 的安裝程序包

4. 分別在每臺(tái)機(jī)器上啟動(dòng) MongoDB

給你的副本集取個(gè)名字吧,比如這里叫 test:

/data/MongoDBtest/MongoDB-linux-x86_64-2.4.8/bin/mongod --dbpath /data/MongoDBtest/replset/data --replSet test

從日志可以看出副本集還沒有初始化。

5. 初始化副本集

在三臺(tái)機(jī)器上任意一臺(tái)機(jī)器登陸 MongoDB:

/data/MongoDBtest/MongoDB-linux-x86_64-2.4.8/bin/mongo

使用 admin 數(shù)據(jù)庫:

use admin

定義副本集配置變量,這里的 _id:”test”和上面命令參數(shù)“ndash;replSet test”要保持一致:

config = { _id: test , members:[ ... {_id:0,host:  10.43.159.56:27017}, ... {_id:1,host:  10.43.159.58:27017}, ... {_id:2,host:  10.43.159.60:27017}] ... }

初始化副本集配置:

rs.initiate(config);

輸出成功:

{  info  :  Config now saved locally. Should come online in about a minute. ,  ok  : 1 }

查看日志,副本集啟動(dòng)成功后,56 為主節(jié)點(diǎn) PRIMARY,58、60 為副本節(jié)點(diǎn) SECONDARY,注意這里是三個(gè)節(jié)點(diǎn)共同選舉出的主節(jié)點(diǎn),有一定隨機(jī)性。

查看集群節(jié)點(diǎn)的狀態(tài):

rs.status();

整個(gè)副本集已經(jīng)搭建成功了。是不是超級(jí)簡(jiǎn)單?

副本集模式的 MongoDB 不僅搭建簡(jiǎn)單,而且功能強(qiáng)大。現(xiàn)在回頭看看這種模式能否解決我們前面遺留的問題:主節(jié)點(diǎn)掛了能否自動(dòng)切換連接?

先測(cè)試副本集數(shù)據(jù)復(fù)制功能是否正常

首先在主節(jié)點(diǎn) 56 上插入數(shù)據(jù),然后再副本節(jié)點(diǎn)上查看數(shù)據(jù),發(fā)現(xiàn)日志報(bào)錯(cuò):

error: {  $err  :  not master and slaveOk=false ,  code  : 13435 } at src/mongo/shell/query.js:128

這是因?yàn)槟J(rèn)只從主節(jié)點(diǎn)讀寫數(shù)據(jù),副本不允許讀,只要設(shè)置副本可以讀即可。在副本節(jié)點(diǎn)上執(zhí)行:rs.slaveOk(),然后查詢數(shù)據(jù),發(fā)現(xiàn)主節(jié)點(diǎn)的數(shù)據(jù)已經(jīng)同步過來了。

再測(cè)試下副本集的故障轉(zhuǎn)移功能

先停掉主節(jié)點(diǎn) 56 上的進(jìn)程,可以看到 58 和 60 節(jié)點(diǎn)上的日志顯示的就是投票過程。再執(zhí)行 rs.status() 可以看到集群狀態(tài)更新了,56 為不可達(dá),58 成為主節(jié)點(diǎn),60 還是副本。再啟動(dòng) 56 節(jié)點(diǎn),發(fā)現(xiàn)還是 58 為主節(jié)點(diǎn),56 變?yōu)楦北竟?jié)點(diǎn)。這樣就解決了 *** 個(gè)故障自動(dòng)轉(zhuǎn)移的問題。

那么,對(duì)于主節(jié)點(diǎn)讀寫壓力過大,如何解決呢?常見的解決方案是讀寫分離,MongoDB 副本集的讀寫分離如何做呢?

看圖說話:

對(duì)于移動(dòng) APP 的場(chǎng)景,通常寫操作遠(yuǎn)沒有讀操作多,所以一臺(tái)主節(jié)點(diǎn)負(fù)責(zé)寫,兩臺(tái)副本節(jié)點(diǎn)負(fù)責(zé)讀。從哪個(gè)節(jié)點(diǎn)讀,完全可以由客戶端選擇,數(shù)據(jù)讀取參數(shù)一共有五類(Primary、PrimaryPreferred、Secondary、SecondaryPreferred、Nearest):

Primary:默認(rèn)參數(shù),只從主節(jié)點(diǎn)上進(jìn)行讀取操作; 

PrimaryPreferred:大部分從主節(jié)點(diǎn)上讀取數(shù)據(jù),只有主節(jié)點(diǎn)不可用時(shí)從 Secondary 節(jié)點(diǎn)讀取數(shù)據(jù)。 

Secondary:只從 Secondary 節(jié)點(diǎn)上進(jìn)行讀取操作,存在的問題是 Secondary 節(jié)點(diǎn)的數(shù)據(jù)會(huì)比 Primary 節(jié)點(diǎn)數(shù)據(jù)“舊”。 

SecondaryPreferred:優(yōu)先從 Secondary 節(jié)點(diǎn)進(jìn)行讀取操作,Secondary 節(jié)點(diǎn)不可用時(shí)從主節(jié)點(diǎn)讀取數(shù)據(jù); 

Nearest:不管是主節(jié)點(diǎn)、Secondary 節(jié)點(diǎn),從網(wǎng)絡(luò)延遲 *** 的節(jié)點(diǎn)上讀取數(shù)據(jù)。

典型的副本集組網(wǎng)中,除了有副本節(jié)點(diǎn),還有其他角色,比如仲裁節(jié)點(diǎn),如下圖:

其中的仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只是負(fù)責(zé)故障轉(zhuǎn)移的群體投票,這樣就少了數(shù)據(jù)復(fù)制的壓力。此外還有 Secondary-Only、Hidden、Delayed、Non-Voting 等角色。

Secondary-Only:不能成為 Primary 節(jié)點(diǎn),只能作為 Secondary 副本節(jié)點(diǎn),防止一些性能不高的節(jié)點(diǎn)成為主節(jié)點(diǎn)。

Hidden:這類節(jié)點(diǎn)是不能夠被客戶端制定 IP 引用,也不能被設(shè)置為主節(jié)點(diǎn),但是可以投票,一般用于備份數(shù)據(jù)。

Delayed:可以指定一個(gè)時(shí)間延遲從 Primary 節(jié)點(diǎn)同步數(shù)據(jù)。主要用于備份數(shù)據(jù),如果實(shí)時(shí)同步,誤刪除數(shù)據(jù)馬上同步到從節(jié)點(diǎn),恢復(fù)又恢復(fù)不了。

Non-Voting:沒有選舉權(quán)的 Secondary 節(jié)點(diǎn),純粹的備份數(shù)據(jù)節(jié)點(diǎn)。

以上就是 MongoDB 中怎么實(shí)現(xiàn)集群,丸趣 TV 小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-01發(fā)表,共計(jì)5241字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 沅陵县| 扎囊县| 阿城市| 会宁县| 家居| 禹城市| 化隆| 伊金霍洛旗| 张家川| 凤凰县| 娄烦县| 平定县| 辛集市| 乌兰浩特市| 昌江| 石家庄市| 逊克县| 满城县| 潼关县| 小金县| 攀枝花市| 平顶山市| 北安市| 平罗县| 克拉玛依市| 万源市| 鄂伦春自治旗| 沙雅县| 齐齐哈尔市| 西和县| 南乐县| 乌鲁木齐市| 延寿县| 岳池县| 福海县| 迭部县| 永登县| 新和县| 宝兴县| 永城市| 定陶县|