胖胖的枫叶
主页
博客
产品设计
企业架构
全栈开发
效率工具
数据分析
项目管理
方法论
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
主页
博客
产品设计
企业架构
全栈开发
效率工具
数据分析
项目管理
方法论
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
  • 标签索引
  • 2024年

    • 配置Mac环境
    • 业务知识会计管理
    • 业务知识会计基础
    • 业务知识什么是财务
  • 2023年

    • 项目 Boi
  • 2022年

    • 企业架构故障管理
    • 企业架构开发债务
  • 2021年

    • Python3.8 Matplotlib员工数据分析
    • Python3.8 Matplotlib IP折线图
    • Python3.8 词云 IP地址
    • Redis RediSearch
    • Rust第一个CLI程序
    • Rust所有权
    • Rust函数与控制流
    • Rust变量与数据类型
    • Rust入门
    • 企业架构分布式系统
    • 编程式权限设计
    • Java JVM优化
    • SpringBoot MyBatis 批量
    • SpringBoot 测试Mock
    • SpringBoot Redis布隆过滤器
    • CentOS7 Jenkins 部署
    • SpringBoot WebClient
    • Docker Drone 部署
    • SpringBoot MyBatis
    • SpringBoot Redisson
    • SpringBoot MyBatis 雪花算法
    • Java Netty
    • Redis 扫描
    • CentOS7 Jenkins本地部署分级
    • Mac 安装 Neo4j Jupyter
    • Mac OpenJDK11 JavaFX 环境
    • Mac 安装 Jenv
    • SpringBoot Redis 延时队列
    • SpringBoot MDC日志
    • SpringBoot 定时任务
    • CentOS7 Nginx GoAccess
    • SpringBoot MyBatis 分析
    • SpringBoot Lucene
    • 企业架构分布式锁
    • 学习技巧减少学习排斥心理
    • SpringBoot 动态数据源
    • Docker Compose SpringBoot MySQL Redis
    • SpringBoot 阻塞队列
    • Docker Compose Redis 哨兵
    • Docker Compose Redis 主从
    • 网络通信
  • 2020年

    • SpringBoot 延时队列
    • MySQL基础(四)
    • Java 雪花算法
    • Redis Geo
    • 网络通信 Tcpdump
    • Spring SPI
    • Java Zookeeper
    • SpringBoot JMH
    • 网络通信 Wireshark
    • Docker Compose Redis MySQL
    • CentOS7 Docker 部署
    • Netty 源码环境搭建
    • MySQL基础(三)
    • CentOS7 Selenium运行环境
    • CentOS7 Nginx HTTPS
    • Java JMH
    • SpringBoot 修改Tomcat版本
    • Java Eureka 钉钉通知
    • SpringBoot 错误钉钉通知
    • Java JVM
    • Git 合并提交
    • CentOS7 OpenResty 部署
  • 2019年

    • Redis CLI
    • CentOS7 Nginx 日志
    • 编程式代码风格
    • IDEA 插件
    • Skywalking 源码环境搭建
    • SpringBoot Redis 超时错误
    • 编程式 gRPC
    • Java Arthas
    • Docker Compose Redis 缓存击穿
    • Docker ElasticSearch5.6.8 部署
    • Docker Mysql5.7 部署
    • Spring Redis 字符串
    • Docker Zookeeper 部署
    • Docker Redis 部署
    • SpringBoot Dubbo
    • CentOS7 CMake 部署
    • 应用程序性能指标
    • Java Code 递归
    • CentOS7 ELK 部署
    • CentOS7 Sonarqube 部署
    • Java Selenium
    • Java JJWT JUnit4
    • Spring 源码环境搭建
    • Java JUnit4
    • Java Web JSON Token
    • 编程式 FastDFS
    • Java XPath
    • Redis基础(二)
    • Redis基础(一)
    • Java MyBatis JUnit4
    • Java MyBatis H2 JUnit4
    • MyBatis 源码环境搭建
    • Git 配置
    • Java 核心
    • Java Dubbo
    • Java JavaCollecionsFramework
    • Java Maven
    • Java MyBatis
    • Java Spring
    • Java SpringMVC
    • MySQL
    • Redis
  • 2018年

    • Java HashMap
    • Java HashSet
    • Java Code 交换值
    • Spring Upgrade SpringBoot
    • Mac 编程环境
    • Java Log4j
    • 网络通信 Modbus
    • MySQL基础(二)
    • MySQL基础(一)
    • Java Stack
    • Java Vector
    • CentOS7 RabbitMQ 部署
    • CentOS7 Redis 部署
    • CentOS7 MongoDB 部署
    • CentOS7 基础命令
    • Java Eureka Zookeeper
    • CentOS7 MySQL 部署
    • Git 分支
    • CentOS7 Java环境配置
    • Java LinkedList
    • Java ArrayList
    • Spring Annotation Aop

