如何配置 MongoDB 副本集
MongoDB 已經成為市面上最知名的 NoSQL 資料庫。MongoDB 是面向文件的,它的無模式設計使得它在各種各樣的WEB 應用當中廣受歡迎。最讓我喜歡的特性之一是它的副本集(Replica Set),副本集將同一資料的多份拷貝放在一組 mongod 節點上,從而實現資料的冗餘以及高可用性。
這篇教程將向你介紹如何配置一個 MongoDB 副本集。
副本集的最常見配置需要一個主節點以及多個副節點。這之後啟動的複製行為會從這個主節點到其他副節點。副本集不止可以針對意外的硬體故障和停機事件對資料庫提供保護,同時也因為提供了更多的節點從而提高了資料庫客戶端資料讀取的吞吐量。
配置環境
這個教程裡,我們會配置一個包括一個主節點以及兩個副節點的副本集。
為了達到這個目的,我們使用了3個執行在 VirtualBox 上的虛擬機器。我會在這些虛擬機器上安裝 Ubuntu 14.04,並且安裝 MongoDB 官方包。
我會在一個虛擬機器例項上配置好所需的環境,然後將它克隆到其他的虛擬機器例項上。因此,選擇一個名為 master 的虛擬機器,執行以下安裝過程。
首先,我們需要給 apt 增加一個 MongoDB 金鑰:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
然後,將官方的 MongoDB 倉庫新增到 source.list 中:
$ sudo su # echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
接下來更新 apt 倉庫並且安裝 MongoDB。
$ sudo apt-get update $ sudo apt-get install -y mongodb-org
現在對 /etc/mongodb.conf 做一些更改
auth = true dbpath=/var/lib/mongodb logpath=/var/log/mongodb/mongod.log logappend=true keyFile=/var/lib/mongodb/keyFile replSet=myReplica
第一行的作用是表明我們的資料庫需要驗證才可以使用。keyfile 配置用於 MongoDB 節點間複製行為的金鑰檔案。replSet 為副本集設定一個名稱。
接下來我們建立一個用於所有例項的金鑰檔案。
$ echo -n "MyRandomStringForReplicaSet" | md5sum > keyFile
這將會建立一個含有 MD5 字串的金鑰檔案,但是由於其中包含了一些噪音,我們需要對他們清理後才能正式在 MongoDB 中使用。
$ echo -n "MyReplicaSetKey" | md5sum|grep -o "[0-9a-z]/+" > keyFile
grep 命令的作用的是把將空格等我們不想要的內容過濾掉之後的 MD5 字串列印出來。
現在我們對金鑰檔案進行一些操作,讓它真正可用。
$ sudo cp keyFile /var/lib/mongodb $ sudo chown mongodb:nogroup keyFile $ sudo chmod 400 keyFile
接下來,關閉此虛擬機器。將其 Ubuntu 系統克隆到其他虛擬機器上。
這是克隆後的副節點1和副節點2。確認你已經將它們的MAC地址重新初始化,並且克隆整個硬碟。
請注意,三個虛擬機器示例需要在同一個網路中以便相互通訊。因此,我們需要它們弄到“網際網路”上去。
這裡推薦給每個虛擬機器設定一個靜態 IP 地址,而不是使用 DHCP。這樣它們就不至於在 DHCP 分配IP地址給他們的時候失去連線。
像下面這樣編輯每個虛擬機器的 /etc/networks/interfaces 檔案。
在主節點上:
auto eth1 iface eth1 inet static address 192.168.50.2 netmask 255.255.255.0
在副節點1上:
auto eth1 iface eth1 inet static address 192.168.50.3 netmask 255.255.255.0
在副節點2上:
auto eth1 iface eth1 inet static address 192.168.50.4 netmask 255.255.255.0
由於我們沒有 DNS 服務,所以需要設定設定一下 /etc/hosts 這個檔案,手工將主機名稱放到此檔案中。
在主節點上:
127.0.0.1 localhost primary 192.168.50.2 primary 192.168.50.3 secondary1 192.168.50.4 secondary2
在副節點1上:
127.0.0.1 localhost secondary1 192.168.50.2 primary 192.168.50.3 secondary1 192.168.50.4 secondary2
在副節點2上:
127.0.0.1 localhost secondary2 192.168.50.2 primary 192.168.50.3 secondary1 192.168.50.4 secondary2
使用 ping 命令檢查各個節點之間的連線。
$ ping primary $ ping secondary1 $ ping secondary2
配置副本集
驗證各個節點可以正常連通後,我們就可以新建一個管理員使用者,用於之後的副本集操作。
在主節點上,開啟 /etc/mongodb.conf 檔案,將 auth 和 replSet 兩項註釋掉。
dbpath=/var/lib/mongodb logpath=/var/log/mongodb/mongod.log logappend=true #auth = true keyFile=/var/lib/mongodb/keyFile #replSet=myReplica
在一個新安裝的 MongoDB 上配置任何使用者或副本集之前,你需要註釋掉 auth 行。預設情況下,MongoDB 並沒有建立任何使用者。而如果在你建立使用者前啟用了 auth,你就不能夠做任何事情。你可以在建立一個使用者後再次啟用 auth。
修改 /etc/mongodb.conf 之後,重啟 mongod 程式。
$ sudo service mongod restart
現在連線到 MongoDB master:
$ mongo <master-ip-address>:27017
連線 MongoDB 後,新建管理員使用者。
> use admin > db.createUser({ user:"admin", pwd:" })
重啟 MongoDB:
$ sudo service mongod restart
再次連線到 MongoDB,用以下命令將 副節點1 和副節點2節點新增到我們的副本集中。
> use admin > db.auth("admin","myreallyhardpassword") > rs.initiate() > rs.add ("secondary1:27017") > rs.add("secondary2:27017")
現在副本集到手了,可以開始我們的專案了。參照 官方驅動文件 來了解如何連線到副本集。如果你想要用 Shell 來請求資料,那麼你需要連線到主節點上來插入或者請求資料,副節點不行。如果你執意要嘗試用副本集操作,那麼以下錯誤資訊就蹦出來招呼你了。
myReplica:SECONDARY> myReplica:SECONDARY> show databases 2015-05-10T03:09:24.131+0000 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at Error () at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
如果你要從 shell 連線到整個副本集,你可以安裝如下命令。在副本集中的失敗切換是自動的。
$ mongo primary,secondary1,secondary2:27017/?replicaSet=myReplica
如果你使用其它驅動語言(例如,JavaScript、Ruby 等等),格式也許不同。
希望這篇教程能對你有所幫助。你可以使用Vagrant來自動完成你的本地環境配置,並且加速你的程式碼。
相關文章
- mongodb 4.0副本集搭建MongoDB
- MongoDB 6.0.3副本集搭建MongoDB
- MongoDB日常運維-04副本集搭建MongoDB運維
- MongoDB日常運維-05副本集故障切換MongoDB運維
- MongoDB 4.2副本集新增/刪除副本(一主一副一仲裁)MongoDB
- MongoDB 4.2副本集自動故障轉移(一主一副一仲裁)MongoDB
- MongoDB日常運維-06副本集搭建錯誤彙總MongoDB運維
- MongoDB副本集MongoDB
- MongoDB部署副本集MongoDB
- 搭建MongoDB副本集MongoDB
- MongoDB 副本集搭建MongoDB
- MongoDB 副本集管理MongoDB
- 2.MongoDB 4.2副本集環境基於時間點的恢復MongoDB
- 006.MongoDB副本集MongoDB
- MongoDB - 副本集簡介MongoDB
- MongoDB副本集replica set (二)--副本集環境搭建MongoDB
- MongoDB 副本集切換方法MongoDB
- MongoDB 副本集原理及管理MongoDB
- MongoDB Replica Set 副本集實踐MongoDB
- MongoDB 刪除,新增副本集,並修改副本集IP等資訊MongoDB
- 手把手教你搭建mongodb副本集MongoDB
- Python連線訪問mongodb副本集PythonMongoDB
- mongodb副本集新增刪除節點MongoDB
- Mongodb分散式叢集副本集+分片MongoDB分散式
- linux下Mongodb叢集搭建:分片+副本集LinuxMongoDB
- 第六章 MongoDB副本集搭建MongoDB
- MongoDB4.2 副本集掃盲說明MongoDB
- MongoDB--副本集基本資訊【面試必備】MongoDB面試
- 單機Linux下搭建MongoDB副本集-三節點LinuxMongoDB
- 使用Docker搭建MongoDB 5.0版本副本集叢集DockerMongoDB
- 分散式文件儲存資料庫之MongoDB副本集分散式資料庫MongoDB
- 銀河麒麟系統安裝mongodb副本集故障處理MongoDB
- MongoDB安全配置MongoDB
- 【mongodb安裝配置】MongoDB
- MongoDB 映象配置方法MongoDB
- Mongodb主從配置MongoDB
- MongoDB副本集keyFile認證檔案必須滿足的條件MongoDB
- k8s-mongodb叢集部署(副本集) (包括規劃文件-攢)K8SMongoDB
- 在Windows上使用Docker 建立MongoDB 副本集的極簡方法(翻譯)WindowsDockerMongoDB