Mongodb 从入门到精通

-rw-r–r– 1 root root 56K Aug 28 2018 THIRD-PARTY-NOTICES。net:port: 270

MongoDB介绍

MongoDB是个非关系型数据库 但操作跟关系型数据库很类似

MongoDB是面向文档存储的非关系型数据库 数据以json的格式进行存储

MongoDB可用来永久存储 也可以用来缓存数据

MongoDB提供副本集合集群功能 操作简单

MongoDB的下载链接 直接使用MongoDB的二进制文件 面编译安装

https://www/mongodb.com/download-center?jmp=nav#community

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

mongodb的二进制解压安装

cd /usr/local/src

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.2.tgz

tar -zxvf mongodb-linux-x86_64-4.0.2.tgz

mv mongodb-linux-x86_64-4.0.2 /usr/local/mongodb

[root@c7-node01 mongodb]# ll -h /usr/local/mongodb/

total 120K

drwxr-xr-x 2 root root 231 Mar 9 14:37 bin

-rw-r–r– 1 root root 34K Aug 28 2018 GNU-AGPL-3.0

-rw-r–r– 1 root root 2.1K Aug 28 2018 LICENSE-Community.txt

-rw-r–r– 1 root root 17K Aug 28 2018 MPL-2

-rw-r–r– 1 root root 2.2K Aug 28 2018 README

-rw-r–r– 1 root root 56K Aug 28 2018 THIRD-PARTY-NOTICES

[root@c7-node01 mongodb]# ./bin/mongod –help

Options:

General options:

-v [ –verbose ] [=arg(=v)] be more verbose (include multiple times

for more verbosity e.g. -vvvvv)

–quiet quieter output

–port arg specify port number – 27017 by default

–logpath arg log file to send write to instead of

stdout – has to be a file, not

directory

–syslog log to system’s syslog facility instead

of file or stdout

–syslogFacility arg syslog facility used for mongodb syslog

message

–logappend append to logpath instead of

over-writing

–logRotate arg set the log rotation behavior

(rename|reopen)

–timeStampFormat arg Desired format for timestamps in log

messages. One of ctime, iso8601-utc or

iso8601-local

–setParameter arg Set a configurable parameter

-h [ –help ] show this usage information

–version show version information

-f [ –config ] arg configuration file specifying

additional options

–bind_ip arg comma separated list of ip addresses to

listen on – localhost by default

….

查看版本号

[root@c7-node01 mongodb]# ./bin/mongod –version

db version v4.0.2

git version: fc1573ba18aee42f97a3bb13b67af7d837826b47

allocator: tcmalloc

modules: none

#########MongoDB单实例启动

mkdir -pv /data/mongodb/27017/

[root@c7-node01 logs]# cat /data/mongodb/27017/conf/mongodb.conf

systemLog:

destination: file

logAppend: true

path: /data/mongodb/27017/logs/mongodb.log

storage:

dbPath: /data/mongodb/27017/data/

journal:

enabled: true

processManagement:

fork: true

pidFilePath: /data/mongodb/27017/conf/mongodb.pid

net:

port: 27017

bindIp: 127.0.0.1

启动MongoDB

./bin/mongod -f /data/mongodb/27017/conf/mongodb.conf

[root@c7-node01 27017]# ps -ef|grep -v grep|grep mongo

root 9592 1 6 15:25 ? 00:00:30 ./bin/mongod -f /data/mongodb/27017/conf/mongodb.conf

[root@c7-node01 27017]#

[root@c7-node01 27017]# tree

├── conf

│ ├── mongodb.conf

│ └── mongodb.pid

├── data

│ ├── collection-0–6966875933417581368.wt

│ ├── collection-2–6966875933417581368.wt

│ ├── collection-4–6966875933417581368.wt

│ ├── diagnostic.data

│ │ ├── metrics.2019-03-09T07-15-22Z-00000

│ │ ├── metrics.2019-03-09T07-25-40Z-00000

│ │ └── metrics.interim

│ ├── index-1–6966875933417581368.wt

│ ├── index-3–6966875933417581368.wt

│ ├── index-5–6966875933417581368.wt

│ ├── index-6–6966875933417581368.wt

│ ├── journal

│ │ ├── WiredTigerLog.0000000002

│ │ ├── WiredTigerPreplog.0000000001

│ │ └── WiredTigerPreplog.0000000002

│ ├── _mdb_catalog.wt

│ ├── mongod.lock

│ ├── sizeStorer.wt

│ ├── storage.bson

│ ├── WiredTiger

│ ├── WiredTigerLAS.wt

│ ├── WiredTiger.lock

│ ├── WiredTiger.turtle

│ └── WiredTiger.wt

└── logs

└── mongodb.log

5 directories, 25 files

关闭

不建议使用kill,kill -9 和突然断电会导致MongoDB数据丢失

MongoDB 客户端 mongo 类似于mysql 的 mysql 连接客户端

[root@c7-node01 27017]# /usr/local/mongodb/bin/mongo 127.0.0.1:27017

MongoDB shell version v4.0.2

connecting to: mongodb://127.0.0.1:27017/test

MongoDB server version: 4.0.2

Server has startup warnings:

2019-03-09T15:25:39.221+0800 I CONTROL [initandlisten]

2019-03-09T15:25:39.222+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.

2019-03-09T15:25:39.225+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.

2019-03-09T15:25:39.225+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.

2019-03-09T15:25:39.225+0800 I CONTROL [initandlisten]

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten]

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten]

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’

2019-03-09T15:25:39.235+0800 I CONTROL [initandlisten]

>

优化启动说明

1.调整用户进程数

[root@c7-node01 ~]# tail /etc/security/limits.conf

#* hard rss 10000

#@student hard nproc 20

#@faculty soft nproc 20

#@faculty hard nproc 50

#ftp hard nproc 0

#@student – maxlogins 4

# End of file

#

* – nofile 65536

* – nproc 65536

2.禁止内存巨大页

[root@c7-node01 ~]# echo ‘never’ >/sys/kernel/mm/transparent_hugepage/enabled

[root@c7-node01 ~]# echo ‘never’ >/sys/kernel/mm/transparent_hugepage/defrag

[root@c7-node01 ~]# tail -3 /etc/rc.local

#

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

echo ‘never’ >/sys/kernel/mm/transparent_hugepage/defrag

3.使用普通用户登录

[root@c7-node01 ~]# useradd mongodb -s /sbin/nologin

[root@c7-node01 ~]# chown -R mongodb. /data/mongodb #要先停止MongoDB再授权 否则普通用户启动会提示没有权限错误

[root@c7-node01 ~]# chown -R mongodb. /usr/local/mongodb

[mongodb@c7-node01 ~]$ /usr/local/mongodb/bin/mongod -f /data/mongodb/27017/conf/mongodb.conf

about to fork child process, waiting until server is ready for connections.

forked process: 13008

child process started successfully, parent exiting

[mongodb@c7-node01 ~]$

[root@c7-node01 logs]# /usr/local/mongodb/bin/mongo 127.0.0.1:27017

