簡介mysql
1.MongoD歌基於分佈式文件存儲的數據庫。linux
分佈式文件系統是指文件系統管理的物理存儲資源不必定直接鏈接在本地節點上,而是經過計算機網絡與節點相連。分佈式文件系統的設計基於客戶機/服務器模式。一個典型的網絡可能包括多個供多用戶訪問的服務器。另外,對等特性容許一些系統扮演客戶機和服務器的雙重角色。web
特色sql
.它的特色是高性能、易部署、易使用,存儲數據很是方便。主要功能特性有:mongodb
1.*面向集合存儲,易存儲對象類型的數據。shell
2.*模式自由。數據庫
3.*支持動態查詢。編程
4.*支持徹底索引,包含內部對象。數組
5.*支持查詢。安全
6.*支持複製和故障恢復。
7.*使用高效的二進制數據存儲,包括大型對象(如視頻等)。
8.*自動處理碎片,以支持雲計算層次的擴展性。
9.*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
10.文件存儲格式爲BSON(一種JSON的擴展)。
11.*可經過網絡訪問。
安裝MongoDB
1:建立yum倉庫配置文件,編輯 /etc/yum.repos.d/mongodb.repo文件,添加
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
2:安裝mongodb-org,且mongodb-org-server、mongodb-org-mongos、mongodb-org-shell、mongodb-org-tools將一併被安裝
yum install -y mongodb-org
修改配置文件 /etc/mongodb.conf
bind_ip = 0.0.0.0 讓全部的用戶均可以鏈接服務端, 生成環境裏請自行按需修改
dbpath = /data/mongo 從新指定數據存儲的路徑
httpinterface = true 打開基於web接口來監控mongodb的工做特性,且監聽於28017
rest = true 支持restful編程接口
port = 27017 指定mongodb-server監聽的端口
建立數據目錄,而且修改權限
mkdir -pv /data/mongo
chown -R mongod.mongod /data/mongo
啓動MongoDB,而且查看數據目錄是否存在數據
systemctl start mongod.service
ll /data/mongo/
查看客戶端鏈接到服務端的幫助
[root@mongodb1 data]# mongo --help
MongoDB shell version:
2.6.12
usage: mongo [options] [db address] [file names (ending in .js)]
MongoDB的幫助
(三):經過客戶端鏈接到服務端
mongo --host
192.168.23.9 鏈接到服務端,默認是鏈接192.168.23.9:27017/test, test爲數據庫名
show dbs
db.help() 查看庫級別的命令
db.stats() 查看數據庫狀態
db.version() 查看數據庫版本
db.serverStatus() 查看數據庫服務器狀態
db.mycoll.help() 查看錶級別的命令
db.getCollectionNames 顯示當前庫中全部的表的列表
sh.help() 關於sharding的操做
rs.help() 集合賦值命令
help admin 管理命令
help connect 鏈接操做語法
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs 顯示數據庫名稱
show collections 顯示錶名稱
show users 查看已有用戶
show profile 顯示profile信息,顯示性能評估工具
show logs 顯示日誌名信息
show log [name] 顯示指定的日誌名的信息
use <db_name> 進入某庫,設定某庫爲當前庫
db.foo.find()
db.foo.find( { a :
1 } )
it
result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x
set default number of items to display on shell
exit quit the mongo shell
db.students.insert({name:"dage",age:20}) 插入一條數據,默認會建立students表
show collections 顯示當前的表
db.students.stats() 顯示students表的數據信息
db.students.find() 查詢插入的各個字段
db.students.count() 查看students表中有多少個document
find()的高級用法:比較操做:
(一) db
.students.find({age: {$gt: 30}}) age大於30
{
"_id" : ObjectId("597b49b4072d632a342867cc"), "name" : "data", "age" : 34 }
(二)db
.students.find({age: {$gte: 30}}) age大於等於30
(三)db
.students.find({age: {$lt: 30}}) age小於30
(四)db
.students.find({age: {$lte: 30}}) age小於等於30
(五)db
.students.find({age: {$in: [20, 30]}}) age在[20, 30]的document
(六)db
.students.find({age: {$nin: [20, 30]}}) age不在[20, 30]的document
find()的高級用法:組合條件:邏輯運算
(一)db
.students.find({$or: [{name: {$eq: "yhy"}}, {age: {$nin: [40,50]}}]}) 或運算
(二)
$and:與運算
(三)
$not:非運算
(四)
$nor:取反運算
find()的高級用法:元素查詢: 根據document中是否存在指定的字段進行的查詢
(一)db.students.find({gender: {$exists:
true}}) 查詢存在gender字段的document
(二)$mod:取摸
(三)$type:返回指定字段的值類型爲指定類型的document
MongoDB支持的數據類型有:Double,
String, Object, Array, Binary data, Undefined, Boolean, Date, Null 等
update()的高級用法:$set 更新,或插入字段的值, $unset 刪除指定字段 ,$rename 修改字段名
(一)db.students.
update({name: "yhy"}, {$set: {age: 44}})
將name爲yhy的這個document的age字段的值改成
44
db.students.
update({name: "yhy"}, {$set: {age: 50}})
將name爲yhy的這個document的age字段的值改成
50
(二)db.students.
update({name: "yhy"}, {$unset: {age: 50}})
刪除name字段爲yhy的document的age爲
50的字段
(三)db.students.
update({name: "yhy"}, {$rename: {age: "Age"}})
修改name字段爲yhy的document的age字段名爲Age字段名
(四)db.students.
update({name: "yhy"}, {$inc: {course: "Python"}})
給name字段爲yhy的document增長一個字段course且值爲Python
# 刪除字段
db.students.remove({
"name": "yhy"})
# 刪除表
db.students.drop()
# 刪除當前數據庫
db.dropDatabase()
索引
1:MongoDB中的索引與MySQL中的索引有相似的功能,將表中的字段添加索引,索引會將字段作排序,依次索引可以大大提升MongoDB的查詢能力,可是會削弱一部分的i/o能力
2:在MySQL的學習過程當中,咱們知道,當用戶去查詢一行數據的時候,都須要指定條件過濾,那麼在條件過濾時,最好可以使用字段上創建的索引,可以幫助咱們快速匹配到行,拿到須要的數據。若是使用到了索引,那麼MySQL先會去查找索引,而後經過索引定位到數據表中的數據,最後返回給調用者, MySQL的索引類型有以下幾類:B Tree索引、hash索引、空間索引、全文索引
3:mongoDB索引類型有:單鍵索引、組合索引、多鍵索引、空間索引、文本索引、hash索引
db
.student.ensureIndex({name: 1})
給name字段建立索引,
1爲指定按升序建立索引,若是你想按降序來建立索引指定爲-1便可。
實例
db
.student.getIndexes()
查看索引
db
.student.find({"name": "yhy"}).explain()
查看是否使用到了索引(因爲MongoDB調優)
db
.student.dropIndex("name_1")
刪除索引
db
.students.ensureIndex({name: 1}, {unique: true})
給name字段建立一個惟一鍵索引,那麼再給students表增長一條行document,且name與以前存在的document的name值相同,那麼就會報錯, 如:增長一條document
db
.students.insert({name: "yhy"})
報錯的信息以下:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.students.$name_1 dup key: { : \"yhy\" }"
}
})
受權認證
mongodb存儲全部的用戶信息在admin 數據庫的集合system.users中,保存用戶名、密碼和數據庫信息。mongodb默認不啓用受權認證,只要能鏈接到該服務器,就可鏈接到mongod。若要啓用安全認證,須要更改配置文件參數auth
1:建立一個root用戶,角色爲userAdminAnyDatabase,所以root用戶對數據庫具備管理權限,可是不具有操做權限
db.createUser({user:"root",pwd:"123456", roles: [{ role: "userAdminAnyDatabase", db: "admin" }]});
2:createUser()方法說明
user:定義用戶名
pwd:設置密碼
roles:指定用戶的角色,能夠用一個空數組給新用戶設定空角色; 在roles字段,能夠指定內置角色和用戶定義的角色。
db:指定用戶對哪一個數據庫具備管理員權限
3:角色種類說明
Built-
In Roles(內置角色):
①. 數據庫用戶角色:
read、readWrite;
②. 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
③. 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
④. 備份恢復角色:backup、
restore;
⑤. 全部數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
⑥. 超級用戶角色:root
⑦. 內部角色:__system
4:角色對應的意義說明
Read:容許用戶讀取指定數據庫
readWrite:容許用戶讀寫指定數據庫
dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile
userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級帳號,超級權限
5:查看受權表
db.system.users.find();
6:此時退出MongoDB,且編輯配置文件/etc/mongod.
conf, 添加
auth=true(針對於2.6版本)
security:(針對於3.4版本)
authorization: enabled
7:能夠在鏈接數據庫的時候認證,也能夠在登入時候認證,這裏使用登入以後認證的方式
show dbs; (會報錯,由於沒有管理受權)
db.auth("root", "123456") 受權以後再查看數據庫就沒有問題了
8:此時登入使用的是root用戶,角色是管理角色,可是不具有對數據庫的操做權限
use test;
show collections; (會報錯,由於沒有操做權限)
9:再次建立一個用戶:
test,讓其對test具備讀寫操做, 且切換用戶爲test
db.createUser({user:"test",pwd:"test", roles: [{ role: "readWrite", db: "test" }]});
db.auth("test", "test")
10:再次查看
test庫的表,發現能夠查看了
show collections;
11:其實,若是須要建立一個用戶具備管理權限且同時具備操做權限,那麼這個用戶的角色必須是root
db.createUser({user:"yhy",pwd:"123456", roles: [{ role: "root", db: "admn" }]});
mongod是服務器程序,mongo是客戶端程序,不要搞混亂了,咱們不只可使用systemctl來啓動mongoDB, 還能夠直接使用mongod來啓動
在啓動mongod的時候,能夠指定一系列的選項,那麼mongodb中,提供了一個配置文件:/etc/mongod.conf ,那麼能夠將這些選項都寫在這個配置文件裏,使得啓動mongod時,mongodb會先讀取這個配置文件中的選項,以後在讀取命令行的選項來啓動mongodb
①:在配置mongodb2
.6的時候,經常使用的一些選項有
fork = {true=false}:指定mongod是否運行在後臺
bind_ip = IP地址:指定監聽的地址,若是不指定,默認是監聽本地的全部IP地址
port = 監聽的端口:指定監聽的端口
maxConns = 併發鏈接數:指定支持的最大併發鏈接數
logappend = {true=false}:指定是否支持日誌滾動
auth = :指定是否啓用認證功能
②:在配置mongodb3
.4的時候,經常使用的選項有(若是想使用mongodb的web管理頁面,在/usr/lib/systemd/system/mongod.service文件中,修改:Environment="OPTIONS=-f /etc/mongod.conf --rest")(/usr/lib/systemd/system/mongod.service這個unit file能夠指定不少環境配置選項)
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
net:
port: 27017
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
# 啓用認證
security:
authorization: enabled
參考官方文檔:https://docs.mongodb.com/compass/current/install/#install-on-red-hat-enterprise-linux-rhel
Mongodb compass 提供圖形化管理界面管理MongoDB
1:下載安裝包:
wget https:
//downloads.mongodb.com/compass/mongodb-compass-1.6.0.x86_64.rpm;
2:安裝
yum install mongodb-compass-
1.6.0.x86_64.rpm;
3:啓動
DEBUG=* mongodb-compass;
MongoDB的複製架構
以上全部的內容都是 MongoDB standalone方式 運行,下面咱們將重點講解MongoDB的複製,也就是副本集的概念(MongoDB的集羣架構)
MongoDB複製是將數據同步在多個服務器的過程,複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提升了數據的可用性, 並能夠保證數據的安全性, 複製還容許您從硬件故障和服務中斷中恢復數據
1:在mongodb的集羣中,通常會部署多個節點,且有多個節點有相同的數據。
2:主節點能夠進行讀寫操做,而從節點通常只可以進行讀操做
3:副本集就是服務全部的mongodb實例的同一個數據集(也就是說副本集定義了一個集羣,一個已經運行的集羣中若是添加了一個新的節點,那麼必須指定這個新的節點加入到哪一個副本集中。一個副本集就定義了一個集羣,一個副本集能夠最多支持12個成員,可是隻有7個成員能夠參與投票)
4:對應MySQL而言:從節點在主節點複製數據的方式爲主節點將數據操做保存在二進制日誌中,而從節點就是複製主節點的二進制日誌,在本地再執行一次,那麼這就實現了與主節點的數據一致。而mongodb是主節點將數據操做保存在操做日誌(oplog)中,從節點複製操做日誌(oplog),在本地再執行一次實現數據集一致
5:從節點每隔一段時間會探測一次主節點的心跳信息,若是在一段時間中沒法得到主節點的心跳信息,那麼其他的從節點會從新進行一次投票選舉操做,誰的優先級高就會成爲下一個主節點。
6:mongodb節點集羣至少須要三個節點,一個主節點,兩個從節點
7:複製中的四種特殊的從節點分類
a:
0優先級的節點:冷備節點,不會被選舉成爲主節點,可是能夠參與選舉過程
b:被隱藏的從節點:不想讓客戶端訪問數據的節點,必須爲
0優先級的節點,不會顯示在mongodb集羣的信息中
c:延遲複製的從節點:必須爲
0優先級的節點,且複製時間落後於主節點一個固定時間,能夠參與選舉過程
d:arbiter:沒有數據
8:oplog:記錄數據改變的操做日誌,用於數據同步複製,大小固定的文件,存儲在local數據庫中,集羣中每個節點都有oplog。可是隻有當其成爲主節點的時候,纔會將其數據改變的操做記錄到oplog之中
同步的步驟分爲:
初始同步
同步以後追趕主節點
切分塊遷移(切片)
local庫中存放了副本集的全部的元數據和oplog,用於存儲oplog的一個叫oplog.rs的collection表,oplog.rs的大小默認與文件系統有關,可是能夠自定義
基於MongoDB2.6版本配置MongoDB主從複製集羣架構實戰
(請你們自行完成3.4版本的MongoDB主從複製集羣架構)
1:集羣環境說明:mongodb1:192.168.43.十、mongodb2:192.168.43.十一、mongodb3:192.168.43.12。且基於主機名相互通訊/etc/hosts文件(爲了集羣信息同步不出現問題,先關閉認證功能anth)
2:編輯mongodb1的/etc/mongod.conf文件,註釋auth指令,添加以下內容
# 指定副本集的名稱
replSet=uplooking
# 指定預拷貝的索引,這裏只拷貝id那個系統自動生成的索引
replIndexPrefetch=_id_only
noauth=true
3:將mongodb1的配置文件拷貝到mongodb二、mongodb3
scp
/etc/mongod.conf 192.168.43.11:/etc/
scp
/etc/mongod.conf 192.168.43.12:/etc/
3:啓動mongodb一、mongodb二、mongodb3
4:登入mongodb1的shell接口
> rs.status(); (查看集羣中的節點狀態)
> rs.initiate();(初始化副本集)
> rs.status();(再次查看集羣中的節點狀態)
uplooking:PRIMARY> (此時的提示符已經變了)
5:當初始化了主節點之後,須要添加其餘的從節點到mongodb集羣中來
uplooking:PRIMARY> rs.add("192.168.43.11")
uplooking:PRIMARY> rs.add("192.168.43.12")
6:添加了其餘節點之後,就能夠查看配置信息和副本集的狀態信息
uplooking:PRIMARY> rs.conf()
{
"_id" : "uplooking",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "mongodb1:27017"
},
{
"_id" : 1,
"host" : "192.168.43.11:27017"
},
{
"_id" : 2,
"host" : "192.168.43.12:27017"
}
]
}
7:再次查看狀態副本集的狀態信息
uplooking:PRIMARY> rs.status()
{
"set" : "uplooking",
"date" : ISODate("2017-10-29T16:05:55Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongodb1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 914,
"optime" : Timestamp(1509292923, 1),
"optimeDate" : ISODate("2017-10-29T16:02:03Z"),
"electionTime" : Timestamp(1509292619, 1),
"electionDate" : ISODate("2017-10-29T15:56:59Z"),
"self" : true
},
{
"_id" : 1,
"name" : "192.168.43.11:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 237,
"optime" : Timestamp(1509292923, 1),
"optimeDate" : ISODate("2017-10-29T16:02:03Z"),
"lastHeartbeat" : ISODate("2017-10-29T16:05:54Z"),
"lastHeartbeatRecv" : ISODate("2017-10-29T16:05:54Z"),
"pingMs" : 0,
"syncingTo" : "mongodb1:27017"
},
{
"_id" : 2,
"name" : "192.168.43.12:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 232,
"optime" : Timestamp(1509292923, 1),
"optimeDate" : ISODate("2017-10-29T16:02:03Z"),
"lastHeartbeat" : ISODate("2017-10-29T16:05:55Z"),
"lastHeartbeatRecv" : ISODate("2017-10-29T16:05:55Z"),
"pingMs" : 0,
"syncingTo" : "mongodb1:27017"
}
],
"ok" : 1
}
8:此時從節點能夠在shell接口查看到在主節點複製過來的數據庫和表,可是不能查詢表的內容,所以須要經過命令讓從節點變爲可用節點,在查詢就能夠了
uplooking:SECONDARY> rs.slaveOk()
9:主節點也能夠經過命令變爲從節點, 此時其餘的節點經過投票將會變爲主節點
uplooking:SECONDARY> rs.stepDown()
10:在新的主節點(mongodb2)中能夠設置從節點的優先級讓從節點變爲主節點,讓第一個從節點優先級爲10,那麼第一個從節點就會變爲主節點
uplooking:PRIMARY> config=rs.conf() # 先使用一個config臨時變量保存rs.conf()的值,也就是當前的副本集配置
uplooking:PRIMARY> config.members[0].priority=10 # 讓第一個節點,也便是mongodb1的優先級爲10
uplooking:PRIMARY> rs.reconfig(config) # 讓副本集得到新的配置,此時,mongodb1將會成爲主節點
11:在主節點中,從副本集中移除一個節點,
rs.conf()
# 先查看須要刪除的host
rs.remove(
"192.168.43.12:27017")
12:也能夠將一個從節點變爲arbiter仲裁節點,這裏將mongodb3變爲arbiter節點,必須先讓mongodb3下線,而後刪除數據目錄,在重啓,再設置爲arbiter仲裁節點
rs.addArb(
"192.168.43.12")