2020重新出發(fā)重虑,NOSQL践付,MongoDB分布式集群架構(gòu)

MongoDB分布式集群架構(gòu)

看到這里相信你已經(jīng)掌握了 MongoDB 的大部分基本知識(shí),現(xiàn)在在單機(jī)環(huán)境下操作 MongoDB 已經(jīng)不存在問題缺厉,但是單機(jī)環(huán)境只適合學(xué)習(xí)和開發(fā)測(cè)試永高,在實(shí)際的生產(chǎn)環(huán)境中,MongoDB 基本是以集群的方式工作的提针。集群的工作方式能夠保證在生產(chǎn)遇到故障時(shí)及時(shí)恢復(fù)命爬,保障應(yīng)用程序正常地運(yùn)行和數(shù)據(jù)的安全。

重點(diǎn)介紹 MongoDB 的集群工作方式关贵,以及在集群工作方式下遇骑,MongoDB 是如何使用分片和復(fù)制的機(jī)制來完成對(duì)數(shù)據(jù)的管理和恢復(fù)的卖毁。

MongoDB 有三種集群部署模式揖曾,分別為主從復(fù)制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式亥啦。

  • Master-Slaver: 是一種主從副本的模式炭剪,目前已經(jīng)不推薦使用。
  • Replica Set :模式取代了 Master-Slaver 模式翔脱,是一種互為主從的關(guān)系奴拦。Replica Set 將數(shù)據(jù)復(fù)制多份保存,不同服務(wù)器保存同一份數(shù)據(jù)届吁,在出現(xiàn)故障時(shí)自動(dòng)切換错妖,實(shí)現(xiàn)故障轉(zhuǎn)移绿鸣,在實(shí)際生產(chǎn)中非常實(shí)用。
  • Sharding :模式適合處理大量數(shù)據(jù)暂氯,它將數(shù)據(jù)分開存儲(chǔ)潮模,不同服務(wù)器保存不同的數(shù)據(jù),所有服務(wù)器數(shù)據(jù)的總和即為整個(gè)數(shù)據(jù)集痴施。
    • Sharding 模式追求的是高性能擎厢,而且是三種集群中最復(fù)雜的。

在實(shí)際生產(chǎn)環(huán)境中辣吃,通常將 Replica Set 和 Sharding 兩種技術(shù)結(jié)合使用动遭。

主從復(fù)制

雖然 MongoDB 官方建議用副本集替代主從復(fù)制,但還是讓大家了解 MongoDB 的復(fù)制機(jī)制神得。

主從復(fù)制是 MongoDB 中最簡單的數(shù)據(jù)庫同步備份的集群技術(shù)厘惦,其基本的設(shè)置方式是建立一個(gè)主節(jié)點(diǎn)(Primary)和一個(gè)或多個(gè)從節(jié)點(diǎn)(Secondary),如圖哩簿。

img

這種方式比單節(jié)點(diǎn)的可用性好很多绵估,可用于備份、故障恢復(fù)卡骂、讀擴(kuò)展等国裳。集群中的主從節(jié)點(diǎn)均運(yùn)行 MongoDB 實(shí)例,完成數(shù)據(jù)的存儲(chǔ)全跨、查詢與修改操作缝左。

主從復(fù)制模式的集群中只能有一個(gè)主節(jié)點(diǎn),主節(jié)點(diǎn)提供所有的增浓若、刪渺杉、查、改服務(wù)挪钓,從節(jié)點(diǎn)不提供任何服務(wù)是越,但是可以通過設(shè)置使從節(jié)點(diǎn)提供查詢服務(wù),這樣可以減少主節(jié)點(diǎn)的壓力碌上。

另外倚评,每個(gè)從節(jié)點(diǎn)要知道主節(jié)點(diǎn)的地址,主節(jié)點(diǎn)記錄在其上的所有操作天梧,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作,然后對(duì)自己的數(shù)據(jù)副本執(zhí)行這些操作霞丧,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致呢岗。

在主從復(fù)制的集群中,當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),只能人工介入后豫,指定新的主節(jié)點(diǎn)悉尾,從節(jié)點(diǎn)不會(huì)自動(dòng)升級(jí)為主節(jié)點(diǎn)。同時(shí)挫酿,在這段時(shí)間內(nèi)焕襟,該集群架構(gòu)只能處于只讀狀態(tài)。

