Site icon Soul & Shell Blog

MongoDB Sharding 分散式儲存架構建置 (實作篇)

前一篇文章「MongoDB Sharding 分散式儲存架構建置 (概念篇)」介紹了 MongoDB Sharding 基本架構與各種角色的介紹。接下來繼續示範如何建置整個 MongoDB Sharding Cluser。

首先,我們要先有一個概念,由於 Shard 本身沒有備援機制,因此 MongoDB 的 Shard 必須建置在 Replica Set 上,Replica Set 建置方式請參考「MongoDB Replica Set 高可用性架構搭建」這一篇文章。假設您已經建立好 Replica Set,那麼就可以繼續接著開始建置 Shard。

建置 Config Server

我們先回顧一下 MongoDB Cluster 的架構,如下:

一開始我們先建立 Config Server,在 MongoDB Sharding Cluster 架構中,Config Server 必須有三個實體以上,強烈建議部署在不同的機器上,因為 Metadata 實在太重要了。下面的範例其實是與 Replica Set 一起部署,實際上分開會比較好。慣例上我們會先透過 /etc/hosts 管理我們的主機資訊 (用 DNS 也是可以),假設要安裝 Config Server 的 Hostname 為 mongodb-cfg-1 ~ 3,先編輯 /etc/hosts,如下:

192.168.0.101    mongodb-a1
192.168.0.102    mongodb-a2
192.168.0.103    mongodb-a3

192.168.0.101    mongodb-cfg-1
192.168.0.102    mongodb-cfg-2
192.168.0.103    mongodb-cfg-3

192.168.0.101    mongodb-router-1
192.168.0.102    mongodb-router-2

接著建立 Config Server 要存放的 DB File Directory,命令如下:

mkdir -p /var/lib/mongodb-cfg

sudo chown -R mongodb:mongodb /var/lib/mongodb-cfg

然後建立 MongoDB Config Server 需要的設定檔,之後再透過 mongod 來載入啟用,因為我們測試環境的 Config Server 與 Replica Set 都在其實同一台機器(正式環境建議分開或分散比較好),Port 與 PID 都要不同,Port 隔開可以方便我們部署在不同機器,然而透過不同的設定檔也會比較好進行管理。大致上的 Port 分配如下:

編輯 Config Server 設定檔內容如下:

sudo vim /etc/mongod-cfgserv.conf

storage:
  dbPath: /var/lib/mongodb-cfg
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod-cfgserv.log

sharding:
   clusterRole: configsvr

net:
  port: 27018
  bindIp: 0.0.0.0

processManagement:
  fork: true
  pidFilePath: /var/run/mongod-cfgserv.pid

上面的設定檔先不開啟認證模式,官方規定在 Production 環境最少要配置三台以上的 Config Server。透過以下 mongod 命令分別在「mongodb-cfg-1, mongodb-cfg-2, mongodb-cfg-3」三台機器各別透過 mongod 指令來啟用 Config Server,如下:

sudo mongod -f /etc/mongod-cfgserv.conf

啟動後我們也可以在 /var/log/mongodb/mongod-cfgserv.log 看到 log 資訊。

建置 MongoDB Router

再來就是建置 MongoDB Sharding Router。首先建立 mongos 要載入的設定檔,基本上跟上面 Config Server 使用的 mongod 差不多。我們這裡測試用的 Router 是跟 Config Server 放在一起,實際上可分開存放會更好。

一樣先設定不啟用認證模式,稍等建立好帳密後再啟用即可。設定檔內容如下:

sudo vim /etc/mongod-router.conf

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod-router.log

sharding:
  configDB: mongodb-cfg-1:27018,mongodb-cfg-2:27018,mongodb-cfg-3:27018
  chunkSize: 64

net:
  port: 27017
  bindIp: 0.0.0.0

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb-router.pid

我們可以看到上述的設定檔有指定 Config Server 的位置,好讓 Router 啟動時可以讀取 Config Server 中的 Metadata。

