MongoDB简单使用操作
本文简单介绍了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
数据库安装
下载安装包
# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.10.tgz
解压
# tar -zxvf mongodb-linux-x86_64-rhel70-4.0.10.tgz -C /opt/mongodb/
安装依赖
# yum -y install libcurl openssl
添加环境变量
# vim /etc/profile
export PATH=/opt/mongodb/mongodb-linux-x86_64-rhel70-4.0.10 bin:$PATH
# source /etc/profile
查看是否安装成功
# 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
创建mongod用户
# useradd mongod
更改mongodb安装目录用户组
# chown mongod:mongod -R mongodb/
切换到mongod用户
# su mongod
注:以下全部为在mongod用户下进行的操作创建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
创建目录
$ mkdir /opt/mongodb/datas/data0
$ mkdir /opt/mongodb/datas/logs
启动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
关闭mongod服务
$ mongod --shutdown -f /opt/mongodb/datas/configs/mongod0.conf
进入shell
mongo --port 20001
配置副本集群
- 配置文件示例
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
- 初始化集群
> rs.initiate({_id:"myRep", members:[{_id:0, host:"192.168.5.52:30001"},{_id:1, host:"192.168.5.53:30001"}]})
- 为集群添加仲裁节点
> rs.addArb("192.168.5.51:30001")
- 查看集群状态
> 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
- 编辑文件:/etc/sysctl.conf ,添加一行:vm.swappiness=1
- 参考文章:https://www.staroon.dev/2018/11/30/CDH6Performance/
禁用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/
- 编辑/etc/rc.d/rc.local文件,最下面添加两行配置:
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
- 停止集群中所有节点mongod服务
- 重新启动所有节点服务,不使用–replSet选项,使用不同于集群的端口号,并指定dbpath路径
mongod --dbpath /opt/mongod/data --port 30002
- 登陆mongo shell修改副本集配置
> use local
- 查看原配置
> db.system.replset.find()
- 在原配置基础上修改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 } } }
- 更新配置
> db.system.replset.update( { "_id": "myRep" } , cfg )
- 退出mongo shell
- 重新按照正常配置开启 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