副本集

副本集的集群架構(gòu)如下圖所示饭豹。

img

此集群擁有一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)鸵赖,這一點(diǎn)與主從復(fù)制模式類似,且主從節(jié)點(diǎn)所負(fù)責(zé)的工作也類似拄衰,但是副本集與主從復(fù)制的區(qū)別在于:當(dāng)集群中主節(jié)點(diǎn)發(fā)生故障時(shí)它褪,副本集可以自動(dòng)投票,選舉出新的主節(jié)點(diǎn)翘悉,并引導(dǎo)其余的從節(jié)點(diǎn)連接新的主節(jié)點(diǎn)茫打,而且這個(gè)過程對(duì)應(yīng)用是透明的。

可以說妖混,MongoDB 的副本集是自帶故障轉(zhuǎn)移功能的主從復(fù)制老赤。

MongoDB 副本集使用的是 N 個(gè) mongod 節(jié)點(diǎn)構(gòu)建的具備自動(dòng)容錯(cuò)功能、自動(dòng)恢復(fù)功能的高可用方案制市。在副本集中抬旺,任何節(jié)點(diǎn)都可作為主節(jié)點(diǎn),但為了維持?jǐn)?shù)據(jù)一致性祥楣,只能有一個(gè)主節(jié)點(diǎn)开财。

主節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的寫入和更新,并在更新數(shù)據(jù)的同時(shí)误褪,將操作信息寫入名為 oplog 的日志文件當(dāng)中责鳍。主節(jié)點(diǎn)還負(fù)責(zé)指定其他節(jié)點(diǎn)為從節(jié)點(diǎn),并設(shè)置從節(jié)點(diǎn)數(shù)據(jù)的可讀性兽间,從而讓從節(jié)點(diǎn)來分擔(dān)集群讀取數(shù)據(jù)的壓力历葛。

另外,從節(jié)點(diǎn)會(huì)定時(shí)輪詢讀取 oplog 日志嘀略,根據(jù)日志內(nèi)容同步更新自身的數(shù)據(jù)恤溶,保持與主節(jié)點(diǎn)一致。

在一些場景中屎鳍,用戶還可以使用副本集來擴(kuò)展讀性能宏娄,客戶端有能力發(fā)送讀寫操作給不同的服務(wù)器,也可以在不同的數(shù)據(jù)中心獲取不同的副本來擴(kuò)展分布式應(yīng)用的能力逮壁。

在副本集中還有一個(gè)額外的仲裁節(jié)點(diǎn)(不需要使用專用的硬件設(shè)備),負(fù)責(zé)在主節(jié)點(diǎn)發(fā)生故障時(shí)粮宛,參與選舉新節(jié)點(diǎn)作為主節(jié)點(diǎn)窥淆。

副本集中的各節(jié)點(diǎn)會(huì)通過心跳信息來檢測(cè)各自的健康狀況卖宠,當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),多個(gè)從節(jié)點(diǎn)會(huì)觸發(fā)一次新的選舉操作忧饭,并選舉其中一個(gè)作為新的主節(jié)點(diǎn)扛伍。為了保證選舉票數(shù)不同,副本集的節(jié)點(diǎn)數(shù)保持為奇數(shù)词裤。

分片

副本集可以解決主節(jié)點(diǎn)發(fā)生故障導(dǎo)致數(shù)據(jù)丟失或不可用的問題刺洒,但遇到需要存儲(chǔ)海量數(shù)據(jù)的情況時(shí),副本集機(jī)制就束手無策了吼砂。副本集中的一臺(tái)機(jī)器可能不足以存儲(chǔ)數(shù)據(jù)逆航,或者說集群不足以提供可接受的讀寫吞吐量。這就需要用到 MongoDB 的分片(Sharding)技術(shù)渔肩,這也是 MongoDB 的另外一種集群部署模式因俐。

