使用密钥文件在Ubuntu 16.04上的访问控制中在MongoDB 3.4中部署具有高可用性的副本集

自2009年推出以来,MongoDB一直引领NoSQL行业。MongoDB的核心概念之一是副本集,因此在使用它之前首先要对其进行回顾。

关于副本集

数据库复制中使用的最简单的通信模型是Master-Slave体系结构。顾名思义,该模型有2个角色,分布在唯一的主服务器和许多从服务器中,主服务器的角色是处理客户端执行的读取和写入操作,而从服务器被视为主服务器的副本。

此模型的最重要优点是,备份操作不会损害主服务器的性能,备份操作是以异步方式完成的,当主节点发生故障时,这可能会成为一个严重的问题。从节点是只读的,必须将它们手动提升为主节点,因此此时可能会丢失数据。

解决可用性问题的一个选项是在体系结构中拥有多个主服务器,但这可能导致这些实例之间的数据一致性以及配置复杂性增加的另一个问题。

现在,根据上下文,我们可以介绍MongoDB 的副本集技术。副本集是具有自动故障转移功能的主从结构的名称,因此,当主primary节点(现在称为)无法正常运行时,election将触发并从​​其余从节点中选出一个新的主节点(现在称为secondaries)。

主节点

主节点是唯一执行写操作的节点,默认情况下,读操作也由主节点处理,但是此行为以后可以更改。

将操作记录到oplog(操作日志)中,然后辅助节点根据操作的内容异步更新其内容。oplog

注意:这oplog是一个有上限的集合,这意味着该集合具有限制,local.oplog.rs您可以在任何set成员的mongo shell中检查该集合的内容。

次要节点

除了是负责适当备份数据库的人之外,辅助节点还具有以下角色:

  • 如果需要,可以接受读取操作。
  • 如果主节点发生故障,则可以触发选举。
  • 可以在选举中投票。
  • 如果需要,可以成为新的主要对象。

由于这些特性,我们可以拥有不同类型的辅助节点:

  • 优先级0:这些节点不能成为primary,也不能触发选举,它们仍然可以在选举中投票,具有完整的副本并可以接受读取操作。这些在多数据中心部署中可能会有所帮助。
  • 隐藏的:这些是Priority 0成员,但是它们不能处理读取操作。如有必要,他们可以投票。这些成员的首选任务是报告和备份。
  • 延迟的:这些节点通过以某个时间单位延迟而负责“历史数据”。延迟成员必须是priority 0节点,并且建议它们hidden也成为成员。

先决条件

  • 可在相同服务器大小下运行至少3个Ubuntu 16.04 x64实例的可用性。

设计副本集

在部署基础架构之前,设计基础架构很重要,并且在设计中需要考虑一些要点。

选择会员人数

请记住,构建副本集的最小元素数是3。您可以将三种类型的节点与至少一个主节点和一个辅助节点混合使用。

在本指南中,我们将部署3个成员,一个主要成员和两个标准次要成员。

注意:建议最多由7名投票成员组成,其中包括仲裁员和次要成员。

选择一个名字

该名称仅供参考,但是您正在该集合的配置中使用它。请记住,您的生产环境中可以有多个副本集,因此请不要忽略您的副本集的名称。

本教程鼓励用户选择集合的名称。

成员在不同数据中心的分布

本教程建议在同一数据中心上部署,这样可以避免出现通信问题。

注意:如果要在不同的数据中心中进行部署,建议使用VPN包围您的节点

部署说明

步骤1:为基础架构部署最少的节点

启动Ubuntu 16.04 x64的3个节点; 如果可能,从您的客户门户在同一区域中。不要忘记根据您要处理的项目类型来命名它们,并确保所有这些节点中的服务器大小均相同

部署3个节点后,必须确保每个节点都可以与其余节点通信。您需要将ssh分为两个节点,并使用来访问其他节点ping -c 4 EXAMPLE_IP。更改EXAMPLE_IP为节点的实际IP。

在这里,您可以看到两个节点之间成功通信的示例。

root@foo_node:~# ping -c 4 EXAMPLE_IP
PING EXAMPLE_IP (EXAMPLE_IP) 56(84) bytes of data.
64 bytes from EXAMPLE_IP: icmp_seq=1 ttl=59 time=0.594 ms
64 bytes from EXAMPLE_IP: icmp_seq=2 ttl=59 time=0.640 ms
64 bytes from EXAMPLE_IP: icmp_seq=3 ttl=59 time=0.477 ms
64 bytes from EXAMPLE_IP: icmp_seq=4 ttl=59 time=0.551 ms

