zoukankan      html  css  js  c++  java
  • MongoDB关于replSet的配置概述(一主二从)

    对于网上的文章来说,通常遇到问题想要寻求解决方法,其结果往往都是坑较多,成功例子较少。原因不过是文章习作时间较早,版本较老;或者写作大佬以为自己的读者能力很强,在某些细节没有展开或遗漏;再或者技术型网站随意借鉴其他原创作者文章,夸大功效排版错乱删减篇幅。

    实际上这种“别人都是坑,我来说说我做的”这种文章(包括自己)都不一定好到哪里去,看看粉丝关注度和技术难易程度,基本都是刚摸技术没多久的新手~

    so,我的建议就是,如果你有问题,还一定要从几个博客几个问答中找到解决办法的,最好收集多篇【不一样】的技术文章,相互参考校对,取其精华去其槽粕,找到答案……

    前话扯得多系列是我文章写作的习惯hhh,(还不是主要内容不多……)好~现在开始进入正题(本文给小白看的,语言粗浅不要森气)↓

    目录

    如果有耐心,请按顺序看完,本文内容……没多少

    先谈一谈副本集吧~(英文是replset,以下统称为汉语【副本集】)

            副本集简单呢就是复制出来多份作为副本,首要功能就是防止主节点崩溃导致数据丢失——从节点经过票选选出新的主节点,继续完成其遗志……

            由于要票选,所以出现0票或者1:1情况都不太好,所以,通常建议节点保持在一主两从或一主三从。其中一主两从是一主,一从,一投票节点(职业投票……)分配会比较好。

            分成主从主要原因是功能区分,主节点是数据员主要操作的对象。操作过程和结果会保留成oplog形式,从节点会定期从log中读取,并修改自身数据,达到同步效果。

            从节点通常赋予读的权利,因为主节点通常不会读取从节点更改信息,而反过来,从节点会根据主节点变化而变化。所以从节点一般用来做读有关操作较多。

            例如分词与检索操作,数据分析和识别等。不会对源数据产生“生产必要更改”的人为操作(这里想法可能是副本集会自动复原吗?大概吧……不重要)

            主节点删除或损毁会使一个从节点变成主节点,通常会继承所有功能,其前提是存在可以被票选出来的节点

    从集群部署上,一般生产实践中,会将节点部署在不同服务器上(仔细想想就是大一点的另外多台主机咩……),利用路由等原理,将他们连通起来,分配好主与从之后就可以干活了。但是在开发过程中,基本上都是现在开发者本机上搭建环境的。那么就要尝试理解好,不同服务器与单机环境的对应关系,这样才能好好的完成副本集的配置工作。

     图片来自https://blog.csdn.net/java2000_wl/article/details/7777319

    上图可以看出,无论是主,还是从节点,都是服务器(同一服务器或不同服务器)中的一个部分,那么我们在给主节点部署数据库结构,搭建服务器(这个可以自行查找相关文案)时,所做的,也应该为从节点做一下。换句话说,主节点上已经部署了数据库了(包括dbpath和logpath),那么不配置从节点的数据库环境,则从节点只是一块内存而已什么也不是,还怎么做数据库呢。

    同理,在本机搭建环境的时候,实际上是我遇到的问题,不理解服务器与本机的关系。网上默认大家都能够理解,以至于都避而不谈,直接说之后的事情。所以我初期搭建环境,直接输入

    config={ _id:"replset_test",members:[  
    {_id:0,host:"127.0.0.1:27017"}, {_id:1,host:"127.0.0.1:27018"}, {_id:2,host:"127.0.0.1:27019"} ]}

    的时候,给的结果只有一个id为0的数据源节点,使用rs.add也不好使,rs.remove提示说只有一个节点,没法投票选出下一个主节点所以不能删……所以就陷入了对于小白来说的我的死循环中——想多添加节点,结果不是说节点已添加就是说无法找到该节点(后来才明白这句话的含义);想删了重做,结果说节点太少balabala不让删。

    网上直接搜索删除副本集相关,结果都不令人满意,主要就在于缺少节点。所以我找到了下面这个文章↓

    https://www.jb51.net/article/109091.htm

    在这先说明一下,我在这里做得操作完全源于bug无法修复前提,不得不实施的“网吧重启”操作,实际上还有更好的办法,如果读者也有相同问题且项目目前已保存备份情况下,可以借鉴一下我这个操作。

    为了方便阅读,我将其中一部分摘抄一下(这里使用windows举例,其他系统可以参考替换部分内容即可):

    1)做好数据备份

    因为下面步骤会去掉数据库内容(破釜沉舟啊……那些帮助帖细点讲也不至于这么坑)

    2)卸载MongoDB服务

    mongod.exe --remove --serviceName "MongoDB"

    这里注意的是,如果你的mongod不是配置的全局变量(在我的电脑-环境变量配置),请先cd到MongoDB的bin目录下(不会的,可以点击这里学习)

    这样,系统中服务名为MongoDB就会消失。这里插一句,一般新建完成的MongoDB,会自动生成这个服务,默认是自动开启,也就是开机的时候就一起开了,或许有时候会影响电脑速度,所以如果你还用电脑做点别的事情,最好将它设置为手动开启。不知道怎么进服务的……请点这里

    我就是这么善良,一般有现成的很少会为了阅读量“直接抄一份”~这也是为看我文章的小白培养【去哪里学习提高自身能力水平】

    3)卸载了当然还要再装回来……(哎,何苦)

    mongod.exe --install --logpath="你的log目录(直到log文件自身位置)的绝对路径" --dbpath="你的数据库文件夹对应的绝对路径(这里只是文件夹哟)" 

    重装之后就会发现数据库“清爽”了

    4)配置replset(终于到重点了……)

    新建多个文件夹,这几个文件夹就看作是多个服务器节点。目录内新建两个文件夹和文件,分别是db(或data),log(或logs),mongo.conf。主要是为了好记,其别的名字也无所谓……

    dbpath=D:/mongodb/rs/data   #数据存放目录  
    logpath=D:/mongodb/rs/logs/mongod.log  #日志文件目录  
    port=12345   #mongodb端口  
    logappend=true   #追加方式写日志文件  
    fork=true        #后台运行  
    journal=true     #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里  
    oplogSize=2048   #同步操作记录文件大小(MB)  
    smallfiles=true  #使用较小的默认文件  
    replSet=dbset    #副本集名称,同一个副本集,名称必须一致  

    将以上代码内容写到每个MongoDB的对应节点文件夹目录内的mongo.conf文件内(这里文件名和后缀可以更改,文本文件能打开就都可以)

    这里的目录名要根据放置的目录名进行更改,端口号要设置不同的,副本集名称要设置统一名称不然会出错。

    关闭正在运行的MongoDB服务器。现在我们通过指定 --replSet 选项来启动mongoDB。--replSet 基本语法格式如下:

    mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

    在不同的命令窗口,分别对每个文件夹内的节点都做这个操作。

    默认按照顺序,第一个节点就是主节点primary,其后节点为secondary(这个可以之后更改)

    然后再新来一个命令行窗口,执行mongo命令,进入MongoDB命令行环境,找到主节点对应服务器,输入:

    rs.add(HOST_NAME:PORT)

    这里add内参数为其与secondary节点的ip:port。意为将其他节点添加进入主节点中,作为从节点使用。

    至此配置完成,你可以使用db.isMaster() 来查看对应服务器是否为主节点。你可以使用rs.status()来查看目前replset副本集状态。

    啊,终于成功了,撒花~~~~✿✿ヽ(°▽°)ノ✿

    附:

    本文参考:

    http://tcrct.iteye.com/blog/2108099       mongodb replica set(副本集)设置步骤

    http://www.runoob.com/mongodb/mongodb-replication.html     MongoDB 复制(副本集)

    https://www.jb51.net/article/109091.htm    Mongodb常见错误与解决方法小结(Mongodb中经常出现的错误)

    操作环境:

    windows7   MongoDB3.6.5

  • 相关阅读:
    如何让百度网盘下载速度达60MB/s!
    记一次内存溢出问题的排查、分析过程及解决思路
    使用maven命令打包可执行jar方法
    java实现四则运算
    POI如何合并单元格
    我是如何从功能测试成功转型自动化测试人员的?
    Edgar:Netflix分布式系统的可视化问题诊断平台实践
    Uber的API生命周期管理平台边缘网关(Edge Gateway)的设计实践
    UBer面向领域的微服务体系架构实践
    技术团队:问题被过度的夸大小题大做,你该怎么办?
  • 原文地址:https://www.cnblogs.com/6luv-ml/p/9187435.html
Copyright © 2011-2022 走看看