分片是指將數(shù)據(jù)拆分并分散存放在不同機(jī)器上的過程。有時(shí)也用分區(qū)來表示這個(gè)概念周偎。將數(shù)據(jù)分散到不同的機(jī)器上抹剩,不需要功能強(qiáng)大的大型計(jì)算機(jī)就可以存儲(chǔ)更多的數(shù)據(jù),處理更大的負(fù)載蓉坎。

MongoDB 支持自動(dòng)分片澳眷,可以使數(shù)據(jù)庫架構(gòu)對(duì)應(yīng)用程序不可見,簡化系統(tǒng)管理蛉艾。對(duì)應(yīng)用程序而言境蔼,就如同始終在使用一個(gè)單機(jī)的 MongoDB 服務(wù)器一樣。

MongoDB 的分片機(jī)制允許創(chuàng)建一個(gè)包含許多臺(tái)機(jī)器的集群伺通,將數(shù)據(jù)子集分散在集群中箍土,每個(gè)分片維護(hù)著一個(gè)數(shù)據(jù)集合的子集。與副本集相比罐监,使用集群架構(gòu)可以使應(yīng)用程序具有更強(qiáng)大的數(shù)據(jù)處理能力吴藻。

MongoDB 分片的集群模式如下圖所示。

img

構(gòu)建一個(gè) MongoDB 的分片集群弓柱,需要三個(gè)重要的組件沟堡,分別是分片服務(wù)器(Shard Server)、配置服務(wù)器(Config Server)和路由服務(wù)器(Route Server)矢空。

  • Shard Server
    • 每個(gè) Shard Server 都是一個(gè) mongod 數(shù)據(jù)庫實(shí)例航罗,用于存儲(chǔ)實(shí)際的數(shù)據(jù)塊。整個(gè)數(shù)據(jù)庫集合分成多個(gè)塊存儲(chǔ)在不同的 Shard Server 中屁药。
    • 在實(shí)際生產(chǎn)中粥血,一個(gè) Shard Server 可由幾臺(tái)機(jī)器組成一個(gè)副本集來承擔(dān),防止因主節(jié)點(diǎn)單點(diǎn)故障導(dǎo)致整個(gè)系統(tǒng)崩潰。
  • Config Server
    • 這是獨(dú)立的一個(gè) mongod 進(jìn)程复亏,保存集群和分片的元數(shù)據(jù)趾娃,在集群啟動(dòng)最開始時(shí)建立,保存各個(gè)分片包含數(shù)據(jù)的信息缔御。
  • Route Server
    • 這是獨(dú)立的一個(gè) mongos 進(jìn)程抬闷,Route Server 在集群中可作為路由使用,客戶端由此接入耕突,讓整個(gè)集群看起來像是一個(gè)單一的數(shù)據(jù)庫笤成,提供客戶端應(yīng)用程序和分片集群之間的接口。
    • Route Server 本身不保存數(shù)據(jù)眷茁,啟動(dòng)時(shí)從 Config Server 加載集群信息到緩存中炕泳,并將客戶端的請(qǐng)求路由給每個(gè) Shard Server,在各 Shard Server 返回結(jié)果后進(jìn)行聚合并返回客戶端蔼卡。

以上介紹了 MongoDB 的三種集群模式喊崖,副本集已經(jīng)替代了主從復(fù)制,通過備份保證集群的可靠性雇逞,分片機(jī)制為集群提供了可擴(kuò)展性荤懂,以滿足海量數(shù)據(jù)的存儲(chǔ)和分析的需求。

在實(shí)際生產(chǎn)環(huán)境中塘砸,副本集和分片是結(jié)合起來使用的节仿,可滿足實(shí)際應(yīng)用場景中高可用性和高可擴(kuò)展性的需求。

將MongoDB部署到分布式集群(實(shí)操)

分布式集群的整體架構(gòu)

在實(shí)際生產(chǎn)環(huán)境中掉蔬,MongoDB 的集群架構(gòu)是分布式的廊宪,如下圖所示,集群會(huì)結(jié)合副本集和分片機(jī)制保證生產(chǎn)過程的高可靠性和高可擴(kuò)展性女轿。

img

