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
[root@zzx ~]# yum update glibc
[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
[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
[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
[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
[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%]
[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
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>
> rs.conf()
rs.status()
> rs.add( { host: "192.168.111.112:27017", priority: 0, votes: 0 } )
成功后查看集群状态,没问题之后可以登录从节点看看命令提示符是否变化。
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/