DBA-70-day17

NoSQL-MongoDB運(yùn)維技術(shù)

# NoSQL-MongoDB 運(yùn)維

# 第一章:MySQL 到 MongoDB快速轉(zhuǎn)型

## 1. MongoDB的簡(jiǎn)介

![image-20200714174928913](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714174928913.png)

### 1.1 MongoDB趨勢(shì)及未來(lái)展望

![image-20200712214131023](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712214131023.png)

### 1.2 對(duì)于MongoDB的認(rèn)識(shí)Q&A

| Q? ? ? ? ? ? ? ? ? ? | A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| -------------------- | ------------------------------------------------------------ |

| 什么是 MongoDB?? ? | 一個(gè)以 JSON 為數(shù)據(jù)模型的文檔數(shù)據(jù)庫(kù)? ? ? ? ? ? ? ? ? ? ? ? ? |

| 為什么叫文檔數(shù)據(jù)庫(kù)? | 文檔來(lái)自于“JSON Document”,并非我們一般理解的 PDF,WORD? ? ? |

| 誰(shuí)開(kāi)發(fā) MongDB?? ? ? | 上市公司 MongoDB Inc. ,總部位于美國(guó)紐約。? ? ? ? ? ? ? ? ? |

| 主要用途有哪些?? ? | OLTP\OLAP數(shù)據(jù)庫(kù),類似于 Oracle, MySQL,海量數(shù)據(jù)處理,數(shù)據(jù)平臺(tái)。 |

| 主要特點(diǎn)是什么?? ? | 無(wú)模式或可選。友好的JSON數(shù)據(jù)模型,開(kāi)發(fā)方便。? ? ? ? ? ? ? ? |

| MongoDB 是免費(fèi)的嗎? | MongoDB 有兩個(gè)發(fā)布版本:社區(qū)版和企業(yè)版。企業(yè)版基于商業(yè)協(xié)議,需付費(fèi)。 |

### 1.3 MongoDB 版本變遷

? ![image-20200712214832083](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712214832083.png)

### 1.4 MongoDB vs. RDBMS

| 功能? ? ? ? | MongoDB? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | RDBMS? ? ? ? ? |

| ------------ | ---------------------------------------- | --------------- |

| 數(shù)據(jù)模型? ? | JSON? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | Relational? ? ? |

| 數(shù)據(jù)庫(kù)類型? | OLTP/OLAP? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | OLTP/OLAP? ? ? |

| CRUD 操作? ? | MQL/SQL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | SQL/SQLX? ? ? ? |

| 高可用? ? ? | 原生Replica-Set? ? ? ? ? ? ? ? ? ? ? ? ? | Cluster、中間件 |

| 橫向擴(kuò)展能力 | 原生MSC? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 分片、中間件? ? |

| 索引支持? ? | B-Tree、F-text、GIS、multikey、HASH、TTL | B+Tree? ? ? ? ? |

| 開(kāi)發(fā)難度? ? | easy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | hard? ? ? ? ? ? |

| 數(shù)據(jù)容量? ? | 無(wú)理論上限? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 千萬(wàn)、億? ? ? ? |

| 擴(kuò)展方式? ? | 垂直擴(kuò)展+水平擴(kuò)展? ? ? ? ? ? ? ? ? ? ? ? | 垂直擴(kuò)展? ? ? ? |

<img src="C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714182132857.png" alt="image-20200714182132857" style="zoom:50%;" />

### 1.5 MongoDB vs. MySQL邏輯結(jié)構(gòu)對(duì)比

| MySQL? ? | MongoDB? ? |

| -------- | ---------- |

| database | database? |

| table? ? | collection |

| row? ? ? | document? |

![image-20200714175039543](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714175039543.png)

## 2.MongoDB 特色及優(yōu)勢(shì)

### 2.1 MongoDB 優(yōu)勢(shì):面向開(kāi)發(fā)者的易用+高效數(shù)據(jù)庫(kù)

![image-20200712220144898](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712220144898.png)

#### SQL模型:錯(cuò)綜復(fù)雜

![image-20200712220544879](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712220544879.png)

#### JSON模型:條理清楚

![image-20200712220619975](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712220619975.png)

![image-20200714174906277](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714174906277.png)

#### 快速響應(yīng)業(yè)務(wù)變化:

```

a. 多類型:

同一個(gè)Collection中,可以包含不同字段(類型)的文檔對(duì)象.

b. 更靈活:

線上修改結(jié)構(gòu),應(yīng)用與數(shù)據(jù)庫(kù)均無(wú)須下線。

```

![image-20200712221449231](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712221449231.png)

#### 簡(jiǎn)潔的開(kāi)發(fā)模式:

```

a. 數(shù)據(jù)庫(kù)引擎只需要在一個(gè)存儲(chǔ)區(qū)讀寫(xiě).

b. 反范式、無(wú)關(guān)聯(lián)的組織極大優(yōu)化查詢速度.

c. 程序API自然,開(kāi)發(fā)快速.

```

