MongoDB副本集(一主一备+仲裁)环境部署_mongdb4.0.15 副本集 1个primary +1个 secondary +1个arbite-程序员宅基地

技术标签: mongodb  

https://www.cnblogs.com/kevingrace/p/7881496.html,

https://blog.csdn.net/com_it/article/details/84702046

MongoDB复制集是一个带有故障转移的主从集群。是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复。MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一个主结点。该主结点被称为primary,一个或多个从结点被称为secondaries。primary结点基本上就是master结点,不同之处在于primary结点在不同时间可能是不同的服务器。如果当前的主结点失效了,复制集中的其余结点将会试图选出一个新的主结点。

MongoDB提供了两种复制部署方案:主从复制和副本集。两种方式共同点是只在一个主节点上进行写操作,然后写入的数据会异步的同步到所有的从节点上。但主从复制有明显的缺陷:当主节点出现故障停电或者死机等情况,整个MongoDB服务集群就不能正常工作了,需要人工的处理这种情况。而副本集是具有自动故障恢复功能的主从复制。所以一般都用副本集。

1、思路:


       当副本集的总可投票数为偶数时,可能出现无法选举出主节的情况。2个节点组成副本集是不合理的,因为这样的副本集不具备故障切换能能力:
        ·当 SECONDARY节点挂掉,剩下一个 PRIMARY,此时副本集运行不会出现问题,但不具备副本集的功能了,相当于单实例 Mongodb服务
        ·当 PRIMARY节点挂掉,此时副本集只剩下一个 SECONDARY,它只有1票,不超过总节点数的半数,不会成功选举自己为 PRIMARY节点。会错误提示。
因此我们有两种方案,

     一是设置 MONGODB集群的节点数量为奇数。

     二是当Mongodb集的节点数量为偶数时,适当增加仲裁节点,增加集群的稳定性。

所以尝试部署副本集的可行方案是:3个数据节点2个数据节点+1个仲裁节点
 

在一个MongoDB复制集集群中,各个服务器有以下几种状态:

  • Primary 主节点,一个复制集有且仅有一台服务器处于Primary状态,只有主节点才对外提供读写服务。如果主节点挂掉,复制集将投票选出一个备节点成为新的主节点。
  • Secondary 备用节点,复制集允许有多台Secondary,每个备用节点的数据与主节点的数据是完全同步的。Recovering 恢复中,当复制集中某台服务器挂掉或者掉线后数据无法同步,重新恢复服务后从其他成员复制数据,这时就处于恢复过程,数据同步后,该节点又回到备用状态。
  • Arbiter 仲裁节点,该类节点可以不用单独存在,如果配置为仲裁节点,就主要负责在复本集中监控其他节点状态,投票选出主节点。该节点将不会用于存放数据。如果没有仲裁节点,那么投票工作将由所有节点共同进行。
  • Down 无效节点,当服务器挂掉或掉线时就会处于该状态。复制集的从节点读请求,也是在各个Driver层设置slaveOk的值来实现的。

如上介绍所知,mongodb中的复制可以在多台服务器中同步数据。复制提供了冗余和增加了数据的高可用性,防止单个节点易丢失数据的可能性,也可以用来进行读写分离提高客户端操作性能。复制集中各节点的mongodb实例有相同的数据集副本。主节点可以接收客户端所有写操作记录到日志中,从库复制主库的操作日志记录应用到其数据库中。一个客户端只能有一个主节点,如果主节点不可用(10秒内无法连接),复制集中将选一个成员节点作为主节点。

 

 

三台mongodb节点:一主一备一仲裁,这样,主节点挂了后,通过仲裁机制将primary自动切换到备机上!
如果上面的三台mongodb节点:一主两备,没有仲裁节点,那么主节点挂了后,primary会自动切换到其余两台备节点中的一台上!

 

2. 部署 

1)服务器信息

sign-mongo01.wangshibo.cn  172.16.51.216   Primary
sign-mongo02.wangshibo.cn  172.16.51.217   Secondary
sign-mongo03.wangshibo.cn  172.16.51.218   Arbiter

 

2)在3台服务器文件hosts文件中都添加以下3行

