NEIL's_學而時習之x不學無術~私藏IT技術經驗分享部落

關於部落格
NEIL. Cheng....寫作只是為了日後工作之備忘操作參考

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


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

  • 138195

    累積人氣

  • 60

    今日人氣

    0

    訂閱人氣

MongoDB Replica Set + Sharding 實作 (下): Sharding 分片組 by NEIL

 實驗架構說明




延續前一篇" [NoSQL] MongoDB Replica Set + Sharding 實作 (一): Replica Set 複寫組 "

設計,已配置好一組 Replica Set(rs0)複寫組"Sharding"分片儲存組,本篇將進入配置分片(Sharding)

步驟建構與組態配置, NEIL 亦是參考下圖所設計



分片(Sharding) 架構組成 

OS: Ubuntu 16.04 

MongoDB ver. 3.4

Router Process: mongos(mongos80:16888):

前端路由"用戶端"藉此程序遠程連線詢問 configsver, 可取正確Shard 儲存分佈狀

(再連接對應Shard操作)後進行資料讀寫與存取
(--chunksize: 我們可透過mongos去微調異動

變更該預設值:64MB)     #下圖:  生產環境中 Router Access 可以安置數台提供APP存取




Configsver
(mongo84:30001, mongo84:30002,mongo84:30003 模擬三組ConfigSvr)

用於儲存所有Shard節點設定資訊,各個chunk的shard key 範圍..等資訊(中繼資料), Router 將透過

Configserver 查詢對應Sharding Server 實際分片所在位置(shard key:紀錄該筆資料屬於哪個

chunk)
進行資料讀寫存取動作



Sharding Server(mongo81:27017,mongo82:27017,mongo83:27017)共三台節點(上線中)

實際儲存分片資料段(chunk)節點,MongoDB分片資料段稱"chunk"一資料區段,

於前篇實作中我們已經將"Replica Set rs0" mongod 與sharding組整合做(高可用性HA規劃)

chunk(預設值: 64MB)
隨著資料大小超過此預設大小,將逐步新增N個"chunk"分佈於不同Sharding

Server 節點做
資料存儲..,進而達成"水平分片"" 提升快速搜尋紀錄與減輕DB負擔等效益

實驗目標概述:  
本篇探討內容鎖定"Sharding"分片組,延續前篇架構完成"Replica Set + Sharding"

(1.)  完成 ConfigServer(mongo84:30001 ~ mongo84:30003)

   
組態配置(Replica Set "rs1" 複寫組用於保護ConfigSvr) 由於NEIL資源有限將三台集中在

    一台主機上做
mongo84:30001 ~ mongo84:30003模擬,實際生產環境強烈要求配置在不同主機上

  * 由於前一篇我們已經將 Replica Set 執行步驟敘述完整,本篇之"rs1"建構將重點帶過(請依樣畫葫蘆),


(
2.)
進行 Router Process(mongos: mongo80:16888) 路由前端配置與啟動後,連線到

   'mongos: mongo80:16888" Sharding 組(mongo81:27017,mongo82:27017,

       mongo83:27017)
叢集構建完成

(3.) 實作分片(Sharding)案例規劃與執行

        啟用資料庫"分片"支援與 "Collections表分割鍵(索引鍵)&水平擴充/刪除 Sharding Server

        調整預設值" --chunkSize" , 觀察分片分佈訊息(status)及 選擇欄位鍵值做分片設計..等

        *偷分享一下稍早實作分片(Sharding Cluster) 成功截圖,稍後我們步驟也會走向這一步

         #sh.status 查閱分片組資訊,下圖中我們已將mongo81 ~ mongo83 完成Sharding Cluster

      
[  實作開始 ]

(一.) 依序配置好Replica Set  r1 =>  Configsvr  (mongo84:30001,mongo84:30002,mongo84:3003)

      *參考前篇操作配置順序如下(快速回顧)建立Replica Set rs0 提醒
          
(1.) 部署安裝
Mongodb 3.4 至各節點 (Ubuntu 16.04)"mongo80,mongo84"

(2.) Single 節點建立好 keyfile 後 將keyfile 權限設定600(使用者:mongodb) 發佈至個節點路徑存放