![image-20200712221734097](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712221734097.png)

#### SQL插入數(shù)據(jù)代碼量:

![image-20200712221946591](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712221946591.png)

#### MongoDB 只需要兩行代碼:

![image-20200712222042384](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712222042384.png)

### 2.2 MongoDB 優(yōu)勢(shì):原生的高可用和橫向擴(kuò)展能力

#### 2.2.1 高可用能力

```

a. Replica Set – 2 to 50 個(gè)成員

b. 自恢復(fù)

c. 多中心容災(zāi)能力

d. 滾動(dòng)服務(wù) – 最小化服務(wù)終端

```

![image-20200712222146248](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712222146248.png)

#### 2.2.2 橫向擴(kuò)展能力

```

a. 需要的時(shí)候無(wú)縫擴(kuò)展

b. 應(yīng)用全透明

c. 多種數(shù)據(jù)分布策略

d. 輕松支持TB–PB數(shù)量級(jí)

```

![image-20200712222318802](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200712222318802.png)

### 2.3 MongoDB 技術(shù)優(yōu)勢(shì)總結(jié)

```

a. JSON 結(jié)構(gòu)和對(duì)象模型接近,開(kāi)發(fā)代碼量低

b. JSON 的動(dòng)態(tài)模型意味著更容易響應(yīng)新的業(yè)務(wù)需求

c. 復(fù)制集提供99.999%高可用

d. 分片架構(gòu)支持海量數(shù)據(jù)和無(wú)縫擴(kuò)容

```

## 3.MongoDB的獲取和安裝

### 3.1 獲取MongoDB

```

https://www.mongodb.com/try/download/community

```

### 3.2安裝MongoDB

#### 3.2.0 上傳軟件并解壓

```

[root@node01 nosql]# mkdir -p /mongodb && cd /mongodb

[root@node01 nosql]# tar xf? mongodb-linux-x86_64-rhel70-4.2.8.tgz

# 關(guān)閉THP

root用戶下

在vi /etc/rc.local最后添加如下代碼

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then

echo never > /sys/kernel/mm/transparent_hugepage/enabled

fi

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then

? echo never > /sys/kernel/mm/transparent_hugepage/defrag

fi

[root@node01 app]# cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

[root@node01 app]# cat /sys/kernel/mm/transparent_hugepage/defrag

always madvise [never]

其他系統(tǒng)關(guān)閉參照官方文檔:

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

為什么要關(guān)閉?

Transparent Huge Pages (THP) is a Linux memory management system

that reduces the overhead of Translation Lookaside Buffer (TLB)

lookups on machines with large amounts of memory by using larger memory pages.

However, database workloads often perform poorly with THP,

because they tend to have sparse rather than contiguous memory access patterns.

You should disable THP on Linux machines to ensure best performance with MongoDB.

```

#### 3.2.1 環(huán)境準(zhǔn)備

```

(1)創(chuàng)建所需用戶和組

useradd mongod

passwd mongod

(2)創(chuàng)建mongodb所需目錄結(jié)構(gòu)

mkdir -p /mongodb/conf

mkdir -p /mongodb/log

mkdir -p /mongodb/data

(3) 修改權(quán)限

chown -R mongod:mongod /mongodb

(4) 切換用戶并設(shè)置環(huán)境變量

su - mongod

vi .bash_profile

export PATH=/mongodb/app/bin:$PATH

source .bash_profile

```

### 3.2.2 啟動(dòng)數(shù)據(jù)庫(kù)并初始化數(shù)據(jù)

```

su - mongod

mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork

# 登錄mongodb

$ mongo

```

#### 3.2.3 使用配置文件

