mongodb的部署,概念及opsmanager监控管理
上手安装和配置 centos7 (可根据官网介绍安装)
进入mongodb官网下载中心, 选择社区版, 选择数据库版本, linux版本, 包选择tgz
安装前最好先看一下对应版本的 Release Notes,没有严重问题再下载使用
配置环境变量 以下三选一
- 拷贝 mongodb/bin下面的文件到 /usr/local/bin/下
cp mongodb/bin/* /usr/local/bin - 创建软链接
ln -s 绝对路径/mongodb/bin/* /usr/local/bin/ - 设置/etc/profile中的环境变量
export PATH=:$PATH:/application/mongodb/bin
创建数据和日志文件夹
mkdir data
mkdir log
更改目录权限(尽量使用mongod用户)(如果启动的用户不同)(可选)
useradd mongod #添加用户
chown -R mongod:mongod mongodb安装文件 #修改权限
配置 官网文档Reference->Configuration File Options (分片+副本集请看9)
linux默认mongo配置位置 /etc/mongod.conf
默认端口27017
systemLog:
destination: file
path: /data1/mongodb/log/mongodb.log
storage:
dbPath: /data1/mongodb/data
wiredTiger:
engineConfig:
cacheSizeGB: 1
net:
port: 27017
bindIp: "*"
replication:
replSetName: shard
启动mongodb并指定配置文件
使用 mongod --config conf/mongod.conf 或者 mongod -f conf/mongod.conf
(或者不指定配置文件,使用参数指定,不推荐)
后台启动 mongod -f conf/mongod.conf --fork 或者加上
processManagement:
fork: true
部署 副本集 集群
先启动集群的每台机器
通过shell连接到mongoDB
对集群进行初始化:在副本集中的一个机器且仅一个机器上执行
rs.initiate({ _id:"mongoTest", members:[ {_id:0,host:"centos144:27017"},{_id:1,host:"centos145:27017"}] })
或者先初始化,后加入节点 rs.add("centos144:27017")
也可以修改配置属性,如修改节点权重 rs.conf().members[0].priority=2
使用rs.conf() 或者 rs.status() 查看状态
部署仲裁者(两副本集时需要1个)(其实就是不带数据的 节点/shard )
仲裁者消耗资源非常少,只负责投票,可以在相同机器上搭建另一个mongo实例启动
创建arb数据目录 mkdir -p /data1/mongodb/data/arb
启动仲裁者 mongod -f conf/arb.conf --fork
配置文件arb.conf ⬇
storage:
dbPath: /data1/mongodb/data/arb
net:
port: 27021
bindIp: "*"
replication:
replSetName: <replSetName>
进入mongo shell主节点(primary),执行 rs.addArb("centos144:27021")
或者和其他机器一起初始化时设置 {_id : 0, host : "centos144:27021", arbiterOnly : true}
分片和副本集()
config和shard端口,副本集名称等不能重复;clusterRole需修改成对应的字符串
- Config Servers(metadata)
创建数据文件夹mkdir data/config
vim config.conf
然后启动systemLog: destination: file path: /data1/mongodb/log/config.log storage: dbPath: /data1/mongodb/data/config wiredTiger: engineConfig: cacheSizeGB: 0.5 net: port: 27018 bindIp: "*" replication: replSetName: config sharding: clusterRole: configsvrmongod -f conf/config.conf --fork
mongo shell初始化rs.initiate({_id: "config", configsvr: true, members: [{_id : 0, host : "centos144:27018"},{_id : 1, host : "centos145:27018"}]}) - Shards
可以把shard设置为仲裁者
创建数据文件夹mkdir data/shard
vim shard.conf
然后启动systemLog: destination: file path: /data1/mongodb/log/shard.log storage: dbPath: /data1/mongodb/data/shard wiredTiger: engineConfig: cacheSizeGB: 1 net: port: 27019 bindIp: "*" replication: replSetName: shard sharding: clusterRole: shardsvrmongod -f conf/shard.conf --fork
mongo --port xxx进入对应端口的shell初始化rs.initiate({_id: "shard", members: [{_id : 0, host : "centos144:27019"},{_id : 1, host : "centos145:27019"}]}) - Router(mongos)
配置mongos: mongos.conf
启动mongos服务sharding: configDB: config/centos144:27018,centos145:27018 net: bindIp: "*" port: 27017 systemLog: destination: file path: /data1/mongodb/log/mongos.logmongos -f conf/mongos.conf --fork
连接到mongos的端口mongo --port xxx
初始化sh.addShard("replSetName/host:port,host:port")
shell命令
常用命令
- 清理日志,将日志按日期切分
db.runCommand({logRotate:1}) - 连接数量
db.serverStatus().connections - 查看分片集群状态 mongos>
sh.status() - 开始平衡
sh.startBalancer() - 查看配置
- 副本集配置,要在副本集中执行 Primary>
rs.conf() - mongos>
db.stats()
- 副本集配置,要在副本集中执行 Primary>
shard
- 数据库开启分片
- 执行前需切换到admin数据库 mongos>
use admin - (选一执行)
sh.enableSharding('test')或者db.runCommand({'enablesharding':'test'})
- 执行前需切换到admin数据库 mongos>
- 集合分片
建立分片前要先建立索引
mongos>db.test.createIndex({_id:'hashed'})
mongos>sh.shardCollection('test.hsd_test',{'_id':'hashed'})
副本集配置
设置主副节点,剔除不想要的节点
在主节点运行
cfg = rs.conf()
cfg.members[0].priority = 1
cfg.members[1].priority = 1
cfg.members[2].priority = 1.1
// 选择想要的
cfg.members=[cfg.members[0],cfg.members[2],cfg.members[3]]
// 不加force的话一次只能添加或删除一个副本且前台执行且不能在副节点运行
rs.reconfig(cfg, {force : true})
也可以使用
rs.remove("hostname:port")
操作符命令
重命名
>db.t3.find()
{"_id":ObjectId("4fe686288414d282f712fae8"),"name":[],"userid":3}
>db.t3.update({"userid":3},{$rename:{"name":"alias"}})
>db.t3.find()
{"_id":ObjectId("4fe686288414d282f712fae8"),"alias":[],"userid":3}
删除字段
>db.t3.find()
{"_id":ObjectId("4fe676348414d282f712fae4"),"name":"wangwenlong","age":40}
>db.t3.update({name:"wangwenlong"},{$unset:{age:1}})
>db.t3.find()
{"_id":ObjectId("4fe676348414d282f712fae4"),"name":"wangwenlong"}
删除嵌套字典
更新
更新方法中第二个参数是可以写聚合函数($aggregate)的, 但是要带上左右括号[].
修改数据类型
db.test.updateMany(
{ },
[{ $set: { xxx: { $toString: "$a_number" } } }],
)
较大的数值转字符串可能会得到 2.123e+07 这样的结果
如果存的是double类型 1648444644.459 ,转字符串需要先转decimal再转字符串
如果只需要整形就先转Long再转字符串
db.test.updateMany(
{ },
[{ $set: { xxx: { $toString: { $toDecimal: "$a_number" } } } }],
)
索引
1. 复合索引
优化方案
-
索引顺序(提升查询效率):遵循ESR规则, 精确(Equal)匹配>排序(Sort)条件>范围(Range)匹配
如现有car,time,name,date四个字段,我想要根据前三个字段一起查询 car和name是精确匹配,time是范围查询,则索引应该为{car:-1,name:-1,time:-1}1 或者{name:-1,car:-1,time:-1}2 其中一个car会对应不同的name, name去重后是要比car去重多的所以 2 要优于 1 -
建立复合索引,实际上相当于建立了多个
比如建立了下边一个索引{a:1,b:1,c:1,d:1}相当于同时建了下边的几种索引,换句话说,下边的几种查询方式都会受益
{a:1,b:1,c:1,d:1} {a:1,b:1,c:1} {a:1,b:1} {a:1}
集群搭建
配置文件
- storage.wiredTiger.engineConfig.cacheSizeGB
- operationProfiling.mode
- replication.enableMajorityReadConcern
工具
- 官方
- mongodb compass 用来可视化数据,分析查询等
- mongodb ops manager 用来监控,自动化安装升级
- 非官方
- gui工具,navicat , robot3T 和studio3T, nosqlbooster for mongodb
工具使用
批量管理监控工具ops manager
集群配置注意项
- 设置mongodb内存占用大小
advanced configuration options > add option > wiredTigerCacheSizeGB > 1
- 设置集群监控
advanced configuration options > add option > profile > showOp
- psa架构禁用读关注
advanced configuration options > add option > enableMajorityReadConcern > False
安装
- 在 MongoDB.com 下载指定版本的程序, 推荐下载tar.gz的 Red Hat + CentOS 6, 7, 8 / SUSE 12 + 15 / Amazon Linux 2 文件.
- 在用于 Ops Manager 的每台服务器上安装 Ops Manager 软件包
- 配置数据库连接. mongodb ops manager需要 一个/或多个 mongodb数据库作为基础
修改<install_directory>/conf/conf-mms.properties配置文件
配置以下设置连接数据库, 把xxx.xxx.xxx.xxx:27017改成你的mongodb数据库地址就行 - 其他配置
- 修改端口<install_directory>/conf/mms.conf
BASE_PORT=11700如果页面已经启动, 要重启服务
- 修改端口<install_directory>/conf/mms.conf
- 启动
<install_directory>/bin/mongodb-mms start
很长时间后启动完成 - 配置
打开浏览器, 输入ip:port, 第一次要注册账号, 注册完成会进入配置页面 配置项
管理集群
Deployment --> Agents --> Downloads & Settings --> Select your operating system --> 一版情况选择第一个就行,里面出现的步骤在想要管理的机器上执行
启用数据库监控
配置本地mongodb包下载(离线生产环境必做)
- 页面初始化时设置
- 已经启动服务, 页面修改设置
根据 mongodb ops manager 文档 设置- 点击右上角 ALL Clusters旁边的 Admin
- 点击General
- 点击Ops Manager Config
- 点击MISCELLANEOUS
- 在下方找到MongoDB Version Management,选择Installer Download Source为local,后续需要其他操作请看官方文档
- 本地部署mongodb需要下载 mongodb数据库服务 和 mongodb database tools 的二进制包,放在Versions Directory(默认 /opt/mongodb/mms/mongodb-releases/ )下. 需要检查版本是否兼容release notes. 最好也在 /opt/mongodb-mms-automation/versions 放一份(没有放新建集群后下载时可能会失败)
集群搭建和维护
使用页面部署集群
先看生产注意事项和错误/问题/警告 排解, 将集群设置最佳环境后再配置更好
集群部署前记得改文件夹用户权限 chown mongod:mongod data
在管理集群时对一个副本集不能同时 增加/删除 多个投票节点
例子: 在分片集群扩容时,只能对一个分片的副本集增加/删除单个投票节点
集群有时执行命令会超时,可以手动进到集群执行分片等命令
错误/问题/警告 排解
设置 mongodb linux ulimit / 在并发度大的情况下发现mongos挂掉的情况
解决:查看mongos日志发现报错 Too many open files ,是因为linux打开文件/通讯连接(比如socket)等超出设置,使用 ulimit -a 查看当前最大句柄数open files
- 命令方式 重启后会还原默认值 非root权限只能设置到4096
ulimit -n 2048 - 修改系统配置文件
最前面的*表示所有用户,可根据需要设置某一用户,例如vim /etc/security/limits.conf # 在最后加入 * soft nofile 64000 * hard nofile 64000 # 或者只加入 * - nofile 64000
xxx soft nofile 64000或者mongod soft nofile 64000
- 表示同时设置soft和hard
centos7禁用 Transparent Huge Pages:
创建文件 vim /etc/systemd/system/disable-transparent-huge-pages.service
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
执行
# 运行下面的命令来重新加载 systemd 单元文件来让 disable-transparent-huge-pages.service 服务可用
sudo systemctl daemon-reload
# 手动启动一次服务以确保相应的 THP 设置已更改
sudo systemctl start disable-transparent-huge-pages
# [never]通过运行以下命令验证 THP 是否已成功设置
cat /sys/kernel/mm/transparent_hugepage/enabled
要确保每次系统启动时都应用此设置,请运行以下命令
sudo systemctl enable disable-transparent-huge-pages
如果你正在使用 tuned / ktune 在你的 RHEL / CentOS 系统, 必须创建自定义 配置文件以确保 THP 保持禁用状态
查看是否启用 tuned-adm active 一般为 virtual-guest
如果启用(为virtual-guest) 则执行
sudo mkdir /etc/tuned/virtual-guest-no-thp
# 编辑文件
vim /etc/tuned/virtual-guest-no-thp/tuned.conf
[main]
include=virtual-guest
[vm]
transparent_hugepages=never
# 启动服务
sudo tuned-adm profile virtual-guest-no-thp
磁盘格式化xfs
使用 cat /etc/filesystems 查看支持的文件系统格式
df -Th 查看磁盘情况
格式化前要先取消挂载 umount /dev/sdb1 , 如果提示正忙, 使用 fuser -mv 提示的路径 , kill -9 进程号不为kernel的进程
格式化 mkfs.xfs /dev/sdb1 , 如果已有文件系统, 需要加 -f 参数
mount 磁盘 挂载点 mount /dev/sdb1 /data
关闭挂载盘atime
# 先查看磁盘挂载情况
df -Th
# 然后备份文件
cp /etc/fstab /etc/fstab.o
# 编辑文件
vim /etc/fstab
# 加入 df -Th 查看的文件系统和挂载点和类型
/dev/sdb1 /data1 xfs defaults,noatime 0 0
# 重新挂载分区
mount -o remount /data1
# 查看当前挂载参数
mount
psa架构禁用读关注
- --enableMajorityReadConcern command line option to false. 启动mongodb时参数
- replication.enableMajorityReadConcern configuration file setting to false. mongodb配置文件中参数
replication: oplogSizeMB: <int> replSetName: <string> enableMajorityReadConcern: <boolean>
// 查看状态,要在mongodb副本集primary执行
mongod:> db.serverStatus().storageEngine.supportsCommittedReads
主副节点都挂掉
xxx
生产注意项
内核和系统建议,详情见官方文档或 问题 排解
参考以下将集群设置最佳环境后再配置容错更高
- 对于 WiredTiger 存储引擎,强烈建议对数据承载节点使用 XFS ,以避免在使用 EXT4 和 WiredTiger 时可能出现的性能问题
- 请使用适用于此系统提供的版本的最新更新glibc库
yum update glibc - 对于 WiredTiger 存储引擎,请考虑以下建议:
- 禁用 mongodb 数据存储位置(dbpath)的存储卷的 atime
- linux 的 ulimit 值的大小尽量在64000以上
- 禁用 Transparent Huge Pages。MongoDB 在使用普通(4096 字节)虚拟内存页面时表现更好. 请参阅 Transparent Huge Pages (THP) Settings
- 在 BIOS 中禁用 NUMA。如果这是不可能的, 请参阅 MongoDB on NUMA Hardware
- 如果您不使用默认的 MongoDB 目录路径或端口,请为 MongoDB 配置 SELinux. 所需配置请参阅: Configure SELinux for MongoDB 和 Configure SELinux for MongoDB Enterprise
概念
readConcern
readConcern产生背景:
MongoDB的写请求写入Primary, secondary从Primary自动获取并且应用oplog来保持和主库的同步, MongoDB 允许用户从Primary 或者 secondary 读取数据。但读数据可能存在以下问题:
- 如果用户从secondary读,但secondary还没有跟上Primary,就会导致读取了老数据
- 如果用户从primary读到数据,但在该数据复制到secondary 之前crash 了,就会导致用户读取到"脏数据"。
MongoDB在3.6版本中引入了readConcern这个参数,readConcern决定在读取数据的时候,到底能够读取到哪个版本的数据。
今天主要看看概念性质的东西,下篇文章中会给出相应的例子。
readConcern可选的值包含:
local、available、majority、linearizable、snapshot
下面来看这几个值的含义:- local:查询从实例返回数据,不能保证数据已经写入大多数副本集成员
默认从主库读
如果本次读取使用了causally consistent(这里仅知道这个概念就行,关于这个概念,后续会补充) ,则默认在从库读 - available:查询从实例返回数据,不能保证数据已经写入大多数副本集成员
如果本次读取没有使用causally consistent ,则默认在从库读
如果本次读取使用了causally consistent ,则不能使用available
对于分片的副本集来说,available模式提供了最低的读取延迟,但是这个优点是以数据的一致性为代价的. 如果分片正在进行块迁移, 它可能返回一个孤立的文档。 - majority:查询结果返回被副本集的大多数成员确认的数据,读操作返回的文档是持久化的
要想使用majority这个模式的readConcern,MongoDB必须使用wireTiger存储引擎。 - linearizable:该查询返回的数据返回在读取操作开始之前完成的所有成功的多数确认写入。查询可能会等待并发执行的写操作传播到大多数副本集成员,然后返回结果。
如果集群中大多数副本集成员崩溃,并且在读取操作后重新启动,这个时候,读取的结果将取决于参数:
writeConcernMajorityJournalDefault
如果writeConcernMajorityJournalDefault设置为默认状态true,则读取操作返回的文档是持久的;
如果将writeConcernMajorityJournalDefault设置为false时,在确认写入之前,MongoDB不会等待数据写入磁盘日志,即使我们配置了w=majority。这样,在给定副本集中大多数节点的瞬时丢失的情况下,多数写入操作可能会回滚(为磁盘中没有日志)。
通常情况下,可以对primary节点配置线性读取
如果读取使用了causally consistent,则无法使用linearizable模式 - snapshot:适用于多文档事务中的操作。
通常情况下使用较少。后续有用到,再举例说明。
注意:
- local:查询从实例返回数据,不能保证数据已经写入大多数副本集成员
目前 readConcern 主要用于跟 mongos 与 config server 的交互上
使用readConcern 需要配置replication.enableMajorityReadConcern选项
只有支持 readCommited 隔离级别的存储引擎才能支持 readConcern,比如 wiredtiger 引擎,而 mmapv1引擎则不能支持
local, majority, available
设置命令
mongos:> db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultReadConcern" : { "level" : "majority" }
})
defaultReadConcern: { level : "majority" }
defaultWriteConcern: { w: "majority" }

浙公网安备 33010602011771号