(3.)mongos (mongo80:16888) ,
Configsvr

      (mongo84:30001,mongo84:30002,mongo84:3003)

       建立好"DB","LOG" 存放目錄,本Lab範例安排如下

    #Configsvr  (Config01~ Config03  對應 mongo84:30001 ~ mongo84:30003) 

     *舉例來說 mongo84:30001  配置說明

         logfile = /configsvr/config01.log , db = /configsvr/db 

         keyfile = /configsvr/keyfile  ,
mongodb 組態檔案 = rs01-01/mongod31.conf

      

 (4.) 編輯 Mongodb 組態檔案 "mongod31.conf" "mongod84: 30001" 為範例如下

Then 啟動 mongod 服務建立"siteRootAdmin使用者授權配置"


mongod  --config mongod31.conf

---

mongo   mongo84 --port 30001     


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

---------

上一步授權成功後, 現關閉
"mongod"程序(kill)再次編輯"mongod31.conf' 加入

sharding:
   clusterRole: configsvr

replication:
  replSetName: rs1

OK!  第一台Configsvr (mongd84:30001) 的 Replica Ser(rs1) 與 Configsvr組態已配置完成, 
         
         請將配置檔案複製其餘2個Configsvr (mongo84:30002,mongo84:30003) 微調路徑對應即可

          在此省略步贅述

(5.) 組建Replica Set rs1 複寫組  進而保護 Configsvr

依序啟動 mongo84:30001,mongo84:30002,mongo84:30003 (Configsvr)

mongod  --config mongod31.conf

mongod  --config mongod32.conf

mongod  --config mongod33.conf

*使用"siteRootAdmin" 連線 mongo84:30001 底下 admin 資料庫 
 
mongo   mongo84:30001/admin  -u siteRootAdmin  -pxxxxxx

rs.initiate( )     #初始化rs1

rs.add("mongo84:30002")     #將第二,第三節點加入rs1叢集(Replica Set)
 
rs.add("mongo84:30003")

rs.status()      #rs1

往下拉檢視"members"成員狀態 

#mongo84:30001  (Primary)


#mongo84:30002  
(Secondary) 


#mongo84:30003  
(Secondary) 

# rs.isMaster()   #目前我們操作已經將Replica Set (rs1) + Configsvr設定伺服器配置已就位

















(6.)  Then 
路由前端 Router Access(mongo80:16888) 組態檔案配置

          /mongos/keyfile

         /mongos /log/mongos.log

         /mongos/mongo_route.conf  
#mongos組態檔案 


......

編輯 mongos 組態檔案  

sudo vi 
mongo_route.conf

sharding:
  configDB: rs1/mongo84:30001,mongo84:30002,mongo84:30003

#提醒,初次建構Sharding Cluster 的時候(稍後介紹),你可以不需要帶入"rs1/" (Replica Set)

   
但由於,我們的Configsvr 有做複寫組(rs1)配置,透過mongos程序建構成功,關閉mongos程序

      後續再啟動 mongos 時需修改配置加入
"rs1/"  


....

若不修改
"configDB: rs1/mongo84:30001,mongo84:30002,mongo84:30003"配置將出現

以下警訊,將無法正常啟動mongos程序訊息如下

FailedToParse: mirrored config server connections are not supported; for config server replica sets be sure to use the replica set connection string
try 'mongos --help' for more information (切記)...NEIL測試是建構好Sharding配置狀態

....

OK 現在正式啟動 mongos 程序

# sudo mongos -f mongo_route.conf   #下圖中 mongo80:16888  已順利啟動



.....

(6) 連線登入 mongo80:16888
(Router) 進行Sharding Cluster 組建

 sudo mongo mongo80:16888/admin  -u siteRootAdmin -pxxxxxx

  #建立Sharding Cluster :  將Shard成員加入,我們做Replica Set (rs0) 配置

      回傳值 "OK":1 即成功

sh.addShard("rs0/mongo81:27017,mongo82:27017,mongo83:27017")

#sh.status
 #觀察分片狀態資訊   #shards 叢集組件已成功


....

#  db.runCommand({listshards:1})       #列出所有Shards , state:1 表示OK運作中

....

{ 實作分片程序說明 }  