```

# 普通配置文件應(yīng)用

vim /mongodb/conf/mongodb.conf

logpath=/mongodb/log/mongodb.log

dbpath=/mongodb/data

port=27017

logappend=true

fork=true

# 關(guān)閉mongodb

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

使用配置文件啟動(dòng)mongodb

mongod -f /mongodb/conf/mongodb.conf

# YAML 配置文件應(yīng)用

--

NOTE:

YAML does not support tab characters for indentation: use spaces instead.

--系統(tǒng)日志有關(guān)?

systemLog:

? destination: file? ? ? ?

? path: "/mongodb/log/mongodb.log"? ? --日志位置

? logAppend: true ? --日志以追加模式記錄

--數(shù)據(jù)存儲(chǔ)有關(guān)?

storage:

? journal:

? ? ? enabled: true

? dbPath: "/mongodb/data"? ? ? ? ? ? --數(shù)據(jù)路徑的位置

-- 進(jìn)程控制?

processManagement:

? fork: true? ? ? ? ? ? ? ? ? ? ? ? --后臺(tái)守護(hù)進(jìn)程

? pidFilePath: <string> ? --pid文件的位置,一般不用配置,可以去掉這行,自動(dòng)生成到data中


--網(wǎng)絡(luò)配置有關(guān)?

net:

? bindIp: <ip>? ? ? ? ? ? ? ? ? ? ? -- 監(jiān)聽(tīng)地址,如果不配置這行是監(jiān)聽(tīng)在0.0.0.0

? port: <port> ? -- 端口號(hào),默認(rèn)不配置端口號(hào),是27017


-- 安全驗(yàn)證有關(guān)配置? ? ?

security:

? authorization: enabled? ? ? ? ? ? ? --是否打開(kāi)用戶名密碼驗(yàn)證

------------------以下是復(fù)制集與分片集群有關(guān)----------------------?

replication:

oplogSizeMB: <NUM>

replSetName: "<REPSETNAME>"

secondaryIndexPrefetch: "all"

sharding:

? clusterRole: <string>

? archiveMovedChunks: <boolean>


---for mongos only

replication:

? localPingThresholdMs: <int>

sharding:

? configDB: <string>

---

.........

++++++++++++++++++++++

YAML例子

vim /mongodb/conf/mongo.conf

systemLog:

? destination: file

? path: "/mongodb/log/mongodb.log"

? logAppend: true

storage:

? journal:

? ? ? enabled: true

? dbPath: "/mongodb/data/"

processManagement:

? fork: true

net:

? port: 27017

? bindIp: 10.0.0.21,127.0.0.1


mongod -f /mongodb/conf/mongo.conf --shutdown

mongod -f /mongodb/conf/mongo.conf?

++++++++++++++++++++++

mongodb的關(guān)閉方式

mongod -f mongodb.conf? --shutdown

```

#### 3.2.4 用戶權(quán)限基本管理

##### a . 注意事項(xiàng)

```

用戶管理 *****

注意:

--authenticationDatabase

驗(yàn)證庫(kù),建立用戶時(shí)use到的庫(kù),在使用用戶時(shí),要加上驗(yàn)證庫(kù)才能登陸。

對(duì)于管理員用戶,必須在admin下創(chuàng)建.

1. 建用戶時(shí),use到的庫(kù),就是此用戶的驗(yàn)證庫(kù)

2. 登錄時(shí),必須明確指定驗(yàn)證庫(kù)才能登錄

3. 通常,管理員用的驗(yàn)證庫(kù)是admin,普通用戶的驗(yàn)證庫(kù)一般是所管理的庫(kù)設(shè)置為驗(yàn)證庫(kù)

4. 如果直接登錄到數(shù)據(jù)庫(kù),不進(jìn)行use,默認(rèn)的驗(yàn)證庫(kù)是test,不是我們生產(chǎn)建議的.

```

##### b. 基本語(yǔ)法

```

use admin

db.createUser

{

? ? user: "<name>",

? ? pwd: "<cleartext password>",

? ? roles: [

? ? ? { role: "<role>",

? ? db: "<database>" } | "<role>",

? ? ...

? ? ]

}

基本語(yǔ)法說(shuō)明:

user:用戶名

pwd:密碼

roles:

? ? role:角色名

? ? db:作用對(duì)象

role:root, readWrite,read?

驗(yàn)證數(shù)據(jù)庫(kù):

mongo -u test -p 123 10.0.0.21/test

-------------

```

##### 角色關(guān)系

![image-20200714140327727](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714140327727.png)

##### c. 用戶實(shí)例

```

(1)--創(chuàng)建超級(jí)管理員:管理所有數(shù)據(jù)庫(kù)(必須use admin再去創(chuàng)建)

$ mongo

use admin

db.createUser(

{

? ? user: "root",

? ? pwd: "root123",

? ? roles: [ { role: "root", db: "admin" } ]

}

)

驗(yàn)證用戶

db.auth('root','root123')

配置文件中,加入以下配置

security:

? authorization: enabled

重啟mongodb

mongod -f /mongodb/conf/mongo.conf --shutdown

mongod -f /mongodb/conf/mongo.conf

登錄驗(yàn)證

mongo -uroot -proot123? admin

mongo -uroot -proot123? 10.0.0.21/admin

或者

mongo

use admin

db.auth('root','root123')

查看用戶:

use admin

db.system.users.find().pretty()

2、創(chuàng)建對(duì)app數(shù)據(jù)庫(kù),讀、寫(xiě)權(quán)限的用戶app01:

(1)超級(jí)管理員用戶登陸

mongo -uroot -proot123 admin

(2)選擇一個(gè)驗(yàn)證庫(kù)

use app

(3)創(chuàng)建用戶

db.createUser(

{

user: "app01",

pwd: "app01",

roles: [ { role: "readWrite" , db: "app" } ]

}

)

mongo? -uapp01 -papp01 10.0.0.51/app

4、創(chuàng)建app數(shù)據(jù)庫(kù)讀寫(xiě)權(quán)限的用戶并對(duì)test數(shù)據(jù)庫(kù)具有讀權(quán)限:

mongo -uroot -proot123 10.0.0.51/admin

use app

db.createUser(

{

user: "app03",

pwd: "app03",

roles: [ { role: "readWrite", db: "app" },

{ role: "read", db: "test" }

]

}

)

5、查詢mongodb中的用戶信息

mongo -uroot -proot123 10.0.0.51/admin

db.system.users.find().pretty()

6、刪除用戶(root身份登錄,use到驗(yàn)證庫(kù))

# mongo -uroot -proot123 10.0.0.51/admin

use app

db.dropUser("app03")

```

