摘要:系列文章請看環境準備主從復制是中最常見的復制方式。本次試驗中,我們采用一個主節點,一個從節點。重啟一下即可正常運行。執行完這條語句之后既可以正常操作了。具體怎么創建用戶參考學習札記第二篇之安全參考權威指南官網手冊
mongo系列文章請看http://www.codefrom.com/p/mongodb
環境準備:
ubuntu12.0.4
mongodb3.0.3
主從復制是MongoDB中最常見的復制方式。這種方式非常靈活,可用于備份,故障恢復,讀擴展 等。
本次試驗中,我們采用一個主節點,一個從節點。
首先先創建master和slave的目錄
lwb@ubuntu:~$ mkdir -p ~/mongoData/master lwb@ubuntu:~$ mkdir -p ~/mongoData/slave
創建之后,啟動master
lwb@ubuntu:~$ mongod --master --dbpath ~/mongoData/master/ --port 10000
然后再啟動slave
lwb@ubuntu:~$ mongod --dbpath ~/mongoData/slave/ --port 10001 --slave --source localhost:10000
接著,連接到master的機器,
lwb@ubuntu:~$ mongo --host localhost --port 10000
往test數據庫的users集合里面插入兩條數據:
> db.users.find() { "_id" : ObjectId("55763d98db85929bb8addedf"), "username" : "lwb" } { "_id" : ObjectId("55764a694b24187a7a3c6693"), "username" : "mongodb master-slave" }
在master操作完成之后,在連接slave的mongod
lwb@ubuntu:~$ mongo --host localhost --port 10001 MongoDB shell version: 3.0.3 connecting to: localhost:10001/test Server has startup warnings: 2015-06-08T19:02:31.866-0700 I CONTROL [initandlisten] 2015-06-08T19:02:31.866-0700 I CONTROL [initandlisten] ** WARNING: /sys/kernel/ mm/transparent_hugepage/defrag is "always". 2015-06-08T19:02:31.866-0700 I CONTROL [initandlisten] ** We suggest set ting it to "never" 2015-06-08T19:02:31.866-0700 I CONTROL [initandlisten] > > show dbs 2015-06-08T19:09:17.770-0700 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 > > rs.slaveOk() > > show dbs local 0.078GB test 0.078GB > > use test switched to db test > show collections system.indexes users > > db.users.find() { "_id" : ObjectId("55763d98db85929bb8addedf"), "username" : "lwb" } { "_id" : ObjectId("55764a694b24187a7a3c6693"), "username" : "mongodb master-slave" }
我遇到的問題及解決方法
問題一:
我的主從復制實驗分為兩次進行,剛開始我配置的master的端口是 10000 ,salve的端口是10001 ; 后因為電腦內存使用率暴漲,90+% 。 所以關掉電腦重啟。問題就出現在這里,重啟之后,我指定master端口的時候指定為 27000 , 指定slave端口為 27001 所以就出現了如下問題:terminating mongod after 30 seconds
2015-06-08T18:11:37.981-0700 I NETWORK [initandlisten] waiting for connections on port 27001 2015-06-08T18:11:38.975-0700 I REPL [replslave] repl: --source localhost:27000 != localhost:10000 from local.sources collection 2015-06-08T18:11:38.976-0700 I REPL [replslave] repl: for instructions on changing this slave"s source, see: 2015-06-08T18:11:38.976-0700 I REPL [replslave] http://dochub.mongodb.org/co re/masterslave 2015-06-08T18:11:38.976-0700 I REPL [replslave] repl: terminating mongod after 30 seconds 2015-06-08T18:12:08.976-0700 I CONTROL [replslave] dbexit: rc: 3
解決方法:
如果仔細觀察日志的同學應該會發現:
2015-06-08T18:11:38.975-0700 I REPL [replslave] repl: --source localhost:27000 != localhost:10000 from local.sources collection
所以,在一開始的時候我們已經為slave指定了master的host和port,這個會插入到local.sources 這個集合的。所以,把master端口改成10000就可以了。
問題二
主從啟動之后,連接slave可以成功連上,但是在slave中執行 show dbs 的時候就報錯了:
QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
解決方法:
在報錯的slave機器上執行 rs.slaveOk()方法即可。
> rs.slaveOk() > show dbs local 0.078GB test 0.078GB > use test switched to db test > show collections system.indexes users > db.users.find() { "_id" : ObjectId("55763d98db85929bb8addedf"), "username" : "lwb" } { "_id" : ObjectId("55764a694b24187a7a3c6693"), "username" : "mongodb master-sla
具體slaveOk方法是什么意思?
rs.slaveOk()
Provides a shorthand for the following operation:
db.getMongo().setSlaveOk()
This allows the current connection to allow read operations to run on secondary members. See the readPref() method for more fine-grained control over read preference in the mongo shell.
Master-Slave安全
這個主從安全在 MongoDB官網說的很清楚。不能和普通的mongod權限驗證那樣。這里除了需要加入 —auth 還需要加入 —keyFile 的驗證。
首先,我們生成我們的keyFile,根據官網提供的說明,這個keyfile是可以任意內容的,只要保證所有集群中的機器都擁有同樣的文件即可。在linux環境下,我們通過
openssl rand -base64 741 > /usr/localhsot/mongodb/mongo-keyfile
這條命令來生成我們的keyFile。 生成之后就可以在啟動mongod的時候指定了。
首先先啟動 master
root@ubuntu:/usr/local/mongodb# mongod --master --dbpath ~/mongoData/master/ --port 10000 --auth --keyFile /usr/local/mongodb/mongo-keyfile
這里在啟動的時候可能會遇到一些問題,我是在ubuntu環境下,所以經常操作要sudo,很繁瑣。因此,讓當前用戶獲得root權限是很有必要的。
在命令行模式執行 vi etc/passwd
我的用戶名是 lwb ,所以將lwb所在的行改成
lwb:x:0:0:Ubuntu12.04,,,:/home/lwb:/bin/bash
原來的值是(將1000 改成 0 即可): lwb:x:1000:1000:Ubuntu12.04,,,:/home/lwb:/bin/bash
修改完成之后重啟登錄就可以讓當前用戶獲得root權限了。
回到正題,在生成mongo-keyfile后,并指定keyFile參數來啟動mongod的時候,可能還會遇到另一個問題:
root@ubuntu:~# mongod --master --dbpath ~/mongoData/master/ --port 10000 --auth --keyFile /usr/local/mongodb/mongo-keyfile 2015-06-08T21:34:43.864-0700 I ACCESS permissions on /usr/local/mongodb/mongo-keyfile are too open
這個錯誤的意思是說 mongo-keyfile權限太大了,降低一下這個文件的權限。
root@ubuntu:/usr/local/mongodb# chmod 400 mongo-keyfile root@ubuntu:/usr/local/mongodb# ll total 84 drwxr-xr-x 4 root root 4096 Jun 8 21:34 ./ drwxr-xr-x 11 root root 4096 Jun 8 16:49 ../ -rw-r--r-- 1 root root 34520 Jun 6 07:24 GNU-AGPL-3.0 -rw-r--r-- 1 root root 1359 Jun 6 07:24 README -rw-r--r-- 1 root root 22660 Jun 6 07:24 THIRD-PARTY-NOTICES drwxr-xr-x 2 root root 4096 Jun 6 07:24 bin/ drwxr-xr-x 3 root root 4096 Jun 7 13:02 data/ -r-------- 1 root root 1004 Jun 8 21:34 mongo-keyfile
重啟一下mongod即可正常運行。
接著啟動slave
mongod --slave --dbpath ~/mongoData/slave/ --port 10001 --source localhost:10000 --auth --keyFile /usr/local/mongodb/mongo-keyfile
一切都順利的進行著。
使用創建的用戶操作master里面的數據庫以及集合都是正常的。但是使用同樣的用戶操作slave的時候就有不正常了。還是提示
QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
這個錯誤上面已經提到了。解決方法也是一樣的。 rs.slaveOk() 執行完這條語句之后既可以正常操作了。
可以發現,用keyFile的方式啟動mongod服務器其實和平常啟動沒什么區別,唯一的區別就是在啟動參數中指定了 --keyFile keyfile 而已。
具體怎么創建用戶參考: MongoDB學習札記第二篇之mongodb安全
Sincerely!
參考
MongoDB權威指南
MongoDB官網Manual手冊
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18750.html
摘要:系列專題查詢條件首先往數據庫集合里面插入幾條數據。指定了之后,顯示具體的條數,上文中,表示,顯示條文檔。其中,表示要排序的字段,的可取值為。要對集合進行排序。其中按照升序,按照降序。發現逆序排序了。至此,說明我們的實驗成功了。 系列專題http://www.codefrom.com/p/mongodb 查詢條件 首先往數據庫集合里面插入幾條數據。 測試數據: > db.u...
摘要:原圖加載毛玻璃的效果比較快,你的這個打開白屏好幾秒。這就是系列第六篇之系列之,等。這個系列的講解和實例都會整理在一個里,的地址去吧,我會慢慢完善的。 這篇文章其實我一直在想,是寫還是不寫,因為關于講 CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout,Toolbar,TabLayout 等這些控件的使用,以前寫過一篇,那就是《通...
摘要:我們常說的分表分庫分區等概念都屬于分片的實際體現。傳統分片做法是手工分表分庫。自動分片技術是根據指定的片鍵自動拆分數據并維護數據請求路由的過程。 1.mongodb特性 1)mongo是一個面向文檔的數據庫,它集合了nosql和sql數據庫兩方面的特性。 2)所有實體都是在首次使用時創建。 3)沒有嚴格的事務特性,但是它保證任何一次數據變更都是原子性的。 4)也沒有固定的數據模型 5)...
閱讀 798·2021-09-06 15:02
閱讀 2439·2019-08-30 15:43
閱讀 2164·2019-08-30 11:26
閱讀 2372·2019-08-26 12:12
閱讀 3538·2019-08-23 18:24
閱讀 3254·2019-08-23 18:16
閱讀 695·2019-08-23 17:02
閱讀 2241·2019-08-23 15:34