mongodb集群搭建之Replica-Set方式

2023-05-16


mongodb集群搭建有三种方式。
1、Master-Slave模式
2、Replica-Set方式
3、Sharding方式
其中,第一种方式基本没什么意义,官方也不推荐这种方式搭建。另外两种分别就是副本集和分片的方式。今天介绍副本集的方式搭建mongodb高可用集群。	
  

副本集的方式也很容易理解,这里需要一个主节点,一个备节点,如果主节点发生故障,那么会启用备节点,当主节点修复之后,主节点再次恢复为主节点,备节点不再是主节点的角色。副本集的方式还需要一个角色,那就是仲裁节点,它不存储数据,他的作用就是当主节点出现故障,选举出备节点作为主节点,继续保证集群可用。客户端连接时只连接主节点或者备节点,不用连接仲裁节点。
  

修改配置文件
master.conf
  
dbpath=/data/mongodb/master
logpath=/data/mongodb/master.log
pidfilepath=/data/mongodb/master.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=192.168.61.21
port=27017
oplogSize=10000
fork=true
noprealloc=true

slave.conf
  
dbpath=/data/mongodb/slave
logpath=/data/mongodb/slave.log
pidfilepath=/data/mongodb/slave.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=192.168.61.22
port=27017
oplogSize=10000
fork=true
noprealloc=true

arbiter.conf
  
dbpath=/data/mongodb/arbiter
logpath=/data/mongodb/arbiter.log
pidfilepath=/data/mongodb/arbiter.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=192.168.61.23
port=27017
oplogSize=10000
fork=true
noprealloc=true

启动节点,保证每个节点上存储数据的文件夹都存在/data/mongodb/master,/data/mongodb/slave,/data/mongodb/arbiter,然后依次启动每个节点。
  

mongod -f master.conf
mongod -f slave.conf
mongod -f arbiter.conf
  

创建集群
  
[root@linux-node1 mongodb]# mongo 192.168.61.21:27017
MongoDB shell version: 3.2.9
connecting to: 192.168.61.21:27017/test
Server has startup warnings: 
2017-11-16T22:44:06.170+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2017-11-16T22:44:06.170+0800 I CONTROL  [initandlisten] 
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] 
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] 
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-11-16T22:44:06.171+0800 I CONTROL  [initandlisten] 
> use admin
switched to db admin
> cfg={_id:"testrs",members:[{_id:0,host:"192.168.61.21:27017",priority:2},{_id:1,host:"192.168.61.22:27017",priority:1},{_id:2,host:"192.168.61.23:27017",arbiterOnly:true}]};
{
        "_id" : "testrs",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "192.168.61.21:27017",
                        "priority" : 2
                },
                {
                        "_id" : 1,
                        "host" : "192.168.61.22:27017",
                        "priority" : 1
                },
                {
                        "_id" : 2,
                        "host" : "192.168.61.23:27017",
                        "arbiterOnly" : true
                }
        ]
}
> rs.initiate(cfg)
{ "ok" : 1 }

查看集群状态
  