## 4. MongoDB 基本CRUD(MQL)

### 4.0 通用方法和幫助獲取

```

a.獲取幫助

help

> help

db.help()? ? ? ? ? ? ? ? ? ? help on db methods

db.mycoll.help()? ? ? ? ? ? help on collection methods

sh.help()? ? ? ? ? ? ? ? ? ? sharding helpers

rs.help()? ? ? ? ? ? ? ? ? ? replica set helpers

db.help();

DB methods:

db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [just calls db.runCommand(...)]

db.aggregate([pipeline], {options}) - performs a collectionless aggregation on this database; returns a cursor

db.auth(username, password)

db.cloneDatabase(fromhost) - will only function with MongoDB 4.0 and below

...

> db.t1.help();

DBCollection help

db.t1.find().help() - show DBCursor help

db.t1.bulkWrite( operations, <optional params> ) - bulk execute write operations, optional parameters are: w, wtimeout, j

db.t1.count( query = {}, <optional params> ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS

...

db.[TAB][TAB]

db.t1.[TAB][TAB]

b. 常用操作

//查看當(dāng)前db版本

test> db.version()

//顯示當(dāng)前數(shù)據(jù)庫(kù)

test> db

> db.getName()

// 查詢所有數(shù)據(jù)庫(kù)

test> show dbs

//切換數(shù)據(jù)庫(kù)

> use local

// 顯示當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)

查看local數(shù)據(jù)

test> use local

local> db.stats()

查看當(dāng)前數(shù)據(jù)庫(kù)的連接機(jī)器地址

> db.getMongo()

// 指定數(shù)據(jù)庫(kù)進(jìn)行連接:(默認(rèn)連接本機(jī)test數(shù)據(jù)庫(kù))

# mongo 192.168.1.24/admin

[mongod@db01 data]$ mongo -uroot -proot123 10.0.0.51:27017/admin

c. 庫(kù)和表的操作

// 建庫(kù)

use test

// 刪除

> db.dropDatabase()

{ "dropped" : "test", "ok" : 1 }

// 創(chuàng)建集合(表)

方法1:

admin> use app

app> db.createCollection('a')

app> db.createCollection('b')

方法2:當(dāng)插入一個(gè)文檔的時(shí)候,一個(gè)集合就會(huì)自動(dòng)創(chuàng)建。

admin> use app

switched to db app

app> db.c.insert({username:"mongodb"})

WriteResult({ "nInserted" : 1 })

app> show collections

app> db.c.find()

{ "_id" : ObjectId("5743c9a9bf72d9f7b524713d"), "username" : "mongodb" }

// 刪除集合

app> use app

switched to db app

app> db.log.drop() //刪除集合

// 重命名集合

app> db.log.renameCollection("log1")

```

### 4.1 使用 insert 完成插入操作

```

操作格式:

db.<集合>.insertOne(<JSON對(duì)象>)

db.<集合>.insertMany([<JSON 1>, <JSON 2>, …<JSON n>])

示例:

db.fruit.insertOne({name: "apple"})

db.fruit.insertMany([

{name: "apple"},

{name: "pear"},

{name: "orange"}

])

批量插入數(shù)據(jù):

for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }

```

### 4.2 使用 find 查詢文檔

```

# 關(guān)于 find:

find 是 MongoDB 中查詢數(shù)據(jù)的基本指令,相當(dāng)于 SQL 中的 SELECT 。

find 返回的是游標(biāo)。

# find 示例:

db.movies.find( { "year" : 1975 } ) //單條件查詢

db.movies.find( { "year" : 1989, "title" : "Batman" } ) //多條件and查詢

db.movies.find( { $and : [ {"title" : "Batman"}, { "category" : "action" }] } ) // and的另一種形式

db.movies.find( { $or: [{"year" : 1989}, {"title" : "Batman"}] } ) //多條件or查詢

db.movies.find( { "title" : /^B/} ) //按正則表達(dá)式查找

```

### 4.3 查詢條件對(duì)照表

| SQL? ? | MSQL? ? ? ? ? |

| ------ | -------------- |

| a = 1? | {a: 1}? ? ? ? |

