[NoSQL]-mongodb-基礎


第1章 關系型與非關系型

NoSQL  not only sql 
NoSQL,指的是非關系型的數據庫。
NoSQL有時也稱作Not Only SQL的縮寫是對不同於傳統的關系型數據庫的數據庫管理系統的統稱。 
對NoSQL最普遍的解釋是”非關聯型的”,強調Key-Value Stores和文檔數據庫的優點,而不是單純的RDBMS。 
NoSQL用於超大規模數據的存儲。
這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。
今天我們可以通過第三方平台可以很容易的訪問和抓取數據。
用戶的個人信息,社交網絡,地理位置,用戶生成的數據和用戶操作日志已經成倍的增加。
我們如果要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了
NoSQL數據庫的發展也卻能很好的處理這些大的數據。

第2章 mongo和mysql數據對比

mysql里的數據
user庫
user_info表
name 	   age   job
oldzhang   24	 IT 
cookzhang  28    cook
xiaozhang  26    IT 

mongo里的數據
user庫
user_info集合
{ name:"oldzhang", age:"24", job:"IT" }
{ name:"cookzhang", age:"28", job:"cook" }
{ name:"xiaozhang", age:"26", job:"IT" }
{ name:"cookya", age:"23", job:"cook" , host:"XZ" }

第3章 mongo的特點

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

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

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

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

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

第4章 mongo的應用場景

參考網站:

https://www.zhihu.com/question/32071167

應用場景:

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

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

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

物聯網場景,使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,並對這些信息進行多維度的分析

視頻直播,使用 MongoDB 存儲用戶信息、禮物信息等,用戶評論

電商場景,使用 MongoDB
商城上衣和褲子兩種商品,除了有共同屬性,如產地、價格、材質、顏色等外,還有各自有不同的屬性集,如上衣的獨有屬性是肩寬、胸圍、袖長等,褲子的獨有屬性是臀圍、腳口和褲長等

第5章 安裝部署mongodb

1.下載軟件

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz

2.目錄規划

#軟件所在目錄
/opt/mongodb
#單節點目錄
/opt/mongo_27017/{conf,log,pid}
#數據目錄
/data/mongo_27017

3.下載並解壓

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

4.創建目錄

mkdir -p /opt/mongo_27017/{conf,log,pid}
mkdir -p /data/mongo_27017 

5.創建配置文件

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

6.配置文件解釋

配置文件注解:
systemLog:
  destination: file #Mongodb 日志輸出的目的地,指定一個file或者syslog,如果指定file,必須指定
  logAppend: true #當實例重啟時,不創建新的日志文件, 在老的日志文件末尾繼續添加
  path: /opt/mongo_27017/logs/mongodb.log #日志路徑

storage:
  journal: #回滾日志
    enabled: true
  dbPath: /data/mongo_27017 #數據存儲目錄
  directoryPerDB: true #默認,false不適用inmemoryengine
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1 #將用於所有數據緩存的最大小
      directoryForIndexes: true #默認false索引集合storage.dbPath存儲在數據單獨子目錄
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true

processManagement: #使用處理系統守護進程的控制處理
  fork: true #后台運行
  pidFilePath: /opt/mongo_27017/pid/mongod.pid #創建 pid 文件

net:
  port: 27017 #監聽端口
  bindIp: 127.0.0.1,10.0.0.51 #綁定ip

7.啟動mongo

/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf

8.檢查是否啟動

 ps -ef|grep mongo
 netstat -lntup|grep mongo

9.寫入環境邊境

echo 'export PATH=/opt/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

10.進入mongo

mongo

11.關閉命令

方法1:推薦
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

方法2: 只能是使用localhost方式登陸
mongo
use admin
db.shutdownServer()

方法3: system管理
見下面的優化3

第6章 優化警告

1.內存不足

** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
   See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt

解決方法:

方法1;加大機器內存
方法2: 調小配置文件里緩存大小 cacheSizeGB: 0.5

2.沒有開啟訪問控制

** WARNING: Access control is not enabled for the database.
   Read and write access to data and configuration is unrestricted.

解決方法:

開啟數據庫安裝認證功能,見用戶認證章節

3.不建議以root用戶運行

** WARNING: You are running this process as the root user, which is not recommended.

解決方法:

方法1: 創建普通用戶mongo,然后切換到mongo用戶啟動
方法2: 使用system方式登陸,指定運行用戶為普通用戶mongo

創建普通用戶:

mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown
groupadd mongo -g 777
useradd mongo -g 777 -u 777 -M -s /sbin/nologin
id 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

重新啟動mongo

systemctl daemon-reload 
systemctl start mongod.service
ps -ef|grep mongo
mongo

4.關閉大內存頁

** 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
systemctl stop mongod
systemctl start mongod
mongo

5.rlimits太低

** WARNING: soft rlimits too low. rlimits set to 7193 processes, 65535 files. Number of processes should be at least 32767.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 

6.關閉監控服務體驗

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

第7章 mongo數據庫命令介紹

1.默認數據庫說明

test:	登陸的時默認的庫
admin: 系統預留庫,Mongodb的系統管理庫
local: 本地預留庫,存儲關鍵日志
config: 配置信息庫

2.查看數據庫命令

db: 查看當前所在庫
show dbs/show databases	:查看所有的數據庫
show collections/show tables:查看當前庫下所有的集合
use admin :切換到不同的庫

3.mongo特別的地方

1.mongo默認登陸的時候是在test庫下
2.mongo不需要提前創建庫和表,直接use切換就是創建庫,直接插入數據就會創建表
3.使用use切換到的庫,如果沒有任何數據,實際上並不會真正創建,是個虛的庫,所以show dbs並不會顯現

4.shell窗口執行mongo命令

echo "show dbs"|mongo

第8章 mongo操作命令

1.插入命令

1.1插入單條

db.user_info.insertOne({name: "zhang",age: 29,host: "北京"})
db.user_info.insertOne({name: "yazhang",age: 29,host: "上海"})
db.user_info.insertOne({name: "yaya",age: 29,host: "深圳"})

db.user_info.insertOne(
  {
  	name: "zhang",
  	age: 29,
  	host: "北京"
  }
)

1.2插入多條

db.user_info.insertMany([
	{name: "zhang",age: 29,host: "北京"},
	{name: "yazhang",age: 29,host: "上海"},
	{name: "yaya",age: 29,host: "深圳"},
])

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()
select * from user_info limit 1;

2.2查詢所有

db.user_info.find()
select * from user_info;

2.3按條件查詢

db.user_info.find({name:"zhang"})
select * from user_info where name="zhang";

2.4只返回想要的字段

方法({條件1,條件2},{字段顯示開關})
db.user_info.find({name:"zhang"},{name:1,age:1,_id:0})
select name,age from user_info where name="zhang";

2.5嵌套查詢

db.inventory.find({"size.uom":"cm"})
db.inventory.find(
  {
  	"size.uom":"cm"
  }
)

2.6邏輯查詢-and

db.inventory.find( { status: "A", size.uom:"cm" } )

db.inventory.find( 
  { 
  	status: "A", 
  	"size.uom": "cm" 
  } 
)

select * from inventory where status="A" AND size.uom="cm";

db.inventory.find( 
  { 
  	status: "A", 
  	"size.uom": "cm" 
  },
  {
  	_id: 0,
  	status: 1,
  	"size.uom": 1
  } 
)

select status,size.uom from inventory where status="A" AND size.uom="cm";

2.7邏輯查詢-or

參考網站:

https://docs.mongodb.com/manual/reference/operator/query-comparison/

案例:

db.inventory.find({$or:[{條件1},{條件2}]})

db.inventory.find(
	{
		$or:[
			{條件1的key: 值},
			{條件2的key: 值}
		]
	}
)

db.inventory.find( { $or: [ { status: "D" }, { "size.uom": "cm" } ] } )

db.inventory.find( 
	{ 
		$or: 
			[ 
				{ status: "D" }, 
				{ "size.uom": "cm" } 
			] 
	} 
)

SELECT * FROM inventory WHERE status = "D" OR size.uom = cm;

db.inventory.find( 
	{ 
		$or: 
			[ 
				{ status: "A" }, 
				{ qty: { $lt: 30 } } 
			] 
	} 
)

SELECT * FROM inventory WHERE status = "A" OR qty < 30;

2.8 邏輯查詢+或+and+正則表達式

db.inventory.find( 
{
     status: "A",
     $or: 
       [ 
     	    { qty: { $lt: 30 } }, 
     	    { item: /^p/ } 
       ]
} )

SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")

3.更新數據

3.1 按條件更改單條

db.inventory.updateOne({查詢條件},{更改內容})
db.inventory.find({ item: /^p/ })
db.inventory.updateOne(
   { item: /^p/ },
   {
     $set: { status: "P" }
   }
)
db.inventory.find({ item: /^p/ })

