前情提要 最近在 VM 部署了 MongoDB, 不知道為什麼同事在 QA 與正式環境採取了兩個不同的作法, 因此產生了一些版本不一致的問題。 為此需要更換 MongoDB 版本,進而有一些討論, 決策的考量主要有兩個面向,一、維運的成本。二、實際應付的帳務成本。 可行的方案比較如下,
VM 部署 MongoDB
Mongo Atlas(Start from GCP Marketing)
GCP VM with MongoDB(Pay as You Go)
Azure VM with MongoDB
Azure CosmosDB
實作隨筆:Mongo Atlas(Start from GCP Marketing) 測試規劃
如圖,為了不影響原有的環境,我打算建一組新的 VPC Network 進行實驗, 並在這個網路中建立一台實體的 VM 機器,待 Mongo Atlas 設定完成後, 進行連線的測試。
測試的方法,由於 MongoDB Atlas 採用一種安全性較高的連線政策, 必需使用以下連線集群的三種方式才可以連到資料庫: 第一種,IP Access List,使用 GUI 建立 Cluster 的當下會自動加入一組你所在網路對外的 IP, 如果不是固定 IP 可能會有問題 第二種,Peering ,要付錢的版本 M10 以上才可用,也是我們這次實作的重點目標 最後一種,Create a Private Endpoint,也是 M10 以上才可用,但是不是我們這次的主要實作項目,所以不過多的展開。
從 GCP Marketing 建立 Mongo Atlas 在 GCP 的 Marketing 搜尋並訂閱 Mongo Atlas 後點擊 MANAGE ON PROVIDER
在 Mongo Atlas 建立 Cluster,也可以建立 Project 與 User 作更細緻的管控。 這時候可以到 Network Access 查看 IP Access List 的清單,應該會有你網路上設定的對外 IP, 這個流程是自動化的,但是我個人認為不是固定 IP 的話可能會有問題,如果有人可以給我一些提點會十分感激。
建立 VM GCP 建立 VM 是十分簡單的,就不多作說明。 同時記得安裝我們的測試工具 - mongosh
Mongo DB 相關 切換 db
查詢目前 DB 狀態
Create User 1 db.createUser({ user : "username", pwd: "password", roles: [{ role: "roleName", db: "databaseName" }] });
Drop User 1 db.dropUser("username");
查詢 User
User 加入角色 1 db.grantRolesToUser("username", [{ role: "readWriteAnyDatabase", db: "mydb" }])
User 移除角色 1 db.revokeRolesFromUser("usernmae", [{ role: "readWrite", db: "admin" }])
前置作業: GCP VPC 與 Firewall Rules 設定 為了避免影響原有的系統, 建立 GCP 一組新的 VPC Network : vpc-lab
,一般來說 GCP 的專案會有自動建立一組 default
VPC Network, 而 default
VPC Network 會預設建立以下的防火牆規則
default-allow-icmp – 允許來自任何來源對所有網路 IP 進行存取。ICMP 協議主要用於對目標進行 ping 測試。
default-allow-internal – 允許在任何埠口上的實例之間建立連接。
default-allow-rdp – 允許從任何來源連接到 Windows 伺服器的 RDP 會話。
default-allow-ssh – 允許從任何來源連接到 UNIX 伺服器的 SSH 會話。
與此對應,我也建立相同的規則給vpc-lab
,如下:
vpc-lab-allow-icmp
vpc-lab-allow-internal
vpc-lab-allow-rdp
vpc-lab-allow-ssh
可以用以下的語法測試一下網路是否能連,如果可以連線再進行 mongodb connection 的測試
1 telnet {ip address} {port}
測試連線用的語法 如果網路測試沒有問題,再進行 mongodb 的連線,由於目前沒有設定 Peering 連線, 所以在開發機上可以(網路環境需要在 IP Access List 內),而使用 GCP VM 會無法連線, 開發機連線 GCP MongoDB 語法
1 mongosh mongodb://{user:pwd}@{mongodb_ip}:27017/my_db
開發機連線 MongoDB Atlas 語法
1 mongosh mongodb+srv://{user:pwd}@{atlas_cluster_name}.mongodb.net/my_db
Peering 實作 首先需要在 Mongo Atlas 進行設定, Network Access > Peering > Add Peering Connection 在 Cloud Provider 中選擇 GCP,
設定 Project ID、VPC Name 與 Atlas CIDR, 比較特殊的是 Atlas CIDR 在 GUI 的說明是
An Atlas GCP CIDR block must be a /18 or larger. You cannot modify the CIDR block if you have an existing cluster.
但我遇到的狀況是,無法修改預設值為 192.168.0.0/16
建立後會產生一組 Peering 的資料,請記住 Atlas GCP Project ID 與 Atlas VPC Name
接下來到 GCP > VPC Network > GCP Network Peering 選擇 Create peering connection 在 Peered VPC network 中選擇 Other Project,並填入上面的 Atlas GCP Project ID 與 Atlas VPC Name
大概等待一下子就會生效了(網路上寫 10 分鐘,實測不到 3 分鐘)
參考
(fin)