第1章 關(guān)系型與非關(guān)系型
NoSQL not only sql
NoSQL毅整,指的是非關(guān)系型的數(shù)據(jù)庫他嚷。
NoSQL有時也稱作Not Only SQL的縮寫是對不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)的統(tǒng)稱。
對NoSQL最普遍的解釋是”非關(guān)聯(lián)型的”渗钉,強(qiáng)調(diào)Key-Value Stores和文檔數(shù)據(jù)庫的優(yōu)點(diǎn)航瞭,而不是單純的RDBMS诫硕。
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲。
這些類型的數(shù)據(jù)存儲不需要固定的模式刊侯,無需多余操作就可以橫向擴(kuò)展章办。
今天我們可以通過第三方平臺可以很容易的訪問和抓取數(shù)據(jù)。
用戶的個人信息滨彻,社交網(wǎng)絡(luò)藕届,地理位置,用戶生成的數(shù)據(jù)和用戶操作日志已經(jīng)成倍的增加亭饵。
我們?nèi)绻獙@些用戶數(shù)據(jù)進(jìn)行挖掘休偶,那SQL數(shù)據(jù)庫已經(jīng)不適合這些應(yīng)用了
NoSQL數(shù)據(jù)庫的發(fā)展也卻能很好的處理這些大的數(shù)據(jù)。
第2章 mongo和mysql數(shù)據(jù)對比
mysql mongo
庫 庫
表 集合
字段 key:value
行 文檔
mysql里的數(shù)據(jù):
name age job
oldzhang 28 it
xiaozhang 28 it
xiaofei 18 student SZ
mongo里的數(shù)據(jù):
{name:'oldzhang',age:'28',job:'it'},
{name:'xiaozhang',age:'28',job:'it'},
{name:'xiaozhang',age:'28',job:'it',host:'SZ'}
第3章 MongoDB特點(diǎn)
高性能:
Mongodb提供高性能的數(shù)據(jù)持久性
尤其是支持嵌入式數(shù)據(jù)模型減少數(shù)據(jù)庫系統(tǒng)上的I/O操作
索引支持能快的查詢辜羊,并且可以包括來嵌入式文檔和數(shù)組中的鍵
豐富的語言查詢:
Mongodb支持豐富的查詢語言來支持讀寫操作(CRUD)以及數(shù)據(jù)匯總踏兜,文本搜索和地理空間索引
高可用性:
Mongodb的復(fù)制工具词顾,成為副本集,提供自動故障轉(zhuǎn)移和數(shù)據(jù)冗余
水平可擴(kuò)展性:
Mongodb提供了可擴(kuò)展性碱妆,作為其核心功能的一部分肉盹,分片是將數(shù)據(jù)分,在一組計算機(jī)上
支持多種存儲引擎:
WiredTiger存儲引擎和疹尾、MMAPv1存儲引擎和InMemory存儲引擎
第4章 mongo應(yīng)用場景
游戲場景上忍,使用 MongoDB 存儲游戲用戶信息,用戶的裝備纳本、積分等直接以內(nèi)嵌文檔的形式存儲窍蓝,方便查詢、更新
物流場景饮醇,使用 MongoDB 存儲訂單信息它抱,訂單狀態(tài)在運(yùn)送過程中會不斷更新,以 MongoDB 內(nèi)嵌數(shù)組的形式來存儲朴艰,一次查詢就能將訂單所有的變更讀取出來观蓄。
社交場景,使用 MongoDB 存儲存儲用戶信息祠墅,以及用戶發(fā)表的朋友圈信息侮穿,通過地理位置索引實現(xiàn)附近的人、地點(diǎn)等功能
物聯(lián)網(wǎng)場景毁嗦,使用 MongoDB 存儲所有接入的智能設(shè)備信息亲茅,以及設(shè)備匯報的日志信息,并對這些信息進(jìn)行多維度的分析
視頻直播狗准,使用 MongoDB 存儲用戶信息克锣、禮物信息等,用戶評論
電商場景,使用 MongoDB
商城上衣和褲子兩種商品腔长,除了有共同屬性袭祟,如產(chǎn)地、價格捞附、材質(zhì)巾乳、顏色等外,還有各自有不同的屬性集鸟召,如上衣的獨(dú)有屬性是肩寬胆绊、胸圍、袖長等欧募,褲子的獨(dú)有屬性是臀圍压状、腳口和褲長等
第5章 安裝部署mongodb
0.下載軟件
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
1.規(guī)劃目錄
#軟件所在目錄
/opt/mongodb
#單節(jié)點(diǎn)目錄
/opt/mongo_27017/{conf,log,pid}
#數(shù)據(jù)目錄
/data/mongo_27017
2.下載并解壓
yum install libcurl openssl -y
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
tar zxf mongodb-linux-x86_64-rhel70-4.0.14.tgz -C /opt/
cd /opt/
ln -s mongodb-linux-x86_64-rhel70-4.0.14 mongodb
3.創(chuàng)建文件目錄以及數(shù)據(jù)目錄
mkdir -p /opt/mongo_27017/{conf,log,pid}
mv /data /data_bak
mkdir -p /data/mongo_27017
4.創(chuàng)建配置文件
cat >/opt/mongo_27017/conf/mongodb.conf<<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_27017/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_27017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongo_27017/pid/mongod.pid
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.51
EOF
5.配置文件解釋
配置文件注解:
systemLog:
destination: file #Mongodb 日志輸出的目的地,指定一個file或者syslog槽片,如果指定file何缓,必須指定
logAppend: true #當(dāng)實例重啟時肢础,不創(chuàng)建新的日志文件, 在老的日志文件末尾繼續(xù)添加
path: /opt/mongo_27017/logs/mongodb.log #日志路徑
storage:
journal: #回滾日志
enabled: true
dbPath: /data/mongo_27017 #數(shù)據(jù)存儲目錄
directoryPerDB: true #默認(rèn)碌廓,false不適用inmemoryengine
wiredTiger:
engineConfig:
cacheSizeGB: 1 #將用于所有數(shù)據(jù)緩存的最大小
directoryForIndexes: true #默認(rèn)false索引集合storage.dbPath存儲在數(shù)據(jù)單獨(dú)子目錄
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement: #使用處理系統(tǒng)守護(hù)進(jìn)程的控制處理
fork: true #后臺運(yùn)行
pidFilePath: /opt/mongo_27017/pid/mongod.pid #創(chuàng)建 pid 文件
net:
port: 27017 #監(jiān)聽端口
bindIp: 127.0.0.1,10.0.0.51 #綁定ip
6.啟動mongo
/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
7.檢查是否啟動
ps -ef|grep mongo
netstat -lntup|grep mongo
8.進(jìn)入mongo
/opt/mongodb/bin/mongo
第6章 配置登錄mongo
1.寫入環(huán)境變量
echo 'export PATH=/opt/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile
2.登錄
mongo
3.關(guān)閉
方法1:推薦
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown
方法2: 只能是使用localhost方式登陸
mongo
use admin
db.shutdownServer()
方法3: system管理
見下面的優(yōu)化3
第7章 優(yōu)化告警
1.內(nèi)存不足
** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
解決方法:
方法1: 加大機(jī)器內(nèi)存
方法2: 調(diào)小配置文件里的緩存大小 cacheSizeGB: 0.5
2.沒有開啟訪問控制
** WARNING: Access control is not enabled for the database.
Read and write access to data and configuration is unrestricted.
解決方法:
開啟安全賬戶功能,見用戶認(rèn)證章節(jié)
3.不建議以root身份運(yùn)行
** WARNING: You are running this process as the root user, which is not recommended.
解決方法:
方法1: 創(chuàng)建普通用戶mongo传轰,然后切換到mongo用戶啟動
方法2: 使用system方式登陸,指定運(yùn)行用戶為普通用戶mongo
mongo的system啟動文件:
cat >/usr/lib/systemd/system/mongod.service<<EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongo
Group=mongo
ExecStart=/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongo_27017/
ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongo_27017/
PermissionsStartOnly=true
PIDFile=/opt/mongo_27017/pid/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
EOF
創(chuàng)建普通用戶mongo
pkill mongo
groupadd mongo -g 777
useradd mongo -g 777 -u 777 -M -s /sbin/nologin
id mongo
重新啟動mongo
systemctl daemon-reload
systemctl start mongod.service
ps -ef|grep mongo
mongo
4.關(guān)閉大內(nèi)存頁
** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
We suggest setting it to 'never'
** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
We suggest setting it to 'never'
解決方法:改完要重啟
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
5.數(shù)據(jù)目錄磁盤不是XFS格式
** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
解決方法:
把磁盤格式轉(zhuǎn)成XFS
6.rlimits太低
** WARNING: soft rlimits too low. rlimits set to 7266 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
解決方法:
cat > /etc/profile<<EOF
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -u 64000
EOF
生效配置:
source /etc/profile
驗證:
systemctl stop mongod
systemctl start mongod
mongo
7.關(guān)閉監(jiān)控服務(wù)體驗
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
解決方法:
db.disableFreeMonitoring()
第8章 mongo數(shù)據(jù)庫指令介紹
1.默認(rèn)數(shù)據(jù)庫說明
test:登錄時默認(rèn)存在的庫
admin庫:系統(tǒng)預(yù)留庫,MongoDB系統(tǒng)管理庫
local庫:本地預(yù)留庫,存儲關(guān)鍵日志
config庫:MongoDB配置信息庫
2.查看數(shù)據(jù)庫命令
show databases/show dbs #查看有哪些庫
show tables/show collections #查看當(dāng)前所在的庫下有哪些集合
use admin #切換到不同的庫
db #查看當(dāng)前在哪個庫下
3.mongo特別的地方
1.mongo默認(rèn)登陸的時候是在test庫下
2.mongo不需要提前創(chuàng)建庫和表,直接use切換就是創(chuàng)建庫谷婆,直接插入數(shù)據(jù)就會創(chuàng)建表
3.使用use切換到的庫慨蛙,如果沒有任何數(shù)據(jù),實際上并不會真正創(chuàng)建纪挎,是個虛的庫期贫,所以show dbs并不會顯現(xiàn)
4.shell窗口執(zhí)行mongo命令
mongo --port 28017 --eval "show dbs"
echo "show dbs"|mongo --port 28017
第9章 mongo操作命令
0.注意
mongo命令嚴(yán)格區(qū)分大小寫
1.插入命令
1.1 插入單條
db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區(qū)"})
db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區(qū)"})
db.user_info.insert({"name":"yazhang","age":28,"ad":"北京市朝陽區(qū)"})
db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區(qū)"})
db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區(qū)","sex":"boy"})
1.2 插入多條
db.inventory.insertMany( [
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);
2.查詢命令
2.1 查詢一條
db.user_info.findOne()
2.2 查詢所有
db.user_info.find()
2.3 查詢符合條件
db.user_info.find({"age":28})
select * from user_info where age = 28;
2.4 只返回想要的字段(來自雷神的提問)
db.user_info.find({"name":"json"},{name:1,_id:0})
2.5 查詢嵌套的條件
db.inventory.find( { "size.uom": "in" } )
db.inventory.find(
{
"size.uom": "in"
}
)
2.6 邏輯查詢:and
db.inventory.find( { "size.uom": "cm" ,"status" : "A"} )
db.inventory.find(
{
"size.uom": "cm" ,
"status" : "A"
}
)
2.7 邏輯查詢 或
https://docs.mongodb.com/manual/reference/operator/query-comparison/
db.inventory.find(
{
$or:[
{status:"D"},
{qty:{$lt:30}}
]
}
)
2.8 邏輯查詢+或+and+正則表達(dá)式
db.inventory.find({status:"A",$or:[{qty:{$lt:30}},{item:/^p/}]})
db.inventory.find(
{
status: "A",
$or: [
{ qty: { $lt: 30 } },
{ item: /^p/ }
]
}
)
db.inventory.find(
{
status: "A",
$or: [
{ qty: { $gt: 30 } },
{ item: /^p/ }
]
}
)
3.更新數(shù)據(jù)
3.1 更改匹配條件的單條數(shù)據(jù)
db.inventory.find({ "item" : "paper" })
db.inventory.updateOne{ "item" : "paper" },{$set: { "size.uom" : "cm", "status" : "P" }})
db.inventory.updateOne(
{ "item" : "paper" },
{
$set: {
"size.uom" : "cm",
"status" : "P"
}
}
)
3.2 更改匹配條件的多條數(shù)據(jù)
db.inventory.find({ "qty" : { $lt: 50 } })
db.inventory.updateMany(
{ "qty" : { $lt: 50 } },
{
$set:
{
"size.uom" : "mm",
"status": "P"
}
}
)
3.3 添加字段
db.user_info.find({ "age" : 27})
db.user_info.updateMany(
{ "age" : 27},
{
$set:
{
"pet" : "cat"
}
}
)
4.索引
4.1 查看執(zhí)行計劃
db.user_info.find({"age":{ $lt: 30 }})
db.user_info.find({"age":{ $lt: 30 }}).explain()
4.2 創(chuàng)建索引
db.user_info.createIndex({ age: 1 },{background: true})
4.3 查看索引
db.user_info.getIndexes()
4.4 再次查看執(zhí)行計劃
db.user_info.find({"age":{ $lt: 30 }}).explain()
4.5 關(guān)鍵詞
"stage" : "IXSCAN"
"indexName" : "age_1"
4.6 刪除索引
db.user_info.dropIndex("age_1")
4.7 其他索引類型
COLLSCAN – Collection scan
IXSCAN – Scan of data in index keys
FETCH – Retrieving documents
SHARD_MERGE – Merging results from shards
SORT – Explicit sort rather than using index orde
5.刪除
5.1 先查找需要刪除的數(shù)據(jù)
db.inventory.find({"status":"P"})
5.2 刪除單條
db.inventory.deleteOne({"status":"P"})
5.3 刪除多個
db.inventory.deleteMany({"status":"P"})
5.4 刪除索引
db.user_info.dropIndex("age_1")
5.5 刪除集合
show dbs
db
show tables
db.inventory.drop()
5.6 刪除庫
show dbs
db
db.dropDatabase()
第10章 mongo工具
1.命令介紹
mongo #登陸命令
mongod #啟動命令
mongodump #全備導(dǎo)出,壓縮格式
mongorestore #恢復(fù)
mongoexport #備份導(dǎo)出异袄,可讀的json格式
mongoimport #恢復(fù)
mongos #集群分片
mongotop #查看mongo的運(yùn)行狀態(tài)
mongostat #查看mongo的運(yùn)行狀態(tài)
2.mongostat使用說明:
默認(rèn)一秒打印一次
使用-n參數(shù)可以只打印一次
mongostat -n 1
3.mongostat各字段解釋說明:
insert/s : 官方解釋是每秒插入數(shù)據(jù)庫的對象數(shù)量通砍,如果是slave,則數(shù)值前有*,則表示復(fù)制集操作
query/s : 每秒的查詢操作次數(shù)
update/s : 每秒的更新操作次數(shù)
delete/s : 每秒的刪除操作次數(shù)
getmore/s: 每秒查詢cursor(游標(biāo))時的getmore操作數(shù)
command: 每秒執(zhí)行的命令數(shù)烤蜕,在主從系統(tǒng)中會顯示兩個值(例如 3|0),分表代表 本地|復(fù)制 命令
注: 一秒內(nèi)執(zhí)行的命令數(shù)比如批量插入封孙,只認(rèn)為是一條命令(所以意義應(yīng)該不大)
dirty: 僅僅針對WiredTiger引擎,官網(wǎng)解釋是臟數(shù)據(jù)字節(jié)的緩存百分比
used:僅僅針對WiredTiger引擎讽营,官網(wǎng)解釋是正在使用中的緩存百分比
flushes:
For WiredTiger引擎:指checkpoint的觸發(fā)次數(shù)在一個輪詢間隔期間
For MMAPv1 引擎:每秒執(zhí)行fsync將數(shù)據(jù)寫入硬盤的次數(shù)
注:一般都是0虎忌,間斷性會是1, 通過計算兩個1之間的間隔時間橱鹏,可以大致了解多長時間flush一次膜蠢。flush開銷是很大的,如果頻繁的flush莉兰,可能就要找找原因了
vsize: 虛擬內(nèi)存使用量挑围,單位MB (這是 在mongostat 最后一次調(diào)用的總數(shù)據(jù))
res: 物理內(nèi)存使用量,單位MB (這是 在mongostat 最后一次調(diào)用的總數(shù)據(jù))
注:這個和你用top看到的一樣, vsize一般不會有大的變動糖荒, res會慢慢的上升贪惹,如果res經(jīng)常突然下降,去查查是否有別的程序狂吃內(nèi)存寂嘉。
qr: 客戶端等待從MongoDB實例讀數(shù)據(jù)的隊列長度
qw:客戶端等待從MongoDB實例寫入數(shù)據(jù)的隊列長度
ar: 執(zhí)行讀操作的活躍客戶端數(shù)量
aw: 執(zhí)行寫操作的活客戶端數(shù)量
注:如果這兩個數(shù)值很大,那么就是DB被堵住了枫绅,DB的處理速度不及請求速度泉孩。看看是否有開銷很大的慢查詢并淋。如果查詢一切正常寓搬,確實是負(fù)載很大,就需要加機(jī)器了
netIn:MongoDB實例的網(wǎng)絡(luò)進(jìn)流量
netOut:MongoDB實例的網(wǎng)絡(luò)出流量
注:此兩項字段表名網(wǎng)絡(luò)帶寬壓力县耽,一般情況下句喷,不會成為瓶頸
conn: 打開連接的總數(shù)镣典,是qr,qw,ar,aw的總和
注:MongoDB為每一個連接創(chuàng)建一個線程,線程的創(chuàng)建與釋放也會有開銷唾琼,所以盡量要適當(dāng)配置連接數(shù)的啟動參數(shù)兄春,maxIncomingConnections,阿里工程師建議在5000以下锡溯,基本滿足多數(shù)場景
4.小實驗:
一個終端寫入測試數(shù)據(jù):
use oldboy
for(i=1;i<10000;i++){ db.hash.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
一個終端使用mongotop觀察
一個終端使用mongostat觀察
第11章 創(chuàng)建用戶和角色
https://docs.mongodb.com/manual/core/authorization/
0.與用戶相關(guān)的命令
db.auth() 將用戶驗證到數(shù)據(jù)庫赶舆。
db.changeUserPassword() 更改現(xiàn)有用戶的密碼。
db.createUser() 創(chuàng)建一個新用戶祭饭。
db.dropUser() 刪除單個用戶芜茵。
db.dropAllUsers() 刪除與數(shù)據(jù)庫關(guān)聯(lián)的所有用戶。
db.getUser() 返回有關(guān)指定用戶的信息倡蝙。
db.getUsers() 返回有關(guān)與數(shù)據(jù)庫關(guān)聯(lián)的所有用戶的信息九串。
db.grantRolesToUser() 授予用戶角色及其特權(quán)。
db.removeUser() 已過時寺鸥。從數(shù)據(jù)庫中刪除用戶猪钮。
db.revokeRolesFromUser() 從用戶中刪除角色。
db.updateUser() 更新用戶數(shù)據(jù)析既。
1.在未開啟用戶訪問控制的實例下創(chuàng)建管理員賬戶
mongo db01:27017
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "123456",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
2.查看創(chuàng)建的用戶
db.getUsers()
3.配置文件添加權(quán)限認(rèn)證參數(shù)
vim /opt/mongo_27017/conf/mongodb.conf
security:
authorization: enabled
4.重啟mongo
systemctl restart mongod.service
5.使用admin用戶登錄
mongo --authenticationDatabase "admin" -u "myUserAdmin" -p
6.創(chuàng)建其他用戶
use test
db.createUser(
{
user: "mysun",
pwd: "123456",
roles: [ { role: "readWrite", db: "readWrite" },
{ role: "read", db: "read" } ]
}
)
7.使用管理員賬戶創(chuàng)建測試數(shù)據(jù)
use readWrite
db.write.insertOne({"name":"cookzhang"})
use read
db.read.insertOne({"name":"cookzhang"})
8.退出admin躬贡,使用mysun用戶登錄
mongo --authenticationDatabase "test" -u "mysun" -p
show dbs
use readWrite
show tables
db.write.insertOne({"name":"json"}) #正常寫入
db.write.find()
use read
show tables
db.read.find()
db.read.insertOne({"name":"bobo"}) #應(yīng)該報錯
9.修改用戶權(quán)限
mongo --authenticationDatabase "admin" -u "myUserAdmin" -p
use test
db.updateUser(
'mysun',
{
pwd: "123456",
roles: [ { role: "readWrite", db: "readWrite" },
{ role: "readWrite", db: "read" } ,
{ role: "readWrite", db: "test" }]
}
)
db.getUsers()
10.測試賬戶修改后的權(quán)限
mongo --authenticationDatabase "test" -u "mysun" -p
show dbs
use readWrite
show tables
db.write.insertOne({"name":"json"}) #正常寫入
db.write.find()
use read
show tables
db.read.find()
db.read.insertOne({"name":"bobo"}) #正常寫入
11.刪除用戶
mongo --authenticationDatabase "admin" -u "myUserAdmin" -p
use test
db.getUsers()
db.dropUser("mysun")
db.getUsers()
第12章 mongo副本集配置
https://docs.mongodb.com/manual/replication/
1.副本集的角色
主節(jié)點(diǎn) 負(fù)責(zé)讀寫
副本節(jié)點(diǎn) 同步主節(jié)點(diǎn) shell下連接默認(rèn)不可讀
仲裁節(jié)點(diǎn) 不是必須的,不存儲數(shù)據(jù)眼坏,也不參與競選拂玻,只投票
2.選舉的機(jī)制
大多數(shù)投票原則,要想選出新的主節(jié)點(diǎn)宰译,存活的節(jié)點(diǎn)數(shù)必須是副本集的一半以上數(shù)量
3.創(chuàng)建節(jié)點(diǎn)目錄和數(shù)據(jù)目錄
mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid}
mkdir -p /data/mongo_2801{7,8,9}
4.創(chuàng)建配置文件
cat >/opt/mongo_28017/conf/mongodb.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_28017/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_28017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongo_28017/pid/mongod.pid
net:
port: 28017
bindIp: 127.0.0.1,10.0.0.51
replication:
oplogSizeMB: 1024
replSetName: dba
EOF
5.復(fù)制配置文件到其他節(jié)點(diǎn)
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28018/conf/
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28019/conf/
6.替換端口號
sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongodb.conf
sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongodb.conf
7.啟動所有節(jié)點(diǎn)
mongod -f /opt/mongo_28017/conf/mongodb.conf
mongod -f /opt/mongo_28018/conf/mongodb.conf
mongod -f /opt/mongo_28019/conf/mongodb.conf
8.初始化集群
mongo --port 28017
config = {
_id : "dba",
members : [
{_id : 0, host : "10.0.0.51:28017"},
{_id : 1, host : "10.0.0.51:28018"},
{_id : 2, host : "10.0.0.51:28019"},
]}
rs.initiate(config)
9.主庫插入數(shù)據(jù)
mongo --port 28017
db.user_info.insertOne({"name":"json","age":27,"ad":"北京市朝陽區(qū)"})
db.user_info.insertOne({"name":"bobo","age":27,"ad":"北京市朝陽區(qū)"})
db.user_info.insertOne({"name":"lei","age":28,"ad":"北京市朝陽區(qū)"})
db.user_info.insertOne({"name":"bug","age":28,"ad":"北京市朝陽區(qū)"})
db.user_info.insertOne({"name":"bobo","age":28,"ad":"北京市朝陽區(qū)","sex":"null"})
10.副本節(jié)點(diǎn)登錄查看數(shù)據(jù)
mongo --port 28018
rs.slaveOk()
show dbs
show tables
db.user_info.find()
11.設(shè)置副本可讀
方法1:臨時生效
rs.slaveOk()
方法2:寫入啟動文件
echo "rs.slaveOk()" > ~/.mongorc.js
第13章 副本集權(quán)重調(diào)整
1.模擬故障轉(zhuǎn)移
mongod -f /opt/mongo_28017/conf/mongodb.conf --shutdown
mongod -f /opt/mongo_28017/conf/mongodb.conf
2.查看當(dāng)前副本集配置
rs.conf()
3.設(shè)置權(quán)重
myconfig=rs.conf()
myconfig.members[0].priority=100
rs.reconfig(myconfig)
4.主節(jié)點(diǎn)主動降級
rs.stepDown()
5.恢復(fù)成默認(rèn)的權(quán)重
myconfig=rs.conf()
myconfig.members[0].priority=1
rs.reconfig(myconfig)
第14章 增加新節(jié)點(diǎn)和刪除舊節(jié)點(diǎn)
1.創(chuàng)建新節(jié)點(diǎn)并啟動
mkdir -p /opt/mongo_28010/{conf,log,pid}
mkdir -p /data/mongo_28010
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28010/conf/
sed -i 's#28017#28010#g' /opt/mongo_28010/conf/mongodb.conf
mongod -f /opt/mongo_28010/conf/mongodb.conf
mongo --port 28010
2.集群添加節(jié)點(diǎn)
mongo --port 28017
rs.add("10.0.0.51:28010")
3.新節(jié)點(diǎn)查看信息
mongo --port 28010
4.刪除節(jié)點(diǎn)
rs.remove("10.0.0.51:28010")
第15章 仲裁節(jié)點(diǎn)
1.創(chuàng)建新節(jié)點(diǎn)并啟動
mkdir -p /opt/mongo_28011/{conf,log,pid}
mkdir -p /data/mongo_28011
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28011/conf/
sed -i 's#28017#28011#g' /opt/mongo_28011/conf/mongodb.conf
mongod -f /opt/mongo_28011/conf/mongodb.conf
mongo --port 28010
2.將仲裁節(jié)點(diǎn)加入集群
mongo --port 28017
rs.addArb("10.0.0.51:28011")
3.登陸仲裁節(jié)點(diǎn)查看
mongo --port 28011
4.模擬故障轉(zhuǎn)移
結(jié)論:可以壞2臺
第16章 mongo備份與恢復(fù)
1.工具介紹
mongodump/mongorestore
mongoexport/mongoimport
2.應(yīng)用場景
定時備份/全量備份 mongodump/mongorestore bson gzip
分析數(shù)據(jù)/遷移數(shù)據(jù) mongoexport/mongoimport json csv
3.mongodump-備份單節(jié)點(diǎn)數(shù)據(jù)
全備數(shù)據(jù)-mongodump
mongodump --port 28017 -o mongo_backup
只備份某個庫
mongodump --port 28017 -d test -o mongo_backup
只備份某個庫下某個集合
mongodump --port 28017 -d bobo -c bobo -o mongo_backup
4.mongodump-備份整個副本集
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup --gzip
5.mongorestore-恢復(fù)數(shù)據(jù)
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --dir=./mongo_backup --drop
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --dir=./mongo_backup --drop --gzip
6.mongoexport-導(dǎo)出數(shù)據(jù)
mongoexport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup/user_info.json
mongoexport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --type=csv --fields=name,age,ad -o mongo_backup/user_info.csv
7.mongoimport-恢復(fù)數(shù)據(jù)
mongoimport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup/user_info.json --drop
mongoimport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --type=csv --headerline mongo_backup/user_info.csv
第17章 mysql數(shù)據(jù)遷移到mongo
1.mysql自定義分隔符導(dǎo)出成csv格式
select * from world.city into outfile '/var/lib/mysql/city.csv' fields terminated by ',';
2.修改CSV格式并添加字段
ID,Name,CountryCode,District,Population
3.mongo導(dǎo)入修改后的csv格式
mongoimport -d world -c city --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --type=csv --headerline city.csv
4.CSV數(shù)據(jù)導(dǎo)入ES場景
老大發(fā)給他幾個CSV格式的文件檐蚜,讓運(yùn)維導(dǎo)入到ES里
解決步驟:
1.先把csv導(dǎo)入到mongo里
mongoimport -d world -c city --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --type=csv --headerline city.csv
2.把mongo數(shù)據(jù)導(dǎo)出成json
mongoexport -d world -c city --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup/city.json
3.把json導(dǎo)入到es
使用esdump工具將json文件導(dǎo)入到ES里。
第18章 模擬誤刪除恢復(fù)數(shù)據(jù)
1.模擬場景
小波早上10點(diǎn)誤刪除數(shù)據(jù)庫
1
2
3
全備
4
5
6
drop database
2.準(zhǔn)備測試數(shù)據(jù)
use backup
db.backup.insertMany( [
{ "id": 1},
{ "id": 2},
{ "id": 3},
]);
3.全備數(shù)據(jù)
rm -rf mongo_backup
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplog -o mongo_backup
4.增加新數(shù)據(jù)
db.backup.insertMany( [
{ "id": 4},
{ "id": 5},
{ "id": 6},
]);
5.模擬誤刪除數(shù)據(jù)
use backup
db.dropDatabase()
6.備份oplog
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -d local -c oplog.rs -o mongo_backup
7.查找誤刪除時間點(diǎn)
use local
db.oplog.rs.find({"ns":"backup.$cmd"}).pretty()
8.找到誤刪除的時間點(diǎn)
"ts" : Timestamp(1584408504, 1)
9.截斷oplog的drop時間點(diǎn)沿侈,然后恢復(fù)
cd mongo_backup
cp local/oplog.rs.bson oplog.bson
rm -rf local
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplogReplay --oplogLimit="1584408504" mongo_backup --drop
第19章 第二個誤刪場景:
1.誤刪2個庫的場景
test back
1 a
2 b
3 c
全備
dorp test
4 d
5 e
dorp back
6 f
緊急備份
2.整體思路
1.先恢復(fù)test庫闯第,然后還原
2.再恢復(fù)backup庫
1.恢復(fù)test思路:
test
1
2
3
全備
dorp test
4
5
6
恢復(fù)全備
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_20200316
導(dǎo)出test:
mongoexport -d test -c test --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup_test_ok/test.json
2.恢復(fù)backup庫:
back
a
b
c
全備 20200316
d
e
dorp back
f
1.導(dǎo)出當(dāng)前的oplog到全備里:
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019 -d local -o mongo_backup_20200316
cd mongo_backup_20200316
cp local/oplog.rs.bson oplog.bson
rm -rf local
2.查找時間戳:
use local
db.oplog.rs.find({"ns":"backup.$cmd"}).pretty()
db.oplog.rs.find({"op":"i","ns":"backup.backup"}).pretty()
1584427733 e
1584427746 drop
1584427763 f
3.恢復(fù)到drop時間戳之前:
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplogReplay --oplogLimit="1584427746" mongo_backup_20200316
4.導(dǎo)出backup數(shù)據(jù):
mongoexport -d backup -c backup --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup_backup_ok/backup.json
5.恢復(fù)全備:
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_20200316 --drop
3.恢復(fù)test:
mongoimport -d test -c test --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_test_ok/test.json
4.恢復(fù)backup:
mongoimport -d backup -c backup --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_backup_ok/backup.json
14.補(bǔ)充:如果時間戳有多條記錄,如何恢復(fù)指定的時間的操作的方法
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplogReplay --oplogLimit="1584419170:4" mongo_backup_20200316