mongodb應用

来源:https://www.cnblogs.com/1naonao/archive/2019/12/20/12074802.html
-Advertisement-
Play Games

關係型與非關係型 NoSQL not only sql NoSQL,指的是非關係型的資料庫。 NoSQL有時也稱作Not Only SQL的縮寫 是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。 對NoSQL最普遍的解釋是”非關聯型的”,強調Key Value Stores和文檔資料庫的優點,而 ...


關係型與非關係型

NoSQL not only sql

NoSQL,指的是非關係型的資料庫。
NoSQL有時也稱作Not Only SQL的縮寫
是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。
對NoSQL最普遍的解釋是”非關聯型的”,強調Key-Value Stores和文檔資料庫的優點,而不是單純的RDBMS。
NoSQL用於超大規模數據的存儲。
這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。

今天我們可以通過第三方平臺可以很容易的訪問和抓取數據。
用戶的個人信息,社交網路,地理位置,用戶生成的數據和用戶操作日誌已經成倍的增加。
我們如果要對這些用戶數據進行挖掘,那SQL資料庫已經不適合這些應用了
NoSQL資料庫的發展也卻能很好的處理這些大的數據。

mongo和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特點

高性能:
Mongodb提供高性能的數據持久性
尤其是支持嵌入式數據模型減少資料庫系統上的I/O操作
索引支持能快的查詢,並且可以包括來嵌入式文檔和數組中的鍵

豐富的語言查詢:
Mongodb支持豐富的查詢語言來支持讀寫操作(CRUD)以及數據彙總,文本搜索和地理空間索引

高可用性:
Mongodb的複製工具,成為副本集,提供自動故障轉移和數據冗餘,

水平可擴展性:
Mongodb提供了可擴展性,作為其核心功能的一部分,分片是將數據分,在一組電腦上。

支持多種存儲引擎:
WiredTiger存儲引擎和、MMAPv1存儲引擎和InMemory存儲引擎

mongo應用場景

游戲場景,使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新

物流場景,使用 MongoDB 存儲訂單信息,訂單狀態在運送過程中會不斷更新,以 MongoDB 內嵌數組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來。

社交場景,使用 MongoDB 存儲存儲用戶信息,以及用戶發表的朋友圈信息,通過地理位置索引實現附近的人、地點等功能

物聯網場景,使用 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

配置啟動mongo

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

配置登錄mongo

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工具

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副本集配置

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")

mongo備份與恢復

常用選項

導出:
$ 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.1 mongodump和mongorestore

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

mongodump和mongorestore高級企業應用(--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.重新加入集群


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 Bash所支持的算術運算和C語言是一樣的,這裡指的是操作符(operator)以及它們的優先順序(precedence)、結合性(associativity)和值,詳見Shell Arithmetic (Bash Reference Manual)。 註意:如果乘號“*”在某些場景中失效,有可能 ...
  • (智慧職教刷課軟體-職教雨滴)支持職教雲(雲課堂)的課程2019年10月17日 16:19:57 增加支持資料庫,MOOC點擊鏈接加入群聊【職教雨滴反饋群】:https://jq.qq.com/?_wv=1027&k=5BL2WO3填入你的卡號登錄即可 登錄你的網課賬號即可,支持職教雲(雲課堂)、資 ...
  • 相關研究指出,如果以嵌入式MRAM取代微控制器中的eFlash和SRAM,可節省高達90%的功耗;如果採用單一晶體管MRAM取代六個晶體管SRAM,則可實現更高的位元密度和更小的晶元尺寸,這些功率與面積成本優勢將使MRAM成為邊緣側設備的有力競爭者。而相較於傳統的NAND快閃記憶體,PCRAM或ReRAM ...
  • 如何讓shell腳本每天定時執行? 1.新建需要定時執行的shell腳本,這裡為date.sh腳本。 #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH ech ...
  • 對於一個剛創建的虛擬機,上不了網該如何解決呢? 首先檢查自己的網卡配置是否有誤 cd /etc/sysconfig/network-scripts/網卡名 (1)DHCP獲取ip的話把ONBOOT設為yes BOOTPROTO=dhcp ONBOOT=yes (2)static手動獲取就要仔細檢查了 ...
  • Linux 伺服器 CentOS 7.3、Root 許可權 安裝 Nginx ...
  • cron 計劃任務 作用: 計劃任務主要是做一些周期性的任務,目前最主要的用途是定期備份數據Schedule one-time tasks with at. 一次性調度執行 atSchedule recurring jobs with cron. 迴圈調度執行 cronSchedule recurr ...
  • 1. 聚合aggregate 聚合主要用於計算數據,類似sql中的sum()、avg() 語法: db.集合名稱.aggregate([{管道:{表達式}}]) stu準備的數據: 1.1 管道 管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的輸入。 ps ajx | gre ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...