如何创建MongoDB复制集群
时间:2020-01-09 10:39:05 来源:igfitidea点击:
说明
当数据库的整个数据量都可以容纳在单个服务器上时,复制群集可以很好地工作。复制群集中的每个服务器将托管数据库的完整副本。
服务器配置
| 主机名 | 起始角色 | IP地址 |
|---|---|---|
| mongodb01.theitroad.test | Master | 10.0.0.10 |
| mongodb02.theitroad.test | Slave | 10.0.0.11 |
| mongodb03.theitroad.test | Slave | 10.0.0.12 |
创建密钥文件以保护MongoDB集群流量
密钥文件存储每个节点使用的密码。密码允许每个节点相互认证,从而允许它们在彼此之间复制更改。此密码应该很长且非常复杂。我们将使用OpenSSL命令来确保我们的密码很复杂。
- 登录到MongoDB服务器之一。
- 在命令行中,执行以下命令。这将生成一个随机的长字符串,用于增加加密强度。我们将输出传递到文件中,该文件将用作密钥文件。
openssl rand -base64 741 > keyfile
- 创建将存储密钥的目录。
sudo mkdir -p /opt/mongodb
- 将文件复制到新目录。
sudo cp keyfile /opt/mongodb
- 将密钥文件的所有权设置为mongodb。
sudo chown mongodb:mongodb /opt/mongodb/keyfile
- 设置适当的文件权限。
sudo chmod 0600 /opt/mongodb/keyfile
- 将密钥文件复制到将成为复制群集成员的每台服务器。
为MongoDB复制做准备
在预期构成集群的所有MongoDB服务器上应遵循以下说明。
准备复制
- 登录到将作为主服务器启动的MongoDB服务器。
- 在文本编辑器中打开MongoDB配置文件。
sudo vi /etc/mongod.conf
- 找到配置文件的"网络接口"部分。
- 将bindIp的值设置为0.0.0.0,以允许通过任何网络接口进行通信,或者添加特定网络接口的IP地址。
# network interfaces net: port: 27017 bindIp: 0.0.0.0
- 找到配置文件的注释掉的安全性部分。
- 取消评论的安全性:
- 使用先前创建的密钥文件的路径,并设置keyFile选项。
security: keyFile: /opt/mongodb/keyfile
- 继续向下配置文件,直到到达复制部分。
- 取消注释复制:并设置replSetName选项。 ReplSetName设置复制群集的名称,并且该群集的所有节点必须使用相同的名称。
replication: replSetName: app1r0
- 每个MongoDB服务器上的配置文件应与此相似。
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
#processManagement:
security:
keyFile: /opt/mongodb/keyfile
#operationProfiling:
replication:
replSetName: app1r0
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
- 重新启动MongoDB以应用我们的更改。
sudo service mongod restart
创建复制集
创建根管理员帐户
默认的MongoDB配置是完全开放的,这意味着除非网络具有适当的防火墙规则,否则任何人都可以访问存储的数据库。
- 登录到MongoDB主服务器。在我们的示例中,它将是mongodb01.theitroad.test。
- 登录到Mongo控制台
mongo
- 选择管理数据库。
use admin
- 创建根管理员帐户。
db.createUser( {
user: "RootAdmin",
pwd: "",
roles: [ { role: "root", db: "admin" } ]
});
启动复制集
- 仍在Mongo控制台中时,运行以下命令。
rs.initiate()
- 启动复制集时将输出以下消息。
{
"info2" : "no configuration explicitly specified -- making one",
"me" : "mongodb01:27017",
"ok" : 1
}
- 通过查看复制配置来验证初始化是否成功完成。
rs.conf()
- 输出应类似于以下内容。
{
"_id" : "app1r0",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "mongodb01:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : 0,
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatTimeoutSecs" : 10,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
}
}
}
将从站添加到复制集中
- 将成员服务器添加到群集。
rs.add("mongodb02.theitroad.test:27017")
rs.add("mongodb03.theitroad.test:27017")
- 如果正确添加了服务器,则将获得每个服务器的以下输出。
{ "ok" : 1 }
- 检查复制群集的状态。
rs.status()
- 我们会从输出中注意到,已经添加了两个从属节点,但尚未准备好接收数据库。
{
"set" : "app1r0",
"date" : ISODate("2015-10-18T18:29:31.692Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongodb01:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 541,
"optime" : Timestamp(1445192965, 1),
"optimeDate" : ISODate("2015-10-18T18:29:25Z"),
"electionTime" : Timestamp(1445192531, 2),
"electionDate" : ISODate("2015-10-18T18:22:11Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 1,
"name" : "mongodb02.theitroad.test:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 6,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-18T18:29:31.089Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 0,
"configVersion" : -2
}
],
"ok" : 1