| a <> 1 | {a: {$ne: 1}}? |

| a > 1? | {a: {$gt: 1}}? |

| a >= 1 | {a: {$gte: 1}} |

| a < 1? | {a: {$lt: 1}}? |

| a <= 1 | {a: {$lte: 1}} |

### 4.4 查詢邏輯對(duì)照表

| SQL? ? ? ? ? ? | MSQL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

| --------------- | -------------------------------------- |

| a = 1 AND b = 1 | {a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]} |

| a = 1 OR b = 1? | {$or: [{a: 1}, {b: 1}]}? ? ? ? ? ? ? ? |

| a IS NULL? ? ? | {a: {$exists: false}}? ? ? ? ? ? ? ? ? |

| a IN (1, 2, 3)? | {a: {$in: [1, 2, 3]}}? ? ? ? ? ? ? ? ? |

|? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

### 4.5 查詢邏輯運(yùn)算符

```

● $lt: 存在并小于

● $lte: 存在并小于等于

● $gt: 存在并大于

● $gte: 存在并大于等于

● $ne: 不存在或存在但不等于

● $in: 存在并在指定數(shù)組中

● $nin: 不存在或不在指定數(shù)組中

● $or: 匹配兩個(gè)或多個(gè)條件中的一個(gè)

● $and: 匹配全部條件

```

### 4.6 使用 find 搜索子文檔

```

find 支持使用“field.sub_field”的形式查詢子文檔。假設(shè)有一個(gè)文檔:

db.fruit.insertOne({

name: "apple",

from: {

country: "China",

province: "Guangdong" }

})

db.fruit.insertOne({ name: "dacong", from: { country: "China", province: "shandong" } })

正確寫(xiě)法:

db.fruit.find( { "from.country" : "China" } )

db.fruit.find( { "from.country" : "China" ,"from.province":"shandong"} )

```

### 4.7 使用 find 搜索數(shù)組

```

find 支持對(duì)數(shù)組中的元素進(jìn)行搜索。假設(shè)有一個(gè)文檔:

db.fruit.insert([

{ "name" : "Apple", color: ["red", "green" ] },

{ "name" : "Mango", color: ["yellow", "green"] }

])

查看單個(gè)條件:

db.fruit.find({color: "red"})

查詢多個(gè)條件:

db.fruit.find({$or: [{color: "red"}, {color: "yellow"}]} )

```

### 4.8 使用 find 搜索數(shù)組中的對(duì)象

```

考慮以下文檔,在其中搜索

db.movies.insertOne( {

"title" : "Raiders of the Lost Ark",

"filming_locations" : [

{ "city" : "Los Angeles", "state" : "CA", "country" : "USA" },

{ "city" : "Rome", "state" : "Lazio", "country" : "Italy" },

{ "city" : "Florence", "state" : "SC", "country" : "USA" }

]

})

db.movies.insertOne( {

"title" : "changcheng",

"filming_locations" : [

{ "city" : "Los Angeles", "state" : "CA", "country" : "USA" },

{ "city" : "Rome", "state" : "Lazio", "country" : "Italy" },

{ "city" : "BJ", "state" : "CN", "country" : "CHN" }

]

})

db.movies.insertOne( {

"title" : "zhenzi",

"filming_locations" : [

{ "city" : "HSD", "state" : "CA", "country" : "USA" },

{ "city" : "dJ", "state" : "JP", "country" : "JPN" },

{ "city" : "sh", "state" : "CN", "country" : "CHN" }

]

})

// 查找城市是 Rome 的記錄

db.movies.find({"filming_locations.city": "BJ"})

```

### 4.9 使用 find 搜索數(shù)組中的對(duì)象

```

在數(shù)組中搜索子對(duì)象的多個(gè)字段時(shí),如果使用 $elemMatch,它表示必須是同一個(gè)

子對(duì)象滿足多個(gè)條件。

考慮以下兩個(gè)查詢:

db.getCollection('movies').find({

"filming_locations.city": "dj",

"filming_locations.country": "CHN"

})

db.getCollection('movies').find({

"filming_locations": {

$elemMatch:{"city":"BJ", "country": "CHN"}

}

})

```

### 4.10 控制 find 返回的字段

```

find 可以指定只返回指定的字段;

● _id字段必須明確指明不返回,否則默認(rèn)返回;

● 在 MongoDB 中我們稱這為投影(projection);

● db.movies.find({},{"_id":0, title:1})

```

![image-20200714183012204](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714183012204.png)

### 4.11使用 remove 刪除文檔

```

remove 命令需要配合查詢條件使用;

● 匹配查詢條件的的文檔會(huì)被刪除;

● 指定一個(gè)空文檔條件會(huì)刪除所有文檔;

● 以下示例:

db.testcol.remove( { a : 1 } ) // 刪除a 等于1的記錄

db.testcol.remove( { a : { $lt : 5 } } ) // 刪除a 小于5的記錄

db.testcol.remove( { } ) // 刪除所有記錄

```

