距離上次的mongodb有一段日子了,當時說好了要盡快更新這塊,但是由於各種事情,就暫時擱置下來。回頭看看自己第一篇博客,竟然是半年以前,oh,my god,我和我的小伙伴們都驚呆了。
不過還是鼓起勇氣,go on……
以前博客中,也曾介紹過java操作mongodb的事例,那麼這篇博客就不再介紹命令行下增刪改查了。因為mongodb集成了shell命令,同時對javascript也有很好的集成,在命令行下就可以操作簡單的javascript。
比如for 循環。 for(var i=0;i<3;i++){db.my.insert({name:"test",age:18})} 其中my是自定義集合collection。你可以試試,肯定沒問題,若有問題,直接call me
之所以不過多介紹這塊,因為在控制台下可以直接查看其api,並且mongodb有方法補全功能哦,類似java ide環境,再次方便了我們。
在控制台下,按一次tab鍵,mongodb可以自動補全,這就是shell命令的好處。同時,在控制台下,直接敲相應的方法,不要加括號,即可打印其api哦。比如db.my.update;快試試哦。
OK,轉到今天的主題。
主從復制:master-slave模式。通俗的來說,主服務器copy到從服務器中,從而保證了兩者同步一致。這樣的好處就不言而喻喽,若主服務器壞了,哈哈,莫怕,從服務器中還有哩。但是從服務器中有歸有哈,卻不能自動轉正哈。【咋感覺有點像小妾呢,O(∩_∩)O】
不過啊,先不說他的缺點,來看看他的優點,人呢,就不能太貪,一口可不能吃個胖子哦。
主從復制,自動保持同步,這樣就不用咱們手動維護喽。以前原來的項目,咋保證數據的安全呢?首先insert到這個數據庫中,因為當時數據很重要,所以需要備份,然後insert success後,再insert another database中。所以在測試insert功能時,就可以去喝杯咖啡~\(≧▽≦)/~啦
手動測試一下這個功能。
1.准備階段:因為一個服務器,所以建兩個文件夾來模擬:master文件夾、slave文件夾。注意開啟兩個不同的端口。
2.啟動主節點:mongod --dbpath E:\E:\mastersavle\master --port 10000 --master
啟動從節點:mongod --dbpath E:\E:\mastersavle\master\slave --port 10001 --slave --source localhost:10000
注意是兩個控制台哦。
啟動效果如下:
3.再開啟一個窗口,連接10000主服務器。然後我們插入一條數據,然後看效果。
默認是連接test服務器,那麼使用類似mysql的use 切換數據庫。 use my; 注意:執行這條語句,若存在my數據庫,則直接切換,若不存在,則隱含創建一個,此時你查看文件夾下,則看不到,因為是隱含,只有你insert數據後,才可以看到這個my數據庫。
db.my.insert({name:"test"});插入一條數據,同時創建了my集合(表),可以通過db;命令查看當前數據庫。通過db.showtables;或者db.showcollections;查看該數據庫下的表。system.index默認有這個表,這是存放索引的表,稍後有時間我們再討論這塊。
4.主服務器中插入後,我們看看從數據庫中的效果:
注意:從服務器中只可以查詢,不可以insert、delete、update。
5.其實我們所做的操作,mongodb都給我們記錄了oplog,保存在特殊數據庫中local的oplog.$main集合中。注意:local數據庫中只保存更改數據庫狀態的操作,insert、delete、update.查詢操作find()是不會跟我們記錄的。
查看oplog記錄:【後期另一種主從復制模式也是保存在此集合中】
6.介紹oplog.$main集合的數據結構,這些都代表什麼意思,我們又是如何找到有用的信息呢?為什麼我們要了解這塊呢?
因為復制機制,就是通過查看oplog信息來維護數據庫同步一致。
如上圖,這個集合中,有屬性key :ts,op,n,o
其實:ts:代表的是8字節的 時間戳,由4字節unix timestamp + 4字節自增計數表示這個值很重要,在選舉(如master宕機時)新primary時,會選擇ts最大的那個secondary作為新primary。【後面我們介紹另一種主從模式復本集中就會用到】
op:1 字節的操作類型,例如i表示insert,d表示delete。【如上圖中,我們在日志中查看op 是i,正是我們剛插入的一條信息】
ns:操作所在的namespace。【namespace是當前數據.當前集合。使用db.my.insert則是默認創建my集合】
o:操作所對應的 document,即當前操作的內容(比如更新操作時要更新的的字段和值【上圖正是我們insert的一條具體信息】)
o2: 在執行更新操作時的where條件,僅限於 update時才有該屬性【下圖則會展示此屬性】
其中op,可以是如下幾種情形之一:
"i": insert
"u": update
"d": delete
"c": db cmd
"db": 聲明當前數據庫 (其中ns 被設置成為=>數據庫名稱+ '.')
"n": no op,即空操作,其會定期執行以確保時效性
7.展示日志記錄中op其他值,比如刪除、更新。【前提我們在主服務器中執行這些操作】
op:d 刪除操作。o:具體刪除那一條。因為_id是唯一的。
op:u 更新操作。o:具體更新那一條記錄,o2:更新那個字段。
哎,絮絮叨叨了N長,下篇博客再更新另一種主從復制模式吧:副本集。