MongoDB简单使用操作

Author Avatar
山小杰 10月 01, 2019
  • 在其它设备中阅读本文章

本文简单介绍了MongoDB在Linux下的简单安装和配置操作,基于MongoDB 4.0.10,CentOS版本7.2。

官方推荐操作系统:

  • Amazon Linux
  • Debian 8
  • RHEL/CentOS 6.2+
  • SLES 12
  • Ubuntu LTS 16.04
  • Windows Server 2012 R2

数据库安装

  1. 下载安装包
    # wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.10.tgz

  2. 解压
    # tar -zxvf mongodb-linux-x86_64-rhel70-4.0.10.tgz -C /opt/mongodb/

  3. 安装依赖
    # yum -y install libcurl openssl

  4. 添加环境变量
    # vim /etc/profile

     export PATH=/opt/mongodb/mongodb-linux-x86_64-rhel70-4.0.10
     bin:$PATH
    

    # source /etc/profile

  5. 查看是否安装成功
    # mongod --version

     db version v4.0.10
     git version: c389e7f69f637f7a1ac3cc9fae843b635f20b766
     OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
     allocator: tcmalloc
     modules: none
     build environment:
         distmod: rhel70
         distarch: x86_64
         target_arch: x86_64
    
  6. 创建mongod用户
    # useradd mongod

  7. 更改mongodb安装目录用户组
    # chown mongod:mongod -R mongodb/

  8. 切换到mongod用户
    # su mongod
    注:以下全部为在mongod用户下进行的操作

  9. 创建config文件
    $ vim /opt/mongodb/datas/configs/mongod0.conf
    配置示例:

     systemLog:
        destination: file
        path: "/opt/mongodb/datas/logs/mongod0.log"
        logAppend: true
     storage:
        dbPath: /opt/mongodb/datas/data0
        journal:
           enabled: true
     processManagement:
        fork: true
        pidFilePath: /opt/mongodb/datas/logs/mongod0.pid
     net:
        # 配置127.0.0.1只允许本机连接mongodb服务
        # bindIp: 127.0.0.1
        # 配置0.0.0.0可允许所有其他主机连接mongodb服务
        bindIp: 0.0.0.0 
        port: 20001
     setParameter:
        enableLocalhostAuthBypass: false
    
  10. 创建目录
    $ mkdir /opt/mongodb/datas/data0
    $ mkdir /opt/mongodb/datas/logs

  11. 启动mongod服务
    $ mongod -f /opt/mongodb/datas/configs/mongod0.conf

    about to fork child process, waiting until server is ready     for connections.
    forked process: 20240
    child process started successfully, parent exiting
    
  12. 关闭mongod服务
    $ mongod --shutdown -f /opt/mongodb/datas/configs/mongod0.conf

  13. 进入shell
    mongo --port 20001

配置副本集群

  1. 配置文件示例
     systemLog:
        destination: file
        path: "/opt/mongod/log/mongod82.log"
        logAppend: true
     storage:
        dbPath: /opt/mongod/data
        journal:
           enabled: true
        wiredTiger:
           engineConfig:
              cacheSizeGB: 32
     replication:
       replSetName: myRep
     processManagement:
        fork: true
        pidFilePath: /opt/mongod/log/mongod82.pid
     net:
        bindIp: 0.0.0.0
        port: 30001
     setParameter:
        enableLocalhostAuthBypass: false
    
  2. 初始化集群
    > rs.initiate({_id:"myRep", members:[{_id:0, host:"192.168.5.52:30001"},{_id:1, host:"192.168.5.53:30001"}]})
  3. 为集群添加仲裁节点
    > rs.addArb("192.168.5.51:30001")
  4. 查看集群状态
    > rs.status()

其他配置说明

  • dbPath

    • mongod用户必须拥有对配置的dbPath目录的读写权限
    • 目录中的dbPath文件必须与配置的存储引擎相对应。如果dbPath包含由指定的存储引擎以外的存储引擎创建的数据文件,则不会启动
  • WiredTiger

    • 默认WiredTiger内部缓存大小:50%(RAM - 1G) 或者 256MB
    • 默认的WiredTiger内部缓存大小值假定每台计算机有一个MongoDB实例。如果单个计算机包含多个MongoDB实例,则应减少该设置以适应其他mongod 实例。
    • 调整WiredTiger内部缓存参数:storage.wiredTiger.engineConfig.cacheSizeGB
    • 应避免将WiredTiger内部缓存大小增加到其默认值以上
  • Linux 平台的 NUMA 配置(根据实际情况配置)

    • 需要在Linux上禁用zone reclaim
    • 修改方式:sysctl -w vm.zone_reclaim_mode=0
    • 使用numactl启动mongod:numactl –interleave=all mongod -f /etc/mongod.conf
    • 查看系统numa状态:numactl –hardware
  • 存储系统不建议使用NFS

  • 使用NTP同步所有MongoDB节点

  • 文件系统

    • Linux下建议使用XFS
    • Windows下使用NTFS,不要使用任何FAT文件系统
  • 设置vm.swappiness值为1

  • 禁用THP

    • 编辑/etc/rc.d/rc.local文件,最下面添加两行配置:
      • echo never > /sys/kernel/mm/transparent_hugepage/enabled
      • echo never > /sys/kernel/mm/transparent_hugepage/defrag
    • 然后赋予/etc/rc.d/rc.local文件可执行权限:chmod +x /etc/rc.d/rc.local
    • 参考文章:https://www.staroon.dev/2018/11/30/CDH6Performance/
  • RHEL/CentOS 7 下禁用tuned

  • 关闭selinux

  • 后台运行

    • mongod –fork
    • 示例配置:
      systemLog:
       destination: file
       path: "/var/log/mongodb/mongod.log"
       logAppend: true
      storage:
       journal:
          enabled: true
      processManagement:
       fork: true
       pidFilePath: /var/run/mongod.pid
      net:
       bindIp: 127.0.0.1
       port: 27017
      setParameter:
       enableLocalhostAuthBypass: false
      
  • 关闭mongod进程

    • 使用kill -2 <pid>
    • 永远不要使用 kill -9 <pid> 来关闭mongod进程

修改副本集群所有节点IP

  1. 停止集群中所有节点mongod服务
  2. 重新启动所有节点服务,不使用–replSet选项,使用不同于集群的端口号,并指定dbpath路径
    mongod --dbpath /opt/mongod/data --port 30002
  3. 登陆mongo shell修改副本集配置
    > use local
  4. 查看原配置
    > db.system.replset.find()
  5. 在原配置基础上修改IP配置
    > cfg={ "_id" : "myRep", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "192.168.5.53:30001", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 3, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "192.168.5.52:30001", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 2, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "192.168.5.51:30001", "arbiterOnly" : true, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } }
  6. 更新配置
    > db.system.replset.update( { "_id": "myRep" } , cfg )
  7. 退出mongo shell
  8. 重新按照正常配置开启 mongodb 集群,查看集群状态
    mongod -f /opt/mongod/config/mongod.conf

UnrecoverableRollbackError

说明:副本集群某节点宕机后,无法回滚超过一天的数据,导致无法启动
报错信息:

  Rollback failed with unrecoverable error: UnrecoverableRollbackError: not willing to roll back more than 86400 seconds of data.

解决办法:
默认回滚时长为86400秒,即一天时间,可在配置中修改此参数。
配置文件中添加一项配置,并设置合适的数值即可:

setParameter:
   rollbackTimeLimitSecs: 864000