iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Modern Web

Vue+Django+MongoDB+Nginx 全端開發系列 第 24

MongoDB 資料庫複制 & 身份驗證

  • 分享至 

  • xImage
  •  

資料庫複製

不知道大家有沒有聽過負載均衡或者水平擴展呢?在網站佈署中我們會透過這些技術把網站架在多台 server 上,以避免萬一某台 server 掛掉,讓網頁服務仍能維持運作,或者去分擔負載

MongoDB 這邊有一個叫資料庫複製的技術,建立多個相同的 MongoDB service 在不同的 server 上,以避免萬一某台 server 掛掉,讓資料庫無法使用

成員

在資料庫複製中,每個 server 會擔任不同的成員角色,主要分成三種,分別是 primary, secondary 以及仲裁者

https://ithelp.ithome.com.tw/upload/images/20220923/20132990iy6PhWbCUr.png

在這些角色中只有 primary 會和後端溝通,secondary 的功能是同步 primary 的資料,以及當 primary 掛掉的時候,其中一個 secondary 會遞補上來成為 primary,而仲裁者的功能只有當 primary 掛掉的時候參與投票決定哪個 secondary 成為 primary

仲裁者不會同步 primary 的資料,通常由效能較差或者儲存空間較少的 server 擔任,不然如果這台 server 夠好的話,就讓他當 seondary 就好啦

投票

當 primary 掛掉時,seondary 和仲裁者會舉行投票,決定由哪個 secondary 來擔任 primary,secondary 的得票數必須過半才能成為 primary

部署

mongod.cfg

mongod.cfg 中,我們加入以下設定

replication:
  replSetName: "replica_set_name"

在所有的 server 都必須加入相同的 replication 設定

部署

我們先進到其中一台 server 的 mongo shell,輸入以下指令開啟資料庫複製功能

rs.initiate()

加入 secondary

rs.add(“[ip]:[port]”)

加入仲裁者

rs.addArb(“[ip]:[port]”)

連線

python 這邊連接 MongoDB 要改成像這樣,連線到所有在資料庫複製集中的 server

myclient = pymongo.MongoClient("mongodb://192.168.0.1:27017,192.168.0.2:27017,192.168.0.3:27017")

身份驗證

從最一開始到以上的內容,基本上都是讓 MongoDB service 在網路上裸奔的狀態,別人只要知道你的 MongoDB service 架在哪個 ip 和 port 就可以操作你的資料庫了,所以我們要來設置資料庫使用者的帳號密碼

建立 root 使用者

MongoDB 這邊可以建立不同權限的使用者,可以讓有的使用者只讀不寫,也可以讓某個使用者只能操作某幾個 database

這邊我直接介紹建立一個 root 使用者,什麼都可以做,在 mongo shell 中

$ use admin
$ db.createUser( { user: “superuser”, pwd: “yourpwd”, roles: [ { role: “root”, db: “admin” } ] } )

設定 roleroot

mongod.cfg 設定

mongod.cfg 中,我們加入以下設定

security:
  authorization: enabled

連線

現在用 python 連線要改成像這樣

db_root_user='superuser'
db_root_password='yourpwd'
db_host='192.168.0.1:27017,192.168.0.2:27017,192.168.0.2:27017'

myclient = pymongo.MongoClient('mongodb://'+db_root_user+':'+db_root_password+'@'+db_host+'/?authSource=admin')

上一篇
MongoDB: 更有技巧的查詢資料方法
下一篇
MongoDB 匯出整個資料庫
系列文
Vue+Django+MongoDB+Nginx 全端開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言