NoSQL,指的是非關係型的數據庫。
NoSQL有時也稱做Not Only SQL的縮寫
是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱。
對NoSQL最廣泛的解釋是」非關聯型的」,強調Key-Value Stores和文檔數據庫的優勢,而不是單純的RDBMS。
NoSQL用於超大規模數據的存儲。
這些類型的數據存儲不須要固定的模式,無需多餘操做就能夠橫向擴展。html
今天咱們能夠經過第三方平臺能夠很容易的訪問和抓取數據。
用戶的我的信息,社交網絡,地理位置,用戶生成的數據和用戶操做日誌已經成倍的增長。
咱們若是要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了
NoSQL數據庫的發展也卻能很好的處理這些大的數據。mysql
mysql mongo 庫 庫 表 集合 字段 key:value 行 文檔 name age job oldzhang 28 it xiaozhang 28 it xiaofei 18 student SZ {name:'oldzhang',age:'28',job:'it'}, {name:'xiaozhang',age:'28',job:'it'}, {name:'xiaozhang',age:'28',job:'it',host:'SZ'}
高性能:
Mongodb提供高性能的數據持久性
尤爲是支持嵌入式數據模型減小數據庫系統上的I/O操做
索引支持能快的查詢,而且能夠包括來嵌入式文檔和數組中的鍵linux
豐富的語言查詢:
Mongodb支持豐富的查詢語言來支持讀寫操做(CRUD)以及數據彙總,文本搜索和地理空間索引正則表達式
高可用性:
Mongodb的複製工具,成爲副本集,提供自動故障轉移和數據冗餘,sql
水平可擴展性:
Mongodb提供了可擴展性,做爲其核心功能的一部分,分片是將數據分,在一組計算機上。mongodb
支持多種存儲引擎:
WiredTiger存儲引擎和、MMAPv1存儲引擎和InMemory存儲引擎數據庫
遊戲場景,使用 MongoDB 存儲遊戲用戶信息,用戶的裝備、積分等直接之內嵌文檔的形式存儲,方便查詢、更新json
物流場景,使用 MongoDB 存儲訂單信息,訂單狀態在運送過程當中會不斷更新,以 MongoDB 內嵌數組的形式來存儲,一次查詢就能將訂單全部的變動讀取出來。vim
社交場景,使用 MongoDB 存儲存儲用戶信息,以及用戶發表的朋友圈信息,經過地理位置索引實現附近的人、地點等功能數組
物聯網場景,使用 MongoDB 存儲全部接入的智能設備信息,以及設備彙報的日誌信息,並對這些信息進行多維度的分析
視頻直播,使用 MongoDB 存儲用戶信息、禮物信息等
電商場景,使用 MongoDB
商城上衣和褲子兩種商品,除了有共同屬性,如產地、價格、材質、顏色等外,還有各自有不一樣的屬性集,如上衣的獨有屬性是肩寬、胸圍、袖長等,褲子的獨有屬性是臀圍、腳口和褲長等
1.規劃目錄 #軟件所在目錄 /opt/mongodb #單節點目錄 /opt/mongo_27017/{conf,log,pid} #數據目錄 /data/mongo_27017 2.下載依賴並解壓(上傳安裝包) yum install libcurl openssl -y cd /opt/ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz tar zxvf mongodb-linux-x86_64-3.6.13.tgz ln -s mongodb-linux-x86_64-3.6.13 mongodb 3.建立文件目錄以及數據目錄 mkdir /opt/mongo_27017/{conf,logs,pid} -p mkdir /data/mongo_27017 -p
1.建立配置文件 cat > /opt/mongo_27017/conf/mongodb.conf << EOF systemLog: destination: file logAppend: true path: /opt/mongo_27017/logs/mongodb.log storage: journal: enabled: true dbPath: /data/mongo_27017 directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 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 2.啓動mongo /opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf 3.檢查是否啓動 ps -ef|grep mongo netstat -lntup|grep 27017
1.寫入環境變量 echo 'PATH=$PATH:/opt/mongodb/bin' >> /etc/profile source /etc/profile 2.登陸 mongo db01:27017 3.關閉 方法1: 使用localhost登陸 mongo localhost:27017 use admin db.shutdownServer() 方法2: mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown
1.訪問控制 WARNING: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted. 解決方法: 開啓安全認證功能 #建立管理用戶 mongo db01:27017 use admin db.createUser( { user: "admin", pwd: "123456", roles:[ { role: "root", db:"admin" } ] } ) #查看建立的用戶 db.getUsers() #配置文件添加權限認證參數/opt/mongo_27017/conf/mongodb.conf security: authorization: enabled #重啓mongo mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown mongod -f /opt/mongo_27017/conf/mongodb.conf #使用admin用戶登陸 mongo db01:27017 -uadmin -p --authenticationDatabase admin 2.以root用戶運行 WARNING: You are running this process as the root user, which is not recommended. 解決步驟: mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown useradd mongo echo '123456'|passwd --stdin mongo chown -R mongo:mongo /opt/ chown -R mongo:mongo /data/ su - mongo mongod -f /opt/mongo_27017/conf/mongodb.conf mongo logout #切換用戶 3.關閉大內存頁技術 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 寫入開機自啓動: chmod +x /etc/rc.d/rc.local vim /etc/rc.d/rc.local echo "never" >/sys/kernel/mm/transparent_hugepage/enabled echo "never" >/sys/kernel/mm/transparent_hugepage/defrag 驗證: mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown mongod -f /opt/mongo_27017/conf/mongodb.conf mongo 4.解決rlimits過低 WARNING: soft rlimits too low. rlimits set to 31771 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files. 解決方法: vim /etc/profile ulimit -f unlimited ulimit -t unlimited ulimit -v unlimited ulimit -n 64000 ulimit -m unlimited ulimit -u 64000 生效配置: source /etc/profile 驗證: mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown mongod -f /opt/mongo_27017/conf/mongodb.conf mongo
[root@db01 ~]# cat /etc/init.d/disable-transparent-hugepages #!/bin/bash ### BEGIN INIT INFO # Provides: disable-transparent-hugepages # Required-Start: $local_fs # Required-Stop: # X-Start-Before: mongod mongodb-mms-automation-agent # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Disable Linux transparent huge pages # Description: Disable Linux transparent huge pages, to improve # database performance. ### END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'never' > ${thp_path}/enabled echo 'never' > ${thp_path}/defrag re='^[0-1]+$' if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]] then # RHEL 7 echo 0 > ${thp_path}/khugepaged/defrag else # RHEL 6 echo 'no' > ${thp_path}/khugepaged/defrag fi unset re unset thp_path ;; esac [root@db01 ~]# chkconfig --add disable-transparent-hugepages [root@db01 ~]# chkconfig --list|grep disable
1.查詢一條,注意大小寫字母 db.user_info.findOne() 2.查詢全部 db.user_info.find() 3.查詢符合條件 db.user_info.find({"age":28}) select * from user_info where age = 28; 4.查詢嵌套的條件 db.inventory.find( { "size.uom": "in" } ) db.inventory.find( { "size.uom": "in" } ) 5.邏輯查詢:and db.inventory.find( { "size.uom": "cm" ,"status" : "A"} ) db.inventory.find( { "size.uom": "cm" , "status" : "A" } ) 6.邏輯查詢 或 db.inventory.find( { $or:[ {status:"D"}, {qty:{$lt:30}} ] } ) 7.邏輯查詢+或+and+正則表達式 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/ } ] } )
查看指令 test:登陸時默認存在的庫 admin庫:系統預留庫,MongoDB系統管理庫 local庫:本地預留庫,存儲關鍵日誌 config庫:MongoDB配置信息庫 查看數據庫命令 show databases/show dbs show tables/show collections use admin db/select database() 插入命令 1.插入單條 db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) db.user_info.insert({"name":"yazhang","age":28,"ad":"北京市朝陽區"}) db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區"}) db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區","sex":"boy"}) 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" } ]);
更新數據 1.更改匹配條件的單條數據 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" } } ) 2.更改匹配條件的多條數據 db.inventory.find({ "qty" : { $lt: 50 } }) db.inventory.updateMany( { "qty" : { $lt: 50 } }, { $set: { "size.uom" : "mm", "status": "P" } } ) 3.添加字段 db.user_info.find({ "age" : 27}) db.user_info.updateMany( { "age" : 27}, { $set: { "pet" : "cat" } } )
索引 1.查看執行計劃 db.user_info.find({"age":{ $lt: 30 }}) db.user_info.find({"age":{ $lt: 30 }}).explain() #查看詳細的信息 2.建立索引 db.user_info.createIndex({ age: 1 },{background: true}) 注:建索引過程會阻塞其它數據庫操做,background可指定之後臺方式建立索引,即增長 "background" 可選參數。 "background" 默認值爲false。 3.查看索引 db.user_info.getIndexes() 4.再次查看執行計劃 db.user_info.find({"age":{ $lt: 30 }}).explain() 關鍵詞 "stage" : "IXSCAN" "indexName" : "age_1" 5.刪除索引 db.user_info.dropIndex("age_1") db.user_info.dropIndex("age_1") 其餘索引類型 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 COLLSCAN 集合掃描 IXSCAN 索引掃描 FETCH 檢出文檔 SHARD_MERGE 合併分片中結果 SHARDING_FILTER 分片中過濾掉孤立文檔 LIMIT 使用limit 限制返回數 PROJECTION 使用 skip 進行跳過 IDHACK 針對_id進行查詢 COUNT 利用db.coll.explain().count()之類進行count運算 COUNTSCAN count不使用Index進行count時的stage返回 COUNT_SCAN count使用了Index進行count時的stage返回 SUBPLA 未使用到索引的$or查詢的stage返回 TEXT 使用全文索引進行查詢時候的stage返回 PROJECTION 限定返回字段時候stage的返回 參照文檔: https://xuexiyuan.cn/article/detail/179.html?from=csdn
1.先查找須要刪除的數據 db.inventory.find({"status":"P"}) 2.刪除單條 db.inventory.deleteOne({"status":"P"}) 3.刪除多個 db.inventory.deleteMany({"status":"P"}) 4.刪除索引 db.user_info.dropIndex("age_1") 4.刪除集合 show dbs db show tables db.inventory.drop() 5.刪除庫 show dbs db db.dropDatabase()
mongo工具 0.命令介紹 mongod #啓動命令 mongo #登陸命令 mongodump #備份導出,全備壓縮 mongorestore #恢復 mongoexport #備份,數據可讀json mongoimport #恢復 mongostat #查看mongo運行狀態 mongotop #查看mongo運行狀態 mongos #集羣分片命令 1.mongostat 各字段解釋說明: insert/s : 官方解釋是每秒插入數據庫的對象數量,若是是slave,則數值前有*,則表示複製集操做 query/s : 每秒的查詢操做次數 update/s : 每秒的更新操做次數 delete/s : 每秒的刪除操做次數 getmore/s: 每秒查詢cursor(遊標)時的getmore操做數 command: 每秒執行的命令數,在主從系統中會顯示兩個值(例如 3|0),分表表明 本地|複製 命令 注: 一秒內執行的命令數好比批量插入,只認爲是一條命令(因此意義應該不大) dirty: 僅僅針對WiredTiger引擎,官網解釋是髒數據字節的緩存百分比 used:僅僅針對WiredTiger引擎,官網解釋是正在使用中的緩存百分比 flushes: 通常0或者偶爾出現1,一直出現有問題 For WiredTiger引擎:指checkpoint的觸發次數在一個輪詢間隔期間 For MMAPv1 引擎:每秒執行fsync將數據寫入硬盤的次數 注:通常都是0,間斷性會是1, 經過計算兩個1之間的間隔時間,能夠大體瞭解多長時間flush一次。flush開銷是很大的,若是頻繁的flush,可能就要找找緣由了 vsize: 虛擬內存使用量,單位MB (這是 在mongostat 最後一次調用的總數據) res: 物理內存使用量,單位MB (這是 在mongostat 最後一次調用的總數據) 注:這個和你用top看到的同樣, vsize通常不會有大的變更, res會慢慢的上升,若是res常常忽然降低,去查查是否有別的程序狂吃內存。 qr: 客戶端等待從MongoDB實例讀數據的隊列長度 qw:客戶端等待從MongoDB實例寫入數據的隊列長度 ar: 執行讀操做的活躍客戶端數量 aw: 執行寫操做的活客戶端數量 注:若是這兩個數值很大,那麼就是DB被堵住了,DB的處理速度不及請求速度。看看是否有開銷很大的慢查詢。若是查詢一切正常,確實是負載很大,就須要加機器了 netIn:MongoDB實例的網絡進流量 netOut:MongoDB實例的網絡出流量 注:此兩項字段表名網絡帶寬壓力,通常狀況下,不會成爲瓶頸 conn: 打開鏈接的總數,是qr,qw,ar,aw的總和 注:MongoDB爲每個鏈接建立一個線程,線程的建立與釋放也會有開銷,因此儘可能要適當配置鏈接數的啓動參數,maxIncomingConnections,阿里工程師建議在5000如下,基本知足多數場景
建立用戶和角色 0.與用戶相關的命令 db.auth() 將用戶驗證到數據庫。 db.changeUserPassword() 更改現有用戶的密碼。 db.createUser() 建立一個新用戶。 db.dropUser() 刪除單個用戶。 db.dropAllUsers() 刪除與數據庫關聯的全部用戶。 db.getUser() 返回有關指定用戶的信息。 db.getUsers() 返回有關與數據庫關聯的全部用戶的信息。 db.grantRolesToUser() 授予用戶角色及其特權。 db.removeUser() 已過期。從數據庫中刪除用戶。 db.revokeRolesFromUser() 從用戶中刪除角色。 db.updateUser() 更新用戶數據。 1.建立管理用戶 mongo db01:27017 use admin db.createUser( { user: "admin", pwd: "123456", roles:[ { role: "root", db:"admin" } ] } ) 2.查看建立的用戶 db.getUsers() 3.配置文件添加權限認證參數/opt/mongo_27017/conf/mongodb.conf 配置問權限認證後須要重啓節點,再次登錄若是不使用帳號密碼就查看不了數據 security: authorization: enabled 4.重啓mongo mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown mongod -f /opt/mongo_27017/conf/mongodb.conf 5.使用admin用戶登陸 mongo db01:27017 -uadmin -p --authenticationDatabase admin 6.建立其餘用戶 use test db.createUser( { user: "mysun", pwd: "123456", roles: [ { role: "readWrite", db: "write" }, { role: "read", db: "read" } ] } ) 7.建立測試數據 use write db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) db.write.insert({"name":"yazhang","age":28,"ad":"北京市朝陽區"}) db.write.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區"}) db.write.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區","sex":"boy"}) use read db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) db.read.insert({"name":"yazhang","age":28,"ad":"北京市朝陽區"}) db.read.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區"}) db.read.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區","sex":"boy"}) 8.退出admin,使用mysun用戶登陸 mongo db01:27017 -umysun -p --authenticationDatabase test use write db.write.find() db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) use read db.read.find() db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"}) 9.修改用戶權限 use test db.updateUser( 'mysun', { pwd: "123456", roles: [ { role: "readWrite", db: "write" }, { role: "readWrite", db: "read" } , { role: "readWrite", db: "test" } ] } ) 10.刪除用戶 db.getUsers() db.dropUser('mysun')
mongo副本集配置 1.建立節點目錄和數據目錄 su - mongo mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid} mkdir -p /data/mongo_2801{7,8,9} 2.建立配置文件 cat >/opt/mongo_28017/conf/mongo_28017.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 3.複製配置文件到其餘節點 cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28018/conf/mongo_28018.conf cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28019/conf/mongo_28019.conf 4.替換端口號 sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongo_28018.conf sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongo_28019.conf 5.啓動全部節點 mongod -f /opt/mongo_28017/conf/mongo_28017.conf mongod -f /opt/mongo_28018/conf/mongo_28018.conf mongod -f /opt/mongo_28019/conf/mongo_28019.conf 6.初始化集羣 config = { _id : "dba", members : [ {_id : 0, host : "db01:28017"}, {_id : 1, host : "db01:28018"}, {_id : 2, host : "db01:28019"}, ]} rs.initiate(config) #登陸 mongo db01:28017 7.插入數據 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" } ]); 8.副本節點登陸查看數據 rs.slaveOk() use test db.inventory.find() 9.設置副本可讀 方法1:臨時生效 rs.slaveOk() 方法2:寫入啓動文件 echo "rs.slaveOk()" > ~/.mongorc.js 查看副本集狀態 rs.slaveOk() #讓副本能夠讀 rs.status() #查看副本集詳細狀態 rs.isMaster() #查看當前的主節點是誰 rs.printReplicationInfo() #oplog記錄信息 rs.printSlaveReplicationInfo() #查看複製延遲信息 rs.config() #打印當前副本集的配置信息 停節點 使用這條命令的前提是必須使用localhost登錄,不然會提示報錯 use admin db.shutdownserver()
副本集權重調整 0.模擬故障轉移 mongod -f /opt/mongo_28017/conf/mongo_28017.conf --shutdown mongod -f /opt/mongo_28017/conf/mongo_28017.conf 1.查看當前副本集配置 rs.conf() 2.設置權重(主節點) config=rs.conf() config.members[0].priority=100 rs.reconfig(config) 3.主節點主動降級 rs.stepDown() 4.恢復成默認的權重 config=rs.conf() config.members[0].priority=1 rs.reconfig(config)
建立新節點目錄及啓動 [mongo@db01 ~]$ mkdir /opt/mongo_28010/{conf,logs,pid} -p [mongo@db01 ~]$ mkdir /data/mongo_28010 [mongo@db01 ~]$ cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28010/conf/mongo_28010.conf [mongo@db01 ~]$ sed -i 's#28017#28010#g' /opt/mongo_28010/conf/mongo_28010.conf [mongo@db01 ~]$ mongod -f /opt/mongo_28010/conf/mongo_28010.conf [mongo@db01 ~]$ mongo db01:28010 \> 增長新節點命令,主庫操做 [mongo@db01 ~]$ mongo db01:28017 dba:PRIMARY> use admin switched to db admin dba:PRIMARY> rs.add("db01:28010") { "ok" : 1, "operationTime" : Timestamp(1572787956, 1), "$clusterTime" : { "clusterTime" : Timestamp(1572787956, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } 查看新增長節點 [mongo@db01 ~]$ mongo db01:28010 dba:SECONDARY>
主節點操做 [mongo@db01 ~]$ mongo db01:28017 dba:PRIMARY> rs.remove("db01:28010") { "ok" : 1, "operationTime" : Timestamp(1572787994, 1), "$clusterTime" : { "clusterTime" : Timestamp(1572787994, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } 再次查看下線節點 [mongo@db01 ~]$ mongo db01:28010 dba:OTHER> 如今能夠關閉節點了 [mongo@db01 ~]$ mongod -f /opt/mongo_28010/conf/mongo_28010.conf --shutdown
仲裁節點 1.建立新節點並啓動 mkdir -p /opt/mongo_28011/{conf,log,pid} mkdir -p /data/mongo_28011 cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28011/conf/mongo_28011.conf sed -i 's#28017#28011#g' /opt/mongo_28011/conf/mongo_28011.conf mongod -f /opt/mongo_28011/conf/mongo_28011.conf mongo db01:28011 2.將仲裁節點加入集羣 rs.addArb("db01:28010") #移除 rs.remove("db01:28010")
經常使用選項
導出: $ mongoexport --help 參數說明: -h:指明數據庫宿主機的IP -u:指明數據庫的用戶名 -p:指明數據庫的密碼 -d:指明數據庫的名字 -c:指明collection的名字 -f:指明要導出那些列 -o:指明到要導出的文件名 -q:指明導出數據的過濾條件 --authenticationDatabase admin 恢復 $ mongoimport --help 參數說明: -h:指明數據庫宿主機的IP -u:指明數據庫的用戶名 -p:指明數據庫的密碼 -d:指明數據庫的名字 -c:指明collection的名字 -f:指明要導入那些列 -j, --numInsertionWorkers=<number> number of insert operations to run concurrently (defaults to 1) //並行
mongo備份與恢復 1.工具介紹 (1)mongoexport/mongoimport (2)mongodump/mongorestore 2.應用場景 1.異構平臺遷移 mysql <---> mongodb 2.同平臺,跨大版本:mongodb 2 ----> mongodb 3 mongoexport/mongoimport:json csv 平常備份恢復時使用. mongodump/mongorestore 3.導出工具mongoexport,json格式 單表備份 mongoexport --port 27017 -d test -c inventory -o /data/inventory.json 單表備份至csv格式,能夠導出成excl表格 mongoexport --port 27017 -d test -c user_info --type=csv -f name,age,ad -o /data/user_info.csv 4.恢復 mongoimport --port 27017 -d test -c inventory /data/inventory.json mongoimport --port 27017 -d test -c user_info --type=csv --headerline --file /data/user_info.csv 5.mysql數據遷移到mongo [root@db01 ~]# yum install mariadb mariadb-server -y 配置mysql配置文件,增長安全導出目錄路徑 cat > /etc/my.cnf << EOF secure-file-priv=/var/lib/mysql/ #重啓 systemctl restart mariadb.service 4.導入城市數據 [root@db01 ~]# mysql MariaDB [(none)]> source /root/world.sql #將樣本數據導出成csv格式 select * from world.city into outfile '/var/lib/mysql/city.csv' fields terminated by ','; 編輯csv文件,添加列名, ID,Name,CountryCode,District,Population mongoimport --port 27017 -d world -c city --type=csv --headerline --file /data/city.csv mongoexport --port 27017 -d world -c city -o /data/city.json 6.導出與恢復 mongodump --port 27017 -o /data/backup mongorestore --port 27017 -d world /data/backup/world/ --drop mongorestore --port 27017 /data/backup/ --drop
1.介紹:
mongodump可以在Mongodb運行時進行備份,它的工做原理是對運行的Mongodb作查詢,而後將全部查到的文檔寫入磁盤。
可是存在的問題時使用mongodump產生的備份不必定是數據庫的實時快照,若是咱們在備份時對數據庫進行了寫入操做,則備份出來的文件可能不徹底和Mongodb實時數據相等。另外在備份時可能會對其它客戶端性能產生不利的影響。
2.使用方法:
$ mongodump --help 參數說明: -h:指明數據庫宿主機的IP -u:指明數據庫的用戶名 -p:指明數據庫的密碼 -d:指明數據庫的名字 -c:指明collection的名字 -o:指明到要導出的文件名 -q:指明導出數據的過濾條件 -j, --numParallelCollections= number of collections to dump in parallel (4 by default) --oplog 備份的同時備份oplog
注意:==這是replica set或者master/slave模式專用==
1.oplog介紹(能夠實現熱備)
在replica set中oplog是一個定容集合(capped collection),它的默認大小是磁盤空間的5%(能夠經過--oplogSizeMB參數修改).
位於local庫的db.oplog.rs,有興趣能夠看看裏面到底有些什麼內容。
其中記錄的是整個mongodb實例一段時間內數據庫的全部變動(插入/更新/刪除)操做。
當空間用完時新記錄自動覆蓋最老的記錄。
其覆蓋範圍被稱做oplog時間窗口。須要注意的是,由於oplog是一個定容集合,
因此時間窗口能覆蓋的範圍會由於你單位時間內的更新次數不一樣而變化
想要查看當前的oplog時間窗口預計值,可使用如下命令:
dba58:PRIMARY> use local dba58:PRIMARY> db.oplog.rs.find().pretty() .................................. "ts" : Timestamp(1562403898, 1), "op" : "n" "o" : "i": insert "u": update "d": delete "c": db cmd .................................. dba58:PRIMARY> rs.printReplicationInfo() configured oplog size: 1024MB #集合大小 log length start to end: 104539secs (29.04hrs) #預計窗口覆蓋時間 oplog first event time: Sat Jul 06 2019 17:02:15 GMT+0800 (CST) oplog last event time: Sun Jul 07 2019 22:04:34 GMT+0800 (CST) now: Sun Jul 07 2019 22:04:38 GMT+0800 (CST)
準備測試數據 全庫備份 [root@db01 ~]# mkdir /data/backup [root@db01 ~]# chown -R mongo:mongo /data/backup/ [root@db01 ~]# su - mongo #登陸mongodb use backup db.backup.insertMany( [ { "id": 1}, { "id": 2}, { "id": 3}, ]); 全備環境 rm -rf /data/backup/* 備份 mongodump --port 28017 --oplog -o /data/backup 壓縮備份 [mongo@db01 ~]$ mongodump --port 28017 -o /data/backup --gzip [mongo@db01 ~]$ mongodump --port 28017 -d world -o /data/backup --gzip 增長新數據 mongo db01:28017 use backup db.backup.insertMany( [ { "id": 4}, { "id": 5}, { "id": 6}, ]); 模擬刪除集合 mongo db01:28017 use backup db.backup.drop() 備份oplog mongodump --port 28017 -d local -c oplog.rs -o /data/backup 查找誤操做時間點 use local db.oplog.rs.find({ns:"backup.$cmd"}).pretty(); 找到時間點信息 "ts" : Timestamp(1575023546, 1), 恢復數據 cd /data/backup/local/ cp oplog.rs.bson ../oplog.bson rm -rf /data/backup/local/ mongorestore --port 28017 --oplogReplay --oplogLimit "1575023546:1" --drop /data/backup/
1.首先確保是副本集狀態
2.先關閉1個副本節點
3.檢測數據是否能夠升級
4.升級副本節點的可執行文件
5.更新配置文件
6.啓動升級後的副本節點
7.確保集羣工做正常
8.滾動升級其餘副本節點
9.最後主節點降級
10.確保集羣 可用
11.關閉降級的老的主節點
12.升級老的主節點
13.從新加入集羣