CentOS 7 上的 MongoDB 复制
在此页
- 第 1 步 - 准备服务器
- 第 2 步 - 在所有节点上安装 MongoDB
- 第 3 步 - 配置防火墙
- 第 4 步 - 配置 MongoDB 副本集
- 第 5 步 - MongoDB 副本集启动
- 第 6 步 - 测试复制
- 参考资料
MongoDB 是一种 NoSQL 企业级数据库,可提供高性能、高可用性和自动缩放功能。在 NoSQL 数据库上,您不能使用 SQL(结构化查询语言)来插入和检索数据,并且它不会像 MySQL 或 Postgres 那样将数据存储在表中。数据存储在 JSON 格式的“文档”结构中(在 MongoDB 中称为 BSON)。 MongoDB 于 2009 年首次推出,目前由 MongoDB Inc. 公司开发。
在本教程中,我将指导您逐步在 MongoDB 中构建副本集。我们将使用 3 个安装了 CentOS 7 的服务器节点,然后安装和配置 MongoDB。
先决条件
- 三台安装了 CentOS 7 的服务器
10.0.15.21 mongo1
10.0.15.22 mongo2
10.0.15.23 mongo3
- 根权限
第 1 步 - 准备服务器
在本教程中,我将为 MongoDB 禁用 SELinux。我们需要编辑 SELinux 配置文件,并将 enforcing 的值更改为 disabled。
使用 ssh 连接到所有服务器节点。
ssh
使用 vim 编辑主机文件。
vim /etc/hosts
在下面粘贴主机配置:
10.0.15.21 mongo1
10.0.15.22 mongo2
10.0.15.23 mongo3
保存文件并退出。
接下来,我们将通过使用 vim 编辑配置文件来禁用 SELinux。
vim /etc/sysconfig/selinux
将值强制更改为禁用。
SELINUX=disabled
保存并退出,然后重启服务器。
reboot
使用命令检查 SELinux 状态。
getenforce
确保您因此而被禁用。
第 2 步 - 在所有节点上安装 MongoDB
在此步骤中,我们将从官方存储库安装 MongoDB。第一步是将新的 MongoDB 3.4 存储库添加到 /etc/yum.repos.d/ 目录。
运行以下命令以添加存储库。
cat <<'EOF' >> /etc/yum.repos.d/mongodb.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
EOF
接下来,使用 yum 命令安装 mongodb-org 包。
sudo yum -y install mongodb-org
MongoDB 已安装在所有 CentOS 7 节点上。
笔记:
如果您想要有关 MongoDB 安装的完整教程,请查看此链接。
第 3 步 - 配置 Firewalld
在第一步中,我们已经禁用了 SELinux。出于安全原因,我们现在将在所有节点上启用 firewalld 并仅打开 MongoDB 和 SSH 使用的端口。
使用 yum 命令安装 Firewalld。
yum -y install firewalld
启动 firewalld 并使其在引导时启动。
systemctl start firewalld
systemctl enable firewalld
接下来,打开您的 ssh 端口和 MongoDB 默认端口 27017。
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=27017/tcp
重新加载 firewalld 以应用更改。
firewall-cmd --reload

第 4 步 - 配置 MongoDB 副本集
副本集是 MongoDB 中维护相同数据和信息的一组 mongod 进程。副本集为数据库的生产部署提供高可用性和容错能力。
mongodb 中的复制由多个运行 mongod 进程的 MongoDB 服务器实例组成,只有一个实例作为 PRIMARY 运行,所有其他实例都是 SECONDARY。数据仅写入 PRIMARY 实例,然后将数据集复制到所有 SECONDARY 实例。
在此步骤中,我们将准备所有服务器节点以在 MongoDB 中实现副本集。
使用 vim 编辑 MongoDB 配置文件 mongod.conf 文件。
vim /etc/mongod.conf
在 net 部分第 27 行中,注释 bindIP。
net:
port: 27017
# bindIP: 127.0.0.1
接下来,取消注释复制行 36,并将复制名称设置为 myreplica01。
replication:
replSetName: "myreplica01"
保存文件并退出 vim。
在所有节点上重启 MongoDB。
systemctl restart mongod
现在检查 mongodb 并确保它在服务器 ipaddress 上运行,而不是本地主机 ipaddress。
netstat -plntu

第 5 步 - MongoDB 副本集启动
在此步骤中,我们将创建副本集。我们将使用 mongo1 服务器作为 PRIMARY 节点,使用 mongo2 和 mongo3 作为 SECONDARY 节点。
登录到 mongo1 服务器并启动 mongo shell。
ssh
mongo
使用以下查询从 mongo1 服务器启动副本集。
rs.initiate()
确保 ok 值为 1。
现在将 mongo2 和 mongo3 节点添加到副本集。
rs.add("mongo2")
rs.add("mongo3")
您将看到下面的结果并确保没有错误。

接下来,使用下面的 rs 查询检查副本集状态。
rs.status()

另一个检查状态的查询是:
rs.isMaster()

第 6 步 - 测试复制
测试从 PRIMARY 实例 mongo1 到 SECONDARY 节点 mongo2 和 mongo3 的数据集复制。
在此步骤中,我们将尝试在 PRIMARY 节点 mongo1 上写入或创建一个新数据库,然后通过检查 SECONDARY 节点 mongo2 和 mongo3 上的数据库来检查复制是否正常工作。
登录到 mongo1 服务器并打开 mongo shell。
ssh
mongo
现在为数据库创建一个新的数据库 lemp 和新的堆栈集合。
use lemp
db.stack.save(
{
"desc": "LEMP Stack",
"apps": ["Linux", "Nginx", "MySQL", "PHP"],
})

接下来,转到 SECONDARY 节点 mongo2 并打开 mongo shell。
ssh
mongo
使用查询 rs.slaveOk() 启用从 SECONDARY 节点读取,然后检查 SECONDARY 节点上是否存在 lemp 数据库。
rs.slaveOk()
show dbs
use lemp
show collections
db.stack.find()
如果没有错误,您将看到以下结果:

来自 PRIMARY 节点的数据库已被复制到 SECONDARY 节点,来自 mongo1 实例的数据库 lemp 已成功复制到 mongo2 和 mongo3 实例。
已成功创建 MongoDB 副本集。
参考
- https://docs.mongodb.com/manual/core/replica-set-members/