NEIL's_學而時習之x不學無術~私藏IT技術經驗分享部落
關於部落格
NEIL. Cheng....寫作只是為了日後工作之備忘操作參考

本部落格文章撰寫前進邁向第五年(since 2009 ~至今)仍繼續推進分享IT學習!!About Windows/Linux Server,Virtualization


分享網誌: 由於,本人預先完成LAB後,才補上撰寫文章與截圖,若發現文圖對照說明有誤..本人將盡快校正,也請不吝指教! Thanks!

  • 154596

    累積人氣

  • 74

    今日人氣

    0

    訂閱人氣

MongoDB Replica Set + Sharding 實作 (上): Replica Set 複寫組 by NEIL

實作開始

(一.) 登入mongo81主機

編輯mongo81組態檔案配置(mongo81.conf) 與  Replica Set 必要管理User授權配置

sudo vi  mongo81.conf     #參考以下

storage:
  dbPath: /repliset/db
  journal:
    enabled: true
  engine: wiredTiger
 
systemLog:
  destination: file
  logAppend: true
  path: /mongodb/log/rs0_1.log
 
net:
  port: 27017
  bindIp: 0.0.0.0
 
processManagement:
  fork: true
 
security:
  keyFile: /mongodb/keyfile
 #  啟動mongo81並建立DB管理員與SiteRootAdmin 使用者與密碼

sudo   mongod --config  mongo81.conf    #啟動mongod

mongo    mongo81 --port 27017    #連線Standalone mongo81 主機

use admin
db.createUser( {                              
    user: "neil",                                        
    pwd: "xxxxxxx",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  });
 
db.createUser( {
    user: "siteRootAdmin",
    pwd: "xxxxxxx",
    roles: [ { role: "root", db: "admin" } ]   
  });

*userAdminAnyDatabase:  #針對所有資料庫的使用者管理許可權

*root:   #DB內權力最大管理者,稍後我們將常用此帳戶登入


*驗證用戶"siteRootAdmin" 登入

use admin;

db.auth("siteRootAdmin","xxxxxx")  
 #回傳"1"表示帳戶驗證用戶OK




*關閉現有 mongod 服務

use admin

db.shutdownServer()

"mongo81.conf" 尾端繼續增加以下配置, 

replication:

  oplogSizeMB: 1024

  replSetName: rs0

sharding:

  clusterRole: shardsvr


*其餘 [rs0] mongo82.conf.mongo83 .conf 成員請依上述畫葫蘆配置組態檔案(在此不贅述)

--->



