RHEL7下MongoDB 3.0安裝及啟動
MongoDB 簡介
MongoDB是一個開源的文檔型資料庫,支援索引,有複製功能(複製集replSet),支援資料分區等,可以搭建一個高效能,高可用,易擴充的伺服器叢集。
與MySQL相比不同有:
1. 非關係型,資料自包含,雖然相似的文檔儲存在一個集合中,但文檔之間沒有關係,集合與集合之間也類似
2. 沒有表,行的概念,與之對應的是集合和文檔,也沒有外鍵,串連,但在3.2版本,提供了左外串連另一個集合
3. 無模式,集合中的文檔結構不固定,可以儲存各式各樣的文檔
4. 不支援事務,但不代表不能用於管理重要資料(MySQL的MYISAM儲存引擎也不支援事務...)
資料庫中的一條記錄就是一個文檔,文檔可以嵌套文檔,結構類似於JSON,官方稱BSON,多個文檔組成集合,多個集合組成了資料庫。
本文主要記錄一下,MongoDB一些概念和術語,關於MongoDB的操作、叢集的搭建、會在後續整理
database:儲存文檔和集合,和MySQL一樣,可以使用 use <db> 選擇一個資料庫,如果選中的資料庫不存在,在第一次操作資料庫時直接建立資料庫
比如:
use myDb
db.book.insert({"x":1})
就會建立一個myDb資料庫和一個book集合
collection:儲存文檔,相當於RDBMS的表,我們可以對集合進行,添加,刪除,更新,查詢文檔,建立和刪除索引等,當第一次插入資料時就隱式的建立集合,
還可以使用db.createCollection()顯式的建立集合,在3.2版本可以指定插入時,對文檔驗證。
此外還有一個特殊的集合,固定集合,它的大小是固定的,
比如 db.createCollection( "log", { capped: true, size: 10000 } ) 只能儲存10000位元組的資料
db.createCollection("log", { capped : true, size : 10000, max : 5000 } ) 只能儲存10000位元組的資料並且文檔數目不超過5000條
document:資料存放區的地方,文檔結構就和JSON類似
首先看一下MongoDB支援的資料類型:
1. String:字串UTF-8;
2. Integer:32位int or 64位long;
3. Double:浮點數;
4. Boolean:true or false;
5. Null:空值或不存在的欄位;
6. Array:[1, 2, 3]
7. ObjectId:每個文檔都有一個唯一標識 "_id",它就是ObjectId類型的,再插入時,一般不用我們指定,資料庫會自動產生,當然我們也可以在插入文檔時指定這個欄位的值,但要 保證唯一,不然插入會報錯,"_id"是資料庫預設的一個索引;
8. Date:64位整數,儲存的是從1970.1.1到現在的毫秒數,var date = new Date();直接儲存的話,在資料庫好像慢了8h,(+8時區)
9. Timestamp:時間戳記,64位的值,var a = new Timestamp();
10. Regular Expression:Regex,查詢時的限定條件,文法與JavaScript的相同
11. Binary:位元據
11. Min key,
12. Max key。
當不同的類型進行排序時,各類型的值從低到高為:
1. MinKey (internal type)
2. Null
3. Numbers (ints, longs, doubles)
4. Symbol, String
5. Object
6. Array
7. BinData
8. ObjectId
9. Boolean
10. Date
11. Timestamp
12. Regular Expression
13. MaxKey (internal type)
以上是一些常用的類型
文檔的局限性:每個文檔最大不能超過16M,對於向電影,圖片等大檔案MongoDB使用GridFS來進行分Block Storage
> db.foo.insert({
... ... "String":"UTF-8 string",
... ... "Integer":NumberLong(1461334508012),
... ... "Double":3.14159265,
... ... "Boolean":true,
... ... "Null":"null",
... ... "Array":[1, 2, 3, "a"],
... ... "Date":new Date(),
... ... "Timestamp":new Timestamp()
... ... })
WriteResult({ "nInserted" : 1 })
> db.foo.find()
{ "_id" : ObjectId("571a33d6ef35d50971b1c675"), "String" : "UTF-8 string",
"Integer" : NumberLong("1461334508012"), "Double" : 3.14159265,
"Boolean" : true, "Null" : "null", "Array" : [ 1, 2, 3, "a" ],
"Date" : ISODate("2016-04-22T14:23:18.762Z"), "Timestamp" : Timestamp(1461334998, 1)
}
索引,同關係型資料庫一樣,都是為了提高查詢速度的,再分區時,片鍵的前提是索引,隨著索引的增加,資料總容量的增加,資料庫寫入的速度逐漸層慢,之前專門針對MongoDB進行了測試,測試伺服器是128G記憶體,34CPU...測試報告也會整理貼出來,找機會把MySQL也測試對比一下。
關於彙總,目前項目主要的操作就是插入和查詢,暫不寫了,以後用到在更新
儲存引擎:3.0以前預設的儲存引擎是MMAPV1,3.0版本開始支援WiredTiger儲存引擎,3.2版本WT引擎設定為了預設,這兩個的一些區別,簡單說下,鎖的粒度不同,MMAPV1為集合層級鎖,WT為文檔層級鎖,在高並發寫入時,WT效能高;WT引擎應該是完全相容MMAPV1引擎的,支援文檔壓縮,更詳細的看MongoDB的發布說明吧
複製:就是跨多個伺服器資料同步的過程,能夠提高資料的冗餘性和可用性。
複本集replSet其實就是擁有相同資料集的一組mongod進程,其中包含三種類型的成員:主節點,次要節點,仲裁節點(不儲存資料,只是用來投票的)。
用戶端所有的寫操作均在主節點上執行,相關的操作都記錄在oplog 動作記錄裡,從節點通過非同步複製oplog,然後把相應的操作應用到自己的資料集上。當主節點不可用或者和其他節點不通訊超過10秒,自動容錯移轉,複本集會自動選出一個節點當主節點,而仲裁伺服器就是確保這個選舉正常進行。
複本集最低要求是:一個主節點,一個從節點,一個仲裁節點
一個標準的配置是一個主節點,兩個次要節點,共三個成員
如果你的複本集成員數為偶數個,那麼添加一個仲裁節點,變成奇數
關於複本集更多的介紹詳見官方文檔 https://docs.mongodb.org/manual/core/replication-introduction/
分區:就是把資料按照指定的規則(片鍵)拆分到分區伺服器上,減輕伺服器的讀寫壓力,另外可以很方便的擴充
身分識別驗證:MongoDB預設是不開啟存取控制的,可使用 --auth 或者 設定security.authorization 啟用認證,
MongoDB的使用者權限有:
"read":讀許可權
"readWrite":讀寫權限
"dbAdmin":執行管理命令許可權,如建立或刪除索引,查看統計
"dbOwner":相當於聯合 readWrite,dbAdmin和userAdmin
"userAdmin":建立,刪除和系統管理使用者的許可權
admin資料庫中相關許可權,只在admin資料庫中可用
"clusterAdmin":分區和複製集命令許可權,最大的叢集操作許可權
"readAnyDatabase":所有資料庫的讀許可權
"readWriteAnyDatabase":所有資料庫的讀寫權限
"dbAdminAnyDatabase":所有資料庫的dbAdmin許可權
"userAdminAnyDatabase":所有資料庫的userAdmin許可權
超級使用者權限
"root":可訪問所有資源,所有操作
此外還可以自訂使用者角色
寫得有點亂,,接下來就在虛擬機器裡面類比一個MongoDB叢集,並用Java寫個用戶端測試,搭建和測試叢集時,分為開啟存取控制和不開啟存取控制兩種。
更多詳情見請繼續閱讀下一頁的精彩內容:
更多MongoDB相關教程見以下內容:
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務