--- EXAMPLE_IP ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3021ms
rtt min/avg/max/mdev = 0.477/0.565/0.640/0.064 ms

步骤2:在基础架构的每个节点中安装MongoDB

通常,您可以使用Ubuntu的MongoDB软件包,但最好使用官方社区存储库,因为它始终是最新的。此仓库包含以下软件包:

  • mongodb-org,它封装了四个组件。
  • mongodb-org-server,其中包含mongod守护程序(处理数据请求的主进程)。
  • mongodb-org-mongos,它包含mongos守护程序(共享部署的路由服务)。
  • mongodb-org-shell,这是mongo shellJavaScript接口。
  • mongodb-org-tools,一些用于管理活动的工具。

继续安装软件包。

将公钥导入包管理系统。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

为MongoDB'/etc/apt/sources.list.d/mongodb-org-3.4.list'创建列表文件。

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

更新软件包数据库。

sudo apt-get update

安装MongoDB元软件包。

sudo apt-get install -y mongodb-org

启动MongoDB服务。

sudo service mongod start

现在,您可以mongo shell在任何bash会话中打开。为此,您必须使用mongo命令。与此类似的东西会打招呼。

MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
*Some extra logs are cut by the way*
>

不要忘记使用来关闭服务sudo service mongod stop,因为稍后我们将mongod使用一些参数重新开始。在集合的所有3个节点中重复此过程。

步骤3:配置访问密钥文件

使用密钥文件在副本集管理中强制执行两个概念。第一个是Internal Authentication。默认情况下,您可以在mongo shell不使用用户的情况下启动会话,并且该会话将完全控制数据库,但是当您使用密钥文件进行身份验证时,mongo shell会话将达到的状态localhost exception。此状态仅允许您创建管理员用户和副本集。第二个概念是Role-Based Access Control,换句话说就是授权。强制执行此操作以管理副本集的管理级别。

创建您的密钥文件

密钥文件是在集合中使用的密码,该密码在集合的所有成员中必须相同。为了提高安全性,重要的是要使用随您选择的工具使用随机密钥。

内容必须在6到1064个字符之间。另外,您必须设置read only密钥文件的权限。

chmod 400 PATH_OF_YOUR_KEYFILE
将密钥文件放置在每个set成员中

现在,将您的密钥文件复制到每个设置的成员,请使用一致的文件夹以备将来参考,并且不要将其存储在可移动介质中。

另外,请使用mongod可访问文件的文件夹。

强制使用副本集中的密钥文件

在这一步中,我们需要mongod daemon 在每个set成员中启动。有两种方法可以启动该mongod过程:使用配置文件或使用命令行。两种方法都很简单,但为简单起见,本教程使用命令行版本。

命令行配置

使用您在此命令前面选择的名称。

mongod --keyFile PATH_OF_YOUR_KEYFILE --replSet "YOUR_SET_NAME"

默认情况下mongod不作为守护程序运行。您将需要使用该--fork参数或使用将该参数upstart作为守护程序完全运行。在本教程中,我们不鼓励mongod以守护程序的身份运行,因此您可以直接在终端中查看日志。

注意:仔细键入副本集的名称,因为创建后就无法更改它。

步骤4:从一组成员之一连接到localhost接口

注意:如果您mongod以非守护进程运行,则必须打开另一个ssh连接才能继续工作。

您必须使用mongo命令打开mongo shell。这可以在集合的任何成员中完成。

此刻,我们处于称为的状态localhost exception。当使用密钥文件来设置mongod过程时,必须先创建数据库管理员,然后才能应用读写操作,但是稍后我们将进行介绍。

步骤5:启动副本集

这是一个微妙的部分,我们rs.initiate()mongo shell步骤4中使用命令。在使用此命令之前,让我们对其进行回顾。

rs.initiate(
  {
    _id : <replicaSetName>,
    members: [
      { _id : 0, host : "example1.net:27017" },
      { _id : 1, host : "example2.net:27017" },
      { _id : 2, host : "example3.net:27017" }
    ]
  }
)