如同上述的設定檔,先不用啟用認證來執行 mongos,主要是為了要先在 Config Server 中建立 User 好讓後續整個認證流程可以順利串起來,這裡通常大家都會遇到最多問題,很多人最後乾脆關閉認證來配置 Sharding,這樣其實很危險,不建議關閉認證。此外由於應用程式大多是透過 27017 Port 進行連線,所以要提供連線的 Router Bind 直接啟動在標準 MongoDB Port 這樣應用程式就不用修改囉。

先啟用其中一台的 MongoDB Sharding Router,等透過 Mongo Router 設定好 Config Server 之後再啟動所有的 Rouer 即可。注意這裡是用 mongos 命令來啟動喔,如下:

sudo mongos -f /etc/mongod-router.conf

其實上述的設定檔也可以直接用命令來啟動 MongoDB Router,像是以下命令但用設定檔管理還是比較好的作法。這裡只是介紹一下方法:

mongos --configdb mongodb-cfg-1:27018,mongodb-cfg-2:27018,mongodb-cfg-3:27018

啟用 MongoDB Sharding Cluster 認證功能

啟動後透過 mongo 命令連進 Router 來建立使用者,請輸入以下語法:

mongo mongodb-router-1:27017

由於我們還沒有啟動認證,因此進入後直接執行以下命令:

use admin
db.createUser( {
    user: "myUserAdmin",
    pwd: "<password>",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  });
db.createUser( {
    user: "siteRootAdmin",
    pwd: "<password>",
    roles: [ { role: "root", db: "admin" } ]
  });

接者停用 mongos (Router) mongod (Config Server) 服務,因為我們必須透過認證模式來啟用服務,關閉服務可以透過 --shutdown 參數,強烈建議不要用 kill killall 這樣的方式來中斷 MongoDB 程序 (但 mongos 我找不到 shutdown 的方法),命令如下:

sudo killall mongos

sudo mongod -f /etc/mongod-cfgserv.conf --shutdown

重新編輯 /etc/mongod-router.conf /etc/mongod-cfgserv.conf  設定檔,加入 security 選項,如下:

security:
  keyFile: /var/lib/mongodb/mongodb-keyfile

上述設定中的 /var/lib/mongodb/mongodb-keyfile 就是當初建立 Replica Set 的那一把鑰匙,注意喔,整個 MongoDB Cluster 都會透過這把 Key 進行認證通訊,千萬別搞混了。

加上認證模式後就可以在每一台 Server 重新啟動 Config Server 與 Mongo Router,啟用認證後未來的連線也可以透過剛剛設定的密碼來進行,如下:

sudo mongod -f /etc/mongod-cfgserv.conf

sudo mongos -f /etc/mongod-router.conf

最後記得將啟動的命令加到 /etc/rc.local 好讓系統啟動後自動執行。

建立 Sharding Cluster

接著我們透過認證模式進入 Mongo Router 來設定 Sharding,因為後端的 Monogd 是採用 Replica Set 認證模式,所以配置 Sharding 的動作一定要透過同一把 Key 啟動,才能把服務整個串起來。以下透過我們建立好的管理者帳密登入 Mongo Router 來進行配置:

mongo mongodb-router-1 -u "siteRootAdmin" -p "<password>" --authenticationDatabase "admin"

輸入以下命令 sh.addShard() 加入之前建立的 Replica Set 成為一個新的 Shard,如果有更多的 Shard 也可以在這裡加入:

sh.addShard("rs-a/mongodb-a1:27019,mongodb-a2:27019,mongodb-a3:27019")

執行畫面如下:

輸入 sh.status() 可以查看 Shard 的配置狀態。好了之後透過 mongo client 連線到 Router 測試看看,命令如下:

mongo mongodb-router-1:27017 -u "myUserAdmin" -p "<password>" --authenticationDatabase "admin"

實務的配置上,我們會部署多台 Router 來平衡應用程式端的查詢,在應用程式中也可以指定這一群「Router」作為 Server,蠻方便的。到這裡 MongoDB Sharding Cluster 就算是被置完成囉,實際的使用上還需要指定 Collection Shard Key 來分配 Chunk 到不同的 Shard 上,這裡請自行參考 MongoDB 官方的 Shard Key 使用介紹。先介紹這裡,Bye!

MongoDB 系列文章

Exit mobile version