[Then [rs0] 各節點"mongo81,mongo82,mongo83"組態配置到位後,依序啟動三節點mongodb服務


sudo mongod --config  mongo81.conf

sudo mongod --config  mongo82.conf

sudo mongod --config  mongo83.conf



*使用User"siteRootAdmin" 連線 mongo81:27017 底下 admin 資料庫 

mongo   mongo81:27017/admin  -u siteRootAdmin  -pxxxxxx

rs.initiate( )     #初始化rs0

rs.add("mongo82:27017")     #將第二,第三節點加入rs0叢集
 
rs.add("mongo83:27017")

----------------------------------

#  rs.status( )     #觀察Replica Set 組內容

    下圖中 " rs0: Primary" 在進行
rs.initiate( ) 與加入組成員後才會判定哪個節點為"Primary"

 
 若初次建立 Replica Set 未設定優先權配置順序如下 mongo81 -> mongo82 -> mongo83

     (通常mongo81 初次啟動叢集時將為預設 Primary )




查看"member" 資訊

#mongo81:27017

"_id" : 0  #成員編號"0' ,

 "health" : 1   #節點正常運作中   ,

"state" : 1    #擔任Primary 



#mongo82:27017

"_id" : 1           #成員編號"1' , 

 "health" : 1   #節點正常運作中   , 

"state" : 2    #擔任Secondary 


#mongo83:27017

"_id" : 2          #成員編號"2' , 

 "health" : 1   #節點正常運作中   , 

"state" : 2        #擔任Secondary      

#一整個"rs0" 複製組裡面僅能存在一個Primary 對數個Sencondary,唯有當Primary 掛點時,

   將從剩餘的Sencondary 組中進行選舉下一個討選出新的"Primary" 節點,這部分可以透過


   優先權(Priority)手動變更調整指定節點或是由Secondary內部自行選舉



rs.conf( )   #下圖中我們可以看到 mongo81:27017 Priority = 2  

                      (預設優先權=1 ,  手動指定範圍 0~10000 數字越大優先選舉成 Primary機會高)

 #下圖中我們可以看到 mongo82:27017 Priority = 1  

 #下圖中我們可以看到 mongo83:27017 Priority = 1  

#rs.isMaster( )      #另一個檢視Replica Set 狀態指令

# db.oplog.rs.find()    #切換"local"資料庫底下查看"oplog.rs" 集合,查看Log紀錄

    下圖中"op" : "n"  意思即"無任何操作" "ns" 表示被執行對象= 集合"collection"名稱,常見

 
   "op" : "i"  即 insert   "op" : "d"  即 delete    "op" : "u"  update    



# db.printSlaveReplicationInfo()   #檢視slave 同步狀態是否有延遲觀察指令

[ 水平擴充/刪除 MongoDB  Replica Set 節點 ]

 新節點mongo82:27018 組態檔案規劃

 db 路徑:  /repliset

 log路徑:   /mongodb/log/rs0_82-1.log

  #mongod82-1.conf


啟動該節點 mongod 服務

sudo mongod --config mongod82-1.conf


[連線Primary 節點(mongo81:27017),新增新節點mongo82:27018]

mongo mongo81:27017/admin -u siteRootAdmin -pxxxxxx

 rs.addArb("mongo82:27018")    #計畫將該節點設定為仲裁節點,回傳"1" OK

# rs.status( )   #已經成功看到新節點mongo82:27018 成功加入rs0 複寫組   "_id:3"

[ 刪除 mongo82:27018 (arbiter)節點]

  rs.remove("mongo82:27018")  
 

 #截止目前為止,已完成Replica Set 複寫組配置 & 正常運作與 增刪節點操作示現


[ 手動修改Replica Set 複製集結點優先權]

從上一步我們得知目前rs0 複製組 各節點優先權限如下  

#rs.conf( )


mongo81:27017  , Priority = 2  (Primary )    

mongo82:27017 ,  Priority =  1  (Secondary)

mongo83:27017,   Priority = 1   
 (Secondary)

*現連線到Primary 節點,手動修正優先權(value)

mongo   mongo81:27017/admin  -u siteRootAdmin  -pxxxxxx

cfg = rs.conf()     #將rs.conf( ) 輸出配置丟給一個"cfg"參數

cfg.members[0].priority = 1    #mongo81 優先權值降等"1"
 
cfg.members[1].priority = 2     #mongo82 優先權值升等為"2" 成為"Primary"

cfg.members[2].priority = 1     #mongo83 優先權維持"1' 不變

#rs.reconfig(cfg)   #套用生效上述配置


[Then 現連線到 mongo82:27017 節點來觀察]


mongo   mongo82:27017/admin  -u siteRootAdmin  -pxxxxxx

#目前Primary 節點 已成功轉移到我們預期的 "mongo82:27017" 節點上,

   而原先Primary Node (mongo81:27017) 已成功降等為Secondary 

     *經變更優先權值後,mongo82:27017 成為Primary



[Mongodb 的讀寫分離設計] :  

Replica Set(rs0) 複寫組成立後,預設僅有Primary節點"可讀/可寫"入資料,其餘

Secondary Node 對外無可讀寫狀態,然而我們可以開啟Secondary Node可讀(Read)權限


讓叢集中數個Secondary Node 減輕分擔 Primary Node 讀取(Read)能力,已達到讀寫分離效能提升

mongo   mongo81:27017/admin  -u siteRootAdmin  -pxxxxxx    #試著搜尋DB集合

#搜尋失敗
"not master and slaveOk=false"  #由於mongo81目前是Secondary


Then 連線/Login mongo81:27017 執行以下指令

# db.getMongo().setSlaveOk();  #讓Sencondary獲得讀取(Read)設置


 # 再次執行查詢動作可以順利取得查詢Data

#use local 

#db.oplog.rs.find() 
#資料現在已經可以被查詢讀取亦可可以觀察New Primary 異動資訊
[ Final Replica Set  Auto - FailOver  容錯移轉]

 上一步中,我們已知Primary 節點目前為"mongo82:27017"


mongo   mongo82:27017/admin  -u siteRootAdmin  -pxxxxxx

 現寫入二筆測試(Fail Over) 用資料

#use walkingdead

#
db.walkingdead.insert({"_id":"2",name:"Daryl Dixon",mobile:"0978978978",sex:"man"})


#db.walkingdead.find()   #OK 已經寫入兩筆資料


#先在我們關閉mongo82:27017服務(模擬Primary Fail)

 # db.shutdownServer()


[現連線到 mongo81:27017 節點來看

mongo   mongo81:27017/admin  -u 
siteRootAdmin  -pxxxxx

#rs.status()        #可以查得mongo82:27017 "stateStr" : "(not reachable/healthy)"")

#往上拉檢視到"mongo81:27017"

經由Replica Set (rs0選舉後,推選新的 Primary: "mongo81:27017"(Auto-Fail Over)

 "stateStr" : "PRIMARY",


#檢視方才建立的資料是否已順利同步

rs0:PRIMARY> db.walkingdead.find()       #經容錯轉移後一樣保存資料做到 "Redundant" 設計
 
{ "_id" : "1", "name" : "Rick Grimes", "mobile" : "0987987987", "sex" : "man" }
{ "_id" : "2", "name" : "Daryl Dixon", "mobile" : "0978978978", "sex" : "man" }
 

不知道讀者是否是The Walking Dead(陰屍路)忠實讀者,這個Negan演得太壞了...

  發現有商家專賣第七季登場大魔王尼根皮外套....聽說商家有意連露西爾一起賣...@@

  有興趣讀者可以點以下圖片連結到賣場下單


NEIL Lab 實作結論:  

本篇規劃了MongoDB Replica Set (rs0) 組建,目的主要是保護"Sharding Server"(分片)資料儲存


 官方建議每一組"Sharding Server(rs0)"   "Config Server(rs1)" 至少配置一組"Replica Set " 保護

 資料遺失風險,下一章節我們除了要新增第二組
Config Server(rs1)複寫組外,另介紹如何組建

 mongos(router),
Sharding role (本章已完成配置) 與  Config Server 相關配置與演示該如何做

資料分片實際操作
(Replica Set +  Sharding)說明實作

相簿設定
標籤設定
相簿狀態