testrs:OTHER> rs.status()
{
        "set" : "testrs",
        "date" : ISODate("2017-11-16T14:51:33.788Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.61.21:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 447,
                        "optime" : {
                                "ts" : Timestamp(1510843888, 2),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2017-11-16T14:51:28Z"),
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1510843888, 1),
                        "electionDate" : ISODate("2017-11-16T14:51:28Z"),
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "192.168.61.22:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 15,
                        "optime" : {
                                "ts" : Timestamp(1510843877, 1),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("2017-11-16T14:51:17Z"),
                        "lastHeartbeat" : ISODate("2017-11-16T14:51:32.718Z"),
                        "lastHeartbeatRecv" : ISODate("2017-11-16T14:51:31.944Z"),
                        "pingMs" : NumberLong(0),
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "192.168.61.23:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 15,
                        "lastHeartbeat" : ISODate("2017-11-16T14:51:32.718Z"),
                        "lastHeartbeatRecv" : ISODate("2017-11-16T14:51:29.987Z"),
                        "pingMs" : NumberLong(1),
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}
数据测试:

主节点测试


从节点连接,查询数据库出错:not master and slaveOk=false,这个错误是正常的,备节点不允许读操作。	
  
 show dbs
2017-11-16T23:10:05.041+0800 E QUERY    [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } 
可以利用rs.slaveOk()命令来解决这个问题,但是在集群环境中没有必要这么做。

故障测试:

[root@linux-node1 mongodb]# ps -ef |grep mongod
root      24676      1  1 22:44 ?        00:00:21 mongod -f master.conf
root      24856  11281  0 23:18 pts/0    00:00:00 grep --color=auto mongod
[root@linux-node1 mongodb]# kill -9 24676

主节点挂掉:在备节点上查看集群状态,一会会发现备节点成为主节点:primary。
  
testrs:SECONDARY> rs.status()
{
        "set" : "testrs",
        "date" : ISODate("2017-11-16T15:18:56.862Z"),
        "myState" : 1,
        "term" : NumberLong(2),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.61.21:27017",
                        "health" : 0,
                        "state" : 8,
                        "stateStr" : "(not reachable/healthy)",
                        "uptime" : 0,
                        "optime" : {
                                "ts" : Timestamp(0, 0),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2017-11-16T15:18:55.651Z"),
                        "lastHeartbeatRecv" : ISODate("2017-11-16T15:18:31.988Z"),
                        "pingMs" : NumberLong(1),
                        "lastHeartbeatMessage" : "Connection refused",
                        "configVersion" : -1
                },
                {
                        "_id" : 1,
                        "name" : "192.168.61.22:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 1986,
                        "optime" : {
                                "ts" : Timestamp(1510845524, 1),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2017-11-16T15:18:44Z"),
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1510845523, 1),
                        "electionDate" : ISODate("2017-11-16T15:18:43Z"),
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 2,
                        "name" : "192.168.61.23:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 1655,
                        "lastHeartbeat" : ISODate("2017-11-16T15:18:55.632Z"),
                        "lastHeartbeatRecv" : ISODate("2017-11-16T15:18:51.951Z"),
                        "pingMs" : NumberLong(1),
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}

这里如果再次将挂掉的master节点启动,那么一会master节点会变为primary主节点,而不是由slave备节点继续充当主节点  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongodb集群搭建之Replica-Set方式 的相关文章

  • 无法在 mongodb 中创建角色

    我正在尝试在 mongodb 中创建一个新角色 但它给了我错误 gt use Admin switched to db Admin gt db createRole role executeFunctions privileges reso
  • 为 Heroku 上的 Mongo Labs 数据库配置 Node.js 连接字符串

    我的 Web 应用程序 基于 Node js 和 Express 构建 在本地运行良好 但当我将其部署到 Heroku 时 我无法连接到我的 Mongo Labs 数据库 我已更改 app js 文件中的连接字符串 以正确反映新 Herok
  • 两个未排序小数组的交集算法

    我正在寻找一种在非常特定的条件下对两个小型未排序数组进行交集的算法 数组项的类型只是整数或类整数类型 在相当长的时间内 大约 30 40 一个或两个数组可能为空 数组通常非常小 通常为 1 3 个项目 我预计不会超过 10 个 交集函数会被
  • 使用 Java 查询 MongoDB 中数组元素的文档

    我是 MongoDB 新手 我的样本文档是 Notification date from ISODate 2013 07 08T18 30 00Z date too ISODate 2013 07 30T18 30 00Z descript
  • MEAN 堆栈文件上传

    我最近开始使用 MEAN Stack 进行编程 目前正在实现某种社交网络 一直使用 MEAN io 框架来做到这一点 我现在的主要问题是让文件上传正常工作 因为我想做的是将文件从表单接收到 AngularJS 控制器中 并将其与更多信息一起
  • 返回游标数组不显示任何结果

    我试图通过这样做来解决两个集合的 连接 foundUsers function var searchUser Session get searchUser user search criteria var usf User find sea
  • 如何在猫鼬中获得多个结果并将其合并为一个响应

    在 API 路由 调用中 我希望有 3 个 mongoose 查询 然后组合结果以形成响应 json Query student countDocuments then stundentNumber gt return stundentNu
  • Ember-data和MongoDB,如何处理_id

    我正在将 ember data 与 Rails 和 MongoDB 一起使用 并且在 MongoDB 中的 id 字段中存储 ID 的方式遇到问题 Ember data 将使用 id 作为 ID 的默认字段 所以我尝试像这样覆盖它 App
  • 使用 mongodb/mongoid 排序时,有没有办法将所有 nil 值放在最后?

    除了问题中已有的内容之外 确实没什么可说的 使用 monoid People asc age 我首先得到零值 有没有办法总是返回nillast 或者告诉 mongodb 将 nil 视为非常高 与回答的完全一样sql中同样的问题在这里 ht
  • 如何获取从中提取数据的服务器的服务器地址

    我知道我们使用cursor getServerAddress 在Java 驱动程序中拥有它 但是 我在 C 中找不到任何相关的调用 不幸的是 在深入研究 C 驱动程序源代码 以及 Java 源代码以了解它在做什么 之后 用作获取一部分的实际
  • 如何在 mongodb 中对数组进行 AND 查询?

    我有一个带有标签的数组 它是文档的一部分 例如 红 绿 蓝 白 黑 现在我想找到所有有红色和蓝色的文档 使用 all 条件查找同时匹配 红色 和 蓝色 条件的记录 db my collection find tags all red blu
  • Mongoose update 更新数组内的嵌套对象

    我正在尝试查询和更新名册数组 roster schedule monday start 中的元素 然后更新本示例中的值 monday start 这两个键需要是动态的 我认为方法会是这样的 通过 id查找文档 通过 id 在数组中查找匹配对
  • 使用空子文档集合保存 Mongoose 文档会导致重复键错误

    我有两个猫鼬模式 var productSchema new Schema name type String required true unique true var categorySchema new Schema products
  • 如何使用官方 MongoDB C# 驱动程序将 BsonDocument 转换为强类型对象?

    出于单元测试的目的 我想测试我的类映射 而无需在 MongoDB 数据库中读取和写入文档 为了处理特殊情况 例如循环父 子引用和只读属性 我使用了BsoncClassMap RegisterClassMap lt MyType gt 一些自
  • Mongoose 中的分组(依据)?

    我已经在 shell 中构建了我想要的查询 但在 Mongoose 中编写它时遇到了问题 db commentstreams group key page id true reduce function obj prev prev num
  • intellij idea 中的项目组

    目前 至少从 IntelliJ Idea 14 开始 ide 会记住最后一组打开的项目 我们能否轻松地控制它并拥有可切换的项目集 组 这是打开项目的另一种方式 与模块不同 我希望某个插件已经具备该功能 但是是哪一个呢 截至2017年8月 I
  • MongoDB:查询速度慢,即使有索引

    我有一个网页 它使用 MongoDB 来存储和检索各种测量结果 突然 在某个时候 我的网页变得如此缓慢 以至于无法使用 事实证明 我的数据库是罪魁祸首 我进行了搜索 但没有找到任何解决我的问题的方法 我很抱歉 因为我对 MongoDB 还很
  • 如何修改副本集配置?

    我正在运行一个 mongo 2 节点集群 并使用此副本集配置 config id repl1 members id 0 host localhost 15000 id 1 host 192 168 2 100 15000 我必须将这两个节点
  • Mongoose 5.x 不允许传递大量运算符

    聚合查询返回错误 Mongoose 5 x 不允许将操作符传递给Model aggregate 代替Model aggregate match skip do Model aggregate match skip 我正在使用 mongoos
  • Mongo 可审核的 ZonedDateTime 字段在 Spring Boot 2 中不起作用

    在 Spring Boot 项目中 我使用 CreatedDate 之类的注释来保存有关创建 更新相应文档的日期的信息 整个项目都使用 ZonedDateTime 因此带注释的字段也是 ZonedDateTime 为了实现 Mongo 的日

随机推荐

  • win7查看端口占用的进程

    之前遇到一个问题 xff0c 系统上mysql启动了 xff0c 无法通过navicat客户端来连接 xff0c 这就很郁闷了 xff0c 最后定位到问题 xff0c 是我机器上还开启了一个开发php的应用程序phpwamp 它自带了一个m
  • cxf+spring实现webservice

    1 构建maven项目 xff0c 工程结构如下 xff1a 这里需要特别指出就是cxf core 3 1 12 jar类路径META INF cxf下有一个cxf xml的配置文件 xff0c 这个在applicationContext
  • Activemq+spring整合

    activemq与spring的整合需要用到线程池 考虑到连接 会话等资源的建立和释放 xff0c 无须人工操作 xff0c 全部交给容器来处理 这里通过一个实例讲解activemq与spring如何整合 项目大致是这样的设计 xff1a
  • springsecurity4.2入门完整实例

    1 构建maven项目 xff0c 引入springsecurity相关依赖 项目结构如下 xff1a pom xml配置文件主要部分 xff1a lt properties gt lt spring version gt 4 2 0 RE
  • Linux上tensorflow安装

    选择安装Anaconda xff0c 然后激活tensorflow 环境 最后使用pip install安装 第一步 xff1a 安装Anaconda xff0c Anaconda集成了很多python库 xff0c 不用手动额外安装 An
  • Window安装Anaconda后,conda不是内部或者外部命令

    今天在安装Theano的时候 xff0c 需要看一下 xff0c anaconda已经安装了哪些包 使用命令如下 在控制台 xff0c cmd回车输入即可 xff1a conda list 但是 xff0c 显示出错 xff0c conda
  • zookeeper集群环境搭建

    zookeeper是一个分布式框架 xff0c 它的用途在今天非常广泛 xff0c 通常与dubbo一起构成分布式系统 xff0c 另外kafka消息系统也自带了zookeeper hadoop集群也少不了zookeeper xff0c z
  • hadoop-2.8.0完全分布式环境搭建

    一 机器及环境准备 1 jdk安装不用多说 xff0c 安装完成配置环境变量即可 export JAVA HOME 61 usr java latest export JRE HOME 61 JAVA HOME jre export CLA
  • Your password does not satisfy the current policy requirements解决办法

    mysql5 7 x安装以后 xff0c 想修改随机生成的密码为简单容易记忆的密码 xff0c 如root 123456等 xff0c 这时候通过修改密码的几种方式都不行 xff0c 出现密码不符合当前安全策略要求 为了解决这种问题 xff
  • redhat7安装oracle11gR2之环境准备

    redhat7安装oracle11gR2环境准备 xff1a 内存 xff1a 2g 磁盘空间 xff1a 15g以上 交换分区 xff1a 3g 我们将oracle安装到 opt app oracle目录下 xff0c 后面的环境变量则以
  • redhat7安装oracle11gR2之动手安装

    oracle11gR2 64位数据库下载地址 xff1a http www oracle com technetwork database enterprise edition downloads 112010 linx8664soft 1
  • redhat7静默安装oracle11gR2

    所谓的静默安装是指不用安装redhat7桌面系统 xff0c 并进入桌面利用界面安装oracle xff0c 这里采用最小化安装redhat7 xff0c 直接在命令行下通过命令执行安装 环境配置和用户设置基本和界面安装一致 就是进入 op
  • docker+nextcloud搭建个人云存储系统

    一 docker安装和启动 yum install epel release yum install docker service docker start 二 docker compose安装 curl L http github com
  • kafka集群搭建以及运行kafka监控平台kmonitor

    kafka集群搭建 kafka依赖zookeeper运行 xff0c 在搭建kafka系统之前需要搭建zookeeper集群 xff0c 这里先略过zookeeper集群搭建的过程 另外 xff0c kafka需要运行在jdk环境中 xff
  • CDH5安装失败如何重新安装

    cdh安装失败的原因可能有以下原因 xff1a 1 机器内存不足 xff0c server节点我用了6G xff0c 两个agent节点均是4G才安装成功 2 需要的mysql驱动文件没有拷贝到指定位置 具体重新安装步骤如下 xff1a 一
  • nginx日志切割和日志定期清理

    nginx日志默认不做人为处理 xff0c 日志文件会存放在access log error log两个文件中 xff0c 随着时间的推移 xff0c 日志量会越来越大 xff0c 不方便编辑查看 xff0c 为了让日志按天存放 xff0c
  • 结构体(参数、嵌套)、结构体指针、结构体中const的使用场景

    结构体 xff1a 属于用户自定义的数据类型 xff0c 允许用户存储不同的数据类型 xff1b 结构体定义和使用 通过结构体创建变量的方式有三种 xff1a struct 结构体名 变量名struct 结构体名 变量名 61 成员1 xf
  • CentOS7.3安装mesos1.4.0

    按照官网一步一步安装mesos 这里选择的版本是1 4 0 download mesos wget http archive apache org dist mesos 1 4 0 mesos 1 4 0 tar gz tar xzf me
  • redhat7上rpm方式安装mongodb

    1 下载相关文件 xff0c 下载地址 xff1a http mirrors aliyun com mongodb yum redhat 7 mongodb org stable x86 64 RPMS mongodb org 3 2 9
  • mongodb集群搭建之Replica-Set方式

    mongodb集群搭建有三种方式 1 Master Slave模式 2 Replica Set方式 3 Sharding方式 其中 xff0c 第一种方式基本没什么意义 xff0c 官方也不推荐这种方式搭建 另外两种分别就是副本集和分片的方