0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MongoDB主从切换功能测试

马哥Linux运维 来源:huaweicloud 2024-03-14 11:25 次阅读

一、MongoDB介绍

1.1 MongoDB简介

MongoDB是一个开源的文档数据库,使用JSON格式存储和操作数据,具有高度灵活性和可扩展性。MongoDB的数据模型是面向文档的,这意味着它可以存储各种类型的数据,如数组、嵌套文档和二进制数据。MongoDB是一种NoSQL数据库,不需要使用传统的表格结构。MongoDB是分布式的,可以在多台服务器上部署,支持自动分片,可以实现高可用性和横向扩展。MongoDB还带有很多强大的功能,包括聚合框架、索引、MapReduce等,支持多种编程语言和多种平台。它被广泛用于Web应用程序、大数据分析和实时数据处理等领域。

1.2 MongoDB特点

面向文档的数据模型:MongoDB是一种面向文档的数据库,这意味着它使用文档来存储数据,文档是一个键值对集合,是非常灵活的数据模型。

分布式:MongoDB支持分布式数据存储,可以将数据分布在多个服务器上,从而实现更高的可用性和可扩展性。

高性能:MongoDB支持高性能读写,能够在海量数据环境下快速响应。

强大的查询语言:MongoDB支持丰富的查询语言,包括聚合管道、地理空间查询、全文搜索等,能够满足各种查询需求。

灵活的数据模型:MongoDB的文档的格式非常灵活,没有固定的架构,可以按照需求进行调整。同时,支持动态添加字段和修改文档结构。

可扩展性:MongoDB非常容易扩展,可以通过水平扩展的方式来增加服务器数量,以满足不断增长的数据和请求量。

可视化管理工具:MongoDB提供了可视化的管理工具,如MongoDB Compass,使得管理和操作MongoDB数据库更加方便。

二、MongoDB主从复制介绍

2.1 MongoDB主从复制

MongoDB主从复制是一种数据同步机制,通过该机制可以将一个 MongoDB 实例的数据复制到其他多个实例中,以提高数据的可靠性和可用性。在主从复制中,有一个主节点(也称为主服务器),负责接收写入请求并将数据同步到从节点(也称为从服务器)。从节点只能处理读操作,而不允许写入操作。

主从复制的核心是复制集(Replica Set),它由多个 MongoDB 实例组成。一个复制集中包括一个主节点和多个从节点。主节点将写入操作同步到所有的从节点,从节点在收到主节点的更新后,将自己的数据更新为与主节点一致的状态,确保数据的一致性。

当主节点出现故障时,从节点可以接替主节点成为新的主节点,继续处理写入请求和同步数据到其他从节点。这种自动切换的机制可以保证系统的高可用性和可靠性。

主从复制还可以通过读写分离的方式提高读写性能。将读操作分发到从节点,从而减轻主节点的负载压力,提高系统的并发处理能力。MongoDB主从复制是一种可靠、高效的数据同步机制,可以帮助用户保证数据的完整性和可用性。

2.2MongoDB副本集

副本集在mongodb中是是一组 mongod保持相同的数据集过程,副本集提供冗余和高可用性,并且是所有生产部署的基础。

复制提供冗余并增加数据可用性,在不同数据库服务器上具有多个数据副本,复制可以提供一个级别的单一数据库服务器丢失的容错能力。

副本集至少需要3个成员,可以是一主两从,也可以是一主一从一仲裁节点,如果主节点挂掉,两个从节点会重新选举,找到一个从节点,将其提升为主。

三、本次实践介绍

3.1 实践环境规划

hostname IP地址 系统版本 MongoDB版本 角色
master 192.168.3.141 centos 7.9 v5.0.21 主节点
node01 192.168.3.142 centos 7.9 v5.0.21 从节点
node02 192.168.3.143 centos 7.9 v5.0.21 从节点

3.2 本次实践简介

1.本次实践准备三台服务器,操作系统为centos7.9;
2.本次实践环境为个人测试环境,生产环境请谨慎;
3.本次实践主要配置MongoDB主从复制。

四、安装MongoDB

4.1 安装说明

三台服务器都需要按照以下步骤安装MongoDB环境。4.2 配置yum仓库配置mongodb的yum仓库