### 4.12 使用 update 更新文檔

```

Update 操作執(zhí)行格式:db.<集合>.update(<查詢條件>, <更新字段>)

● 以以下數(shù)據(jù)為例:

db.fruit.insertMany([

{name: "apple"},

{name: "pear"},

{name: "orange"}

])

db.fruit.updateOne({name: "orange"}, {$set: {from: "China"}})

```

![image-20200714141934900](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200714141934900.png)

### 4.13 使用 update 更新文檔

```

● 使用 updateOne 表示無(wú)論條件匹配多少條記錄,始終只更新第一條;

● 使用 updateMany 表示條件匹配多少條就更新多少條;

```

### 4.15 使用 drop 刪除集合

```

● 使用 db.<集合>.drop() 來(lái)刪除一個(gè)集合

● 集合中的全部文檔都會(huì)被刪除

● 集合相關(guān)的索引也會(huì)被刪除

db.colToBeDropped.drop()

```

### 4.16 使用 dropDatabase 刪除數(shù)據(jù)庫(kù)

```

● 使用 db.dropDatabase() 來(lái)刪除數(shù)據(jù)庫(kù)

● 數(shù)據(jù)庫(kù)相應(yīng)文件也會(huì)被刪除,磁盤(pán)空間將被釋放

use tempDB

db.dropDatabase()

show collections // No collections

show dbs // The db is gone

```

## 5. 通過(guò)python操作mongodb

### 5.1 安裝 Python MongoDB 驅(qū)動(dòng)程序

```

在 Python 中使用 MongoDB 之前必須先安裝用于訪問(wèn)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum install -y python3

pip3 install pymongo

+++++++++++++

pip3 install pymongo -i https://pypi.tuna.tsinghua.edu.cn/simple/? #這樣快點(diǎn)

+++++++++++++

在 python 交互模式下導(dǎo)入 pymongo,檢查驅(qū)動(dòng)是否已正確安裝:

import pymongo

pymongo.version

```

### 5.2 創(chuàng)建連接

```

確定 MongoDB 連接串

使用驅(qū)動(dòng)連接到 MongoDB 集群只需要指定 MongoDB 連接字符串即可。其基本格式可

以參考文檔: Connection String URI Format 最簡(jiǎn)單的形式是

mongodb://數(shù)據(jù)庫(kù)服務(wù)器主機(jī)地址:端口號(hào)

如:mongodb://127.0.0.1:27017

● 初始化數(shù)據(jù)庫(kù)連接

from pymongo import MongoClient

uri = "mongodb://root:root123@10.0.0.51:27017"

client = MongoClient(uri)

client

```

### 5.3 數(shù)據(jù)庫(kù)操作:插入數(shù)據(jù)

```

初始化數(shù)據(jù)庫(kù)和集合

db = client["eshop"]

user_coll = db["users"]

插入一條新的用戶數(shù)據(jù)

new_user = {"username": "nina", "password": "xxxx", "email":

"123456@qq.com "}

result = user_coll.insert_one(new_user)

result

```

## 6. MongoDB RS(Replica Set)

### 6.1 復(fù)制集的作用

```

MongoDB 復(fù)制集的主要意義在于實(shí)現(xiàn)服務(wù)高可用,它的現(xiàn)實(shí)依賴于兩個(gè)方面的功能:

? 數(shù)據(jù)寫(xiě)入時(shí)將數(shù)據(jù)迅速?gòu)?fù)制到另一個(gè)獨(dú)立節(jié)點(diǎn)上

? 在接受寫(xiě)入的節(jié)點(diǎn)發(fā)生故障時(shí)自動(dòng)選舉出一個(gè)新的替代節(jié)點(diǎn)

在實(shí)現(xiàn)高可用的同時(shí),復(fù)制集實(shí)現(xiàn)了其他幾個(gè)附加作用:

? 數(shù)據(jù)分發(fā):將數(shù)據(jù)從一個(gè)區(qū)域復(fù)制到另一個(gè)區(qū)域,減少另一個(gè)區(qū)域的讀延遲

? 讀寫(xiě)分離:不同類型的壓力分別在不同的節(jié)點(diǎn)上執(zhí)行

? 異地容災(zāi):在數(shù)據(jù)中心故障時(shí)候快速切換到異地

```

### 6.2 典型復(fù)制集結(jié)構(gòu)

```

一個(gè)典型的復(fù)制集由3個(gè)以上具有投票權(quán)的節(jié)點(diǎn)組成,包括:

? 一個(gè)主節(jié)點(diǎn)(PRIMARY):接受寫(xiě)入操作和選舉時(shí)投票

? 兩個(gè)(或多個(gè))從節(jié)點(diǎn)(SECONDARY):復(fù)制主節(jié)點(diǎn)上的新數(shù)據(jù)和選舉時(shí)投票

? Arbiter(投票節(jié)點(diǎn))

```

