Mongodb的高可靠性的架構,主要原理為Primary資料庫之外會同時在Secondary資料庫生成一樣的資料防只在在主資料庫有問題的狀況下我們還有Secondary的資料就有點像HA的機制,詳細如下分為三種角色
1.Primary
唯一具有寫跟讀的角色,主要的存取節點
只能讀取的角色,可以有一個以上的Secondary,Primary資料會複製一份到Secondary
3.Arbiter
Arbiter不會存取任何資料,主要功能為在Primary無法跟其他Secondary溝通時
會跳出來推舉為新的Secondary擔任Primary
Sharding Cluster
分片如字面上的意思就是把資料做切分放置在不同位置,這樣做的主要用意為我們單機如果有大量的資料硬碟快撐不住了 負載爆炸,我們把資料做切分減少每個單機上的資料量提升空間的使用率 減少負載 有種load balance的感覺 一般我們常使用架構為sharding cluster其他種就 不做說明
實作
介紹這麼多是不是了解不少,那麼我們為什麼需要Replica set + Sharding Cluster呢 Sharding Cluster的壞處就是當一台資料庫掛了我們就無法處理了 這時候Replica set是不是就剛好把這個洞補起來了 我們就有個高可靠性 又有效率的Mongodb架構
Sharding是建立在Replica set架構之上我們首先間建立Replica set
首先我們建立三個檔案primary.conf secondary.conf arbiter.conf 的config如下
primary.conf
systemLog: destination: file path: "C:\\mongodb\\logs\\primary\\log.log" logAppend: true storage: dbPath: "C:\\mongodb\\data\\primary" directoryPerDB: true net: port: 27017 bindIp: 127.0.0.1 processManagement: windowsService: serviceName: primary displayName: primary replication: replSetName: rssecondary.conf
systemLog: destination: file path: "C:\\mongodb\\logs\\secondary\\log.log" logAppend: true storage: dbPath: "C:\\mongodb\\data\\secondary" directoryPerDB: true net: port: 27018 bindIp: 127.0.0.1 processManagement: windowsService: serviceName: secondary displayName: secondary replication: replSetName: rsarbiter.conf
systemLog: destination: file path: "C:\\mongodb\\logs\\arbiter\\log.log" logAppend: true storage: dbPath: "C:\\mongodb\\data\\arbiter" directoryPerDB: true net: port: 27019 bindIp: 127.0.0.1 processManagement: windowsService: serviceName: arbiter displayName: arbiter replication: replSetName: rs
這時候可以把我們的服務開起來
#安裝服務 mongod --config "C:\mongodb\config\primary.conf" --install mongod --config "C:\mongodb\config\secondary.conf" --install mongod --config "C:\mongodb\config\arbiter.conf" --install #啟動服務 net start primary net start secondary net start arbiter #進入(這時角色都一樣需要設定) mongo 127.0.0.1:27017 #加入Primary rs為replSetName設定的 rs.initiate( { _id : "rs",members: [ { _id : 0, host : "127.0.0.1:27017" } ]}) #加入Secondary rs.add("127.0.0.1:27018") #加入Arbiter rs.addArb("127.0.0.1:27019") #查看狀態 rs.status()
最後我們查看狀態已經把各個角色都指定好
再來我們可以試著Primary寫入資料看看是不是已經達到同步的效果
var data = []; for (var i = 0; i < 50; i++){ data.push({ "index":"資料"+NumberInt(i), }); } db.demo.insertMany(data);
然後可以看到我們的Primary跟Secondary都有我們剛新增的資料
未完待續 還有我們的 Sharding Cluster
沒有留言:
張貼留言