vim /etc/yum.repos.d/mongodb.repo
[mongodb-org]
name=MongoDB Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el7/
gpgcheck=0
enabled=1

4.3 检查yum仓库状态

检查yum仓库各镜像源状态

[root@master ~]# yum repolist all |grep enable
base/7/x86_64         CentOS-7 - Base - mirrors.aliyun.com       enabled: 10,072
extras/7/x86_64       CentOS-7 - Extras - mirrors.aliyun.com     enabled:    518
mongodb-org/7         MongoDB Repository                         enabled:    337
updates/7/x86_64      CentOS-7 - Updates - mirrors.aliyun.com    enabled:  5,176

4.4 安装MongoDB

直接使用yum安装mongodb

yum install -y mongodb-org-server mongodb-org

f9f9d926-e158-11ee-a297-92fbcf53809c.png

4.5 修改绑定IP

修改/etc/mongod.conf 配置文件中的mongodb服务绑定的IP地址为0.0.0.0。

vim /etc/mongod.conf 

fa114db8-e158-11ee-a297-92fbcf53809c.png

4.6 启动MongoDB服务

启动MongoDB服务

systemctl start mongod.service  && systemctl enable  mongod.service

4.7 检查MongoDB服务状态

检查MongoDB服务状态

[root@master ~]# systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-09-13 1648 CST; 44s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1472 (mongod)
   CGroup: /system.slice/mongod.service
           └─1472 /usr/bin/mongod -f /etc/mongod.conf

Sep 13 1648 master systemd[1]: Started MongoDB Database Server.
Sep 13 1648 master mongod[1472]: {"t":{"$date":"2023-09-13T0848.292Z"},"s":"I",  "c":"CONTROL",  "id":7484500, "ctx":"-","msg":"Environment variable MONG... to false"}
Hint: Some lines were ellipsized, use -l to show in full.

4.8 查看MongoDB版本

查看当前安装的MongoDB版本