CentOS7 MongoDB 部署

mongodb的安装方式比较简单,下面演示在CentOS7上用yum方式安装。

参考文献

  • 下载地址 https://www.mongodb.com/download-center#community
  • 在线文档 https://docs.mongodb.com/manual/introduction/

使用yum方式安装

仅供学习参考,若在生产环境中部署请注意修改安全配置。

  • 整个mongodb(社区版)包含如下软件
软件名称描述
mongodb-org-server包含mongod守护程序和关联的配置和init脚本
mongodb-org-mongos包含mongos守护程序
mongodb-org-shell包含mongo shell,它是一个连接mongodb的命令行客户端,允许用户直接输入nosql语法管理数据库。
mongodb-org-tools包含以下工具的MongoDB:数据导入、导出、备份、恢复等等
  • 创建yum源文件
vim /etc/yum.repos.d/mongodb-org-3.4.repo1
  • 把下面的内容复制到上面的文件中
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc123456
  • 启动yum命令开始安装
yum install -y mongodb-org1
  • 如果使用SELinux,则必须配置SELinux,以允许在基于Red Hat Linux的系统(Red Hat Enterprise Linux或CentOS Linux)上启动MongoDB。
vim /etc/selinux/config
#在打开的文件中将值设置为disabled
SELINUX=disabled

关闭THP

自CentOS6版本开始引入了Transparent Huge Pages(THP),从CentOS7版本开始,该特性默认就会启用。尽管THP的本意是为提升内存的性能,不过某些数据库厂商还是建议直接关闭THP(比如说Oracle、MariaDB、MongoDB等),否则可能会导致性能出现下降。

首先检查THP的启用状态:不关闭mongo启动的时候会警告。

  // 检查THP状态
  cat /sys/kernel/mm/transparent_hugepage/defrag
  [always] madvise never
  cat /sys/kernel/mm/transparent_hugepage/enabled
  [always] madvise never
  这个状态就说明都是启用的。
  //禁用THP,编辑rc.local文件
  vim /etc/rc.d/rc.local
  增加下列内容:
  if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
  fi
  if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
      echo never > /sys/kernel/mm/transparent_hugepage/defrag
  fi

编辑完了需要重启服务器才能生效。

配置信息

mongo配置文件操作

  • 安装完后寻找相关配置信息

  • whereis mongd

  • mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1
    
  • mongd.conf 就是配置文件。

  • 打开就可以看到相关配置信息。

mongdb权限操作配置信息

Built-In Roles(内置角色):

  • 数据库用户角色:
    • read、readWrite;
  • 数据库管理角色:
    • dbAdmin、dbOwner、userAdmin;
  • 集群管理角色:
    • clusterAdmin、clusterManager、clusterMonitor、hostManager;
  • 备份恢复角色:
    • backup、restore;
  • 所有数据库角色:
    • readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超级用户角色:
    • root
      • 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  • 内部角色:
    • __system

具体角色:

  • Read:
    • 允许用户读取指定数据库。
  • readWrite:
    • 允许用户读写指定数据库。
  • dbAdmin:
    • 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。
  • userAdmin:
    • 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户。
  • clusterAdmin:
    • 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的读权限。
  • readWriteAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的读写权限。
  • userAdminAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。
  • dbAdminAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
  • root:
    • 只在admin数据库中可用。超级账号,超级权限。

开启用户权限

提示:即便设置了账号密码依然可以不通过密码链接,需要在mongo 启动的时候开启认证。

  • 创建用户
    • 注意读写用户的权限请使用readWrite。
show dbs; 
//显示数据库列表

use admin; 
 //进入admin collections

db.createUser({"user":"root","pwd":"z201.com","roles":[{"role":"root","db":"admin"}]}) 
//创建超级管理员root库管理账号

db.auth("root","eoner.com")
//校验账号是否匹配
1 
//显示1表示匹配成功