第一个_id字段是一个字符串,必须与--replSet之前传递给的字符串匹配mongod。另外,的每个值都host必须是副本集中每个成员的ip或域名。不要忘记在每个成员中附加mongo实例正在使用的端口。

现在该执行包含数据的命令了,这将触发一个election,然后将自动选择一个主要对象。

在这里,您应该注意您的shell光标已更改为YOUR_SET_NAME:PRIMARY>YOUR_SET_NAME:SECONDARY。这意味着创建集合是成功的。

要继续工作,您当然需要找到primary,如果您不在其中。使用rs.status()命令显示副本集的信息并找到primary。您正在寻找物业"stateStr" : "PRIMARY"

步骤6:创建管理员

找到之后primary,输入mongo shell并使用您的数据运行下一个命令。

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "YOUR_USER",
    pwd: "YOU_PASSWORD",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

admin = db.getSiblingDB("admin")部分使我们可以admin从其他数据库写入数据。这将创建一个名为的别名admin,因此我们可以改用它来执行命令。

如果操作成功,您将收到有关已添加用户的通知。

Successfully added user: {
    "user" : "YOUR_USER",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

在这一点上,我们只有所有服务器的管理员,但是设置副本服务器将迫使我们拥有一个clusterAdmin角色用户。我们将创建仅具有该角色的另一个用户来分离关注点。

步骤7:以管理员身份验证

我们已达到的限制localhost exception,这就是为什么我们必须将身份验证更改为之前创建的用户的原因。

您可以mongo shell通过以下方法更改内的用户。

db.getSiblingDB("admin").auth("YOUR_ADMIN", "YOUR_PASSWORD" )

如果尚未连接,请mongo shell使用此命令。

mongo -u "YOUR_ADMIN" -p "YOUR_PASSWORD" --authenticationDatabase "admin"

您将收到有关用户更改的通知,然后可以进行下一步。

步骤8:创建集群主服务器

clusterAdmin角色使用户可以完全控制副本集。创建它就像创建管理员用户一样容易。

db.getSiblingDB("admin").createUser(
  {
    "user" : "YOUR_USER",
    "pwd" : "YOUR_PASSWORD",
    roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
  }
)

请注意,这次角色更改为clusterAdmin

步骤9:将数据插入副本集

目前,我们有2个管理员用户:一个完全控制服务器,另一个可以访问副本集级别的管理任务。但是,我们缺少有权“使用”数据库的用户,因此我们现在将创建该用户。

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "YOUR_USER",
    pwd: "YOUR_PASSWORD",
    roles: [ { role: "userAdminAnyDatabase", db: "cars" } ]
  }
)

请注意,这次我们要更改db零件,我们将数据库放置在用户可访问的位置,在这种情况下,我们使用的数据库名为cars

该数据库尚未创建。为此,您将必须键入一些命令以隐式创建它。切换到cars数据库。

use cars

您会收到一条通知:switched to db cars

尚未创建数据库,为此,您需要向数据库中写入一些内容。我们使用以下示例。

db.models.insert({ make: "Dodge", model: "Viper", year: 2010 })

这次您将收到通知WriteResult({ "nInserted" : 1 })

如果需要,可以使用以下find()方法检索数据库中的所有对象:

db.models.find()
{ "_id" : ObjectId("59acd8b55334882863541ff4"), "make" : "Dodge", "model" : "Viper", "year" : 2010 }

请注意,_id您的输出将有所不同,但其他数据应相同。如果有足够的时间,此数据将被复制到其他成员。

结论

首先,创建副本集可能具有挑战性,因为有很多信息需要理解,但是一旦您了解了它的想法,就可以轻而易举地部署它,因此,如果您第一次无法掌握它就不要放弃。请记住,副本集在MongoDB管理中非常重要,因为它为添加高级功能(如负载平衡)提供了可能性。



Leave a Comment

如何在Arch Linux上安装MariaDB 10.3或MySQL 8.0

如何在Arch Linux上安装MariaDB 10.3或MySQL 8.0

先决条件运行最新的Arch Linux的Vultr服务器(请参阅本文。)Sudo访问:需要以root身份运行的命令以#开头,其中一个

自动备份多个MySQL或MariaDB数据库

自动备份多个MySQL或MariaDB数据库

简介在本文中,我们将逐步介绍如何使用自定义bash脚本备份位于同一台计算机上的多个MySQL或MariaDB数据库

如何在Debian 9上安装Apache Cassandra 3.11.x

