時(shí)間:2024-03-26 14:38作者:下載吧人氣:30
MongoDB集群配置詳解:構(gòu)建高可用性的數(shù)據(jù)庫系統(tǒng)
MongoDB是當(dāng)前最具競爭力的特定NoSQL類型數(shù)據(jù)庫。 這種數(shù)據(jù)庫提供了一些大型網(wǎng)站所需的高可用性功能,這些功能在低成本節(jié)點(diǎn)上提供卓越的性能。為了實(shí)現(xiàn)冪等性、恢復(fù)能力以及容錯(cuò)性,MongoDB在多個(gè)節(jié)點(diǎn)之間提供復(fù)制實(shí)例。MongoDB 集群可以構(gòu)建一個(gè)可擴(kuò)展的高可用性系統(tǒng),其能夠支持增量擴(kuò)展,無縫地實(shí)現(xiàn)水平擴(kuò)展,以及提供層次結(jié)構(gòu)的數(shù)據(jù)分片和本地索引來提高查詢性能。本文將介紹MongoDB集群配置原理并詳細(xì)解釋,以構(gòu)建高可用性的數(shù)據(jù)庫系統(tǒng)。
MongoDB集群的最基本配置要求包括兩個(gè)以上節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)具有三種用途的實(shí)例:主副本、從屬節(jié)點(diǎn)和選舉節(jié)點(diǎn)。主節(jié)點(diǎn)存儲所有更新的數(shù)據(jù)副本,從屬節(jié)點(diǎn)存儲備份的數(shù)據(jù),而選舉節(jié)點(diǎn)存儲數(shù)據(jù)的副本,并充當(dāng)可用性監(jiān)控工具。主節(jié)點(diǎn)負(fù)責(zé)檢測發(fā)送消息,從節(jié)點(diǎn)確保備份數(shù)據(jù)和服務(wù)負(fù)載均衡。 一旦檢測到主節(jié)點(diǎn)故障,投票機(jī)制就會啟動,另一個(gè)從節(jié)點(diǎn)會被選為新的主節(jié)點(diǎn),從而完成故障轉(zhuǎn)移。
在MongoDB集群配置中,集群中所有節(jié)點(diǎn)都是同等重要的,并且充當(dāng)不同的角色來支持集群的可用性。每個(gè)節(jié)點(diǎn)可以在集群中主從切換,它們都可以接收請求,允許任何節(jié)點(diǎn)在讀和寫查詢中發(fā)揮重要作用。 每個(gè)MongoDB節(jié)點(diǎn)可以部署(混合ShardedRepl Sets)和(Repl Sets),允許節(jié)點(diǎn)間的混合模式和復(fù)制模式。
除了主從復(fù)制,MongoDB 3.2還支持?jǐn)?shù)據(jù)分片,也稱為Sharding。 數(shù)據(jù)分片適用于橫向伸縮,可以顯著改善性能,是處理海量數(shù)據(jù)的理想方案。它支持分布式讀/寫,并允許數(shù)據(jù)跨越多個(gè)節(jié)點(diǎn)來擴(kuò)展存儲容量,從而提高可伸縮性和可用性。
最后,MongoDB提供了一個(gè)用于監(jiān)控和管理集群的可視化工具,即Ops Manager。 它可用于監(jiān)控MongoDB實(shí)例,從而預(yù)防節(jié)點(diǎn)故障或過載等錯(cuò)誤,并記錄節(jié)點(diǎn)每一次狀態(tài)更改。
為了實(shí)現(xiàn)MongoDB集群配置,我們可以使用以下代碼:
// Connect to a MongoDB Server running on ‘localhost’
MongoClient.connect(‘mongodb://localhost:27017’, { useNewUrlParser : true}, (err, client) =>{
// Create a Replica Set
const rSet = client.createReplicaSet(‘myRset’,{
members [{
host: ‘host1:27017’,
priority : 1
}, {
host : ‘host2:27017’,
priority : 0
}, {
host : ‘host3:27017’,
priority : 0
}]
})
// Once the Replica Set is Setup, assign it a unique id
const replicaSetId = rSet.replicaSetId;
// Configure the settings
rSet.configure( {
readPreference : “primary”
}, (err, db) => {
// Insert Documents Into the Database
db.collection(‘users’).insert([{
name : ‘Adam’,
age : 25
}, {
name : ‘Bob’,
age : 20
}], (err, result) => {
console.log(‘Documents Inserted’,result);
})
})
});
網(wǎng)友評論