Design

Design
asp.net mvc

2019年4月10日 星期三

Windows Mongodb Replica set + Sharding Cluster

Replica set 
Mongodb的高可靠性的架構,主要原理為Primary資料庫之外會同時在Secondary資料庫生成一樣的資料防只在在主資料庫有問題的狀況下我們還有Secondary的資料就有點像HA的機制,詳細如下分為三種角色


1.Primary
唯一具有寫跟讀的角色,主要的存取節點


2.Secondary
只能讀取的角色,可以有一個以上的Secondary,Primary資料會複製一份到Secondary












3.Arbiter
Arbiter不會存取任何資料,主要功能為在Primary無法跟其他Secondary溝通時
會跳出來推舉為新的Secondary擔任Primary



















Sharding Cluster 
分片如字面上的意思就是把資料做切分放置在不同位置,這樣做的主要用意為我們單機如果有大量的資料硬碟快撐不住了 負載爆炸,我們把資料做切分減少每個單機上的資料量提升空間的使用率 減少負載 有種load balance的感覺 一般我們常使用架構為sharding cluster其他種就 不做說明


至於詳細的架構如下 我們一般都是直接連接資料庫拿資料也就是我們如圖上的Shard的位置,當我們做了Sharding的機制後我們就需要個Router層因為我們已經做分層處理了直接存取Shard我們只能看到資料的片段而已這時候Router就起來作用 至於Router怎知道資料該怎取怎處理呢,Config Server就是在做這類資訊的處理存放些Metadata及計算的索引紀錄每個資料Shard的位置.




















實作

介紹這麼多是不是了解不少,那麼我們為什麼需要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: rs
secondary.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: rs
arbiter.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 

沒有留言:

張貼留言