MongoDB shell version v4.0.2

connecting to: mongodb://127.0.0.1:27017/test

MongoDB server version: 4.0.2

Server has startup warnings:

2019-03-09T16:22:35.916+0800 I CONTROL [initandlisten]

2019-03-09T16:22:35.916+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.

2019-03-09T16:22:35.916+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.

2019-03-09T16:22:35.916+0800 I CONTROL [initandlisten]

2019-03-09T16:22:35.917+0800 I CONTROL [initandlisten]

2019-03-09T16:22:35.918+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 65536 files. Number of processes should be at least 32768 : 0.5 times number of files.

>

3.调整rlimits参数

[root@c7-node01 logs]# cat /etc/security/limits.d/20-nproc.conf

# Default limit for number of user’s processes to prevent

# accidental fork bombs.

# See rhbz #432903 for reasoning.

* soft nproc 65536

root soft nproc unlimited

重启MongoDB,在从新登录

[root@c7-node01 ~]# /usr/local/mongodb/bin/mongo 127.0.0.1:27017

MongoDB shell version v4.0.2

connecting to: mongodb://127.0.0.1:27017/test

MongoDB server version: 4.0.2

Server has startup warnings:

2019-03-09T16:33:48.768+0800 I CONTROL [initandlisten]

2019-03-09T16:33:48.768+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.

2019-03-09T16:33:48.768+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.

2019-03-09T16:33:48.768+0800 I CONTROL [initandlisten]

>

MongoDB的基础概念介绍

database 数据库

collection 集合 类似于sql中的表

filed 类似于mysql中的字段

document 每行的记录

mongo客户端的自动提示功能

使用tab键 提示补全

查询所有的库 默认自带三个数据库

show dbs;

show databases;

> show dbs;

admin 0.000GB

config 0.000GB

local 0.000GB

> show databases;

admin 0.000GB

config 0.000GB

local 0.000GB

mongo客户端提供一个正确的关闭MongoDB服务器的方法

use admin

db.shutdownServer()

MongoDB创建库 创建集合 插入数据(key value的字典方式插入)

use mgtest #use 即可 不用显示创建

db.myuser.insert({‘name’:’mgtest1′,age:22}) #无需显示创建collection。 name age为filed, mgtest1 22为值

show dbs;

show collections;

show tables;

db.myuser.insert({‘name’:’mgtest2′,age:23})

db.myuser.insert({‘name’:’mgtest3′,age:33})

> use mgtest

switched to db mgtest

> db.myuser.insert({‘name’:’mgtest1′,’age’:23}) #往mgtest的集合myuser里插入数据

WriteResult({ “nInserted” : 1 })

> db.myuser.insert({‘name’:’mgtest2′,’age’:24})

WriteResult({ “nInserted” : 1 })

> db.myuser.insert({‘name’:’mgtest3′,’age’:25})

WriteResult({ “nInserted” : 1 })

> show dbs;

admin 0.000GB

config 0.000GB

local 0.000GB

mgtest 0.000GB

> show collections;

myuser

> show tables;

myuser

查询集合数据 默认有个_id

use mgtest

db.myuser.find() #查询所有数据

db.myuser.find({name:’mgtest1′})

db.myuser.find({age:23})

> db.myuser.find({age: 27})

{ “_id” : ObjectId(“5c83a90c8c5abee480a1bd78”), “name” : “mgtest6”, “age” : 27 }

> db.myuser.find({age: 26})

{ “_id” : ObjectId(“5c83a8cd8c5abee480a1bd77”), “name” : “mgtest5”, “age” : 26 }

>

#查询有多少条记录

> db.myuser.count();

5217

删除集合中的数据

use mgtest;

db.myuser.remove({name: ‘mgtest1’}) #有条件的删除

db.myuser.find()

db.myuser.remove({}) #删除所有数据

db.myuser.drop() #删除集合

删除数据库

use mgtest

db.dropDatabase()

MongoDB默认的三个数据库无需动它,MongoDB系统管理库

> show dbs;

admin 0.000GB

config 0.000GB

local 0.000GB

集合的field不用固定 但一般来说是要一样的

db.myuser.insert({age: 28})

db.myuser.insert({‘location’:’hangzhou’})

db.myuser.find()

更新集合数据

use.mgtest;

db.myuser.update({location: ‘hangzhou’},{$set:{‘location’:’shanghai’}})

db.myuser.update({age: 28},{$set: {age: 35}})

##MongoDB集合的多种查询方式

1.易读方式查询

db.myuser.find().pretty()

> db.myuser.find().pretty()

{

“_id” : ObjectId(“5c83a5b08c5abee480a1bd74”),

“name” : “mgtest1”,

“age” : 23

}

{

“_id” : ObjectId(“5c83a5ba8c5abee480a1bd75”),

“name” : “mgtest2”,

“age” : 24

}

{

“_id” : ObjectId(“5c83a5bf8c5abee480a1bd76”),

“name” : “mgtest3”,

“age” : 25

}

{

“_id” : ObjectId(“5c83a8cd8c5abee480a1bd77”),

“name” : “mgtest5”,

“age” : 26

}

2.limit限制条数查询

db.myuser.find().limit(2)

> db.myuser.find().limit(2);

{ “_id” : ObjectId(“5c83a5b08c5abee480a1bd74”), “name” : “mgtest1”, “age” : 23 }

{ “_id” : ObjectId(“5c83a5ba8c5abee480a1bd75”), “name” : “mgtest2”, “age” : 24 }

> db.myuser.find().skip(2).limit(5)

3.使用skip跳过记录查询

db.myuser.find().skip(2).limit(2)

> db.myuser.find().skip(2).limit(5)

{ “_id” : ObjectId(“5c83a5bf8c5abee480a1bd76”), “name” : “mgtest3”, “age” : 25 }

{ “_id” : ObjectId(“5c83a8cd8c5abee480a1bd77”), “name” : “mgtest5”, “age” : 26 }

{ “_id” : ObjectId(“5c83a90c8c5abee480a1bd78”), “name” : “mgtest6”, “age” : 27 }

{ “_id” : ObjectId(“5c83aea38c5abee480a1bd79”), “name” : “shanshan”, “age” : 23 }

{ “_id” : ObjectId(“5c83aeac8c5abee480a1bd7a”), “name” : “nana”, “age” : 22 }

>

4.MongoDB分页查询

db.myuser.find().skip(0).limit(2)

db.myuser.find().skip(2).limit(2)

db.myuser.find().skip(4).limit(2)

5.使用sort进行排序

db.myuser.find().sort({“age”: 1}) #按age升序

db.myuser.find().sort({“age”: -1}) #按age降序

6.根据字段进行数字比较查询

db.myuser.find({“age”: {$lt: 30}})

$gt 大于

$lt 小于

$gte 大于等于

$lte 小于等于

7.与 或 查询

db.myuser.find({name: ‘mgtest1’})

db.myuser.find({name: ‘mgtest2’})

db.myuser.find({$or: [{name: ‘mgtest1’},{name: ‘mgtest2’}]})

db.myuser.find({$and: [{name: ‘mgtest2’},{age: 20}]})

8.mongodb正则查询,支持普通正则和扩展正则

db.myuser.find({“name”:{$regex:”mgtest[0-9]”}}) #普通正则

db.myuser.find({name: {$regex:”(mgtest)”}}) #分组正则

db.myuser.find({name: {$regex: “(mgtest+)”}})

db.myuser.find({name: {$regex: “(zhangsan)”}}) #支持分组正则

MongoDB索引查询与建立

生成点数据测试

use mgtest

for(i=1;i<=500000;i++){

db.myuser.insert({name: ‘test’+i,age:i})

}

MongoDB的慢查询概念 默认是超过100ms会记录慢日志mongo

db.getProfilingStatus()

查询age为9999的 查看扫描的行数

db.myuser.find({age: 9999})

db.myuser.find({age: 9999}).explain(true) #使用explain可以查看是否全表扫描

添加索引,加快查询

db.myuser.getIndexes() #获得当前索引 默认有_id的索引 索引用_id查是比较快的

db.myuser.ensureIndex({age: 1}) #增加age的升序索引

db.myuser.getIndexes()

db.myuser.find({age: 9999})

db.myuser.find(age: 9999).explain(true)

不加索引查询 耗时2182ms

> db.myuser.find({age: 9999})

{ “_id” : ObjectId(“5c8f4c009fc9074914ce79f9”), “name” : “mytest9999”, “age” : 9999 }

>

慢日志

[root@c7-node01 ~]# tailf /data/mongodb/27017/logs/mongodb.log
2019-03-18T16:22:50.611+0800 I COMMAND [conn9] command test.myuser appName: "MongoDB Shell"
command: find { find: "myuser", filter: { age: 9999.0 }, lsid: { id: UUID("3c43c514-01e8-4313-8cc6-f482dde57d42") },
$db: "test" } planSummary: COLLSCAN keysExamined:0 docsExamined:500000 #COLLSCAN 全表扫描
cursorExhausted:1 numYields:3980 nreturned:1 reslen:159 locks:{ Global: { acquireCount: { r: 3981 } },
Database: { acquireCount: { r: 3981 } }, Collection: { acquireCount: { r: 3981 } } } protocol:op_msg 2182ms
#加explain(true)
> db.myuser.find({age: 9999}).explain(true)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.myuser",
"indexFilterSet" : false,
"parsedQuery" : {
"age" : {
"$eq" : 9999
}
},
"winningPlan" : {
"stage" : "COLLSCAN", #全表扫描
"filter" : {
"age" : {
"$eq" : 9999
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 1151, #耗时1151毫秒
"totalKeysExamined" : 0,
"totalDocsExamined" : 500000,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"age" : {
"$eq" : 9999
}
},
"nReturned" : 1,
"executionTimeMillisEstimate" : 944,
"works" : 500002,
"advanced" : 1,
"needTime" : 500000,
"needYield" : 0,
"saveState" : 3946,
"restoreState" : 3946,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 500000
},
"allPlansExecution" : [ ]
},
"serverInfo" : {
"host" : "c7-node01",
"port" : 27017,
"version" : "4.0.2",
"gitVersion" : "fc1573ba18aee42f97a3bb13b67af7d837826b47"
},
"ok" : 1
}
>
#查看默认索引
> db.myuser.getIndexes();
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.myuser"
}
]
>

根据索引查询 速度很快

> db.myuser.find().limit(5)
{ "_id" : ObjectId("5c8f4bcb9fc9074914ce52eb"), "name" : "mytest1", "age" : 1 }
{ "_id" : ObjectId("5c8f4bcb9fc9074914ce52ec"), "name" : "mytest2", "age" : 2 }
{ "_id" : ObjectId("5c8f4bcb9fc9074914ce52ed"), "name" : "mytest3", "age" : 3 }
{ "_id" : ObjectId("5c8f4bcb9fc9074914ce52ee"), "name" : "mytest4", "age" : 4 }
{ "_id" : ObjectId("5c8f4bcb9fc9074914ce52ef"), "name" : "mytest5", "age" : 5 }
> db.myuser.find({"_id" : ObjectId("5c8f4bcb9fc9074914ce52eb")})
{ "_id" : ObjectId("5c8f4bcb9fc9074914ce52eb"), "name" : "mytest1", "age" : 1 }
> db.myuser.find({"_id" : ObjectId("5c8f4bcb9fc9074914ce52eb")}).explain(true)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.myuser",
"indexFilterSet" : false,
"parsedQuery" : {
"_id" : {
"$eq" : ObjectId("5c8f4bcb9fc9074914ce52eb")
}
},
"winningPlan" : {
"stage" : "IDHACK"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 1,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "IDHACK", #没有扫描全表
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keysExamined" : 1,
"docsExamined" : 1
},
"allPlansExecution" : [ ]
},
"serverInfo" : {
"host" : "c7-node01",
"port" : 27017,
"version" : "4.0.2",
"gitVersion" : "fc1573ba18aee42f97a3bb13b67af7d837826b47"
},
"ok" : 1
}
>

##添加索引

> db.myuser.ensureIndex({age: 1}) #以age 为升序索引

{

“createdCollectionAutomatically” : false,

“numIndexesBefore” : 1,

“numIndexesAfter” : 2,

“ok” : 1

}

>

查看索引

> db.myuser.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.myuser"
},
{
"v" : 2,
"key" : {
"age" : 1
},
"name" : "age_1",
"ns" : "test.myuser"
}
]
>
> db.myuser.find({age:39999}).explain(true)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.myuser",
"indexFilterSet" : false,
"parsedQuery" : {
"age" : {
"$eq" : 39999
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"age" : 1
},
"indexName" : "age_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"age" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"age" : [
"[39999.0, 39999.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 8,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 1,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"age" : 1
},
"indexName" : "age_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"age" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"age" : [
"[39999.0, 39999.0]"
]
},
"keysExamined" : 1,
"seeks" : 1,
"dupsTested" : 0,
"dupsDropped" : 0,
"seenInvalidated" : 0
}
},
"allPlansExecution" : [ ]
},
"serverInfo" : {
"host" : "c7-node01",
"port" : 27017,
"version" : "4.0.2",
"gitVersion" : "fc1573ba18aee42f97a3bb13b67af7d837826b47"
},
"ok" : 1
}
>

###使用正则的话 索引无效果

测试

db.myuser.find({name: ‘mytest66’})

db.myuser.ensureIndex({name: 1})

db.myuser.find({name: “mytest6”}) #快

db.myuser.find({“name”: /99999/}) #慢

db.myuser.find({“name”: /99999/}).explain(true) #使用正则全表扫描 慢

keyExamined:500000 #全表扫描

####MongoDB建立唯一索引 唯一索引对应的值不能重复

use mgtest

db.myuser.insert({userid: 1})

db.myuser.insert({userid: 1}) #可以插入

db.myuser.remove({}) #清空数据

db.myuser.ensureIndex({userid: 1},{unique: true}) #创建唯一索引

db.myuser.insert({userid: 1})

db.myuser.insert({userid: 1}) #报错 ,因为索引是唯一的

######MongoDB数据库的监控命令

mongostat可以实时监控MongoDB的状态 一直刷新输出

mongostat –help

mongostat -h 127.0.0.1:27017

测试

for(i=1;i<=300000;i++){

db.myuser.insert({name: ‘mytest’+i,age:i})

}

[root@c7-node01 ~]# mongostat -h 127.0.0.1:27017
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
330 *0 *0 *0 0 2|0 0.1% 28.9% 0 1.09G 204M 0|0 1|0 60.6k 77.7k 2 Mar 18 17:21:46.161
289 *0 *0 *0 0 1|0 0.1% 28.9% 0 1.09G 204M 0|0 1|0 53.2k 68.7k 2 Mar 18 17:21:47.258
345 *0 *0 *0 0 2|0 0.1% 28.9% 0 1.09G 204M 0|0 1|0 63.4k 81.8k 2 Mar 18 17:21:48.179
303 *0 *0 *0 0 2|0 0.1% 28.9% 0 1.09G 204M 0|0 1|0 55.6k 80.7k 2 Mar 18 17:21:49.090
335 *0 *0 *0 0 2|0 0.2% 28.9% 0 1.09G 204M 0|0 1|0 61.6k 76.7k 2 Mar 18 17:21:50.082
353 *0 *0 *0 0 1|0 0.2% 29.0% 0 1.09G 204M 0|0 1|0 64.9k 76.4k 2 Mar 18 17:21:51.091
354 *0 *0 *0 0 2|0 0.2% 29.0% 0 1.09G 204M 0|0 1|0 65.0k 77.6k 2 Mar 18 17:21:52.081
277 *0 *0 *0 0 1|0 0.2% 29.0% 0 1.09G 204M 0|0 1|0 50.9k 71.7k 2 Mar 18 17:21:53.112
218 *0 *0 *0 0 2|0 0.2% 29.0% 0 1.09G 204M 0|0 1|0 40.1k 71.8k 2 Mar 18 17:21:54.096
MongoDB监控值serverStatus
serverStatus可用来获取MongoDB的状态信息
db.serverStatus() #查看索引的监控信息
db.serverStatus().network #单独查看网络流浪信息
db.serverStatus().opcounters #统计增 删 改 查的次数
db.serverStatus().connections #连接
> db.serverStatus().opcounters
{
"insert" : 712976,
"query" : 50,
"update" : 43,
"delete" : 9,
"getmore" : 0,
"command" : 1853
}
>
> db.serverStatus().connections
{ "current" : 2, "available" : 52426, "totalCreated" : 19 }
>
> db.serverStatus().mem
{
"bits" : 64,
"resident" : 205,
"virtual" : 1116,
"supported" : true,
"mapped" : 0,
"mappedWithJournal" : 0
}

使用shell获取监控信息 非交互式获取

echo ‘db.serverStatus()’|/usr/local/mongodb/bin/mongo 127.0.0.1:27017

echo ‘db.serverStatus().opcounters’|/usr/local/mongodb/bin/mongo 127.0.0.1:27017

echo ‘db.serverStatus().opcounters’|/usr/local/mongodb/bin/mongo 127.0.0.1:27017|grep insert

echo ‘db.serverStatus().opcounters’|/usr/local/mongodb/bin/mongo 127.0.0.1:27017|grep insert|egrep -o ‘[0-9]+’

MongoDB副本集的搭建

MongoDB单台服务器

数据会有丢失的风险,单台服务器无法做高可用性 MongoDB副本集能够预防数据丢失 多台MongoDB数据一致

MongoDB副本集能在有问题的时候自动切换

使用2台服务器实战MongoDB副本集 生产环境中建议至少三台服务器

两台服务器IP:192.168.128.162(2个实例27017/27019) 192.168.128.163(27018)

192.168.128.162

MongoDB副本集配置文件 /data/mongodb/27017/conf/mongodb.conf

systemLog:
destination: file
logAppend: true
path: /data/mongodb/27017/logs/mongodb.log
storage:
dbPath: /data/mongodb/27017/data/
journal:
enabled: true
processMangement:
fork: true
net:
port: 27017
bindIp: 127.0.0.1
replication:
replSetName: mgtest
mkdir /data/mongodb/27019/{data,conf,logs}
vim /data/mongodb/27019/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/27019/logs/mongodb.log
storage:
dbPath: /data/mongodb/27019/data/
journal:
enabled: true
processMangement:
fork: true
net:
port: 27019
bindIp: 127.0.0.1
replication:
replSetName: mgtest

##192.168.128.163

mkdir /data/mongodb/27018/{data,conf,logs}
vim /data/mongodb/27018/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/27018/logs/mongodb.log
storage:
dbPath: /data/mongodb/27018/data/
journal:
enabled: true
processMangement:
fork: true
net:
port: 27018
bindIp: 127.0.0.1
replication:
replSetName: mgtest

###启动三个MongoDB实例

/usr/local/mongodb/bin/mongod -f /data/mongodb/27017/conf/mongondb.conf

/usr/local/mongodb/bin/mongod -f /data/mongodb/27018/conf/mongondb.conf

/usr/local/mongodb/bin/mongod -f /data/mongodb/27019/conf/mongondb.conf

MongoDB副本集的初始化及状态查看