![image-20200719173016402](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200719173016402.png)

### 6.3 數(shù)據(jù)是如何復(fù)制的

```

當(dāng)一個(gè)修改操作,無(wú)論是插入、更新或刪除,到達(dá)主節(jié)點(diǎn)時(shí),它對(duì)數(shù)據(jù)的操作將被記錄下來(lái)(經(jīng)過(guò)一些必要的轉(zhuǎn)換),這些記錄稱為 oplog。

從節(jié)點(diǎn)通過(guò)在主節(jié)點(diǎn)上打開(kāi)一個(gè) tailable 游標(biāo)不斷獲取新進(jìn)入主節(jié)點(diǎn)的 oplog,并在自己的數(shù)據(jù)上回放,以此保持跟主節(jié)點(diǎn)的數(shù)據(jù)一致。

```

![image-20200719173100304](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200719173100304.png)

### 6.4 通過(guò)選舉完成故障恢復(fù)

```

具有投票權(quán)的節(jié)點(diǎn)之間兩兩互相發(fā)送心跳;

● 當(dāng)5次心跳未收到時(shí)判斷為節(jié)點(diǎn)失聯(lián);

● 如果失聯(lián)的是主節(jié)點(diǎn),從節(jié)點(diǎn)會(huì)發(fā)起選舉,選出新的主節(jié)點(diǎn);

● 如果失聯(lián)的是從節(jié)點(diǎn)則不會(huì)產(chǎn)生新的選舉;

● 選舉基于 RAFT 一致性算法實(shí)現(xiàn),選舉成功的必要條件是大多數(shù)投票節(jié)點(diǎn)存活;

```

![image-20200719173149620](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200719173149620.png)

### 6.5 影響選舉的因素

```

整個(gè)集群必須有大多數(shù)節(jié)點(diǎn)存活;被選舉為主節(jié)點(diǎn)的節(jié)點(diǎn)必須:

? 能夠與多數(shù)節(jié)點(diǎn)建立連接

? 具有較新的 oplog

? 具有較高的優(yōu)先級(jí)(如果有配置)

```

### 6.6 常見(jiàn)選項(xiàng)

```

復(fù)制集節(jié)點(diǎn)有以下常見(jiàn)的選配項(xiàng):

? 是否具有投票權(quán)(v 參數(shù)):有則參與投票;

? 優(yōu)先級(jí)(priority 參數(shù)):優(yōu)先級(jí)越高的節(jié)點(diǎn)越優(yōu)先成為主節(jié)點(diǎn)。優(yōu)先級(jí)為0的節(jié)點(diǎn)無(wú)法成為主節(jié)點(diǎn);

? 隱藏(hidden 參數(shù)):復(fù)制數(shù)據(jù),但對(duì)應(yīng)用不可見(jiàn)。隱藏節(jié)點(diǎn)可以具有投票僅,但優(yōu)先級(jí)必須為0;

? 延遲(slaveDelay 參數(shù)):復(fù)制 n 秒之前的數(shù)據(jù),保持與主節(jié)點(diǎn)的時(shí)間差。

```

![image-20200719173303341](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200719173303341.png)

![image-20200719173309714](C:\Users\Administrator\Desktop\桌面\mongodb-課件\MongoDB 運(yùn)維及開(kāi)發(fā).assets\image-20200719173309714.png)

### 6.7 復(fù)制集注意事項(xiàng)

```

● 關(guān)于硬件:

? 因?yàn)檎5膹?fù)制集節(jié)點(diǎn)都有可能成為主節(jié)點(diǎn),它們的地位是一樣的,因此硬件配置上必須一致;

? 為了保證節(jié)點(diǎn)不會(huì)同時(shí)宕機(jī),各節(jié)點(diǎn)使用的硬件必須具有獨(dú)立性。

● 關(guān)于軟件:

? 復(fù)制集各節(jié)點(diǎn)軟件版本必須一致,以避免出現(xiàn)不可預(yù)知的問(wèn)題。

● 增加節(jié)點(diǎn)不會(huì)增加系統(tǒng)寫(xiě)性能!

```

### 6.8 Replcation Set配置過(guò)程詳解