*系統管理員驗證連線 =>建立DB (bingo) => Insert 隨機大份量 Collections (asaburu)測試數據 

  => 啟用DB (bingo) 支援分片 => 決定分割(分片)鍵(配置索引)=> 執行 "Sharding"  

sudo mongo
 mongo80:16888/admin  -u siteRootAdmin -pxxxxxx

#"隨機產生大量測試用資料數(盡可能重複N次產生大量資料區間)

  "borough" : "Bronx"
  請產生資料N次過程中替換不同值(行政區)

use  bingo  
 
                                                                


for (var i = 1; i < 15000; i++) db.asaburu.insert({

        "_id" : i ,
        "address" : {
                "building" : "1007",
                "coord" : [
                        -73.856077,
                        40.848447
                ],
                "street" : "Morris Park Ave",
                "zipcode" : "10462"
        },

        "borough" : "Bronx",
        "cuisine" : "Bakery",
         "name" : "neil"

)

決定分片欄位分割"鍵",並配置其"索引"  NEIL 決定是"borough" (依行政區值不同做分片依據)

#db.enableSharding("bingo")                     #將DB"bingo" 的Sharding支援"分片"打開

# db.asabur.ensureIndex({borough:1})     #配置"分片"鍵值索引

檢視方才大量新增資料的Collections

#use bingo

#db.asaburu.find( )[0]     #檢視"asburu" 集合中第一筆資料  

#db.asaburu.find( ).count()  #統計該集合中方才重複隨機產生資料筆數 共"29999"

#db.asaburu.find().
[29999]  #顯示該集合中最後一筆資料訊息

#檢視目前分片(Sharding)狀態 (chunk)

#sh.status()    #下圖中我們可以檢視到 "partitioned : true" (資料庫已支援分片)

                             chunks: rs0   1     #目前僅有1個範圍區間,繼續隨機增加測試資料量..


於是NEIL 繼續再隨機塞入大量異質資料  "borough: greenisland"   #貪婪之島


#手動改變ChunkSize (Defaut=64MB) => Now 放大為"256MB"

#use config 

#db.settings.find()     #  Default chunksiz = 64MB

#db.settings.save({ _id:"chunksize",value:256 } )   #DB管理者可視情況修改ChunkSize大小 

 
 NEIL 擴充Shard2(rsx) 來檢視分片(Shading)Chunks分配成果建立

  (建立"複寫組與分片"之過程前面介紹過,不再贅述)

  #sh.addShard("rsx/mongo80:27017,mongo80:27018,mongo80:27019)"



#目前我們分片(Sharding)組現況有
rs0,rsx 兩組,來檢視看看數據區間變化

#sh.status( )

  區間分類:  經由前幾步大量持續擴充資料

  *原
Chunks "rs0 1 " (1個區間) =>  重分配 =>"rs0 2 , rsx 1"(3個區間)資料分割

   0  ~  "borough": Alien                                          
      
   "borough" : Alien   ~   "borough" : greenisland  

   "borough": greenisland   ~  之後擴充資料量變化    
      




檢視目前Shards 成員節點資訊可用(rs0,rsx)

#db.runCommand({ listshards: 1})



# db.asaburu.stats() 

#  線上移除 shards(rsx) 演示

#use  admin


#db.runCommand({removeShard: "rsx"})



 
#sh.status( )

chunks: rs0  3   #之前分配3區間"rs0 2 , rsx 1", 自動移轉分片資料到"rs0"存取




#有點一需注意

#db.runCommand({ listshards: 1})    # "draining":true  表示移除的片組正在移轉資料中..



# 遷移的時間或許將依資料量大小有關,有時20,30 min 或是一個小時還是卡在" "draining":true "

    狀態未變化,建議再執行多次  
db.runCommand({removeShard: "rsx"})  指令如下完成刪除分片

 
#NEIL的結論:  

使用Mongodb Sharding 架構(搭配關鍵索引)有助提升DB集合表中查詢速度,勝過前篇我們提到的

DB讀寫分離(有資料延遲寫入/讀取較不同步時間差產生弱點)架構,搭配底層Replica Set 複寫組保護,

 進而完善高可用性HA設計.  
2016/12/31日終於完成此篇(一波三折+天空部落系統異常出包)終搞定

 #新的2017祝福大家也有屬於自己的"大平台"好好發揮身手

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