[root@sign-mongo01 ~]# cat /etc/hosts
172.16.51.216   sign-mongo01.wangshibo.cn
172.16.51.217   sign-mongo02.wangshibo.cn
172.16.51.218   sign-mongo03.wangshibo.cn

3)安装部署mongodb(三台机器都安装)

下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62

 

在3台机器上都操作一遍
[app@sign-mongo01 software]$ ls
mongodb-linux-x86_64-rhel62-v3.2-latest.tgz
[app@sign-mongo01 software]$ tar -zvxf mongodb-linux-x86_64-rhel62-v3.2-latest.tgz
[app@sign-mongo01 software]$ mv mongodb-linux-x86_64-rhel62-3.2.17-34-g4c1bae566c /data/mongodb
[app@sign-mongo01 software]$ cd /data/mongodb/
mkdir data    -- 存放数据的目录
mkdir log     -- 存放日志的目录
mkdir -p keyfile  -- 存放秘钥的目录

先创建帐号哦, 再开启认证

使用keyFile模式启动数据库服务,默认会启用--auth认证模式。一般需要先在单例模式下创建好用户,再使用--keyFile模式启动,认证后访问数据库。(否则没权限)

https://blog.csdn.net/zhuchunyan_aijia/article/details/113848406
use admin
db.createUser( 
 { 
 user:"zcyroot", 
 pwd:"zcyroot", 
 roles:[{role:"root",db:"admin"}] 
 } 
 )

配置文件

主和副的 机器一样的配置, 除了 bind_ip=172.16.51.216 变化一下
[app@sign-mongo01 mongodb]$ vim mongodb.conf
pidfilepath=/data/mongodb/log/mongod.pid
logpath=/data/mongodb/log/mongod.log
dbpath=/data/mongodb/data
logappend=true
bind_ip=172.16.51.216
port=27017
fork=true
replSet=rs0   -- 表示复制集名称:rs0

仲裁节点配置:
[app@sign-mongo03 ~]$ vim /data/mongodb/mongodb.conf
pidfilepath=/data/mongodb/log/mongod.pid
logpath=/data/mongodb/log/mongod.log
dbpath=/data/mongodb/arbiter
logappend=false
bind_ip=172.16.51.218
port=27019
fork=true
replSet=rs0

或者

启动主,备,仲裁服务器的mongodb

3台机器上执行
[app@sign-mongo01 ~]$ /data/mongodb/bin/mongod --config /data/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 7317
child process started successfully, parent exiting
[app@sign-mongo01 mongodb]$ ps -ef|grep mongodb
app       7317     1  0 21:38 ?        00:00:00 /data/mongodb/bin/mongod --config /data/mongodb/mongodb.conf
app       7342  7254  0 21:38 pts/1    00:00:00 grep mongodb

4)初始化主节点,副本集,仲裁

启动三台MongoDB服务后,开始把他们初始化为副本集。在想要设置成primary(主节点)的机器上运行客户端mongo。例如第1台机器上:

> mongo 172.16.51.216:27017
> rs.initiate({_id: "rs0",members: [{ _id: 0 , host: "sign-mongo01.wangshibo.cn:27017" }]})
-- 初始化复制集:(集合为:"rs0" ;第一个成员为:"sign-mongo01.wangshibo.cn:27017"
//执行成功后,接着回车,显示这个节点为Primary主节点

rs0:PRIMARY> 
接着添加另1个成员:
rs0:PRIMARY> rs.add("sign-mongo02.wangshibo.cn:27018")

查看副本集配置 rs.conf() / 查看成员信息rs.status() (或者使用 db.isMaster() 
rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2017-11-22T13:55:28.446Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "sign-mongo01.wangshibo.cn:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1031,
            "optime" : {
                "ts" : Timestamp(1511358895, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-11-22T13:54:55Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1511358843, 2),
            "electionDate" : ISODate("2017-11-22T13:54:03Z"),
            "configVersion" : 2,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "sign-mongo02.wangshibo.cn:27018",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 32,
            "optime" : {
                "ts" : Timestamp(1511358895, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-11-22T13:54:55Z"),
            "lastHeartbeat" : ISODate("2017-11-22T13:55:27.684Z"),
            "lastHeartbeatRecv" : ISODate("2017-11-22T13:55:27.827Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 2
        }
    ],
    "ok" : 1
}

详细说明如下:
"_id" :  #集群中节点编号 
"name" :  #成员服务器名称及端口 
"health" :  #表示成员中的健康状态(0:down;1:up) 
"state" :  #为0~10,表示成员的当前状态 
"stateStr" :  #描述该成员是主库(PRIMARY)还是备库(SECONDARY) 
"uptime" :  #该成员在线时间(秒) 
"optime" :  #成员最后一次应用日志(oplog)的信息 
"optimeDate" :  #成员最后一次应用日志(oplog)的时间 
"electionTime" :  #当前primary从操作日志中选举信息 
"electionDate" :  #当前primary被选定为primary的日期 
"configVersion" :  #mongodb版本 
"self" :  #为true 表示当前节点 
 

添加仲裁节点ARBITER
rs0:PRIMARY> rs.addArb("sign-mongo03.wangshibo.cn:27018")

初始化还可以用这种方式:

rs.initiate(
  {
    _id : <replicaSetName>,
    members: [
      { _id : 0, host : "192.168.32.135:27017,priority:4" },
      { _id : 1, host : "192.168.32.137:27017,priority:2" },
      { _id : 2, host : "192.168.32.138:27017,arbiterOnly:true" }
    ]
  }
)

 

5) 数据同步测试

在主库插入数据后,在从库的主机上登录发现数据是通过过来的

默认情况下SECONDARY节点不能读写,要设置slaveOK为true才行。集群中只能有一个Primary节点,只能在Primary写数据,不能在SECONDARY写数据

db.getMongo().setSlaveOk()或rs.slaveOk()

 

6) 故障切换测试

现在模拟主库不可用,将主节点服务停止:

在第1台机器执行db.shutdownServer()

通过rs.status 查看,发现主节点已经到第2台机器了

 

3. mongo支持密码

使用keyFile模式启动数据库服务,默认会启用--auth认证模式。一般需要先在单例模式下创建好用户,再使用--keyFile模式启动,认证后访问数据库。(否则没权限)

1)  生成密钥文件


主机中任何一台机器上执行:

openssl rand -base64 756 > /data/mongodb/testKeyFile.file
chmod 400 /data/mongodb/keyfile/testKeyFile.file
第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限
 
将密钥testKeyFile.file复制到集群中的每台机器的指定位置
一定要保证密钥文件一致。文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置

 2) 配置中增加

keyFile=/data/mongodb/testKeyFile.file

重启mongo 就可以

如果执行rs.status() 提示权限,就执行:

> use admin
>db.auth('zcyroot','zcyroot')
> 
db.grantRolesToUser( "myadmin" , [ { role: "dbOwner", db: "admin" },{ "role": "clusterAdmin", "db": "admin" },
{ "role": "userAdminAnyDatabase", "db": "admin" },
{ "role": "dbAdminAnyDatabase", "db": "admin" },
{ role: "root", db: "admin" } ])

> rs.status() /rs.conf()

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhuchunyan_aijia/article/details/118052518

智能推荐

ArcGIS API for Javascript加载各种来源的wms和wmts服务_arcgis js api wmts-程序员宅基地

文章浏览阅读1.5k次。1、加载wmts服务-使用WebTileLayer方式加载2、加载wms图层-使用BaseDynamicLayer方式加载_arcgis js api wmts

qt实现模拟路由器网络-建模课设_qt模拟实现小型城市组网-程序员宅基地

文章浏览阅读869次。说在前面首先,不是真的路由器,只是一些节点,但是使用的是OSPF协议,主要就是建立了一百多个节点,然后形成了一个连通图网络(深搜形成),接着找到最重要的十个节点(邻居最多的),最后输出这十个节点的路由表(老师的要求是路由表要有目的地,下一跳,以及路径长)。具有的功能直接看下面的截图就知道了。截图蓝色的就是最重要的十个节点这是十个路由器的路由表文件下一跳ip,目的地ip,路径,ip前三个数是乱写的,第四个是节点编号.h文件#ifndef MAINWINDOW_H#define MAINWI_qt模拟实现小型城市组网