3.2 按條件更改多條

db.inventory.find({ item: /^p/ })
db.inventory.updateMany(
   { item: /^p/ },
   {
     $set: { status: "P" }
   }
)
db.inventory.find({ item: /^p/ })

3.3 添加字段

db.inventory.findOne({ item: /^p/ })
db.inventory.updateOne(
   { item: /^p/ },
   {
     $set: { name: "zhangya" }
   }
)
db.inventory.find({ item: /^p/ })

4.索引

4.1 查看執行計划

db.user_info.find({age:29}).explain()

4.2 創建索引

db.user_info.createIndex(
  {
     age: 1
  },
  {
     background: true
  }
)

4.3 查看索引

db.user_info.getIndexes()

4.4 索引信息關鍵詞

COLLSCAN  全表掃描
IXSCAN    索引掃描

4.5 刪除索引

db.user_info.dropIndex("age_1")

4.6 其他索引類型

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 刪除單條

db.inventory.find({status:"P"})
db.inventory.deleteOne({刪除條件})
db.inventory.deleteOne({status:"P"})

5.2 刪除多條

db.inventory.deleteMany({status:"P"})

5.3 刪除索引

db.user_info.dropIndex("age_1")

5,4 刪除集合

db.user_info.drop()

5.5 刪除庫

db.dropDatabase()

第9章 基於角色的訪問控制

1.官網介紹

https://docs.mongodb.com/manual/core/authorization/
https://docs.mongodb.com/manual/tutorial/enable-authentication/
https://docs.mongodb.com/manual/reference/built-in-roles/

2.與用戶相關的命令

db.auth() 將用戶驗證到數據庫。
db.changeUserPassword() 更改現有用戶的密碼。
db.createUser() 創建一個新用戶。
db.dropUser() 刪除單個用戶。
db.dropAllUsers() 刪除與數據庫關聯的所有用戶。
db.getUser() 返回有關指定用戶的信息。
db.getUsers() 返回有關與數據庫關聯的所有用戶的信息。
db.grantRolesToUser() 授予用戶角色及其特權。
db.removeUser() 已過時。從數據庫中刪除用戶。
db.revokeRolesFromUser() 從用戶中刪除角色。
db.updateUser() 更新用戶數據。

3.在未開啟用戶訪問控制的實例下創建管理員賬戶

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "123456",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

4.查看創建的用戶

> db.getUsers()
[
        {
                "_id" : "admin.myUserAdmin",
                "userId" : UUID("bd30449e-6147-41b4-9af7-10c7f4174944"),
                "user" : "myUserAdmin",
                "db" : "admin",
                "roles" : [
                        {
                                "role" : "userAdminAnyDatabase",
                                "db" : "admin"
                        },
                        {
                                "role" : "readWriteAnyDatabase",
                                "db" : "admin"
                        }
                ],
                "mechanisms" : [
                        "SCRAM-SHA-1",
                        "SCRAM-SHA-256"
                ]
        }
]

5.配置訪問控制

vim /opt/mongo_27017/conf/mongodb.conf
security:
    authorization: enabled

6.重啟mongo

systemctl restart mongod

7.使用admin登陸

mongo --authenticationDatabase "admin" -u "myUserAdmin" -p

8.使用admin賬戶創建普通賬戶

use test
db.createUser(
  {
    user: "myTester",
    pwd:  "123456",
    roles: [ { role: "readWrite", db: "db1" },
             { role: "read", db: "db2" } ]
  }
)
db.getUsers()

9.使用admin賬戶創建測試數據

use db1
db.write.insertOne({"name":"readWrite"})

use db2
db.read.insertOne({"name":"read"})

10.退出admin賬戶,使用test賬戶登陸

mongo --authenticationDatabase "test" -u "myTester" -p  
show dbs

11.驗證普通賬戶權限

show dbs
use db1
show tables	
db.write.find()										#正常讀
db.write.insertOne({name:"ok"})		#正常寫

use db2
show tables	
db.read.find()										#正常讀
db.read.insertOne({name:"ok"})		#不能寫

12.使用admin用戶修改普通用戶權限並創建測試語句

mongo --authenticationDatabase "admin" -u "myUserAdmin" -p
use test
db.getUsers()
db.updateUser(
  "myTester",
  {
    roles: [ { role: "read", db: "db1" },
             { role: "readWrite", db: "db2" },
             { role: "readWrite", db: "test" }]
  }
)
db.getUsers()
db.user.insert({name:"test"})