從上圖的集群中可以看到箭启,整個(gè)生產(chǎn)集群與分片集群的架構(gòu)類似,由三個(gè)重要組件組成蛉迹,包括 Shard Server傅寡、Config Server 和 Route Server。不同之處在于每個(gè)組件可以使用多個(gè)實(shí)例來保證集群的可靠性北救。

  • 例如荐操,每一個(gè) Shard Server 由一個(gè)包含三個(gè) mongod 實(shí)例的副本集組成,避免了單一的 mongod 實(shí)例出現(xiàn)故障造成數(shù)據(jù)的丟失珍策。Config Server 也可由多個(gè) mongod 實(shí)例集群組成托启,保證集群中配置信息的可用性。而路由服務(wù)器也可以使用多個(gè) mongos 實(shí)例攘宙,來保證客戶端的請(qǐng)求能得到及時(shí)的響應(yīng)屯耸。

接下來通過分布式集群的部署了解 MongoDB 的副本集和分片機(jī)制拐迁。假設(shè)目前有三臺(tái)機(jī)器, 操作系統(tǒng)為 Ubuntu 16.04肩民,均安裝了 MongoDB 3.4唠亚,信息如下表所示链方。在這三臺(tái)機(jī)器上部署副本集和部署分片集群持痰。

主機(jī)名 IP 端口信息
Node1 10.90.9.101 momgod shard1 : 27018(rs1) momgod shard2 : 27018(rs2) mongod config1 : 27030 mongos router1 : 27017
Node2 10.90.9.102 momgod shard1 : 27018(rs1) momgod shard2 : 27018(rs2) mongod config1 : 27030 mongos router1 : 27017
Node3 10.90.9.103 momgod shard1 : 27018(rs1) momgod shard2 : 27018(rs2) mongod config1 : 27030 mongos router1 : 27017

副本集和分片聯(lián)合部署的基本思路是先建立副本集,然后將每個(gè)副本集作為整體建立分片祟蚀,如在上表中工窍,集群有兩個(gè)副本集 rs1 和 rs2,每個(gè)副本集由三個(gè)成員組成前酿,分別部署在三臺(tái)機(jī)器 Node1患雏、Node2 和 Node3 上。

每個(gè)副本集作為一個(gè)整體建立一個(gè)分片罢维,因此淹仑,此集群由兩個(gè) Shard Server 組成,每個(gè) Shard Server 由一個(gè)三成員的副本集來保證數(shù)據(jù)的容錯(cuò)和冗余肺孵。

另外匀借,在每臺(tái)機(jī)器上啟動(dòng)一個(gè) mongod 和 mongos 實(shí)例分別用于實(shí)現(xiàn) Config Server 和 Route Server 的功能,使用三臺(tái)機(jī)器備份的方式保證集群的可靠性平窘。

部署副本集

標(biāo)準(zhǔn)副本集一般會(huì)部署三個(gè)成員吓肋,即一個(gè) Primary 和兩個(gè) Secondary,實(shí)現(xiàn)數(shù)據(jù)的冗余和容錯(cuò)瑰艘。 以下步驟為配置表 1 集群中的副本集 rs1是鬼、rs2 的部署。

啟動(dòng)副本集

  1. 修改配置文件
    在表 1 所示的集群中紫新,副本 rs1 在三個(gè)節(jié)點(diǎn)上均啟動(dòng)了一個(gè) mongod 實(shí)例來完成數(shù)據(jù)的存儲(chǔ)均蜜,啟動(dòng) mongod 實(shí)例前先修改配置文件 /etc/mongodrs1.conf,主要是對(duì) path芒率、dbpath囤耳、port 這幾項(xiàng)的修改,如下所示:
systemLog:
    path: /root/mongodb/data/mongodrsl.log    #副本集rs1的日志文件位置
storage:
    dbPath: /root/mongodb/data/rsl    #副本集rs1的數(shù)據(jù)庫存儲(chǔ)位置
net:
    port: 27018    #副本集rs1 mongod進(jìn)程使用的端口號(hào)敲董。
    bindIp: 10.90.9.101    #即本機(jī)地址紫皇,允許mongo客戶端連接。

在 /root/mongodb 文件夾下創(chuàng)建 /data/rs1 目錄,用來保存副本集rsl的數(shù)據(jù)庫和日志文件腋寨。

  1. 啟動(dòng) mongod 副本集
    在 Nodel 機(jī)器上啟動(dòng) mongod 進(jìn)程為副本集模式聪铺,在 Shell 終端執(zhí)行:
mongod --shardsvr --replSet rs1 --config /etc/mongodrs1.conf

參數(shù)說明:

  • --shardsvr 表示本集群中的數(shù)據(jù)庫是可分片的。
  • --replSet 用于指定副本集名稱萄窜。
  • --config 用于指定配置文件位置铃剔。

在 Nodel 機(jī)器上啟動(dòng)副本集為 rs1 的 MongoDB 實(shí)例撒桨,如下圖所示。

img

同樣地键兜,在 Node2 和 Node3 節(jié)點(diǎn)上以同樣的方式啟動(dòng) mongod 服務(wù)凤类,在此階段,三臺(tái)機(jī)器上的副本集成員都是 Secondary 節(jié)點(diǎn)普气,只有經(jīng)過初始化才會(huì)稱為 Primary 節(jié)點(diǎn)谜疤。

  1. 初始化副本集
    啟動(dòng) MongoDB 的副本集服務(wù)后,可在任意一臺(tái)機(jī)器上連接 MongoDB 的服務(wù)现诀,例如夷磕,在 Nodel 節(jié)點(diǎn)上執(zhí)行以下命令連接 Node2 節(jié)點(diǎn)上的 mongod 服務(wù)。
mongo --host 10.90.9.102 --port 27018

參數(shù)說明:

  • --host 表示需連接的節(jié)點(diǎn) IP仔沿。
  • --port 是啟動(dòng) mongod 服務(wù)的端口坐桩,端口號(hào)在 /etc/mongod.conf 配置文件中配置。

此命令運(yùn)行后進(jìn)入 mongo shell 的交互界面封锉,如圖下所示绵跷。

img

然后在此界面使用 rs.initiate() 對(duì)副本集進(jìn)行初始化,經(jīng)過初始化后成福,執(zhí)行 rs.status碾局。

查看副本集狀態(tài),如下圖所示闷叉,初始化后的 Node2 已經(jīng)作為副本集 rs1 的 Primary 節(jié)點(diǎn)擦俐。

img
  1. 添加成員
    目前 rs1 副本集還只有 Node2 這個(gè) Primary 節(jié)點(diǎn),需要將 Node1握侧、Node3 節(jié)點(diǎn)添加到副本集中蚯瞧,執(zhí)行以下命令添加副本集成員:
rs.add( "10.90.9.101 : 27018" )
rs.add( "10.90.9.103 : 27018" )

至此副本集的啟動(dòng)配置已完成,通過 rs.stutas() 命令可以看到 rs1 副本集中已經(jīng)有一個(gè) Primary 節(jié)點(diǎn)(10.90.9.102)和兩個(gè) Secondary 節(jié)點(diǎn)(10.90.9.101 和 10.90.9.103)品擎。副本集 rs2 以同樣的步驟部署即可埋合。

測(cè)試副本集復(fù)制功能

  1. 在 Primary 節(jié)點(diǎn)上添加數(shù)據(jù)
    在 Primary 節(jié)點(diǎn)上創(chuàng)建 myDB 數(shù)據(jù)庫,在此數(shù)據(jù)庫中創(chuàng)建集合 myCollection萄传,并插入 5 個(gè)文檔甚颂,如圖下所示。
img
  1. 在 Secondary 節(jié)點(diǎn)上查看副本數(shù)據(jù)
    使用 mongo 命令連接 Secondary 節(jié)點(diǎn)秀菱,Secondary 節(jié)點(diǎn)上的數(shù)據(jù)默認(rèn)是不允許讀寫的振诬,可以通過以下命令設(shè)置副本節(jié)點(diǎn)允許查詢。
db.getMongo().setSlaveOk()

然后查詢 Secondary 節(jié)點(diǎn)上的數(shù)據(jù)衍菱,查詢結(jié)果如下圖所示赶么。

img
  1. 管理副本集
    通過 rs.conflg() 命令可以查看副本集中每個(gè)成員的屬性,如下圖所示脊串。
img

修改副本集屬性可通過如下命令實(shí)現(xiàn):

con=rs.conf()
con.members[1].priority=2
rs.reconfig(con)

首先定義對(duì)象 con辫呻,將副本集的配置信息賦給 con清钥,之后將 con 成員列表中的第 2 個(gè)(編號(hào)從 0 開始)成員的優(yōu)先級(jí)設(shè)為 2,最后以 con 為參數(shù)放闺,使用 rs.reconfig() 函數(shù)對(duì)副本集屬性進(jìn)行重設(shè)祟昭。

在 MongoDB 中只能通過主節(jié)點(diǎn)將 Mongo 服務(wù)添加到副本集中,可以使用命令 db.isMaster() 判斷當(dāng)前運(yùn)行的 Mongo 服務(wù)是否為主節(jié)點(diǎn)怖侦,其他副本集的操作可查看 rs.help 來了解篡悟。

部署分片集群

分片集群由配置服務(wù)器、路由服務(wù)器础钠、分片服務(wù)器和客戶端組成恰力〔婷眨客戶端可以是 Shell 終端旗吁,也可以是具體的應(yīng)用程序。

配置服務(wù)器(Config Server)是普通的 mongod 服務(wù)器停局,保存著集群的配置信息:集群中有哪些分片很钓、分片的是哪些集合,以及數(shù)據(jù)塊的分布董栽。分片服務(wù)器(Shard Server)存儲(chǔ)具體的分片數(shù)據(jù)码倦。啟動(dòng)集群后,路由服務(wù)器(Route Server)加載 Config Server 中的分片信息锭碳, 客戶端通過連接 Route Server 來獲取集群中的數(shù)據(jù)信息袁稽。

啟動(dòng)分片機(jī)制

在表 1 的分布式集群中,有兩個(gè)分片擒抛,分別由副本集 rs1推汽、rs2 組成。集群中的 Shard Server 已經(jīng)在前面配置好歧沪,接下來需要建立 Config Server 和 Route Server歹撒。

  1. 配置 Config Server
    Config Server 相當(dāng)于集群的大腦,保存著集群和分片的元數(shù)據(jù)诊胞,即各分片包含哪些數(shù)據(jù)的信息暖夭。鑒于它所包含數(shù)據(jù)的極端重要性,必須啟用其日志功能撵孤,并確保其數(shù)據(jù)保存在非易失性驅(qū)動(dòng)器上迈着。

因此,在集群中邪码,Config Server 也通常配置成副本集模式來保證數(shù)據(jù)的可靠性裕菠。由于 mongos 需從配置服務(wù)器獲取配置信息,因此配置服務(wù)器應(yīng)先于任何 mongos 進(jìn)程啟動(dòng)霞扬。

配置服務(wù)器是獨(dú)立的 mongod 進(jìn)程糕韧,所以可以像啟動(dòng)“普通的”mongod 進(jìn)程一樣啟動(dòng)配置服務(wù)器:

mongod --replSet config --configsvr --dbpath /home/ubuntu/mongodb/data/config --port 27030 -logpath /home/ubuntu/mongodb/data/config.log --logappend --fork

分別在三臺(tái)機(jī)器上執(zhí)行以上命令來啟動(dòng)配置服務(wù)器枫振,使用 replSet config 選項(xiàng),表示該實(shí)例歸屬于名為 config 的副本集萤彩。

參數(shù)說明:

  • --configsvr:選項(xiàng)表明啟動(dòng)的為 config server粪滤,端口為 27030。
  • --dbpath:表示數(shù)據(jù)存儲(chǔ)路徑
  • --logpath:表示日志文件路徑雀扶。

配置 config 副本集的過程請(qǐng)參考本節(jié)前面的內(nèi)容杖小。

使用副本集選項(xiàng)實(shí)現(xiàn)了配置信息的冗余存儲(chǔ)。配置服務(wù)器并不需要太多的空間和資源愚墓。配置服務(wù)器的 1KB 空間約等于 200MB 真實(shí)數(shù)據(jù)予权,它保存的只是數(shù)據(jù)的分布表。

由于配置服務(wù)器并不需要太多的資源浪册,因此可將其部署在運(yùn)行著其他程序的機(jī)器上扫腺,如應(yīng)用服務(wù)器、分片的 mongod 服務(wù)器或 mongos 進(jìn)程的服務(wù)器上村象。

  1. 配置 Route Server
    三個(gè)配置服務(wù)器均處于運(yùn)行狀態(tài)后笆环,啟動(dòng)一個(gè) mongos 進(jìn)程供應(yīng)用程序連接。因?yàn)?mongos 進(jìn)程需要知道配置服務(wù)器的地址厚者,所以必須使用 --configdb 選項(xiàng)啟動(dòng) mongos:
mongos --configdb config/10.90.9.101:27030,10.90.9.102:27030,10.90.9.103:27030 -logpath /home/ubuntu/mongodb/data/mongos.log --logappend --fork

在默認(rèn)情況下躁劣,mongos 運(yùn)行在 27017 端口。注意库菲,并不需要指定數(shù)據(jù)目錄(mongos 自身并不保存數(shù)據(jù)账忘,它會(huì)在啟動(dòng)時(shí)從配置服務(wù)器加載集群數(shù)據(jù))。確保正確設(shè)置了 logpath熙宇,以便將 mongos 日志保存到安全的地方鳖擒。

可啟動(dòng)任意數(shù)量的 mongos 進(jìn)程,通常的設(shè)置是每個(gè)應(yīng)用程序服務(wù)器使用一個(gè) mongos 進(jìn)程(與應(yīng)用服務(wù)器運(yùn)行在同一臺(tái)機(jī)器上)奇颠。每個(gè) mongos 進(jìn)程必須按照列表順序败去,使用相同的配置服務(wù)器列表,如 --configdb 后面輸入的是一個(gè)帶有三個(gè)服務(wù)器列表的 config 的副本集的名稱烈拒。

至此圆裕,分布式集群中的分片服務(wù)已經(jīng)啟動(dòng)完畢,接下來進(jìn)行分片服務(wù)器的設(shè)置和數(shù)據(jù)的分片存儲(chǔ)荆几。

測(cè)試分片機(jī)制

  1. 添加分片
    為了將副本集轉(zhuǎn)換為分片吓妆,需告知 mongos 副本集名稱和副本集成員列表。例如吨铸,在 Node1行拢、 Node2 和 Node3上有一個(gè)名為 rs1 和 rs2 的副本集,將每個(gè)副本集作為一個(gè)分片诞吱。

首先執(zhí)行以下命令連接 mongos:

mongo --host 10.90.9.101 --port 27017

然后進(jìn)入 mongos 的 Shell 界面舟奠,執(zhí)行下面兩條命令竭缝,將兩個(gè)副本集 rs1 和 rs2 加入分片集中:

db.runCommand ({ addshard : "rs1/10.90.9.102:27020,10.90.9.101:27020,10.90.9.103 : 27020", name : "s1", maxsize : 10240 });
db.runCommand ({ addshard : "rs2/10.90.9.102:27021,10.90.9.101:27021,10.90.9.103 : 27021", name : "s2", maxsize : 1024 });

可在參數(shù)中指定副本集的所有成員,但并非一定要這樣做沼瘫。mongos 能夠自動(dòng)檢測(cè)到?jīng)]有包含在副本集成員表中的成員抬纸。name 選項(xiàng)表示此分片的名稱,maxsize 選項(xiàng)指定此分片的最大存儲(chǔ)容量耿戚。

如果之后需要移除這個(gè)分片或是向這個(gè)分片遷移數(shù)據(jù)湿故,可使用分片名稱標(biāo)識(shí)這個(gè)分片。這比使用特定的服務(wù)器名稱要好膜蛔,因?yàn)楦北炯蓡T和狀態(tài)是不斷改變的坛猪。

將副本集作為分片添加到集群后,就可以將應(yīng)用程序設(shè)置從連接到副本集改為連接到 mongos皂股。添加分片后墅茉,mongos 會(huì)將副本集內(nèi)的所有數(shù)據(jù)庫注冊(cè)為分片的數(shù)據(jù)庫,因此屑墨,所有查詢都會(huì)被發(fā)送到新的分片上躁锁。與客戶端庫相同,mongos 會(huì)自動(dòng)處理應(yīng)用故障卵史,將錯(cuò)誤返回客戶端。

