mongodb 6.0.4社区版
CentOS7
正常的副本集需要三台主机,一主两从或者一主一从一仲裁,集群可以实现高可用,主节点宕机之后通过选举产生新的主节点。我只有两台主机,根据实际的需求,我要部署的是一主一从,不进行选举,部署过程大致相同,以作参考。
除了第8点和第9点,主从两个节点都需要进行同样的操作,建议先主后从
除了第8点和第9点,主从两个节点都需要进行同样的操作,建议先主后从
除了第8点和第9点,主从两个节点都需要进行同样的操作,建议先主后从
社区版下载地址,根据需求选择版本
https://www.mongodb.com/try/download/community
mongo shell地址https://www.mongodb.com/try/download/shell
- 检查系统配置
系统推荐配置,详细见:
https://www.mongodb.com/docs/manual/administration/production-notes/
UNIXulimit设置,详细见:
https://www.mongodb.com/docs/manual/reference/ulimit/
主要检查如下:
- 内存
从 MongoDB 3.4 开始,默认的 WiredTiger 内部缓存大小是以下两者中较大的一个:
(RAM - 1 GB) 的 50%,或256MB。
总共有 4GB RAM 的系统,,将使用0.5 * (4 GB - 1 GB) = 1.5 GB
总共有 1.25 GB RAM 的系统,将使用0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB - 时钟同步
MongoDB组件保留逻辑时钟以支持依赖于时间的操作 - 内核以及文件系统
使用WiredTiger 存储引擎,强烈建议对数据承载节点使用 XFS,以避免使用 EXT4 和 WiredTiger 时可能出现的性能问题。
如果使用 XFS 文件系统,请至少使用 2.6.25Linux 内核版本。
如果使用 EXT4 文件系统,请至少使用 2.6.28Linux 内核版本。
在 Red Hat Enterprise Linux 和 CentOS 上,至少使用 2.6.18-194Linux 内核版本。
- 安装前准备
- 系统C库
[root@zzx ~]# yum update glibc
- 关闭SELinux
[root@zzx ~]# setenforce 0
[root@zzx ~]# vi /etc/selinux/config
SELINUX=disabled
- 关闭防火墙或开放需要的业务端口
[root@zzx ~]# systemctl stop firewalld
[root@zzx ~]# systemctl disable firewalld
- 设置参数
[root@zzx ~]# sysctl -w vm.max_map_count=262144
[root@zzx ~]# sysctl -w vm.swappiness=0
[root@zzx ~]# vi /etc/sysctl.conf
vm.swappiness = 0
vm.max_map_count = 262144
[root@zzx ~]# sysctl -p
- 透明巨页设置
[root@zzx ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@zzx ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
- ulimit
[root@zzx ~]# vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65535
[root@zzx ~]# reboot
- 通用环境
[root@zzx ~]# yum -y install make gcc gcc-c++ openssl openssl-devel openssh-clients wget curl tcpdump bind-utils lrzsz nc screen sysstat iotop htop lsof vim ntp unzip patch parted
- 安装所需的依赖项(官网要求)
[root@zzx ~]# yum install -y libcurl openssl xz-libs
- 创建用户并切换用户
[root@zzx ~]# useradd mongo
[root@zzx ~]# passwd mongo
[root@zzx ~]# su - mongo
- 开始安装:
- 上传并解压tar包
[mongo@zzx ~]$ tar -zxvf mongodb-linux-x86_64-rhel70-6.0.4.tgz
- 解压后创建相关目录及文件
[mongo@zzx ~]$ mv mongodb-linux-x86_64-rhel70-6.0.4 ~/mongodb
[mongo@zzx ~]$ mkdir -p ~/mongodb/{data,log,conf}
[mongo@zzx ~]$ touch ~/mongodb/conf/mongodb.conf
[mongo@zzx ~]$ touch ~/mongodb/log/mongodb.log
- mongodb配置文件
此时mongodb未建立用户无法进行验证,所以注释掉security段,还未进行副本集初始化,注释掉replication段。之后再放开。
bindIp为绑定的IP,比如写192.168.13.13,就只能从此ip进行访问。
[mongo@zzx ~]$ vi ~/mongodb/conf/mongodb.conf
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/home/mongo/mongodb/log/mongodb.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾>。
logAppend: true
logRotate: rename
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/home/mongo/mongodb/data"
# mongodb数据库的存储引擎,wiredTiger存储引擎(3.2开始默认使用)
engine: "wiredTiger"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
pidFilePath: "/home/mongo/mongodb/conf/mongod.pid"
net:
#服务实例绑定的IP,默认是localhost
bindIp: 0.0.0.0
#绑定的端口,默认是27017
port: 27017
# mongod/mongos进程允许的最大连接数
maxIncomingConnections: 50000
#security:
# MondoDB认证功能
#authorization: enabled
#keyFile: /home/mongo/mongodb/conf/mongo.key
#setParameter:
# 本地主机绕过身份验证
#enableLocalhostAuthBypass: false
#replication:
#副本集的名称
#replSetName: zzx
- 启动数据库
如果有提示报错,大概率是文件路径不对,检查一下
[mongo@zzx ~]$ ~/mongodb/bin/mongod -f ~/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1204
child process started successfully, parent exiting
- 安装mongodb shell
mongodb shell是字符界面的连接工具,现在的版本不自带工具了,需要自行下载
[root@zzx ~]# rpm -ivh mongodb-mongosh-1.7.1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:mongodb-mongosh-1.7.1-1.el8 ################################# [100%]
- 设置用户名和密码
第一次进入时会有很多提示信息
- 推荐用云上的相关服务,我们使用db.disableFreeMonitoring()关闭
- 强烈建议使用XFS
- 未使用auth验证,我们稍后会开启
- mongo会匿名发送数据,我们使用disableTelemetry()关闭
- 也会有系统参数需要调整的信息,自行百度解决
[mongo@zzx ~]$ mongosh
进入之后先建立root用户,之后关闭一些提示信息,解决一下需要解决的报错
> use admin
> db.createUser({user:"root",pwd:"zzxcool",roles:[{role:"root",db:"admin"}]})
禁用匿名发送数据
> disableTelemetry()
禁用云监控提醒
> db.disableFreeMonitoring()
> db.system.users.find()
> exit
- 编写启动与停止mongodb脚本
echo "/home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/conf/mongodb.conf" >> start.sh
chmod +x start.sh
echo "/home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/conf/mongodb.conf" >> stop.sh
chmod +x stop.sh
- 关闭服务之后,修改集群配置文件,启动服务
[mongo@zzx ~]$ sh ~/stop.sh
[mongo@zzx ~]$ vi ~/mongodb/conf/mongodb.conf
去掉这两行注释,开启副本集,验证模块暂时不管
(因为我实验的时候开了验证之后集群通信出现问题了,为了保准还是集群没问题之后再开)
replication:
#副本集的名称
replSetName: zzx
[mongo@zzx ~]$ sh ~/start.sh
校验root用户
[mongo@zzx ~]$ mongosh
> use admin
> db.auth("root","zzxcool")
> show dbs
admin 180.00 KiB
config 60.00 KiB
local 72.00 KiB
> exit
- 集群初始化
!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!进入主节点初始化集群!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!
[mongo@zzx ~]$ mongosh
> rs.initiate({_id:'mdbA',members:[{_id:0,host:'192.168.111.111:27017'}]})
{ "ok" : 1 }
zzx [direct: primary] admin>
- “ok”的值为1,说明创建成功。
- 命令行提示符发生变化,变成了一个从节点角色,此时默认不能读写。稍等片刻,回车,变成主节点。
- 这里的host值需要填写IP地址,可以直接执行rs.initiate(),会生成默认配置,IP处默认是主机名,无法进行解析的话会影响集群通信
查看副本集的配置内容的命令(结果不演示了,文章最后有完整版)
> rs.conf()
- “_id” :副本集的配置数据存储的主键值,默认就是副本集的名字
- “members” :副本集成员数组,此时只有一个: host: ‘192.168.111.111:27017’,该成员不
是仲裁节点: arbiterOnly: false ,优先级(权重值):priority: 1, - “settings” :副本集的参数配置。
查看当前集群状态(结果不演示了,文章最后有完整版)
rs.status()
- “set” : 副本集的名字
- “State” : 1:说明状态正常
- “members” :副本集成员数组,此时只有一个:name: ‘192.168.111.111:27017’ ,该成员的
角色是 stateStr: ‘PRIMARY’, 该节点是健康的: health: 1 。
- 添加从节点
!!!在主节点添加从节点,将其他成员加入到副本集,命令如下:
> rs.add( { host: "192.168.111.112:27017", priority: 0, votes: 0 } )
- 添加从节点时,设置节点的priority和votes都是0,也就说它们并没有选主的权限。这是因为,从节点初始化和同步数据需要一段时间,如果刚好在此时发生选主,如果这些还在同步初始化的节点有投票权,就会有可能无法选主成功。因此我们开始时将这些新加的node设置无投票权,等到初始化完成,节点变成secondary,再将priority和votes修改为预期值
- 删除节点用rs.remove(“192.168.111.112:27017”)
- 修改主机信息用
zzx [direct: primary] admin> cfg.members[1].host=“192.168.111.113:27017”
zzx [direct: primary] admin> rs.reconfig(cfg) - 我只有两台主机,只想做主从集群,不想让服务地址变化,只有主节点提供服务,如果有需要请参考大神的文章
成功后查看集群状态,没问题之后可以登录从节点看看命令提示符是否变化。
zzx [direct: secondary] test>
- 关闭服务,添加验证配置,启动服务
先修改配置
[mongo@zzx ~]$ sh ~/stop.sh
[mongo@zzx ~]$ vi ~/mongodb/conf/mongodb.conf
去掉这几行注释
security:
# MondoDB认证功能
authorization: enabled
keyFile: /home/mongo/mongodb/conf/mongo.key
setParameter:
# 本地主机禁止绕过身份验证
enableLocalhostAuthBypass: false
添加集群验证文件
正常单机部署不需要keyFile文件,只需要auth参数
副本集服务器,开启auth参数的同时,必须指定keyfile参数,节点之间的通讯基于该keyfile,key长度必须在6到1024个字符之间,最好为3的倍数,不能含有非法字符。
若开启auth参数不配置keyFile,在启动mongo时会报错:“BadValue: security.keyFile is required when authorization is enabled with replica sets”
[mongo@zzx ~]$ openssl rand -base64 90 -out /home/mongo/mongodb/conf/mongo.key
[mongo@zzx ~]$ chmod 600 /home/mongo/mongodb/conf/mongo.key
把此文件直接复制到从节点主机,不能粘贴内容,需要复制文件
启动服务
[mongo@zzx ~]$ sh ~/start.sh
查看集群状态(完整结果)
[mongo@zzx ~]$ mongosh
Current Mongosh Log ID: *
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.7.1
Using MongoDB: 6.0.4
Using Mongosh: 1.7.1
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
zzx [direct: primary] test> rs.conf() ##这步可以看到没有通过验证无法查询数据
MongoServerError: command replSetGetConfig requires authentication
zzx [direct: primary] test> use admin
switched to db admin
zzx [direct: primary] admin> db.auth("root","zzxcool")
{ ok: 1 }
ygxy [direct: primary] admin> rs.conf()
{
_id: 'zzx',
version: 2,
term: 2,
members: [
{
_id: 0,
host: '192.168.111.111:27017',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 1,
tags: {},
secondaryDelaySecs: Long("0"),
votes: 1
},
{
_id: 1,
host: '192.168.111.112:27017',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 0,
tags: {},
secondaryDelaySecs: Long("0"),
votes: 0
}
],
protocolVersion: Long("1"),
writeConcernMajorityJournalDefault: true,
settings: {
chainingAllowed: true,
heartbeatIntervalMillis: 2000,
heartbeatTimeoutSecs: 10,
electionTimeoutMillis: 10000,
catchUpTimeoutMillis: -1,
catchUpTakeoverDelayMillis: 30000,
getLastErrorModes: {},
getLastErrorDefaults: { w: 1, wtimeout: 0 },
replicaSetId: ObjectId("63ed8aec2caa00e8f420c795")
}
}
ygxy [direct: primary] admin> rs.status()
{
set: 'zzx',
date: ISODate("2023-02-16T08:58:33.396Z"),
myState: 1,
term: Long("2"),
syncSourceHost: '',
syncSourceId: -1,
heartbeatIntervalMillis: Long("2000"),
majorityVoteCount: 1,
writeMajorityCount: 1,
votingMembersCount: 1,
writableVotingMembersCount: 1,
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
lastCommittedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
readConcernMajorityOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
appliedOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
durableOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
lastAppliedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
lastDurableWallTime: ISODate("2023-02-16T08:58:31.859Z")
},
lastStableRecoveryTimestamp: Timestamp({ t: 1676537851, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: 'electionTimeout',
lastElectionDate: ISODate("2023-02-16T03:29:41.206Z"),
electionTerm: Long("2"),
lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 0, i: 0 }), t: Long("-1") },
lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1676517921, i: 1 }), t: Long("1") },
numVotesNeeded: 1,
priorityAtElection: 1,
electionTimeoutMillis: Long("10000"),
numCatchUpOps: Long("0"),
newTermStartDate: ISODate("2023-02-16T03:29:41.213Z"),
wMajorityWriteAvailabilityDate: ISODate("2023-02-16T03:29:41.236Z")
},
members: [
{
_id: 0,
name: '192.168.111.111:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
uptime: 19745,
optime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
optimeDate: ISODate("2023-02-16T08:58:31.000Z"),
lastAppliedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
lastDurableWallTime: ISODate("2023-02-16T08:58:31.859Z"),
syncSourceHost: '',
syncSourceId: -1,
infoMessage: '',
electionTime: Timestamp({ t: 1676518181, i: 1 }),
electionDate: ISODate("2023-02-16T03:29:41.000Z"),
configVersion: 2,
configTerm: 2,
self: true,
lastHeartbeatMessage: ''
},
{
_id: 1,
name: '192.168.111.112:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
uptime: 19724,
optime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
optimeDurable: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
optimeDate: ISODate("2023-02-16T08:58:31.000Z"),
optimeDurableDate: ISODate("2023-02-16T08:58:31.000Z"),
lastAppliedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
lastDurableWallTime: ISODate("2023-02-16T08:58:31.859Z"),
lastHeartbeat: ISODate("2023-02-16T08:58:32.289Z"),
lastHeartbeatRecv: ISODate("2023-02-16T08:58:32.027Z"),
pingMs: Long("0"),
lastHeartbeatMessage: '',
syncSourceHost: '192.168.111.111:27017',
syncSourceId: 0,
infoMessage: '',
configVersion: 2,
configTerm: 2
}
],
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1676537911, i: 1 }),
signature: {
hash: Binary(Buffer.from("128984a71cc21015dc29e8392926d40a16835fce", "hex"), 0),
keyId: Long("7200564125452206086")
}
},
operationTime: Timestamp({ t: 1676537911, i: 1 })
}
添加普通用户
> db.createUser({user:'zzx',pwd:'zzxcool',roles:[{role:'dbOwner',db:'zzxcool'}]})
> use admin
> db.system.users.find()
-
安装mongodb compass
compass是mongo官方的可视化工具,感觉比navicat好用一些
下载https://www.mongodb.com/try/download/compass
安装之后填写主机信息即可连接 -
MongoDB 备份方法
https://www.mongodb.com/docs/manual/core/backups/