如何在Debian 9上安装Apache Cassandra 3.11.x

使用其他系统?Apache Cassandra是免费的开源NoSQL数据库管理系统,旨在提供可扩展性,高

如何在CentOS 7上安装和配置OrientDB Community Edition

如何在CentOS 7上安装和配置OrientDB Community Edition

OrientDB是下一代多模型开源NoSQL DBMS。通过支持多种数据模型,OrientDB可以在以下方面提供更多功能和灵活性:

如何在Ubuntu 16.04上备份,还原或传输MySQL / MariaDB数据库

如何在Ubuntu 16.04上备份,还原或传输MySQL / MariaDB数据库

备份是处理数据库的重要部分。无论您是运行公司网站还是仅托管WordPress,备份您的信息都很重要

如何在Ubuntu 15.10上安装Redis

如何在Ubuntu 15.10上安装Redis

Redis是键值数据存储解决方案,通常称为NoSQL数据库。它是内存中的单元,因此可以实现很高的读/写速度。

备份MySQL数据库

备份MySQL数据库

MySQL是世界上用于数据库的最流行的软件。确保您具有数据库备份非常重要。这种做法允许

在Ubuntu 16.04上通过SSL支持保护MariaDB

在Ubuntu 16.04上通过SSL支持保护MariaDB

MariaDB是一个免费的开源数据库,并且是MySQL中使用最广泛的直接替代方法。它由MySQL的开发人员制作,旨在恢复

使用Telegraf在Debian Jessie上安装InfluxDB

使用Telegraf在Debian Jessie上安装InfluxDB

简介InfluxDB是用Go编写的基于时间序列的数据库。InfluxDB有许多实际用途,其中之一是将监视数据存储在服务器上。一世

如何在Arch Linux上安装PostgreSQL 11.1

如何在Arch Linux上安装PostgreSQL 11.1

先决条件运行最新的Arch Linux的Vultr服务器(请参阅本文。)Sudo访问。需要以root身份运行的命令以#开头,其中一个

在OpenBSD 6上配置MariaDB

在OpenBSD 6上配置MariaDB

在本文中,我将向您展示如何在OpenBSD 6上安装MariaDB并将其配置为可供chroot的Web服务器(Apache或Nginx)访问。你会

如何在Ubuntu 16.04 LTS上安装Apache Cassandra 3.11.x

如何在Ubuntu 16.04 LTS上安装Apache Cassandra 3.11.x

使用其他系统?Apache Cassandra是免费的开源NoSQL数据库管理系统,旨在提供可扩展性,高

使用Snort设置Bar 2

使用Snort设置Bar 2

Barnyard2是一种将Snort的二进制输出存储和处理到MySQL数据库中的方法。开始之前,请注意,如果您没有打nor

如何使用Redis配置WordPress

如何使用Redis配置WordPress

Redis是一个数据结构存储。它在WordPress网站中很受欢迎,因为它通过优化的缓存方法提供了巨大的性能提升。

如何在Ubuntu 16.04上安装和使用ArangoDB

如何在Ubuntu 16.04上安装和使用ArangoDB

使用其他系统?简介ArangoDB是一个开放源代码NoSQL数据库,具有用于文档,图形和键值的灵活数据模型。它是

如何在Arch Linux上安装MongoDB 4.0

如何在Arch Linux上安装MongoDB 4.0

先决条件运行最新的Arch Linux的Vultr服务器(请参阅本文)Sudo访问:需要以root身份运行的命令以#开头,其中一个

如何在CentOS 7上安装Apache Cassandra 3.11.x

如何在CentOS 7上安装Apache Cassandra 3.11.x

使用其他系统?Apache Cassandra是免费的开源NoSQL数据库管理系统,旨在提供可扩展性,高

如何在CentOS 7上安装Laravel GitScrum

如何在CentOS 7上安装Laravel GitScrum

Laravel GitScrum或GitScrum是一种开源生产力工具,旨在帮助开发团队以类似的方式实施Scrum方法。

使用Docker在CentOS 7上开始使用SQL Server 2017(MS-SQL)

使用Docker在CentOS 7上开始使用SQL Server 2017(MS-SQL)

前提条件Docker引擎1.8+。至少4GB的磁盘空间。至少4GB的RAM。步骤1.安装Docker为了安装SQL-Server,Docker mus

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。