1. 下载和安装
MongoDB社区版下载地址
如上图所示,拷贝链接然后到命令行中输入,下载MongoDB服务端的rpm安装包
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.7-1.el7.x86_64.rpm
下载完成后,接着进行安装
rpm -ivh mongodb-org-server-4.2.7-1.el7.x86_64.rpm
此时只是安装了MongoDB的服务端,如果还需要用命令行连接 mongoDB,则需要安装 shell 程序包
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-shell-4.2.7-1.el7.x86_64.rpm
rpm -ivh mongodb-org-shell-4.2.7-1.el7.x86_64.rpm
如果需要一些附加工具,例如数据导入导出,则需要安装 tool 程序包
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-tools-4.2.7-1.el7.x86_64.rpm
rpm -ivh mongodb-org-tools-4.2.7-1.el7.x86_64.rpm
如果要部署集群,则还需要安装 mongos 程序包
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-mongos-4.2.7-1.el7.x86_64.rpm
rpm -ivh mongodb-org-mongos-4.2.7-1.el7.x86_64.rpm
2. 默认配置
安装完成之后,在/etc目录下会有一个mongod.conf ,这是mogoDB 的配置文件。
使用cat命令进行查看
cat /etc/mongod.conf
默认配置如下
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
一些参数的介绍:
systemLog.path:系统运行日志的路径
storage.dbPath:数据文件存放路径
net:定义了端口号以及绑定的IP,如果想使用其他主机进行连接,IP改为0.0.0.0
security:配置MongoDB的安全项,例如秘钥,权限控制等等
replication:配置复制集
sharding:配置分片集群
3. 配置复制集
这里使用的是两台云服务器,其中Service 1配置为主节点,Service 2配置两个从节点
3.1 Service 1
目录结构如下(data目录存放数据文件,log目录存放日志,mongdo.conf为配置文件):
接着进行主节点primary配置文件的设置(mongod.conf):
systemLog:
destination: file
logAppend: true
path: /root/mongodb/primary/log/mongod.log
storage:
dbPath: /root/mongodb/primary/data
journal:
enabled: true
net:
port: 27017 # 主节点用27017端口
bindIp: 0.0.0.0
replication:
replSetName: strong # 复制集名称
processManagement:
fork: true
pidFilePath: /var/run/mongodb/primary_mongod.pid
启动primary服务:
mongod -f /root/mongodb/primary/mongod.conf
# 这里是mongod已经配置系统变量,如果没有配置,则需要具体的路径
3.2 Service 2
目录结构如下(两个从节点,每个从节点和上面一样的结构):
secondary_1的配置文件:
systemLog:
destination: file
logAppend: true
path: /root/mongodb/secondary_1/log/mongod.log
storage:
dbPath: /root/mongodb/secondary_1/data
journal:
enabled: true
net:
port: 27018 # 从节点1用27018端口
bindIp: 0.0.0.0
replication:
replSetName: strong # 复制集名称
processManagement:
fork: true
pidFilePath: /var/run/mongodb/secondary_1_mongod.pid
secondary_2的配置文件:
systemLog:
destination: file
logAppend: true
path: /root/mongodb/secondary_2/log/mongod.log
storage:
dbPath: /root/mongodb/secondary_2/data
journal:
enabled: true
net:
port: 27019 # 从节点2用27019端口
bindIp: 0.0.0.0
replication:
replSetName: strong # 复制集名称
processManagement:
fork: true
pidFilePath: /var/run/mongodb/secondary_2_mongod.pid
启动secondary_1和secondary_2:
mongod -f /root/mongodb/secondary_1/mongod.conf
mongod -f /root/mongodb/secondary_2/mongod.conf
选择primary节点,在命令行中输入mongo,进入mongodb,输入rs.status()查看复制集的状态信息,提示复制集还未配置。
rs.status()
{
"operationTime" : Timestamp(0, 0),
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized",
"$clusterTime" : {
"clusterTime" : Timestamp(0, 0),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
定义config初始化参数,并进行初始化。
# _id:0 为主节点的ip和端口号
# _id:1 为从节点1的ip和端口号
# _id:2 为从节点2的ip和端口号
config={"_id":"kgcrs","members":[
{"_id":0,"host":"xxxx:27017"},
{"_id":1,"host":"xxxx:27018"},
{"_id":2,"host":"xxxx:27019"}
]}
rs.initiate(config)
结果如下:
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1590839215, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1590839215, 1)
}
最后通过rs.status()查看主节点状态
{
"set" : "strong",
"date" : ISODate("2020-05-30T11:47:06.271Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastCommittedWallTime" : ISODate("1970-01-01T00:00:00Z"),
"appliedOpTime" : {
"ts" : Timestamp(1590839225, 5),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1590839225, 5),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-05-30T11:47:05.985Z"),
"lastDurableWallTime" : ISODate("2020-05-30T11:47:05.985Z")
},
"lastStableRecoveryTimestamp" : Timestamp(0, 0),
"lastStableCheckpointTimestamp" : Timestamp(0, 0),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-05-30T11:47:05.947Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1590839215, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2020-05-30T11:47:05.972Z")
},
"members" : [
{
"_id" : 0,
"name" : "xxxx:27017", # 主节点
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 508,
"optime" : {
"ts" : Timestamp(1590839225, 5),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-05-30T11:47:05Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1590839225, 1),
"electionDate" : ISODate("2020-05-30T11:47:05Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "xxxx:27018", # 从节点1
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 10,
"optime" : {
"ts" : Timestamp(1590839215, 1),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(1590839215, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2020-05-30T11:46:55Z"),
"optimeDurableDate" : ISODate("2020-05-30T11:46:55Z"),
"lastHeartbeat" : ISODate("2020-05-30T11:47:05.957Z"),
"lastHeartbeatRecv" : ISODate("2020-05-30T11:47:06.049Z"),
"pingMs" : NumberLong(2),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "xxxx:27019", # 从节点2
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 10,
"optime" : {
"ts" : Timestamp(1590839215, 1),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(1590839215, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2020-05-30T11:46:55Z"),
"optimeDurableDate" : ISODate("2020-05-30T11:46:55Z"),
"lastHeartbeat" : ISODate("2020-05-30T11:47:05.958Z"),
"lastHeartbeatRecv" : ISODate("2020-05-30T11:47:06.034Z"),
"pingMs" : NumberLong(2),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1590839225, 5),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1590839225, 5)
}
后续如果想添加从节点
rs.add("xxxx:xxx")
rs.add("xxxx:xxx")
如果想删除某个节点可以用
rs.remove("xxxx:xxx")
如果想关闭服务,可以用下面的命令
mongod --shutdown --dbpath xxx
# mongod 命令的 shutdown 选项能干净的关闭 MongoDB 服务。
如果想对当前节点降级,可以用下面的命令。通过执行 rs.stepDown(30) 命令将当前主库“降级”,30秒内这个实例不会把自己选为primary角色,相当于在30秒内此实例被“降级”了。
rs.stepDown(30)
附录
给出了两个脚本可以方便地开启和关闭全部的MongoDB服务
start.sh
#!/bin/bash
echo -e "start rs !\n"
# 启动primary节点
mongod -f /root/mongodb/primary/mongod.conf
if [ $? -eq 0 ]; then
echo -e "\nsuccessful start primary !\n"
else
echo -e "\nfail to start primary !\n"
fi
# 登录其他服务器,开启从节点
ssh user_name@ip "mongod -f /root/mongodb/secondary_1/mongod.conf;mongod -f /root/mongodb/secondary_2/mongod.conf"
if [ $? -eq 0 ]; then
echo -e "\nsuccessful start secondary !\n"
else
echo -e "\nfail to start secondary !\n"
fi
echo "done !"
stop.sh
#!/bin/bash
echo -e "stop rs !\n"
# 关闭primary节点
mongod --shutdown --dbpath /root/mongodb/primary/data/
if [ $? -eq 0 ]; then
echo -e "\nsuccessful stop primary !\n"
else
echo -e "\nfail to stop primary !\n"
fi
# 登录其他服务器,关闭从节点
ssh user_name@ip "mongod --shutdown --dbpath /root/mongodb/secondary_1/data/;mongod --shutdown --dbpath /root/mongodb/secondary_2/data/"
if [ $? -eq 0 ]; then
echo -e "\nsuccessful stop secondary !\n"
else
echo -e "\nfail to stop secondary !\n"
fi
exit
echo "done !"
注:使用ssh生成公钥进行登录,这样就无需输入用户和密码
具体的可以看这里