13.切換普通賬戶登陸並測試

mongo --authenticationDatabase "test" -u "myTester" -p
show dbs
use db1
show tables	
db.write.find()										#正常讀
db.write.insertOne({name:"ok"})		#不可寫

use db2
show tables	
db.read.find()										#正常讀
db.read.insertOne({name:"ok"})		#正常寫

use test
show tables	
db.user.find()										#正常讀
db.user.insertOne({name:"ok"})		#正常寫

14.刪除用戶

mongo --authenticationDatabase "admin" -u "myUserAdmin" -p
use test
db.dropUser("myTester")

第10章 mongo副本集-replica set

1.官網地址

https://docs.mongodb.com/manual/replication
https://docs.mongodb.com/manual/reference/method/rs.initiate/#rs.initiate

2.副本集角色

主節點			 負責讀寫
副本節點		同步主節點
仲裁節點		不是必需的,不存儲數據,不參與競主,只投票,不消耗什么資源

3.選舉機制

大多數投票原則,存活的節點必須是副本集一半以上的數量

4.創建目錄

mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid}  
mkdir -p /data/mongo_2801{7,8,9}

5.創建配置文件

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

6.復制配置文件到其他節點

cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28018/conf/
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28019/conf/

7.替換端口號

sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongodb.conf
sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongodb.conf

8.啟動所有節點

mongod -f /opt/mongo_28017/conf/mongodb.conf
mongod -f /opt/mongo_28018/conf/mongodb.conf
mongod -f /opt/mongo_28019/conf/mongodb.conf

9.檢查服務

ps -ef|grep mongo
netstat -lntup|grep mongo

10.初始化集群

mongo --port 28017
rs.initiate(
   {
      _id: "dba",
      version: 1,
      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" }
      ]
   }
)

11.主庫插入數據測試

mongo --port 28017
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" }
]);

12.設置副本節點可讀

方法1:臨時生效

rs.slaveOk()

方法2:寫入啟動文件

echo "rs.slaveOk()" > ~/.mongorc.js

13.副本集常用命令

rs.config()
rs.status()
rs.isMaster()
rs.printReplicationInfo()
rs.printSlaveReplicationInfo()

第11章 模擬故障轉移和權重調整

1.模擬故障轉移

mongod -f /opt/mongo_28017/conf/mongodb.conf --shutdown

2.查看副本集信息

rs.status()
rs.config()

3.設置權重

myconfig=rs.conf()
myconfig.members[0].priority=100
rs.reconfig(myconfig)

4.主動降級

rs.stepDown()

5.恢復默認權重

myconfig=rs.conf()
myconfig.members[0].priority=0
rs.reconfig(myconfig)

第12章 增加節點和刪除節點

1.創建新節點

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.集群加入新節點

rs.add("10.0.0.51:28010")

3.刪除節點

rs.remove("10.0.0.51:28010")
rs.status()

第13章 仲裁節點

1.創建新節點並啟動

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 28011

2.將仲裁節點加入副本集

rs.addArb("10.0.0.51:28011")

3.登陸仲裁節點查看

mongo --port 28011

4.模擬故障轉移結論

4個節點+1仲裁 允許壞2台機器

第14章 mongo狀態查看工具

1.命令介紹

mongo					#客戶端連接工具
mongod				#啟動命令
mongos				#分片路由命令
mongostat			#查看mongo運行狀態
mongotop			#查看mongo運行狀態
mongodump			#備份
mongoexport		#備份
mongoimport		#恢復
mongorestore	#恢復
bsondump			#將bson格式導出json格式

2.mongostat使用說明

使命命令

mongostat --port 28018 -O vsize,res --humanReadable=false --noheaders -n 1 

參數解釋

--humanReadable=false		#將G轉換為K
--noheaders							#不輸出首行標題
-n 1 										#只輸出一次

3.mongostat字段解釋說明

insert/s : 官方解釋是每秒插入數據庫的對象數量,如果是slave,則數值前有*,則表示復制集操作
query/s : 每秒的查詢操作次數
update/s : 每秒的更新操作次數
delete/s : 每秒的刪除操作次數
getmore/s: 每秒查詢cursor(游標)時的getmore操作數
command: 每秒執行的命令數,在主從系統中會顯示兩個值(例如 3|0),分表代表 本地|復制 命令
注: 一秒內執行的命令數比如批量插入,只認為是一條命令(所以意義應該不大)
dirty: 僅僅針對WiredTiger引擎,官網解釋是臟數據字節的緩存百分比
used:僅僅針對WiredTiger引擎,官網解釋是正在使用中的緩存百分比
flushes:
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以下,基本滿足多數場景

