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`
    配置示例:
    ```profile
    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
  5. 创建目录
    $ mkdir /opt/mongodb/datas/data0
    $ mkdir /opt/mongodb/datas/logs

  6. 启动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
  7. 关闭mongod服务
    $ mongod --shutdown -f /opt/mongodb/datas/configs/mongod0.conf

  8. 进入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://blog.holoyoo.com/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