CentOS 8自动化安装MongoDB并安装和实验master-slave集群、副本集群(Replica Set)、分片集群(Sharding)

注意实验使用的是ARM架构的CentOS 8 虚拟机

CentOS 8自动化安装MongoDB

  1. 首先,更新系统并安装必要的依赖项:
sudo dnf update -y
sudo dnf install -y wget
  1. 添加 MongoDB 官方仓库:

创建一个新的仓库文件 /etc/yum.repos.d/mongodb-org.repo

sudo nano /etc/yum.repos.d/mongodb-org.repo

将以下内容添加到文件中,保存并退出:

[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/aarch64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc

在这里插入图片描述

使用nano编辑器打开/etc/yum.repos.d/mongodb-org.repo文件后,按下Ctrl + X组合键退出编辑模式,按下Y键保存更改,然后按下Enter键确认保存。如果不想保存更改,则可以按下N键,然后按下Enter键不保存更改并退出编辑器。

  1. 安装 MongoDB:
sudo dnf install -y mongodb-org
  1. 启动 MongoDB 服务并设置开机自启动:
sudo systemctl start mongod
sudo systemctl enable mongod

在这里插入图片描述

  1. 检查 MongoDB 服务状态:
sudo systemctl status mongod

在这里插入图片描述

现在,已成功安装了 MongoDB。接下来,了解如何使用 MongoDB。

  1. 使用 mongo shell 连接到 MongoDB 服务:
mongo

这将打开一个交互式 mongo shell,您可以在其中执行 MongoDB 命令。

在这里插入图片描述

  1. 显示数据库列表:
show dbs

在这里插入图片描述

  1. 创建或切换到一个数据库,例如 myDatabase:
use myDatabase
  1. 在当前数据库中创建一个集合并插入文档:
db.myCollection.insert({
    
    name: "John", age: 30, city: "New York"})
  1. 查询当前集合中的所有文档:
db.myCollection.find()

这些是一些基本的 MongoDB 操作。可以在 MongoDB 官方文档中找到更多详细信息和高级功能:https://docs.mongodb.com/manual/

安装Master-Slave集群

因新版本 MongoDB 已不再支持主从复制(Master/Slave Replication),这里只讲解安装过程,不进行实际测试。如果需要请使用 MongoDB(如 3.6.x)进行实验。

注意新版本 MongoDB 已不再支持主从复制(Master/Slave Replication),需要使用 MongoDB(如 3.6.x)进行实验。MongoDB 官方建议使用副本集代替主从复制,因为副本集提供了更高的数据可用性和容错能力,同时具有自动故障转移功能。

  1. 首先确保您已经按照之前的步骤安装了 MongoDB
  2. 在服务器(CentOS 8)上创建两个单独的目录用于存储主节点和从节点的数据:
sudo mkdir -p /data/db-master
sudo mkdir -p /data/db-slave

在这里插入图片描述

  1. 更改这两个目录的所有权,使其属于当前用户:
sudo chown -R `whoami`:`whoami` /data/db-master
sudo chown -R `whoami`:`whoami` /data/db-slave

在这里插入图片描述

  1. 启动主节点实例:
mongod --dbpath /data/db-master --port 27017 --master
  1. 启动从节点实例:

在另一个终端窗口中运行以下命令:

mongod --dbpath /data/db-slave --port 27018 --slave --source localhost:27017

现在,您已经在同一台服务器上启动了两个 MongoDB 实例,分别作为主节点和从节点。接下来进行实验测试:

  1. 向主节点插入数据:

连接到主节点的 MongoDB shell:

mongo --port 27017

选择一个数据库,创建一个集合并插入文档:

use testDB
db.testCollection.insert({
    
    name: "Alice", age: 28})
  1. 查询主节点的数据:
db.testCollection.find()
  1. 查询从节点的数据:

连接到从节点的 MongoDB shell:

mongo --port 27018

在从节点 MongoDB shell 中,启用从节点查询:

rs.slaveOk()

选择数据库并查询数据:

use testDB
db.testCollection.find()

现在能在从节点上看到主节点插入的数据。

  1. 停止主节点以测试故障转移:
    首先,在主节点运行的终端窗口中,按 Ctrl+C 停止 MongoDB 实例。

  2. 在从节点上启动新的主节点:
    首先,停止从节点实例。然后,运行以下命令,将从节点转换为主节点:

mongod --dbpath /data/db-slave --port 27018 --master
  1. 向新主节点插入数据:

连接到新主节点的 MongoDB shell:

mongo --port 27018

选择相同的数据库并插入一个新文档:

use testDB
db.testCollection.insert({
    
    name: "Bob", age: 32})
  1. 查询新主节点上的数据:
db.testCollection.find()

现在,能在新主节点上看到之前插入的数据和新插入的数据。注意新版本 MongoDB 已不再支持主从复制(Master/Slave Replication),需要使用 MongoDB(如 3.6.x)进行实验。MongoDB 官方建议使用副本集代替主从复制,因为副本集提供了更高的数据可用性和容错能力,同时具有自动故障转移功能。

安装并测试副本集(Replica Set)集群

本实验使用在arm架构centos8上的mongodb,安装副本集(Replica Set)集群,并进行小型实验测试。在一台机器上完成,通过不同端口来模拟不同的服务器。实验测试有插入数据、查询数据、停止主节点测试故障转移、手动提升从节点为主节点、向新主节点插入数据等功能。

副本集(Replica Set)集群实验完美成功~~~

安装副本集(Replica Set)集群

  1. 首先,确保您已经按照之前的步骤安装了 MongoDB。
  2. 创建三个单独的目录,用于存储三个 MongoDB 实例的数据:
sudo mkdir -p /data/db1
sudo mkdir -p /data/db2
sudo mkdir -p /data/db3

在这里插入图片描述

  1. 更改这三个目录的所有权,使其属于当前用户:
sudo chown -R `whoami`:`whoami` /data/db1
sudo chown -R `whoami`:`whoami` /data/db2
sudo chown -R `whoami`:`whoami` /data/db3

在这里插入图片描述

  1. 启动三个 MongoDB 实例:

三个不同的终端窗口中分别运行以下命令,将 <your server’s IP address> 替换为你的服务器 IP 地址。:

刚刚安装的MongoDB会先占用27017端口,运行以下命令以查看占用27017端口的进程PID,然后杀死该进程或更改 MongoDB 实例的端口来解决冲突:

sudo lsof -i :27017

kill <pid>

再在三个不同的终端窗口中分别运行以下命令:

mongod --dbpath /data/db1 --port 27017 --replSet rs0 --bind_ip localhost,<your server's IP address>
mongod --dbpath /data/db2 --port 27018 --replSet rs0 --bind_ip localhost,<your server's IP address>
mongod --dbpath /data/db3 --port 27019 --replSet rs0 --bind_ip localhost,<your server's IP address>

我的ip是192.168.178.130,所以命令是下面三个启动MongoDB 实例的命令:

mongod --dbpath /data/db1 --port 27017 --replSet rs0 --bind_ip localhost,192.168.178.130
mongod --dbpath /data/db2 --port 27018 --replSet rs0 --bind_ip localhost,192.168.178.130
mongod --dbpath /data/db3 --port 27019 --replSet rs0 --bind_ip localhost,192.168.178.130
  1. 连接到任一 MongoDB 实例的 shell:

再打开一个命令行窗口:

mongo --port 27017

在这里插入图片描述

  1. 初始化副本集:

在 MongoDB shell 中,运行以下命令:

rs.initiate({
    
    _id: "rs0", members: [{
    
    _id: 0, host: "localhost:27017"}, {
    
    _id: 1, host: "localhost:27018"}, {
    
    _id: 2, host: "localhost:27019"}]})

在这里插入图片描述

实验测试

现在副本集已经建立。接下来进行实验测试:

  1. 向主节点插入数据:
    首先查找主节点:
rs.status()

在这里插入图片描述

在上述信息中,找到 name 为主机名或 IP 地址的节点,其 stateStrPRIMARY,则为主节点,如下图:
在这里插入图片描述

再打开一个命令行窗口(第5个),连接到主节点的 MongoDB shell,并选择一个数据库,创建一个集合并插入文档:

mongo --port 27017
use testDB
db.testCollection.insert({
    
    name: "Alice", age: 28})

在这里插入图片描述

  1. 查询数据:

在主节点上查询数据:

db.testCollection.find()

在这里插入图片描述

在从节点上查询数据(再打开一个命令行窗口,这是第6个。连接到从节点的 MongoDB shell:):

mongo --port 27018

在从节点 MongoDB shell 中,启用从节点查询:

rs.secondaryOk()

选择数据库并查询数据:

use testDB
db.testCollection.find()

在这里插入图片描述
现在能在从节点上看到主节点插入的数据。

  1. 停止主节点以测试故障转移:
    首先,确定当前主节点的端口(27017、27018 或 27019)。然后,在主节点运行的终端窗口中,按 Ctrl+C 停止 MongoDB 实例。

  2. 查看故障转移是否成功:
    在另外两个节点上运行以下命令查看其状态:

rs.status()

在输出中,能看到另外一个节点已经成为新的主节点,其 stateStrPRIMARY,是新的主节点,如下图:
在这里插入图片描述

  1. 手动提升从节点为主节点:
    如果您希望手动将某个从节点提升为主节点,请在当前主节点的 MongoDB shell 中运行以下命令:
    比如现在主机端口是27018,我想换成端口是27019变成主节点:
mongo --port 27018
rs.stepDown()

在这里插入图片描述

该节点(端口号)会将其主节点身份释放,并开始进行选举以产生新的主节点。
再次查看,发现主节点变成端口号是27019的机器:

rs.status()

在这里插入图片描述

  1. 向新主节点插入数据:
    连接到新主节点的 MongoDB shell:
mongo --port 27019

在这里插入图片描述

选择相同的数据库并插入一个新文档:

use testDB
db.testCollection.insert({
    
    name: "Bob", age: 32})
  1. 查询新主节点上的数据:
db.testCollection.find()

现在,能在新主节点上看到之前插入的数据和新插入的数据。
在这里插入图片描述

安装并测试分片集群(Sharding)

本实验使用在arm架构centos8上的mongodb,安装分片集群(Sharding),并进行小型实验测试。在一台机器上完成,通过不同端口来模拟不同的服务器。实验测试有插入数据、查询数据、停止主节点测试故障转移、手动提升从节点为主节点、向新主节点插入数据等功能。

在一台CentOS 8(IP:192.168.178.130)机器上配置MongoDB分片集群(Sharding)的详细步骤如下:

  1. 创建目录结构:
sudo mkdir -p /data/shard1 /data/shard2 /data/shard3 /data/configdb /data/mongos
  1. 配置分片(shard)服务器:
sudo vi /data/shard1/mongod.conf

添加以下内容:

sharding:
  clusterRole: shardsvr
replication:
  replSetName: shard1ReplSet
storage:
  dbPath: /data/shard1
net:
  bindIp: 192.168.178.130
  port: 27018

重复这个过程,分别为shard2(/data/shard2/mongod.conf)和shard3(/data/shard3/mongod.conf)创建配置文件,将端口号分别更改为27019和27020,以及将replSetName更改为shard2ReplSet和shard3ReplSet。

  1. 配置配置服务器(config server):
sudo vi /data/configdb/mongod.conf

添加以下内容:

sharding:
  clusterRole: configsvr
replication:
  replSetName: ConfigReplSet
storage:
  dbPath: /data/configdb
net:
  bindIp: 192.168.178.130
  port: 27040
  1. 配置mongos路由服务器:
sudo vi /data/mongos/mongos.conf

添加以下内容:

sharding:
  configDB: ConfigReplSet/192.168.178.130:27040
net:
  bindIp: 192.168.178.130
  port: 27017
  1. 启动各个组件:
sudo mongod -f /data/configdb/mongod.conf
sudo mongod -f /data/shard1/mongod.conf
sudo mongod -f /data/shard2/mongod.conf
sudo mongod -f /data/shard3/mongod.conf
sudo mongos -f /data/mongos/mongos.conf
  1. 初始化配置服务器复制集:
mongo --host 192.168.178.130 --port 27040

在MongoDB shell中输入:

rs.initiate({
    
    _id: "ConfigReplSet", configsvr: true, members: [{
    
    _id: 0, host: "192.168.178.130:27040"}]})
  1. 初始化分片服务器复制集:
    对于shard1、shard2和shard3,使用以下命令连接:
mongo --host 192.168.178.130 --port 27018
mongo --host 192.168.178.130 --port 27019
mongo --host 192.168.178.130 --port 27020

分别在每个shard的MongoDB shell中输入以下内容,将“shardXReplSet”替换为相应的复制集名称(例如:shard1ReplSet、shard2ReplSet、shard3ReplSet):

rs.initiate({
    
    _id: "shardXReplSet", members: [{
    
    _id: 0, host: "192.168.178.130:<shard-port>"}]})

<shard-port>替换为分片的端口号(27018、27019或27020)。

  1. 添加分片到mongos:
mongo --host 192.168.178.130 --port 27017

在MongoDB shell中输入:

sh.addShard("shard1ReplSet/192.168.178.130:27018")
sh.addShard("shard2ReplSet/192.168.178.130:27019")
sh.addShard("shard3ReplSet/192.168.178.130:27020")
  1. 创建数据库并启用分片:
use mydb
sh.enableSharding("mydb")
  1. 选择集合并设置分片键:
sh.shardCollection("mydb.mycollection", {
    
    _id: "hashed"})

现在MongoDB分片集群已经设置完成。您可以插入数据、查询数据、测试故障转移等。

插入数据:

db.mycollection.insert({
    
    name: "John Doe", age: 30})

查询数据:

db.mycollection.find({
    
    name: "John Doe"})

为了在一台机器上测试故障转移和手动提升从节点为主节点,我们可以在本地模拟网络故障,停止主节点并观察从节点提升为主节点。首先,我们需要找出主节点:

use mydb
db.runCommand({
    
    isMaster: 1})

停止主节点(假设主节点是shard1,端口27018):

sudo mongod --dbpath /data/shard1 --shutdown

查看从节点(shard2或shard3)提升为主节点:

mongo --host 192.168.178.130 --port <shard-port>

<shard-port>替换为从节点的端口号(27019或27020),然后执行:

rs.status()

找到新的主节点后,您可以使用db.mycollection.insert()命令向新的主节点插入数据。

请注意,这些命令和步骤是在一台机器上设置MongoDB分片集群的简化示例。在生产环境中,需要在多台机器上设置副本集以确保高可用性和数据冗余。

  1. 故障转移:

在生产环境中,每个分片都应该是一个副本集,包含多个节点。在我们的实验设置中,由于我们仅在单台机器上进行操作,每个分片都只有一个节点。因此,我们无法在此设置中直接演示故障转移。但是,我们可以介绍如何在具有多个节点的副本集中进行故障转移。

在一个具有多个节点的副本集中,当主节点发生故障时,自动发生故障转移。这时,从节点之间会发生选举,选出一个新的主节点。故障转移过程通常在几秒钟内自动完成。

  1. 手动提升从节点为主节点:

在具有多个节点的副本集中,您可以通过调整成员的优先级来影响主节点的选举。例如,您可以将一个从节点的优先级设置得比其他节点高,以确保它在下一次选举中被选为主节点。您可以使用以下命令调整优先级:

cfg = rs.conf()
cfg.members[1].priority = 2
rs.reconfig(cfg)

当新的主节点被选举出来后,您可以向新的主节点插入数据,如下所示:

db.mycollection.insert({
    
    name: "Jane Doe", age: 28})

请注意,我们在本教程中展示的设置是为了实验和学习目的,因此在单台机器上进行操作。然而,在生产环境中,建议使用多台机器来设置副本集,以确保高可用性和数据冗余。在实际的生产环境中,需要根据实际需求和场景调整设置和配置。

猜你喜欢

转载自blog.csdn.net/Waldocsdn/article/details/130164710