python智慧交通大数据系统 实时监控 Flask框架 可视化(源码)_python技术在智慧交通大树后监控平台中的实时监控应用研究-程序员宅基地

文章浏览阅读905次,点赞23次,收藏11次。python智慧交通大数据系统 实时监控 Flask框架 可视化(源码)_python技术在智慧交通大树后监控平台中的实时监控应用研究

浅谈“三层结构”原理与用意(转帖)-程序员宅基地

文章浏览阅读78次。浅谈“三层结构”原理与用意序在刚刚步入“多层结构”Web应用程序开发的时候,我阅读过几篇关于“asp.net三层结构开发”的文章。但其多半都是对PetShop3.0和Duwamish7的局部剖析或者是学习笔记。对“三层结构”通体分析的学术文章几乎没有。2005年2月11日,Bincess BBS彬月论坛开始试运行。不久之后,我写了一篇题目为《浅谈“三层结构”原理与用意》的文章。旧版文...

RITSEC CTF2021 Forensics1597题解记录-程序员宅基地

文章浏览阅读300次。题目地址:http://git.ritsec.club:7000/1597.git/这是一道与git版本管理有关的题目解题过程:一、很明显第一步将远程仓库克隆到本地git clone http://git.ritsec.club:7000/1597.git/其中一共有两个文件打开后发现flag.txt为空文件,README.md文件显示:# 1597A git challenge series? Sounds fun.没有用!!!二、推测(看大佬WP)查看版本记录。1.mkdir ki_ritsec

ssm 课程资源库APP 计算机毕设源码23834-程序员宅基地

文章浏览阅读70次。主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等:详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。本课程资源库APP采用的数据库是Mysql,使用Java技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点......

随便推点

Java 基础常见知识点&面试题总结(上),2022 最新版!_2022java面试需要会的知识点-程序员宅基地

文章浏览阅读152次。 拓展一下:“Write Once, Run Anywhere(一次编写,随处运行)”这句宣传口号,真心经典,流传了好多年!以至于,直到今天,依然有很多人觉得跨平台是 Java 语言最大的优势。实际上,跨平台已经不是 Java 最大的卖点了,各种 JDK 新特性也不是。目前市面上虚拟化技术已经非常成熟,比如你通过 Docker 就很容易实现跨平台了。在我看来,Java 强大的生态才是!JVMJava 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Li._2022java面试需要会的知识点

Elasticsearch的基础概念和配置实战-程序员宅基地

文章浏览阅读3.7k次。作者:禅与计算机程序设计艺术 1.简介Elasticsearch是一个开源分布式搜索及分析引擎,主要面向云计算环境和实时应用场景。在互联网行业中扮演着越来越重要的角色,从而影响到各个领域,包括IT、电子商务、金融、搜索等。本文将以实战的方式,带领读者了解Elastic Stack(El

Python入门实战:Python的人工智能应用-程序员宅基地

文章浏览阅读11次。1.背景介绍Python是一种高级、通用、解释型的编程语言,它具有简单易学、高效开发、可读性强等优点,因此在各个领域得到了广泛应用。在人工智能领域,Python也是最受欢迎的编程语言之一。Python的人工智能库和框架丰富,包括NumPy、Pandas、Scikit-learn、TensorFlow、PyTorch等,这些库和框架提供了丰富的功能和强

uni-app 开发微信小程序 自定义tabBar_uniapp iconpath-程序员宅基地

文章浏览阅读1.4k次。uni-app 微信小程序 自定义tabBar 底部导航_uniapp iconpath

wordpress 自定义_在WordPress中创建自定义的“降雪”设计-程序员宅基地

文章浏览阅读327次。wordpress 自定义In December 2012, the New York Times broke out of their standard online post layout and wowed us with John Branch’s beautiful “Snow Fall” article. Instead of simply containing headings, t..._wordpress have_rows

C语言如何输入带空格的字符串?_c语言输入带空格的字符串-程序员宅基地

文章浏览阅读3.6w次,点赞84次,收藏201次。C/C++输入带空格的字符串_c语言输入带空格的字符串

推荐文章

热门文章

相关标签