user yisheng; 
//进入yisheng collections,如果没有该数据库会自己创建一个;但是如果不在里面插入数据是不显示出来的。

db.createUser({"user":"yisheng","pwd":"z201.com","roles":[{"role":"readWrite","db":"yisheng"}]})
//创建数据库管理员

db.auth("yisheng","z201.com")
1 
//显示1表示匹配成功

  • 修改密码
db.changeUserPassword('root','z201.com');
  • 数据库开启认证,注意请进入数据库中在执行。
security:
    authorization:true

基础操作

启动

systemctl start mongod

重启

systemctl restart mongod 
  • 如果无效

    • use admin
    • db.shutdownServer();

停止

systemctl stop mongod

认证模式启动

nohup mongod --auth --port 27017 --dbpath /var/lib/mongo/ &
  • /var/bin/mongd 可以在mongod.conf中查看。

客户端连接失败问题:

SCRAM-SHA-1 authentication failed ``for root

  • mongodb加入了SCRAM-SHA-1校验方式,需要第三方工具配合进行验证。如果直接用代码连接会出问题。

  • 如果客户端没有SCRAM-SHA-1的校验方式,可以选择将authverison 版本降低;不使用该认证方式,同时工具连接的时候需要手动修改默认的认证方式。

  • 参考文献

    • MongoDB中使用的SCRAM-SHA1认证机制

CURD

  • 插入
db.ops_dev.insert({title: 'MongoDB ', 
    description: 'MongoDB 是一个 Nosql 数据库',
    tags: ['mongodb', 'database', 'NoSQL']
})

其他注意事项

mongodb进程莫名退出

每天早上到公司发现Mongo都会自己关闭掉。

2018-01-03T18:21:03.135+0800 I CONTROL  [signalProcessingThread] got signal 1 (Hangup), will terminate after current cmd ends
2018-01-03T18:21:03.136+0800 I NETWORK  [signalProcessingThread] shutdown: going to close listening sockets...
2018-01-03T18:21:03.136+0800 I NETWORK  [signalProcessingThread] closing listening socket: 6
2018-01-03T18:21:03.136+0800 I NETWORK  [signalProcessingThread] closing listening socket: 7
2018-01-03T18:21:03.136+0800 I NETWORK  [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2018-01-03T18:21:03.136+0800 I NETWORK  [signalProcessingThread] shutdown: going to flush diaglog...
2018-01-03T18:21:03.136+0800 I FTDC     [signalProcessingThread] Shutting down full-time diagnostic data capture
2018-01-03T18:21:03.138+0800 I STORAGE  [signalProcessingThread] WiredTigerKVEngine shutting down
2018-01-03T18:21:03.366+0800 I STORAGE  [signalProcessingThread] shutdown: removing fs lock...
2018-01-03T18:21:03.366+0800 I CONTROL  [signalProcessingThread] now exiting
2018-01-03T18:21:03.366+0800 I CONTROL  [signalProcessingThread] shutting down with code:0

  • 天啦噜有人发送了Hangup。。。好比kill -1 pid,但可以确认的是没有人手动信号给mongodb进程。
  • 然后网上找了很久发现了这篇文档 Signals

Bash resends a SIGHUP to all jobs if it receives a SIGHUP itself; this would include mongod. Also, if you happen to have huponexit turned on, every job will receive a SIGHUP when bash exits.

​ shell登进之后启动了mongo,然后退出shell使用的方式是直接关掉窗口,linux认为这是一起异常退出,这样一来这个shell进程就会收到SIGHUP信号,为了保证状态一致性,从而给它的所有子进程发送SIGHUP信号.而使用命令exit退出就不会有这种问题,因为linux会认为这是一种正常的退出。 ​ mongodb官方文档会发现mongo有–-fork这样的一个参数,使用该参数启动mongo时,会自动将其挂到init进程(pid为1)下启动,而不加的话ppid(父进程id)就是当前的shell进程。

  • 如果使用了 fork 参数就必须添加 logpath
mongod --fork --auth --port 27017 --dbpath /var/lib/mongo/ --logpath /opt/mongod/mongod.log

安全的推出方式

一定要以命令方式关闭

关闭服务时,一定要注意,用--shutdown命令关闭,既方便又安全。

最近更新: 2025/12/27 18:51
Contributors: 庆峰
Prev
CentOS7 Redis 部署
Next
CentOS7 基础命令