[root@master ~]# mongod --version
db version v5.0.21
Build Info: {
    "version": "5.0.21",
    "gitVersion": "4fad44a858d8ee2d642566fc8872ef410f6534e4",
    "openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013",
    "modules": [],
    "allocator": "tcmalloc",
    "environment": {
        "distmod": "rhel70",
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

五、master节点配置工作

5.1 进入mongodb数据库

直接本地进入mongodb

mongo

fa24e490-e158-11ee-a297-92fbcf53809c.png

5.2 创建admin账号

在mongodb内创建用户管理员admin账号

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

fa319046-e158-11ee-a297-92fbcf53809c.png

5.3 创建测试账号

进入admin数据库内,使用admin账号验证登录。

>  use admin;
switched to db admin
> db.auth("admin", "admin")
1

fa39252c-e158-11ee-a297-92fbcf53809c.png

在在mongodb内创建huawei用户,用户角色权限为“root”。

db.createUser({
  user: "huawei",
  pwd: "huawei",
  roles: [   "root" ]
}
)

fa4313ca-e158-11ee-a297-92fbcf53809c.png

5.4 访问测试数据库

使用admin账号连接mongodb

mongo -uadmin -padmin --authenticationDatabase admin

fa4e1a7c-e158-11ee-a297-92fbcf53809c.png

5.5 在主节点创建key文件

在主节点创建key文件

mkdir -p /data/mongodb/
openssl rand -base64 666 > /data/mongodb/mongodb.key

在两个从节点创建目录

mkdir -p /data/mongodb/

5.5 拷贝key文件

将key文件发送两个从节点

scp  /data/mongodb/mongodb.key root@192.168.3.142:/data/mongodb/
scp  /data/mongodb/mongodb.key root@192.168.3.143:/data/mongodb/

fa5a81fe-e158-11ee-a297-92fbcf53809c.png

六、所有节点配置工作

6.1 配置说明

以下步骤,三个节点都需要执行。

6.2 目录及文件授权

在三个节点服务器中,执行以下命令,对相关目录及文件进行授权操作·。

chown mongod:mongod -R /data/mongodb/
chmod 600 /data/mongodb/mongodb.key

fa69a2a6-e158-11ee-a297-92fbcf53809c.png

6.3 编辑/etc/mongod.conf文件

在三个节点服务器中,编辑/etc/mongod.conf文件。

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo
net:
  port: 27017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security:
  authorization: enabled
  keyFile: /data/mongodb/mongodb.key
  clusterAuthMode: keyFile
replication:
  replSetName: rs0
  oplogSizeMB: 5000

fa7782a4-e158-11ee-a297-92fbcf53809c.png

6.4 重启mongodb服务

三个节点服务器,重启mongodb服务。

systemctl restart mongod

fa96b39a-e158-11ee-a297-92fbcf53809c.png

七、配置MongoDB主从

7.1 用户认证

连接master节点的mongodb。

mongo

faabc2c6-e158-11ee-a297-92fbcf53809c.png

使用huawei账号进行认证

> use admin;
switched to db admin
> db.auth("huawei","huawei")
1

fab69944-e158-11ee-a297-92fbcf53809c.png

7.2 配置副本集

执行以下命令,配置副本集。

rs.initiate({
   _id : "rs0",
   members: [
      { _id: 0, host: "192.168.3.141:27017" },
      { _id: 1, host: "192.168.3.142:27017" },
      { _id: 2, host: "192.168.3.143:27017" }
   ]
})

fac113ec-e158-11ee-a297-92fbcf53809c.png

7.3 主库查看副本集配置

master主节点,退出mongodb,重新连接后,使用huawei账号验证。

使用huawei账号进行认证

 use admin;
db.auth("huawei","huawei")

查看副本集配置

rs.config()
rs0:PRIMARY>  rs.config()
{
"_id" : "rs0",
"version" : 1,
"term" : 1,
"members" : [
{
"_id" : 0,
"host" : "192.168.3.141:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.3.142:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.3.143:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
],
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("65018aed22234a6282b793a6")
}
}

7.4 查看副本集状态

查看副本集状态

rs0:PRIMARY>  rs.status()
{
"set" : "rs0",
"date" : ISODate("2023-09-13T1054.675Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2023-09-13T1049.099Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T1049.099Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1694600279, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2023-09-13T1008.624Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1694599918, 1),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1694599918, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2023-09-13T1008.987Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2023-09-13T1010.491Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.3.141:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 834,
"optime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-09-13T1049Z"),
"lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T1049.099Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1694599928, 1),
"electionDate" : ISODate("2023-09-13T1008Z"),
"configVersion" : 1,
"configTerm" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.3.142:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 416,
"optime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-09-13T1049Z"),
"optimeDurableDate" : ISODate("2023-09-13T1049Z"),
"lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T1049.099Z"),
"lastHeartbeat" : ISODate("2023-09-13T1054.667Z"),
"lastHeartbeatRecv" : ISODate("2023-09-13T1054.192Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.3.141:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
},
{
"_id" : 2,
"name" : "192.168.3.143:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 416,
"optime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-09-13T1049Z"),
"optimeDurableDate" : ISODate("2023-09-13T1049Z"),
"lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T1049.099Z"),
"lastHeartbeat" : ISODate("2023-09-13T1054.667Z"),
"lastHeartbeatRecv" : ISODate("2023-09-13T1054.192Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.3.141:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1694600329, 1),
"signature" : {
"hash" : BinData(0,"TEVJDeHnCzlM41kvfsK8m3GP4L8="),
"keyId" : NumberLong("7278251270563954692")
}
},
"operationTime" : Timestamp(1694600329, 1)
}

7.5 判断主从节点

“primary” : “192.168.3.141:27017”,显示192.168.3.141主机为主节点

rs.isMaster()
s0:PRIMARY> rs.isMaster()
{
"topologyVersion" : {
"processId" : ObjectId("6501894c22234a6282b7934f"),
"counter" : NumberLong(6)
},
"hosts" : [
"192.168.3.141:27017",
"192.168.3.142:27017",
"192.168.3.143:27017"
],
"setName" : "rs0",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.3.141:27017",
"me" : "192.168.3.141:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1694600459, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2023-09-13T1059Z"),
"majorityOpTime" : {
"ts" : Timestamp(1694600459, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2023-09-13T1059Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2023-09-13T1002.808Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 15,
"minWireVersion" : 0,
"maxWireVersion" : 13,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1694600459, 1),
"signature" : {
"hash" : BinData(0,"K6fiimpJmajEAl5G2IovptISfL4="),
"keyId" : NumberLong("7278251270563954692")
}
},
"operationTime" : Timestamp(1694600459, 1)
}

八、测试MongoDB主从切换

