如何创建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