如何创建MongoDB复制集群

时间:2020-01-09 10:39:05  来源:igfitidea点击:

说明

当数据库的整个数据量都可以容纳在单个服务器上时,复制群集可以很好地工作。复制群集中的每个服务器将托管数据库的完整副本。

服务器配置

主机名起始角色IP地址
mongodb01.theitroad.testMaster10.0.0.10
mongodb02.theitroad.testSlave10.0.0.11
mongodb03.theitroad.testSlave10.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