8.1 停止主库的mongodb服务

停止主库的mongodb服务

systemctl stop mongod.service 

faccf748-e158-11ee-a297-92fbcf53809c.png

8.2 查看从库状态

其他从节点登录mongodb,查看mongodb的角色,发现node01节点已经切换为主库。

mongo

fad72d94-e158-11ee-a297-92fbcf53809c.png

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3591

    浏览量

    63371
  • mongodb
    +关注

    关注

    0

    文章

    22

    浏览量

    332

原文标题:八、测试MongoDB主从切换

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    有用labview和mongodb连接过的吗?怎么把采集到的数据在labview里存到mongodb里面?

    有用labview和mongodb连接过的吗?怎么把采集到的数据在labview里存到mongodb里面?mongodb和驱动都下下来了,就是不知道怎么连接,去哪里弄mongodb的相
    发表于 05-09 14:56

    MySQL和MongoDB的对比

    中的文档不需要具有相同的一组字段,数据的非规范化是常见的。 MongoDB还设计了高可用性和可扩展性,并提供了即用型复制和自动分片功能。术语和概念 MySQL中的许多概念在MongoDB中具有相近
    发表于 08-28 14:51

    MongoDB 4.0 RC 版本强势登陆

    摘要: MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前4.0第一个RC版本已经发布,本文将介绍 Mongo
    发表于 06-11 19:42

    MongoDB环境变量的设置

    MongoDB设置环境变量与设置成Windows服务
    发表于 05-06 07:55

    用composer引入mongodb

    laravel操作mongodb笔记!
    发表于 08-12 06:37

    请问CC2540的主从role怎么切换

    请问CC2540 的主从role切换是怎样的步骤? 官方程序有点搞不懂
    发表于 03-23 08:48

    MongoDB如何操作

    MongoDB的操作
    发表于 05-13 13:10

    MongoDB的安装教程

    MongoDB安装教程
    发表于 05-29 15:06

    Mongodb如何在Mac下的安装

    Mongodb 在 Mac下的安装
    发表于 06-15 16:31

    关于mongodb的几个热点问题

    本文就 MongoDB 的使用场景做个简单的总结,谈谈什么场景该用 MongoDB?如何学习MongoDB
    发表于 02-06 16:49 2664次阅读
    关于<b class='flag-5'>mongodb</b>的几个热点问题

    3种MongoDB的高可用架构介绍

    MongoDB 背景 MongoDB 是一款功能完善的分布式文档数据库,是一款非常出名的 NoSQL 数据库。当前国内使用 Mongodb 的大型实践越来越多,
    的头像 发表于 05-03 18:11 2221次阅读
    3种<b class='flag-5'>MongoDB</b>的高可用架构介绍

    mongoDb入门并整合springboot

      镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站   MongoDb简介 MongoDb是一种非关系型数据库,是现在非常火热的noSQL。也被称为文档性数据库。(可存放json,xml
    发表于 12-07 10:51 328次阅读

    PetaExpress云数据库 MongoDB(mongodb数据库)优势

    MongoDB的数据模型是针对文档的。所谓文档是一种类似JSON的结构。可以简单理解,MongoDB存储在数据库中的各种JSON,在MongoDB中称为“BSON”。 PetaExpress云数据库
    的头像 发表于 07-14 10:06 332次阅读

    NineData:高效可靠的MongoDB迁移及同步方案

    源/目标MongoDB的动态复制。基于变更数据迁移能力,在MongoDB数据迁移过程中,业务可以正常提供服务,无需停服。最终,业务可根据需要选择对应时间点切换到目标MongoDB,具体
    的头像 发表于 09-05 11:32 407次阅读
    NineData:高效可靠的<b class='flag-5'>MongoDB</b>迁移及同步方案

    BLE蓝牙模块主从一体功能应用场景详解

    的一种。 主从一体是说BLE蓝牙模块可以作为主设备,也可以作为从设备,它们之前可以角色互换。自从蓝牙4.1规范里添加了一条“链路层拓扑”的功能后,就已经允许蓝牙模块同时作为主设备和从设备,主从两种角色都可以
    的头像 发表于 01-04 09:19 343次阅读
    BLE蓝牙模块<b class='flag-5'>主从</b>一体<b class='flag-5'>功能</b>应用场景详解