用戶也可以創(chuàng)建單 mongod 服務(wù)器的分片(而不是副本集分片)搜立,但不建議在生產(chǎn)中使用以躯。直接在 addShard() 中指定單個(gè) mongod 的主機(jī)名和端口,就可以將其添加為分片了 :

sh.addShard("some-server:port")

單一服務(wù)器分片默認(rèn)會(huì)被命名為 shard0000啄踊、shard0001 …… 以此類推忧设。

如打算以后切換為副本集,應(yīng)先創(chuàng)建一個(gè)單成員副本集再添加為分片颠通,而不是直接將單一服務(wù)器添加為分片址晕。如需將單一服務(wù)器分片轉(zhuǎn)換為副本集,則需停機(jī)進(jìn)行操作顿锰。

  1. 數(shù)據(jù)分片
    除非明確指定規(guī)則谨垃,否則 MongoDB 不會(huì)自動(dòng)對(duì)數(shù)據(jù)進(jìn)行拆分。如有必要硼控,必須明確告知數(shù)據(jù)庫和集合刘陶。

假設(shè)希望對(duì) myDB 數(shù)據(jù)庫中的 Mytest 集合按照 _id 鍵進(jìn)行分片。首先對(duì) myDB 數(shù)據(jù)庫執(zhí)行以下命令啟用分片:

sh.enableSharding("myDB")

命令執(zhí)行成功后牢撼,用 sh.status() 查詢分片狀態(tài)匙隔,如下圖所示,數(shù)據(jù)庫 myDB 的 patitioned 屬性值為true熏版。

img

對(duì)數(shù)據(jù)庫分片是對(duì)集合分片的先決條件纷责。數(shù)據(jù)庫啟用分片后,就可以使用如下 shardCollection() 命令對(duì)集合進(jìn)行分片了:

sh.shardCollection("myDB.myColletion", {"_id" : 1})

現(xiàn)在捍掺,集合會(huì)按照 _id 鍵進(jìn)行分片。如果是對(duì)已存在的集合進(jìn)行分片再膳,則 _id 鍵上必須包含索引乡小,否則 shardCollection() 會(huì)返回錯(cuò)誤。如果出現(xiàn)了錯(cuò)誤饵史,則先創(chuàng)建索引满钟,然后重試 shardCollection() 命令;如要進(jìn)行分片的集合不存在胳喷,則 mongos 會(huì)自動(dòng)在片鍵上創(chuàng)建索引湃番。

shardCollection() 命令會(huì)將集合拆分為多個(gè)數(shù)據(jù)塊,這是 MongoDB 遷移數(shù)據(jù)的基本單元吭露。

成功執(zhí)行分片操作后吠撮,MongoDB 會(huì)均衡地將集合數(shù)據(jù)分散到集群的分片上。這個(gè)過程不是瞬間完成的讲竿,對(duì)于比較大的集合泥兰,可能需要花費(fèi)幾個(gè)小時(shí)才能完成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末题禀,一起剝皮案震驚了整個(gè)濱河市鞋诗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迈嘹,老刑警劉巖削彬,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秀仲,居然都是意外死亡融痛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門神僵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雁刷,“玉大人,你說我怎么就攤上這事保礼∨胬” “怎么了唧躲?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鼻忠,是天一觀的道長卵慰。 經(jīng)常有香客問我添忘,道長照卦,這世上最難降的妖魔是什么消玄? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任脚翘,我火速辦了婚禮贪绘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘练对。我一直安慰自己遍蟋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布螟凭。 她就那樣靜靜地躺著虚青,像睡著了一般。 火紅的嫁衣襯著肌膚如雪螺男。 梳的紋絲不亂的頭發(fā)上棒厘,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音下隧,去河邊找鬼奢人。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淆院,可吹牛的內(nèi)容都是我干的何乎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼土辩,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼支救!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拷淘,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤各墨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辕棚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欲主,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年逝嚎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片详恼。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡补君,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昧互,到底是詐尸還是另有隱情挽铁,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布敞掘,位于F島的核電站叽掘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玖雁。R本人自食惡果不足惜更扁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浓镜,春花似錦溃列、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哄啄,卻和暖如春雅任,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咨跌。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工沪么, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虑润。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓成玫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拳喻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哭当,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355