MongoDB Replica Set 介紹
MongoDB 算是一個很發展非常成熟的專案,大多數的系統裝起 MongoDB 應該都不會有太大的困難,今天介紹一下進階一點點的用法,Replica Set。資料庫系統做高可用 Replication (副本) 模式算是很常見的架構,在大陸稱為「主備模式」主要提供一份資料庫即時映射的副本,好讓主要的服務資料庫發生異常時可以接手工作。同時,另一個優勢就是可以進行資料備援,或者用來進行查詢。此外,當資料庫大到一定的程度,傳統的 dump 工具將很難完成任務,備援的方法就可以靠 Replication 來完成。
現在的 Open Source 系統發展得很快,官方提供的版本就早已經支援 Replication,想想以前的 PostgreSQL 在 5.x 的時候還要自己 Patch 第三方 Project 進行編譯,比起來真的省事多了。
官方有提供三種 Replica Set 架構 (Pattern),如下:
- Three Member Replica Sets
- Replica Sets with Four or More Members
- Geographically Distributed Replica Sets
第一種 Three Member Replica Sets 是最常用的架構,由三個 MongoDB 節點組成,每個節點其實都是 Mongod 服務。第二種由更多的節點組成,備援能力更強,但我沒有研究,無從介紹。最後一種 Distributed Replica Sets 主要滿足異地備援的需求,這個聽起來不錯。
今天來介紹 MongoDB 最典型的副本架構,主要由三個節點構成,如下:
正常情況對 Primary 節點進行讀寫,資料會自動複製 (Replication) 到另外兩組 Secondary 節點,這些節點彼此透過 Heartbeat (每隔一段時間試探節點是否存活的方式) 檢測狀態,正常的情況每 2 秒會送出 Heartbeat,若是超過 10 秒沒有回覆,那就是 GG 了。如下:
當主要連線的節點發生故障時,會選出一台 Secondary 成為 Primary 接手工作,這樣的能力稱為 Automatic Failover,如下:
因此在 Replica Set 架構下,Application 連線的主機位置會設定到所有節點的位置 (一組 Host),由 Driver 自行控制連線的行為,程式邏輯不需要特別處理什麼,蠻方便的。
安裝 MondoDB 3.0
開始之前,我們先安裝 MongoDB 3.0,在 Ubuntu Server 14.04 目前內建的 MongoDB 版本還是 2.x,由於 3.0 在效能與儲存空間上實在有太多的改進,非用不可。所以我們先來裝一下 3.0 吧!
請依序執行以下命令,這裡的環境是 Ubuntu Server 14.04,如果已經安裝舊的版本,建議先移除再進行。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
注意喔,這裡安裝的套件是名稱是 mongodb-org!
安裝與設定 MongoDB Replica Set
大概知道工作原理以後,那麼我們來看看如何設定 Replica Set 架構。
開始之前我們先在 /etc/hosts 定義這三台要安裝的 hostname 與 IP Address,當然如果您想透過 DNS 服務來管理也是可以的。
sudo vim /etc/hosts
192.168.0.101 mongodb-a1 192.168.0.102 mongodb-a2 192.168.0.103 mongodb-a3
建立一個讓 Replica Set 專用的全新資料庫目錄
sudo mkdir -p /var/lib/mongodb-rs-a
sudo chown -R mongodb:mongodb /var/lib/mongodb-rs-a
設定 Replica Set 服務的 Mongod 設定檔(先不啟用驗證模式)
sudo vim /etc/mongod.conf
storage: dbPath: /var/lib/mongodb-rs-a journal: enabled: true systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log net: port: 27019 bindIp: 0.0.0.0
這裡我們將 Replica Set 服務設定在 27019 Port,主要是因為之後會繼續建立 Sharding 架構,刻意避開標準的 27017 Port,保留 27017 Port 給之後的 Mongo Router 使用。如果您不打算建構 Sharding,那就直接使用 27017 即可,讓應用程式端不需要修改就可以使用。修改完設定檔後記得重新啟動 mongod 服務:
sudo service mongod restart
先連線進到第一台 mongod 設定管理者帳密
mongo mongodb-a1:27019
輸入以下命令
use admin db.createUser( { user: "myUserAdmin", pwd: "<password>", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); db.createUser( { user: "siteRootAdmin", pwd: "<password>", roles: [ { role: "root", db: "admin" } ] });
透過以下命令建立一個 Key,並且複製到每一台機器 (mongodb-a1, mongodb-a2, mongodb-a3),之後每個 Mongod 實體會透過這把 Key 進行資料同步,接下來的動作比較複雜,順序不可以搞錯。很多人在這裡搞不定驗證功能,索性關閉驗證服務,這樣其實比較沒有保障,乖乖啟用驗證還是比較好的。
openssl rand -base64 741 > /var/lib/mongodb/mongodb-keyfile
chmod 600 /var/lib/mongodb/mongodb-keyfile
chown mongodb.mongodb /var/lib/mongodb/mongodb-keyfile
記得把這把 Key 放到每一台機器的 /var/lib/mongodb/mongodb-keyfile 檔案中。接下來我們就要啟用 Replica Set 與認證模式囉。再度編輯 /etc/mongod.conf 設定檔:
sudo vim /etc/mongod.conf
加入 security 與 replication 選項,記得要指定剛剛產生的 Key File,記得另外兩台機器也要執行一樣的動作。
security: keyFile: /var/lib/mongodb/mongodb-keyfile replication: replSetName: rs-a
重新啟動 mongod 服務(另外兩台也要喔)
sudo service mongod restart
連線至剛剛的第一台 Mongod 並初始化 Replica Set,如下:
mongo mongodb-a1:27019
use admin db.auth("siteRootAdmin", "<password>"); rs.initiate() rs.conf()
執行後會看到以下畫面:
接著新增另外兩台 Replica Set 節點,輸入以下命令:
rs.add("mongodb-a2:27019") rs.add("mongodb-a3:27019") rs.status()
最後可以透過 rs.status() 查看 Replica Set 設定狀態,成功後可以看到以下畫面:
OK, 看到這樣的畫面就大功告成囉!你成功了嗎?