4.案例,找出占用資源大的操作

寫入循環命令

use oldboy
for(i=1;i<10000;i++){ db.cook.insert({"id":i,"name":"BJ","age":70,"date":new Date()}); }

使用mongotop和mongostat觀察

mongostat
mongotop 

第15章 備份與恢復

1.工具介紹

mongodump/mongorestore
mongoexport/mongoimport

2.應用場景

定時備份,全量備份 mongodump/mongorestore bson gzip
分析數據,遷移數據 mongoexport/mongoimport json csv

3.mongodump備份單點數據

全備數據庫

mongodump --port 28017 -o mongo_backup
mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -o mongo_backup

只備份某個數據庫

mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d oldboy -o mongo_backup 

只備份某個庫下的某個集合

mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d oldboy -c user_info -o mongo_backup

壓縮格式

mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -o mongo_backup --gzip 

4.mongorestore恢復

恢復bson格式的數據

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"  mongo_backup

恢復gzip格式的數據

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"  mongo_backup --gzip

遇到重復的刪除再導入

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"  mongo_backup --gzip --drop

模擬執行

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"  mongo_backup --gzip --drop --dryRun

恢復到指定庫

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"  --dir=./mongo_backup/oldboy -d oldboy --drop --gzip

恢復到指定集合: 恢復到指定集合那么數據格式必須是bson格式

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"  --dir=./mongo_backup/oldboy/cook.bson -d oldboy -c cook --drop

5.bsog格式轉換成json格式

bsondump --outFile=cook.json cook.bson

6.mongoexport-導出成json和csv

導出指定集合為json格式

mongoexport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d test -c user_info -o mongo_backup/test.user_info.json

導出成csv格式

mongoexport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d test -c user_info --type=csv --fields=name,age,host -o mongo_backup/test.user_info.csv

7.mongoimport-恢復數據

從json格式恢復數據

mongoimport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d test -c user_info mongo_backup/test.user_info.json --drop   

從csv格式恢復數據

mongoimport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" --type=csv --headerline -d test -c user_info mongo_backup/test.user_info.csv --drop

第17章 mongo異構數據遷移

1.mysql自定義分隔符導出成csv格式

select * from world.city into outfile '/var/lib/mysql/city.csv' fields terminated by ',';

2.手動添加CSV頭部

ID,Name,CountryCode,District,Population

3.mongo導入csv格式

mongoimport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" --type=csv --headerline -d world -c city /var/lib/mysql/city.csv --drop

4.CSV導入ES

背景:老大發給運維幾個csv格式的文件,需要導入到ES里 elasticsearch

csv --> mongo
mongo --> json
json --> es 

操作命令:

mongoimport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" --type=csv --headerline -d world -c city /var/lib/mysql/city.csv --drop
mongoexport --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d world -c city -o mongo_backup/world.city.json

第18章 模擬誤刪庫恢復

0.前提

1.只有副本集才會有oplog
2.oplog保存在local里
3.mongodump的時候,默認不備份local

1.模擬場景

1
2
3
全備
4
5
6
drop databases 

2.准備數據

use backup
db.backup.insertOne({"id":1})
db.backup.insertOne({"id":2})
db.backup.insertOne({"id":3})

3.全備數據庫

rm -rf mongo_backup/
mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -o mongo_backup

4.寫入增量數據

use backup
db.backup.insertOne({"id":4})
db.backup.insertOne({"id":5})
db.backup.insertOne({"id":6})

5.模擬誤刪除

use backup
db.dropDatabase()

6.備份oplog

mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d local -c oplog.rs -o mongo_backup 

7.定位誤刪除操作的時間點

use local
db.oplog.rs.find({"ns" : "backup.$cmd"}).pretty()

8.找到誤刪除的位置點

"ts" : Timestamp(1587375719, 1)

9.截斷oplog的drop時間點,然后恢復

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" --oplogReplay --oplogLimit=1587375719 mongo_backup --drop

第19章 生產中oplog配置多大

1.生產中需要設置多大?

差不多兩個全備之間,相差時間內的數據量的大小


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM