0%

MongoDB收集

劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。 —— 唐·无名氏 《金缕衣》

一、安装MongoDB

通过添加repo源方式

  1. 添加repo源 /etc/yum.repos.d/mongodb-org-4.0.repo

  2. 编辑repo源,加入以下内容

    1
    2
    3
    4
    5
    6
    [mongodb-org-4.0]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
  3. 安装 sudo yum install -y mongodb-org

    • 可指定安装版本 sudo yum install -y mongodb-org-4.0.9 mongodb-org-server-4.0.9 mongodb-org-shell-4.0.9 mongodb-org-mongos-4.0.9 mongodb-org-tools-4.0.9
    • 关闭自动更新,编辑/etc/yum.conf文件加入以下内容 exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

通过源码安装

  1. 下载源码 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.9.tgz
  2. 解压并指定位置 tar -zxvf mongodb-linux-x86_64-rhel70-4.0.9.tgz -C /usr/local
  3. 重命名 mv mongodb-linux-x86_64-rhel70-4.0.9 /usr/local/mongodb-4.0.9
  4. cd /usr/local/mongodb-4.0.9
  5. 创建data和logs目录 mkdir data && mkdir logs && touch ./logs/mongo.log
  6. 创建mongodb.conf
1
2
3
4
5
6
7
8
9
10
11
7. 编辑mongodb.conf,加入以下内容

dbpath = /usr/local/mongodb-4.0.9/data
logpath = /usr/local/mongodb-4.0.9/log/mongo.log
port = 27017
fork = true
logappend=true
maxConns=5000
#storageEngine=wiredtiger #可不写此项,3.2版本后默认,3.2之前默认mmapv1

8. 启动服务 mongod -f mongodb.conf

通过以上7/8步骤后不能启动,换成如下方式启动成功

  1. 启动服务 mongod --dbpath=/usr/local/mongodb-4.0.9/data --logpath=/usr/local/mongodb-4.0.9/log/mongo.log --logappend --fork
    • mongod --help可查看更多参数设置
    • 社区版中提供的mongo二进制文件不支持–ssl选项

通过rpm方式

  1. 下载rpm文件
    • mongodb-org-server-4.0.9-1.el7.x86_64.rpm
    • mongodb-org-3.2.9-1.el7.x86_64.rpm
    • mongodb-org-server-3.2.9-1.el7.x86_64.rpm
    • mongodb-org-tools-3.2.9-1.el7.x86_64.rpm
    • mongodb-org-mongos-3.2.9-1.el7.x86_64.rpm
    • mongodb-org-shell-3.2.9-1.el7.x86_64.rpm
  2. 安装各个rpm rpm -ivh mongodb-*.rpm

二、Mac下安装

源码安装

  1. 下载 https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.11.tgz/usr/local/src
  2. 解压 sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.11.tgz
  3. 移动 sudo mv mongodb-osx-x86_64-4.0.11 /usr/local/mongodb-4.0.11
  4. 切换目录 cd /usr/local/mongodb-4.0.11
  5. 初始化数据目录和日志目录和日志文件 mkdir data && sudo mkdir logs && sudo touch ./logs/mongo.log
  6. 创建配置文件 sudo touch mongodb.conf,加入以下内容:
  7. 修改权限 sudo chmod -R 777 /usr/local/mongodb-4.0.11
1
2
3
4
5
6
7
8
dbpath = /usr/local/mongodb-4.0.11/data
logpath = /usr/local/mongodb-4.0.11/logs/mongo.log
port = 27017 ## 指定端口
fork = true ## 一后台进程方式启动
logappend=true ## 以追加方式记录日志
#maxConns=5000 ## 最大连接数
#storageEngine=mmapv1 ## 指定存储引擎,3.2+版本默认wireTiger
#nohttpinterface = true ## 2.6+版本已废弃
  • MAC下新版本(4.2.1)指定storageEngine=mmapv1选项时会报错,4.2已废弃此引擎,默认wiredTiger
  • MAC下提示Error parsing INI config file: unrecognised option 'nohttpinterface'

配置参数

  1. 启动服务 ./bin/mongod -f mongodb.conf,成功则有如下信息:
1
2
3
about to fork child process, waiting until server is ready for connections.
forked process: 80348
child process started successfully, parent exiting
  1. 进入mongo./bin/mongo --port 27017
    • 查看db支持的系统方法db.help()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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.commandHelp(name) returns the help for the command
db.copyDatabase(fromdb, todb, fromhost) - will only function with MongoDB 4.0 and below
db.createCollection(name, {size: ..., capped: ..., max: ...})
db.createUser(userDocument)
db.createView(name, viewOn, [{$operator: {...}}, ...], {viewOptions})
db.currentOp() displays currently executing operations in the db
db.dropDatabase(writeConcern)
db.dropUser(username)
db.eval() - deprecated
db.fsyncLock() flush data to disk and lock server for backups
db.fsyncUnlock() unlocks server following a db.fsyncLock()
db.getCollection(cname) same as db['cname'] or db.cname
db.getCollectionInfos([filter]) - returns a list that contains the names and options of the db's collections
db.getCollectionNames()
db.getLastError() - just returns the err msg string
db.getLastErrorObj() - return full status object
db.getLogComponents()
db.getMongo() get the server connection object
db.getMongo().setSlaveOk() allow queries on a replication slave server
db.getName()
db.getProfilingLevel() - deprecated
db.getProfilingStatus() - returns if profiling is on and slow threshold
db.getReplicationInfo()
db.getSiblingDB(name) get the db at the same server as this one
db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set
db.hostInfo() get details about the server's host
db.isMaster() check replica primary status
db.killOp(opid) kills the current operation in the db
db.listCommands() lists all the db commands
db.loadServerScripts() loads all the scripts in db.system.js
db.logout()
db.printCollectionStats()
db.printReplicationInfo()
db.printShardingStatus()
db.printSlaveReplicationInfo()
db.resetError()
db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj: 1}
db.serverStatus()
db.setLogLevel(level,<component>)
db.setProfilingLevel(level,slowms) 0=off 1=slow 2=all
db.setVerboseShell(flag) display extra information in shell output
db.setWriteConcern(<write concern doc>) - sets the write concern for writes to the db
db.shutdownServer()
db.stats()
db.unsetWriteConcern(<write concern doc>) - unsets the write concern for writes to the db
db.version() current version of the server
db.watch() - opens a change stream cursor for a database to report on all changes to its non-system collections.

命令安装

三、php扩展安装

  1. 下载wget http://pecl.php.net/get/mongodb-1.5.3.tgz
  2. 解压tar -zxvf mongodb-1.5.3.tgz
  3. cd mongodb-1.5.3
  4. /path/phpize
  5. ./configure –with-php-config=/path/php-config
  6. make && make install
    • 报错 /usr/local/src/mongodb-1.5.3/src/libmongoc/src/libmongoc/src/mongoc/mongoc-rand-common-crypto.c:25:10: fatal error:'Security/Security.h' file not found
  7. 解决
    • cd mongodb-1.5.3/include
    • ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Security.framework/Versions/A/Headers/ Security
    • ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/ CoreFoundation
  8. make && make install
  9. 参考

四、各种问题

  1. MongoDB时间范围查询与like查询

五、进阶列表

  1. 常见问题处理

    • 连接问题
      • 连接超时
        • 测试链路是否通畅telnet IP/Domain port
      • 鉴权失败
        • 用户或密码错误
        • 用户权限不对
      • not master and slaveOk=false
        • 默认情况下MongoDB的读写请求都必须到Primary节点,Secondary是不可读的,设置Secondary可读:rs.slaveOk()
      • Connection reset by peer
        • 实例的连接数已经达到上限,无法再建立更多的网络连接
        • 连接数问题
          • 查看当前连接数:db.serverStatus().connections
          • 查看连接具体信息:db.runCommand({currentOp: 1, $all: true})
          • 限制连接数数量:在Connection String URI Format末尾添加&maxPoolSize=num
    • 负载问题
      • CPU利用率很高,查看实例正在执行的操作:db.currentOp()
        • 造成实例负载高的典型case
          • 并发请求的量太大,超出当前规格的服务能力
          • 查询集合时没有合理的建索引,导致全表扫描或排序
          • 正在跑一些计算量很大的mapreduce或者aggregation任务
        • kill操作:db.killOp(opid),opid来自第一步db.currentOp()
  2. 使用正确的姿势连接复制集

    • Primary节点不是固定的
      • MongoDB复制集里Primary节点是不固定的,当遇到复制集轮转升级、Primary宕机、网络分区等场景时复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换。
      • 当连接复制集时,如果直接指定Primary的地址来连接,当时可能可以正确读写数据的,一旦发生主备切换,原来的Primary会降级为Secondary,此时将无法继续执行写操作,切不可以直连Primary地址。
    • 连接时使用Connection String URI Format,如PHP连接时mongodb://user:'.rawurlencode('password').'@aaap.mongodb.xxx.rds.aliyuncs.com:3717,aaas.mongodb.xxx.rds.aliyuncs.com:3717?replicaSet=mgset-1234
  3. 使用正确的姿势连接分片集群

    • 用户访问分片集群跟访问单个实例类似
    • 连接时使用和复制集类似,如PHP连接时:mongodb://user:'.rawurlencode('password').'@aaap.mongodb.xxx.rds.aliyuncs.com:3717,aaas.mongodb.xxx.rds.aliyuncs.com:3717,即没有指定复制集名称。
  4. 参考