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

news2024/11/22 16:19:18

文章目录

  • CentOS 8自动化安装MongoDB
  • 安装Master-Slave集群
  • 安装并测试副本集(Replica Set)集群
    • 安装副本集(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})

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务-概念-实现方式

分布式事务 文章目录分布式事务一、分布式事务相关概念1.分布式事务架构图2.理解本地事务相关概念3.理解分布式事务相关概念1.CAP理论2.刚性事务&#xff08;CP&#xff09;与柔性事务&#xff08;AP&#xff09;3.基于AP模型衍生下的BASE理论4 .如何从大方向选择分布式事务&am…

MySQL正则表达式 | 事务详解

目录 一、正则表达式 实例操作 二、事务 事务控制语句 MYSQL 事务处理主要有两种方法 SQL测试代码 PHP中使用事务实例 使用保留点 SAVEPOINT 一、正则表达式 MySQL可以通过 LIKE ...% 来进行模糊匹配。 MySQL 同样也支持其他正则表达式的匹配&#xff0c; MySQL中使用…

【嵌入式Linux内核驱动】GPIO子系统

GPIO子系统 总体框架 通用功能 可以设为输出&#xff1a;让它输出高低电平&#xff1b;可以设为输入&#xff0c;读取引脚当前电平&#xff1b;可以用来触发中断 通用属性 Active-High and Active-LowOpen Drain and Open Source 开漏和开源 GPIOLIB向上提供的gpiod相关接…

数据结构与算法之手撕排序算法

前言 为什么要学习排序算法&#xff1f; 根据统计&#xff0c;早起大型机CPU资源的四分之一都花在了数据排序上面。排序算法作为最基础的算法&#xff0c;各种操作系统、编程语言都提供了内置的实现。既然排序实现随处可见&#xff0c;我们为什么还要自己动手实现呢&#xff1…

文章伪原创-文章伪原创工具

伪原创原理 文章伪原创的原理是将一篇原始文章进行修改、改写、调整或者替换一些词句等方式&#xff0c;生成与原始文章类似但又不完全相同的新文章。 文章伪原创的实现需要用到自然语言处理技术和相关的算法。具体的过程包括以下几个步骤&#xff1a; 分析原始文章&#xff…

YML是一种数据存储格式

读取yml配置信息 Value("${province}") private String province; Value("${user.sname}") private String name1; Value("${user1[1].name}") private String name; Value("${server.port}") private int port; server:port: 8099 #…

大数据现在找工作难么

大数据行业工作好找还是难找不是光靠嘴说出来的结合实际&#xff0c;看看市场上的招聘需求和岗位要求就大致知道了 要想符合企业用人规范&#xff0c;学历&#xff0c;工作经验&#xff0c;掌握技能都是非常重要的~ 先来看几个招聘网站的报告数据&#xff1a; Boss直聘发布的…

Linux应用编程(系统信息与系统资源)

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息&#xff0c;譬如获取系统时间、日期以及设置系统时间、日期等&#xf…

java拦截器怎么实现

Java拦截器是一种对象拦截器&#xff0c;它可以拦截任何的类、方法和字段。拦截器还可以用于检查类是否已经加载以及对字段的访问权限是否符合规范。下面就让我们来了解一下 java拦截器怎么实现吧。 在 Java中&#xff0c;可以通过重写方法和代码块来实现拦截功能&#xff0c;但…

通俗讲解什么是Socket通讯

Socket通讯原理 1、什么是Socket&#xff1f; Socket&#xff0c;即套接字。就是两台主机之间逻辑连接的端点。&#xff08;通俗来说&#xff1a;网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个socket&#xff09;。 Socket是一套…

【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、魔术方法二、构造方法三、__ getitem __方法四、__ len __方法前言 参考视频&#xff1a;视频 一、魔术方法 首先看一看chatgpt对魔术方法&#xff08;特…

一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlsxwriter 模块&#xff1a;用于创建 Excel .xlsx 文件, 资料整理笔记&#xff08;大全&#xff09;摘要模块图类关系图模块全展开【xlsxwriter】统计常量模块1 xlsxwrite…

数据爬虫爬数据时常遇到的问题

第一&#xff0c;可能不能直接通过pyppeteer简单的直接page.querySelectorAll()获取所有元素然后直接 str(await (await element_songer_name.getProperty("title")).jsonValue()) 得到数据值&#xff0c;主要原因可能是#document问题&#xff0c; 所以遇到这个问题…

vue项目配置不同环境打包指令(vue-cli2、vue-cli3项目)

目录 一、vue-cli3项目&#xff1a;1、项目根目录创建环境文件2、 配置打包指令3、打包生成不同的dist文件夹 二、vue-cli2项目1、配置指令2.创建环境文件3、config/index.js中添加 三、遇到的问题1.vue-cli3项目配置打包指令&#xff0c;没有生成css文件--mode test2、vue-cli…

UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明

目录 CreateMqttClient Connect Subscribe UnSubscribe Publish Disconnect BindConnectedDelegate BindConnectionLostDelegate BindMessageDelegate CreateMqttClient 创建一个Mqtt客户端对象 Connect 链接Mqtt服务器Subscribe 订阅消息频道UnSubscribe 取消订阅频道…

【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端

收获总结&#xff1a; 了解go函数的可变参数的使用&#xff0c;还有切片展开的方式即…了解了HTTP通信方式&#xff0c;hinder的使用了解了go.mod &#xff0c;import 和modoule的使用 分布式缓存需要实现点对点的通信&#xff0c;我们可以使用HTTP来实现节点之间的通信&…

Linux·IO子系统和文件系统读写流程

目录 1.概述 2.linux IO子系统和文件系统读写流程 3.IO之流程与buffer概览 4.IO队列和IO调度 1.概述 分析一下写操作&#xff1a; char *buf malloc(MAX_BUF_SIZE); strncpy(buf, src, , MAX_BUF_SIZE); fwrite(buf, MAX_BUF_SIZE, 1, fp); fclose(fp); 以下图为例&…

九耶丨钛伦特-用深度学习实现垃圾图像分类(二)

3 构建模型 这里大家可以使用自己在项目 2 中寻找到的最好的模型结构&#xff0c;做为示例&#xff0c;这里以实验2-3 中的 snet 模型为基础&#xff0c;并进行细微的调整。 样例代码: 需要注意的是&#xff0c;我们在第一层卷基层之后增加了一层池化层&#xff0c;主要是为了降…

大数据技术之Spark

第1章 Spark概述 1.1 什么是Spark 回顾&#xff1a;Hadoop主要解决&#xff0c;海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Hadoop的Yarn框架比Spark框架诞生的晚&#xff0c;所以Spark自己也设计了一套资源调度…

30天学会《Streamlit》(1)

30学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第1天 - 建立…