config = { _id:"mgtest",members:[
{_id:0,host: "192.168.128.162:27017"},
{_id:1,host: "192.168.128.163:27018"},
{_id:2,host: "192.168.128.162:27019"}]
}
> config = { _id:"mgtest",members:[
... {_id:0,host: "192.168.128.162:27017"},
... {_id:1,host: "192.168.128.163:27018"},
... {_id:2,host: "192.168.128.162:27019"}]
... }
{
"_id" : "mgtest",
"members" : [
{
"_id" : 0,
"host" : "192.168.128.162:27017"
},
{
"_id" : 1,
"host" : "192.168.128.163:27018"
},
{
"_id" : 2,
"host" : "192.168.128.162:27019"
}
]
}
> use admin
switched to db admin
> rs.initiate( config )
{
"ok" : 1,
"operationTime" : Timestamp(1551206629, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1551206629, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
mgtest:SECONDARY>
use admin
rs.initiate( config );#副本集初始化
rs.status() #副本集状态 一个primary 其它secondary。primary是主 只有primary能写入
> use admin
switched to db admin

验证和同步

/usr/local/mongodb/bin/mongo 192.168.128.163:27018

use mgtest

db.myuser.insert({userid: 1})

###坑坑

参数要一致

rs.slaveOk() #secondary 需要声明是slave才能查看数据

mgtest:SECONDARY> rs.slaveOk()
mgtest:SECONDARY> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
mgtest 0.000GB
mgtest:SECONDARY> use mgtest
switched to db mgtest
mgtest:SECONDARY> db.myuser.find()
{ "_id" : ObjectId("5c758ce0f615a72df7261710"), "userid" : 1 }
mgtest:SECONDARY>
mgtest:SECONDARY> db.myuser.insert({userid:2})
WriteCommandError({
"operationTime" : Timestamp(1551209152, 1),
"ok" : 0,
"errmsg" : "not master",
"code" : 10107,
"codeName" : "NotMaster",
"$clusterTime" : {
"clusterTime" : Timestamp(1551209152, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
})
mgtest:SECONDARY>

##查看延迟

mgtest:PRIMARY> rs.printSlaveReplicationInfo()
source: 192.168.128.162:27017
syncedTo: Wed Feb 27 2019 03:27:52 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.128.162:27019
syncedTo: Wed Feb 27 2019 03:27:52 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
mgtest:PRIMARY>

MongoDB的副本自动切换

MongoDB的副本集当primary挂了 会挑选其中的一台secondary升级为主

挑选其中一台secondary升级为primary的条件是剩下的集群台数>=2

如果集群只剩下一个实例的话 会有异常

MongoDB副本集自动切换演练

/usr/local/mongodb/bin/mongo 192.168.128.162:27018

use admin

db.shutdownServer() #关闭主MongoDB 会有其他的MongoDB提升为主 插入数据正常

/usr/local/mongodb/bin/mongo 192.168.128.162:27017

use admin

db.shutdownServer() #关闭两台MongoDB的话 剩下的一台不会提升为primary 插入数据将异常

启动27018和27017 没有固定的主 可通过优先级指定主

/usr/local/mongodb/bin/mongod -f /data/mongodb/27017/conf/mongodb.conf

/usr/local/mongodb/bin/mongod -f /data/mongodb/27018/conf/mongodb.conf

###MongoDB副本的优先级

MongoDB副本集的主的优先级

primary的选举依赖于各个实例的优先权重 默认权重都是1

副本集的主挑选权重最高的 权重一样的无法控制谁为主

设置各个实例的优先级权重 挑选自己想要的实例为主 只有primary可以更改权重配置

rs.config() #获取集群配置信息 必须在primary上执行

conf = rs.config() #赋值给conf 然后通过conf进行修改

conf.members[0].priority = 10 #索引从0开始 每次递增1 类似数组 优先级高的位主

conf.members[1].priority = 5

conf.members[2].priority = 2

rs.reconfig(config) #更新MongoDB副本集的配置 优先权重最高的提升为主 关闭启动后也为主

MongoDB副本集的伸缩

MongoDB副本集的扩展非常好 往副本集里添加实例和移除实例都非常方便

往MongoDB副本集添加实例数据能够自动同步 无需人工干预

往现有的MongoDB副本集中添加实例

创建27020实例 注意副本集名称要保持一致replSetName: mgtest

use admin

rs.add(‘192.168.128.163:27020’) #所有数据自动同步

rs.add的优先权重默认为1

从MongoDB副本机制移除实例 不可移除primary

use admin

rs.remove(‘192.168.128.163:27020’)

rs.remove(‘192.168.128.162:27017’)

副本集经过添加删除后顺序会乱 设置权重需要注意

先rs.config()获取实例的位置 再修改优先级

rs.add(‘192.168.128.162:27017’)

MongoDB的备份和恢复

单台服务器一定需要备份

MongoDB有提供mongodump工具用来备份数据

MongoDB也有提供mongorestore工具来恢复数据

MongoDB备份说明 指定ip和端口

单台服务器直接使用mongodump进行备份

副本集需要连接到primary上进行备份

数据清空 启动单台MongoDB

systenLog:

destination: file

logAppend: true

path: /data/mongodb/27017/logs/mongodb.log

storage:

dbPath: /data/mongodb/27017/data/

journal:

enabled: true

processManagement:

fork: true

net:

port: 27017

bindIp: 192.168.128.162

:%/27017/27018/g #vim全局替换

MongoDB数据库备份 备份所有库

/usr/local/mongodb/bin/mongodump -h 192.168.128.162 –port 27017 -o /data/backup/

也可以-h ip:port

ll -h /data/backup/

MongoDB数据库的恢复

创建个新MongoDB实例27018

/usr/local/mongodb/bin/mongorestore -h 192.168.128.162 –port 27018 /data/backup/

使用Python简单操作MongoDB

使用程序操作MongoDB

MongoDB可以使用java Python PHP等语言去操作

运维使用Python居多 介绍使用Python操作MongoDB数据库

使用Python操作MongoDB 需要使用pip安装pymongo模块

yum install -y epel-release

yum install -y python2-pip

#yum install -y python34-pip

pip install pymongo

连接代码 单实例的连接代码

import pymongo

client = pymongo.MongoClient(‘192.168.128.162’,27017)

mgtest = client.mgtest

myuser = mgtest.myuser

for item in myuser.find():

print(item)

pymongo副本集的连接代码 代码支持自动切换

import pymongo

client = pymongo.MongoClient([‘192.168.128.162:27017′,’192.168.128.162:27018′,’192.168.128.162:27019′,192.168.128.162:27020’])

mgtest = client.mgtest

myuser = mgtest.myuser

myvar = {‘age’:28,’name’:’mgtest1′} #down掉一个实例 测试insert 数据

myuser.insert(myvar)

for item in myuser.find():

print(item)

python获取MongoDB的状态信息

MongoDB监控

使用Python去监控MongoDB状态

获取MongoDB的serverStatus状态信息,一般状态信息需要每个实例都进行监控

import pymongo

client = pymongo.MongoClient(‘192.168.128.162:27017’)

db = client.admin

serverStatus = db.command(‘serverStatus’)

print(serverStatus)

每个状态信息单独打印

import pymongo

client = pymongo.MongoClient(‘192.168.128.162:27017’)

db = client.admin

serverStatus = db.command(‘serverStatus’)

for key,value in serverStatus.items():

print(key,value)

print()

MongoDB建议的监控方向

connection #连接信息

network #流量信息

opcounters #增删改查

状态信息获取

import pymongo

client = pymongo.MongoClient(‘192.168.128.162:27017’)

db = client.admin

serverStatus = db.command(‘serverStatus’)

print(serverStatus[‘connection’])

print(serverStatus[‘network’])

print(serverStatus[‘opcounters’])

print(serverStatus[‘opcounters’][‘query’])

print(serverStatus[‘opcounters’][‘insert’])

print(serverStatus[‘opcounters’][‘update’])

print(serverStatus[‘opcounters’][‘delete’])

MongoDB分片

不是大企业 一般用的比较少 需要较多的服务器 有三种角色

一般吧MongoDB的副本集应用的好就足够了 可搭建多套MongoDB副本集

MongoDB分片技术

MongoDB副本集可以解决数据备份 读性能的问题 但由于MongoDB副本是每份数据都一模一样的 无法解决数据量过大的问题

MongoDB分片技术能够把数据分成两份存储 假如mgtest.myuser里面有1亿条数据 分片能够实现5千万左右存储在mongodb1,5千万左右存储在MongoDB2里

MongoDB1,MongoDB2需要使用副本集的形式 预防数据丢失

生产环境中如果数据量不大 直接使用副本集即可 数据量大 使用分片+副本集

MongoDB分片集群角色介绍

route角色 #MongoDB的路由 提供入口 使得分片集群对外透明 router不存储数据

configsvr角色 #MongoDB的配置服务 存储元数据信息 分片集群后端有多分存储 读取数据改去哪个存储上读取 依赖于元数据 建议使用副本集

shardsvr角色 #MongoDB的存储服务 存储真正的数据 建议使用副本集

依赖关系

当用户通过route角色插入数据时 需要从configsvr知道这份数据插入到哪个节点 然后执行插入动作插入数据到shardsvr

当用户通过route角色获取数据时 需要从configsvr知道这份数据是存储在哪个节点 然后再去shardsvr获取数据

MongoDB分片集群的搭建说明

使用同一份MongoDB二进制包

修改对应的配置就能实现分片集群的搭建

MongoDB分片集群实战环境搭建说明

configsvr #使用28017,28018,28019三个端口来搭建

route #使用27017,27018,27019三个端口来搭建

shardsvr #使用29017,29018,29019,29020四个端口来搭建 生产环境使用三个端口一个集群

MongoDB配置角色configsvr的搭建 配置文件路径/data/mongodb/28017/conf/mongodb.conf

systemLog:

destination: file

logAppend: true

path: /data/mongodb/28017/logs/mongodb.log

storage:

dbPath: /data/mongodb/28017/data/

journal:

enabled: true

processManagement:

fork: true

net:

port: 28017

bindIp: 192.168.128.162

replication:

replSetName: mgtestconf

sharding:

clusterRole: configsvr

#28018 28019 …

启动3个实例

分片集群的配置角色副本集搭建

config = {_id:”mgtestconf”,

configsvr: true,

members:[

{_id:0,host:”192.168.128.162:28017″},

{_id:0,host:”192.168.128.162:28018″},

{_id:0,host:”192.168.128.162:28019″}

]

}

rs.initiate(config)

验证是否搭建成功

mongod 192.168.128.162:28017

rs.status()

####分片集群的route角色

route说明

MongoDB中的router角色只负责提供一个入口 不存储任何的数据

MongoDB分片集群之router角色配置/data/mongodb/27017/conf/mongodb.conf

systemLog:

destination: file

logAppend: true

path: /data/mongodb/27017/logs/mongodb.log

processManagement:

fork: true

net:

port: 27017

bindIp: 192.168.128.162

sharding:

configDB: mgtestconf/192.168.128.162:28017,192.168.128.162:28018,192.168.128.162:28019

router最重要的配置

指定configsvr的地址 使用副本集ip:port的方式指定

配置多个router 任何一个都能正常的获取数据

router的启动

mongos -f /data/mongodb/27017/conf/mongodb.conf

router验证

需要等到数据角色(sharedsvr)搭建完成才能验证

#####mongodb分片集群sharedsvr数据角色的实战部署

分片集群的数据角色里面存储着真正的数据 所以数据角色一定得使用副本集

MongoDB的数据服务配置文件/data/mongodb/29017/conf/mongodb.conf

systemLog:

destination: file

logAppend: true

path: /data/mongodb/29017/logs/mongodb.log

storage:

dbPath: /data/mongodb/29017/data/

journal:

enabled: true

precessManagement:

fork: true

net:

port: 29017

bindIp: 192.168.128.162

replication:

replSetName: mgtestdata1

sharding:

clusterRole: shardsvr

数据服务两个集群说明

29017 29018 29019 数据角色mgtestdata1

29020 29021 29022 数据角色mgtestdata2

…………………mgtestdata3

启动6个实例

mongod -f 29017/mongodb.conf

…..

29017集群数据角色mgtestdata1

config = {_id:”mgtestdata1″,

members:[

{_id:0,host:”192.168.128.162:29017″},

{_id:0,host:”192.168.128.162:29018″},

{_id:0,host:”192.168.128.162:29019″}

]

}

rs.initiate(config)

29020…集群mgtestdata2

config = {_id:”mgtestdata1″,

members:[

{_id:0,host:”192.168.128.162:29020″},

{_id:0,host:”192.168.128.162:29021″},

{_id:0,host:”192.168.128.162:29022″}

]

}

rs.initiate(config)

服务器分配

6台服务器

mgtestdata1 3台

mgtestdata2 3台 配置角色 路由角色

######MongoDB分片集群使用

分片集群添加数据角色 连接到路由角色里面配置 数据角色为副本集的方式

/usr/local/mongodb/bin/mongo 192.168.128.162:27017

sh.addShard(“mgtestdata1/192.168.128.162:29017,192.168.128.162:29018”)

sh.addShard(“mgtestdata2/192.168.128.162:29019,192.168.128.162:29020”)

sh.status()

默认添加数据没有分片存储 操作都是在路由角色里面

use mgtest

for(i=1;i<=500;i++){

db.myuser.insert({name: ‘mytest’+1,age:i})

}

db.dropDatabase() #验证完后删除

针对某个数据库的某个表使用hash分片存储 分片存储就会同一个collection分配两个数据角色

use admin

db.runCommand({enablesharding:”mgtest”}); #启用分片

db.runCommand({shardcollection:”mgtest.myuser”,key:{_id:”hashed”}})

插入数据校验 分布在两个数据集群上

use mgtest

for(i=1;i<=2000;i++){

db.myuser.insert({name: ‘mytest’+1,age:i})

}

配置角色挂掉一个会不会有影响

验证mongos多个入口是否能够正常使用

—–副本集+sharing——-

架构规划

192.168.128.170 节点1 192.168.128.171 节点2 192.168.128.172 节点3

mongos:10005 mongos:10005 mongos:10005

configsvr:10004 configsvr:10004 configsvr:10004

shard1:10001(主节点) shard1:10001(副本) shard1:10001(仲裁)

shard1:10002(仲裁节点) shard1:10002(主节点) shard1:10002(副本)

shard1:10003(副本) shard1:10003(仲裁) shard1:10003(主节点)

目录规划

data目录 config 目录 logs 目录

/data/mongo_cluster/config/ /data/mongo_cluster/logs/

/data/mongo_cluster/shard1/ /data/mongo_cluster/shard1/shard1.conf /data/mongo_cluster/logs/shard1/shard1.log

/data/mongo_cluster/shard2/ /data/mongo_cluster/shard2/shard2.conf /data/mongo_cluster/logs/shard1/shard2.log

/data/mongo_cluster/shard3/ /data/mongo_cluster/shard3/shard3.conf /data/mongo_cluster/logs/shard1/shard3.log

/data/mongo_cluster/mongos/ /data/mongo_cluster/mongos.conf /data/mongo_cluster/logs/mongos/mongos.log

/data/mongo_cluster/logs/

/data/mongo_cluster/configsvr/ /data/mongo_cluster/configsvr/configsvr.conf /data/mongo_cluster/configsvr/logs/configsvr.log

/data/mongo_cluster/keyfile/

节点概述

192.168.128.170、shard1:10001、shard2:10002、shard3:10003、configsvr:10004、mongos:10005

注:shard1主节点,shard2仲裁,shard3副本

192.168.128.171、shard1:10001、shard2:10002、shard3:10003、configsvr:10004、mongos:10005

注:shard1副本,shard2主节点,shard3仲裁

192.168.128.172、shard1:10001、shard2:10002、shard3:10003、configsvr:10004、mongos:10005

注:shard1仲裁,shard2副本,shard3主节点

mgd-node1:192.168.128.170

mgd-node2:192.168.128.171

mgd-node3:192.168.128.172

用户创建

useradd mongodb

passwd mongodb

mongodb

mkdir -pv /data/mongo_cluster/ && chown -R mongodb. /data/mongo_cluster/

su – mongodb

mkdir /data/mongo_cluster/{config,shard1,shard2,shard3,mongos,logs,configsvr,keyfile} -pv

touch /data/mongo_cluster/keyfile/zxl

touch /data/mongo_cluster/logs/shard{1..3}.log

touch /data/mongo_cluster/logs/{configsvr,mongos}.log

touch /data/mongo_cluster/config/shard{1..3}.conf

touch /data/mongo_cluster/config/{configsvr,mongos}.conf

下载

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz

tar xf mongodb-linux-x86_64-3.6.13.tgz -C /data/mongo_cluster/

cd /data/mongo_cluster/ && ln -s mongodb-linux-x86_64-3.6.13 mongodb

echo “export PATH=$PATH:/data/mongodb/bin” >> ~/.bash_profile

source ~/.bash_profile

shard1.conf配置文件内容

cat /data/mongo_cluster/config/shard1.conf

systemLog:

destination: file

path: /data/mongo_cluster/logs/shard1.log

logAppend: true

processManagement:

fork: true

pidFilePath: “/data/mongo_cluster/shard1/shard1.pid”

net:

port: 10001

storage:

dbPath: “/data/mongo_cluster/shard1”

engine: wiredTiger

journal:

enabled: true

directoryPerDB: true

operationProfiling:

slowOpThresholdMs: 10

mode: “slowOp”

#security:

# keyFile: “/data/mongo_cluster/keyfile/zxl”

# clusterAuthMode: “keyFile”

replication:

oplogSizeMB: 50

replSetName: “shard1_zxl”

secondaryIndexPrefetch: “all”

——shard2.conf配置文件内容如下————

systemLog:

destination: file

path: /data/mongo_cluster/logs/shard2.log

logAppend: true

processManagement:

fork: true

pidFilePath: “/data/mongo_cluster/shard2/shard2.pid”

net:

port: 10002

storage:

dbPath: “/data/mongo_cluster/shard2”

engine: wiredTiger

journal:

enabled: true

directoryPerDB: true

operationProfiling:

slowOpThresholdMs: 10

mode: “slowOp”

#security:

# keyFile: “/data/mongo_cluster/keyfile/zxl”

# clusterAuthMode: “keyFile”

replication:

oplogSizeMB: 50

replSetName: “shard2_zxl”

secondaryIndexPrefetch: “all”

———shard3.conf配置文件内容如下——-

systemLog:

destination: file

path: /data/mongo_cluster/logs/shard3.log

logAppend: true

processManagement:

fork: true

pidFilePath: “/data/mongo_cluster/shard3/shard3.pid”

net:

port: 10003

storage:

dbPath: “/data/mongo_cluster/shard3”

engine: wiredTiger

journal:

enabled: true

directoryPerDB: true

operationProfiling:

slowOpThresholdMs: 10

mode: “slowOp”

#security:

# keyFile: “/data/mongo_cluster/keyfile/zxl”

# clusterAuthMode: “keyFile”

replication:

oplogSizeMB: 50

replSetName: “shard3_zxl”

secondaryIndexPrefetch: “all”

——configsvr.conf配置文件内容如下—

systemLog:

destination: file

path: /data/mongo_cluster/logs/configsvr.log

logAppend: true

processManagement:

fork: true

pidFilePath: “/data/mongo_cluster/configsvr/configsvr.pid”

net:

port: 10004

storage:

dbPath: “/data/mongo_cluster/configsvr”

engine: wiredTiger

journal:

enabled: true

#security:

# keyFile: “/data/mongo_cluster/keyfile/zxl”

# clusterAuthMode: “keyFile”

sharding:

clusterRole: configsvr

———mongos.conf配置文件内容如下———-

systemLog:

destination: file

path: /data/mongo_cluster/logs/mongos.log

logAppend: true

processManagement:

fork: true

pidFilePath: /data/mongo_cluster/mongos/mongos.pid

net:

port: 10005

sharding:

configDB: 192.168.42.41:10004,192.168.42.42:10004,192.168.42.43:10004

#security:

# keyFile: “/data/mongo_cluster/keyfile/zxl”

# clusterAuthMode: “keyFile”

注:以上操作只是在node1机器上操作,请把上面这些操作步骤在另外2台机器操作一下,

包括创建用户创建目录文件以及安装mongodb等,以及文件拷贝到node2、node3对应的目录下,

拷贝之后查看一下文件的属主属组是否为mongodb。

启动各个机器节点的mongod,shard1、shard2、shard3

mongod -f /data/mongo_cluster/config/shard1.conf

mongod -f /data/mongo_cluster/config/shard2.conf

mongod -f /data/mongo_cluster/config/shard3.conf

配置复制集

node1机器上操作配置复制集

[mongodb@node1 config]$ mongo --port 10001
MongoDB shell version: 3.2.3
connecting to: 127.0.0.1:10001/test
> use admin
switched to db admin
> config = { _id:"shard1_zxl", members:[
... ... {_id:0,host:"192.168.42.41:10001"},
... ... {_id:1,host:"192.168.42.42:10001"},
... ... {_id:2,host:"192.168.42.43:10001",arbiterOnly:true}
... ... ]
... ... }
{
"_id" : "shard1_zxl",
"members" : [
{
"_id" : 0,
"host" : "192.168.42.41:10001"
},
{
"_id" : 1,
"host" : "192.168.42.42:10001"
},
{
"_id" : 2,
"host" : "192.168.42.43:10001",
"arbiterOnly" : true
}
]
}
> rs.initiate(con
config connect( connectionURLTheSame( constructor
> rs.initiate(config)
{ "ok" : 1 }

node2机器上操作配置复制集

[mongodb@node2 config]$ mongo --port 10002
MongoDB shell version: 3.2.3
connecting to: 127.0.0.1:10002/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> use admin
switched to db admin
> config = { _id:"shard2_zxl", members:[
... ... {_id:0,host:"192.168.42.42:10002"},
... ... {_id:1,host:"192.168.42.43:10002"},
... ... {_id:2,host:"192.168.42.41:10002",arbiterOnly:true}
... ... ]
... ... }
{
"_id" : "shard2_zxl",
"members" : [
{
"_id" : 0,
"host" : "192.168.42.42:10002"
},
{
"_id" : 1,
"host" : "192.168.42.43:10002"
},
{
"_id" : 2,
"host" : "192.168.42.41:10002",
"arbiterOnly" : true
}
]
}
> rs.initiate(config)
{ "ok" : 1 }

node3机器上操作配置复制集

[mongodb@node3 config]$ mongo --port 10003
MongoDB shell version: 3.2.3
connecting to: 127.0.0.1:10003/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> use admin
switched to db admin
> config = {_id:"shard3_zxl", members:[
... ... {_id:0,host:"192.168.42.43:10003"},
... ... {_id:1,host:"192.168.42.41:10003"},
... ... {_id:2,host:"192.168.42.42:10003",arbiterOnly:true}
... ... ]
... ... }
{
"_id" : "shard3_zxl",
"members" : [
{
"_id" : 0,
"host" : "192.168.42.43:10003"
},
{
"_id" : 1,
"host" : "192.168.42.41:10003"
},
{
"_id" : 2,
"host" : "192.168.42.42:10003",
"arbiterOnly" : true
}
]
}
> rs.initiate(config)
{ "ok" : 1 }

注:以上是配置rs复制集,相关命令如:rs.status(),查看各个复制集的状况

启动三台机器上的configsvr和mongos节点

[mongodb@node1 logs]$ mongod -f /data/config/configsvr.conf
about to fork child process, waiting until server is ready for connections.
forked process: 6317
child process started successfully, parent exiting
[mongodb@node1 logs]$ mongos -f /data/config/mongos.conf
about to fork child process, waiting until server is ready for connections.
forked process: 6345
child process started successfully, parent exiting

查看端口是否启动:

[mongodb@elk_node1 ~]$ ss -atunlp|grep mong
tcp LISTEN 0 128 *:10001 *:* users:(("mongod",2630,6))
tcp LISTEN 0 128 *:10002 *:* users:(("mongod",2654,6))
tcp LISTEN 0 128 *:10003 *:* users:(("mongod",2678,6))
tcp LISTEN 0 128 *:10004 *:* users:(("mongod",3053,6))
tcp LISTEN 0 128 *:10005 *:* users:(("mongos",3157,21))

配置shard分片

在node1机器上配置shard分片

[mongodb@node1 config]$ mongo --port 10005
MongoDB shell version: 3.2.3
connecting to: 127.0.0.1:10005/test
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"shard1_zxl/192.168.42.41:10001,192.168.42.42:10001,192.168.42.43:10001"});
{ "shardAdded" : "shard1_zxl", "ok" : 1 }
mongos> db.runCommand({addshard:"shard2_zxl/192.168.42.41:10002,192.168.42.42:10002,192.168.42.43:10002"});
{ "shardAdded" : "shard2_zxl", "ok" : 1 }
mongos> db.runCommand({addshard:"shard3_zxl/192.168.42.41:10003,192.168.42.42:10003,192.168.42.43:10003"});
{ "shardAdded" : "shard3_zxl", "ok" : 1 }

查看shard信息

mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("56de6f4176b47beaa9c75e9d")
}
shards:
{ "_id" : "shard1_zxl", "host" : "shard1_zxl/192.168.42.41:10001,192.168.42.42:10001" }
{ "_id" : "shard2_zxl", "host" : "shard2_zxl/192.168.42.42:10002,192.168.42.43:10002" }
{ "_id" : "shard3_zxl", "host" : "shard3_zxl/192.168.42.41:10003,192.168.42.43:10003" }
active mongoses:
"3.2.3" : 3
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:

查看分片状态

mongos> db.runCommand( {listshards : 1 } )
{
"shards" : [
{
"_id" : "shard1_zxl",
"host" : "shard1_zxl/192.168.42.41:10001,192.168.42.42:10001"
},
{
"_id" : "shard2_zxl",
"host" : "shard2_zxl/192.168.42.42:10002,192.168.42.43:10002"
},
{
"_id" : "shard3_zxl",
"host" : "shard3_zxl/192.168.42.41:10003,192.168.42.43:10003"
}
],
"ok" : 1
}

启用shard分片的库名字为’zxl’,即为库

mongos> sh.enableSharding(“zxl”)

{ “ok” : 1 }

设置集合的名字以及字段,默认自动建立索引,zxl库,haha集合

mongos> sh.shardCollection(“zxl.haha”,{age: 1, name: 1})

{ “collectionsharded” : “zxl.haha”, “ok” : 1 }

模拟在haha集合中插入10000数据

mongos> for (i=1;i<=10000;i++) db.haha.insert({name: “user”+i, age: (i%150)})

WriteResult({ “nInserted” : 1 })

可以使用上面mongos> sh.status()命令查看各个shard分片情况,以上就是复制集和shard分片搭建完成。

结果如下:

mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("56de6f4176b47beaa9c75e9d")
}
shards:
{ "_id" : "shard1_zxl", "host" : "shard1_zxl/192.168.42.41:10001,192.168.42.42:10001" }
{ "_id" : "shard2_zxl", "host" : "shard2_zxl/192.168.42.42:10002,192.168.42.43:10002" }
{ "_id" : "shard3_zxl", "host" : "shard3_zxl/192.168.42.41:10003,192.168.42.43:10003" }
active mongoses:
"3.2.3" : 3
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
2 : Success
databases:
{ "_id" : "zxl", "primary" : "shard3_zxl", "partitioned" : true }
zxl.haha
shard key: { "age" : 1, "name" : 1 }
unique: false
balancing: true
chunks:
shard1_zxl1
shard2_zxl1
shard3_zxl1
{ "age" : { "$minKey" : 1 }, "name" : { "$minKey" : 1 } } -->> { "age" : 2, "name" : "user2" } on : shard1_zxl Timestamp(2, 0)
{ "age" : 2, "name" : "user2" } -->> { "age" : 22, "name" : "user22" } on : shard2_zxl Timestamp(3, 0)
{ "age" : 22, "name" : "user22" } -->> { "age" : { "$maxKey" : 1 }, "name" : { "$maxKey" : 1 } } on : shard3_zxl Timestamp(3, 1)

–mongodb.conf—

systemLog:

destination: file #日志输出的目的地 指定一个file 或者syslog 如果指定file 必须指定logAppend

logAppend: true

path: /data/mongo_cluster/mongo_27017/logs/mongo.log

storage:

journal: #回滚日志

enabled: true

dbPath: /data/mongo_cluster/mongo_27017/data #数据目录

directoryPerDB: true #默认false 不适应inmemory engine

wiredTiger:

engineConfig:

cacheSizeGB: 1 #将用于所有数据缓存的最大值

directoryForIndexes: true #默认false 索引集合storage.dbPath存储在数据单独子目录

collectionConfig:

blockCompressor: zlib

indexConfig:

prefixCompression: true

processManagement: #使用出来系统守护进程的控制处理

fork: true

pidFilePath: /data/mongo_cluster/mongo_27017/pid/mongo_27017.pid

net:

port: 27017 #监听端口

bindIp: 192.168.128.171 #绑定 IP

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/5442.html

(0)
上一篇 2022-12-13 23:13
下一篇 2022-12-13 23:13

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信