MongoDB 已經成爲市面上最知名的 NoSQL 數據庫。MongoDB 是面向文檔的,它的無模式設計使得它在各類各樣的WEB 應用當中廣受歡迎。最讓我喜歡的特性之一是它的副本集(Replica Set),副本集將同一數據的多份拷貝放在一組 mongod 節點上,從而實現數據的冗餘以及高可用性。linux
這篇教程將向你介紹如何配置一個 MongoDB 副本集。mongodb
副本集的最多見配置須要一個主節點以及多個副節點。這以後啓動的複製行爲會從這個主節點到其餘副節點。副本集不止能夠針對意外的硬件故障和停機事件對數據庫提供保護,同時也由於提供了更多的節點從而提升了數據庫客戶端數據讀取的吞吐量。shell
配置環境數據庫
這個教程裏,咱們會配置一個包括一個主節點以及兩個副節點的副本集。ubuntu
爲了達到這個目的,咱們使用了3個運行在 VirtualBox 上的虛擬機。我會在這些虛擬機上安裝 Ubuntu 14.04,而且安裝 MongoDB 官方包。網絡
我會在一個虛擬機實例上配置好所需的環境,而後將它克隆到其餘的虛擬機實例上。所以,選擇一個名爲 master 的虛擬機,執行如下安裝過程。app
首先,咱們須要給 apt 增長一個 MongoDB 密鑰:dom
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10雲計算
而後,將官方的 MongoDB 倉庫添加到 source.list 中:spa
$ 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來自動完成你的本地環境配置,而且加速你的代碼。
免費領取兄弟連IT教育原創雲計算培訓視頻/細說linux教程,詳情諮詢官網客服:http://www.lampbrother.net/linux/ 或者勾搭Q2430675018~
歡迎加入linux交流羣 478068715