```

1、規(guī)劃

三個(gè)以上的mongodb節(jié)點(diǎn)(或多實(shí)例)

多實(shí)例:

(1)多個(gè)端口:28017、28018、28019、28020

(2)多套目錄:

mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log

mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log

mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log

mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

(3) 多套配置文件

touch /mongodb/28017/conf/mongod.conf

touch /mongodb/28018/conf/mongod.conf

touch /mongodb/28019/conf/mongod.conf

touch /mongodb/28020/conf/mongod.conf

(4)配置文件內(nèi)容

vi /mongodb/28017/conf/mongod.conf

systemLog:

? destination: file

? path: /mongodb/28017/log/mongodb.log

? logAppend: true

storage:

? journal:

? ? enabled: true

? dbPath: /mongodb/28017/data

? directoryPerDB: true

? #engine: wiredTiger

? wiredTiger:

? ? engineConfig:

? ? ? cacheSizeGB: 1

? ? ? directoryForIndexes: true

? ? collectionConfig:

? ? ? blockCompressor: zlib

? ? indexConfig:

? ? ? prefixCompression: true

processManagement:

? fork: true

net:

? port: 28017

replication:

? oplogSizeMB: 2048

? replSetName: my_repl

\cp? /mongodb/28017/conf/mongod.conf? /mongodb/28018/conf/

\cp? /mongodb/28017/conf/mongod.conf? /mongodb/28019/conf/

\cp? /mongodb/28017/conf/mongod.conf? /mongodb/28020/conf/

sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i

sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i

sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i

chown -R mongod:mongod /mongodb

------------------------------------------------------------

(5)啟動(dòng)多個(gè)實(shí)例備用

su - mongod

mongod -f /mongodb/28017/conf/mongod.conf

mongod -f /mongodb/28018/conf/mongod.conf

mongod -f /mongodb/28019/conf/mongod.conf

mongod -f /mongodb/28020/conf/mongod.conf

2、配置復(fù)制集:

(1)1主2從,從庫(kù)普通從庫(kù)

config = {_id: 'my_repl', 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)

(2)1主1從1個(gè)arbiter

config = {_id: 'my_repl', members: [

? ? ? ? ? ? ? ? ? ? ? ? ? {_id: 0, host: '10.0.0.52:28017'},

? ? ? ? ? ? ? ? ? ? ? ? ? {_id: 1, host: '10.0.0.52:28018'},

? ? ? ? ? ? ? ? ? ? ? ? ? {_id: 2, host: '10.0.0.52:28019',"arbiterOnly":true}]

? ? ? ? ? }


rs.initiate(config)

3、復(fù)制集測(cè)試:

my_repl:PRIMARY> db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },

... { "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },

... ] );

BulkWriteResult({

"writeErrors" : [ ],

"writeConcernErrors" : [ ],

"nInserted" : 2,

"nUpserted" : 0,

"nMatched" : 0,

"nModified" : 0,

"nRemoved" : 0,

"upserted" : [ ]

})

my_repl:SECONDARY> db.movies.find().pretty();

注:在mongodb復(fù)制集當(dāng)中,默認(rèn)從庫(kù)不允許讀寫(xiě)。

rs.slaveOk();

my_repl:SECONDARY> db.movies.find().pretty();

4、復(fù)制集管理操作:

(1)查看復(fù)制集狀態(tài):

rs.status();? ? //查看整體復(fù)制集狀態(tài)

rs.isMaster(); // 查看當(dāng)前是否是主節(jié)點(diǎn)

(2)添加刪除節(jié)點(diǎn)

rs.add("ip:port"); // 新增從節(jié)點(diǎn)

rs.addArb("ip:port"); // 新增仲裁節(jié)點(diǎn)

rs.remove("ip:port"); // 刪除一個(gè)節(jié)點(diǎn)

注:

添加特殊節(jié)點(diǎn)時(shí),

1>可以在搭建過(guò)程中設(shè)置特殊節(jié)點(diǎn)

2>可以通過(guò)修改配置的方式將普通從節(jié)點(diǎn)設(shè)置為特殊節(jié)點(diǎn)

/*找到需要改為延遲性同步的數(shù)組號(hào)*/;

(3)配置延時(shí)節(jié)點(diǎn)(一般延時(shí)節(jié)點(diǎn)也配置成hidden)

cfg=rs.conf()

cfg.members[2].priority=0

cfg.members[2].slaveDelay=120

cfg.members[2].hidden=true

rs.reconfig(cfg)? ?

--------

cfg.members[2].arbiterOnly=true

------------

配置成功后,通過(guò)以下命令查詢配置后的屬性

rs.conf();

5、副本集其他操作命令:

--查看副本集的配置信息

admin> rs.config()

--查看副本集各成員的狀態(tài)

admin> rs.status()

--副本集角色切換(不要人為順便操作)

admin> rs.stepDown()

注:

admin> rs.freeze(300) //鎖定從,使其不會(huì)轉(zhuǎn)變成主庫(kù)

freeze()和stepDown單位都是秒。

--設(shè)置副本節(jié)點(diǎn)可讀:在副本節(jié)點(diǎn)執(zhí)行

admin> rs.slaveOk()

eg:

admin> use app

switched to db app

app> db.createCollection('a')

{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }

--查看副本節(jié)點(diǎn)

admin> rs.printSlaveReplicationInfo()

source: 192.168.1.22:27017

syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)

0 secs (0 hrs) behind the primary

```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容