Mongodb主、副、仲裁节点集群安装(附带开启用户认证)

mongodb 的集群方式主要分为三种Replica Set / Sharding / Master-Slaver ,这里只说明最简单的集群搭建方式(生产环境),如果有多个节点可以此类推或者查看官方文档。

Replica Set

       中文翻译叫做副本集。其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。如下图:

       Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据(M,S),仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

       默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。

       仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。

介绍完了集群方案,那么现在就开始搭建了。

1、将三台计算机同时下载,解压安装文件

 下载命令:apt-get install mongo



wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.6.tgz

2、同时创建mongodb数据文件夹  

    mkdir -p /mongodb/data/master   
    mkdir -p /mongodb/data/slaver   
    mkdir -p /mongodb/data/arbiter    
    #三个目录分别对应主,备,仲裁节点

3、建立配置文件(M,S,A)

 (一) 主节点配置文件

     #master.conf  
     dbpath=/mongodb/data/master  
     logpath=/mongodb/log/master.log  
     pidfilepath=/mongodb/master.pid  
     directoryperdb=true  
     logappend=true  
     replSet=testrs  
     bind_ip=172.17.79.42
     port=27017
     oplogSize=10000
     fork=true
     noprealloc=true
     #auth=true
     #keyFile =/home/mongodb/master/mongo.keyfile

 (二) 从节点配置文件 

     #slaver.conf  
     dbpath=/mongodb/data/slaver  
     logpath=/mongodb/log/slaver.log  
     pidfilepath=/mongodb/slaver.pid  
     directoryperdb=true  
     logappend=true  
     replSet=testrs  
     bind_ip=172.17.79.42
     port=27018
     oplogSize=10000
     fork=true
     noprealloc=true
     #auth=true
     #keyFile =/home/mongodb/slaver/mongo.keyfile

 (三) 仲裁节点配置文件

     #arbiter.conf  
     dbpath=/mongodb/data/arbiter  
     logpath=/mongodb/log/arbiter.log  
     pidfilepath=/mongodb/arbiter.pid  
     directoryperdb=true  
     logappend=true  
     replSet=testrs  
     bind_ip=172.17.79.42
     port=27019
     oplogSize=10000
     fork=true
     noprealloc=true
     #auth=true
     #keyFile =/home/mongodb/arbiter/mongo.keyfile

*配置文件中参数解释:  

       dbpath:数据存放目录
     
      logpath:日志存放路径
     
      pidfilepath:进程文件,方便停止mongodb
     
      directoryperdb:为每一个数据库按照数据库名建立文件夹存放
     
      logappend:以追加的方式记录日志
     
      replSet:replica set的名字
     
      bind_ip:mongodb所绑定的ip地址
     
      port:mongodb进程所使用的端口号,默认为27017
     
      oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
     
      fork:以后台方式运行进程
     
      noprealloc:不预先分配存储

4、相继启动mongod 或者安装mongo服务

  进入每个mongodb节点的bin目录下(配置文件路径有更改请自行更改下面命令)

    ./monood -f master.conf
    ./mongod -f slaver.conf
    ./mongod -f arbiter.conf

5、配置主,备,仲裁节点

  可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。

    ./mongo 10.10.148.130:27017   #ip和port是某个节点的地址  
    >use admin  
    >cfg={ _id:"testrs", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1},   
    {_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] };  
    >rs.initiate(cfg)  

  cfg是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的10.10.148.130:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。

6、测试配置是否成功

    配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:

    {  
            "set" : "testrs",  
            "date" : ISODate("2013-01-05T02:44:43Z"),  
            "myState" : 1,  
            "members" : [  
                    {  
                            "_id" : 0,  
                            "name" : "10.10.148.130:27017",  
                            "health" : 1,  
                            "state" : 1,  
                            "stateStr" : "PRIMARY",  
                            "uptime" : 200,  
                            "optime" : Timestamp(1357285565000, 1),  
                            "optimeDate" : ISODate("2013-01-04T07:46:05Z"),  
                            "self" : true  
                    },  
                    {  
                            "_id" : 1,  
                            "name" : "10.10.148.131:27017",  
                            "health" : 1,  
                            "state" : 2,  
                            "stateStr" : "SECONDARY",  
                            "uptime" : 200,  
                            "optime" : Timestamp(1357285565000, 1),  
                            "optimeDate" : ISODate("2013-01-04T07:46:05Z"),  
                            "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),  
                            "pingMs" : 0  
                    },  
                    {  
                            "_id" : 2,  
                            "name" : "10.10.148.132:27017",  
                            "health" : 1,  
                            "state" : 7,  
                            "stateStr" : "ARBITER",  
                            "uptime" : 200,  
                            "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),  
                            "pingMs" : 0  
                    }  
            ],  
            "ok" : 1  
    }  

   正在进行配置提示:"stateStr" : "RECOVERING"

7.生成用户

>db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]})   #创建用户和密码

8.生成mongo.keyfile认证文件供集群使用

[root@bobohost ~]# openssl rand -base64 90 -out /home/mongo.keyfile

此处生成mongo.keyfile拷至三个环境的相同路径中,并分别授权

    [root@oapp01 bin]# chmod 600 /home/mongodb/master/mongo.keyfile
    [root@oapp01 bin]# chmod 600 /home/mongodb/slaver/mongo.keyfile
    [root@oapp01 bin]# chmod 600 /home/mongodb/arbiter/mongo.keyfile

9.停止三个mongo实例,修改配置,将三个相应配置文件解开注解

    auth=true
    keyFile =/home/mongodb/arbiter/mongo.keyfile

10.重新启动mongodb,重复步骤4,验证用户

    ./mongo 10.10.148.130:27017   #ip和port是某个节点的地址  
    >use admin
    >db.auth("root","root")
    1
    >show users
    {
        "_id" : "admin.root",
        "user" : "root",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }

再次查看状态:

    rs.status()
    {
        "set" : "testrs",
        "date" : ISODate("2020-11-13T02:05:31.901Z"),
        "myState" : 1,
        "term" : NumberLong(2),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
            "lastCommittedOpTime" : {
                "ts" : Timestamp(1605233125, 1),
                "t" : NumberLong(2)
            },
            "readConcernMajorityOpTime" : {
                "ts" : Timestamp(1605233125, 1),
                "t" : NumberLong(2)
            },
            "appliedOpTime" : {
                "ts" : Timestamp(1605233125, 1),
                "t" : NumberLong(2)
            },
            "durableOpTime" : {
                "ts" : Timestamp(1605233125, 1),
                "t" : NumberLong(2)
            }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1605233085, 1),
        "members" : [
            {
                "_id" : 0,
                "name" : "172.17.79.42:27017",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 99,
                "optime" : {
                    "ts" : Timestamp(1605233125, 1),
                    "t" : NumberLong(2)
                },
                "optimeDate" : ISODate("2020-11-13T02:05:25Z"),
                "syncingTo" : "",
                "syncSourceHost" : "",
                "syncSourceId" : -1,
                "infoMessage" : "",
                "electionTime" : Timestamp(1605233044, 1),
                "electionDate" : ISODate("2020-11-13T02:04:04Z"),
                "configVersion" : 1,
                "self" : true,
                "lastHeartbeatMessage" : ""
            },
            {
                "_id" : 1,
                "name" : "172.17.79.42:27018",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 89,
                "optime" : {
                    "ts" : Timestamp(1605233125, 1),
                    "t" : NumberLong(2)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1605233125, 1),
                    "t" : NumberLong(2)
                },
                "optimeDate" : ISODate("2020-11-13T02:05:25Z"),
                "optimeDurableDate" : ISODate("2020-11-13T02:05:25Z"),
                "lastHeartbeat" : ISODate("2020-11-13T02:05:30.220Z"),
                "lastHeartbeatRecv" : ISODate("2020-11-13T02:05:30.819Z"),
                "pingMs" : NumberLong(0),
                "lastHeartbeatMessage" : "",
                "syncingTo" : "172.17.79.42:27017",
                "syncSourceHost" : "172.17.79.42:27017",
                "syncSourceId" : 0,
                "infoMessage" : "",
                "configVersion" : 1
            },
            {
                "_id" : 2,
                "name" : "172.17.79.42:27019",
                "health" : 1,
                "state" : 7,
                "stateStr" : "ARBITER",
                "uptime" : 81,
                "lastHeartbeat" : ISODate("2020-11-13T02:05:30.236Z"),
                "lastHeartbeatRecv" : ISODate("2020-11-13T02:05:30.540Z"),
                "pingMs" : NumberLong(0),
                "lastHeartbeatMessage" : "",
                "syncingTo" : "",
                "syncSourceHost" : "",
                "syncSourceId" : -1,
                "infoMessage" : "",
                "configVersion" : 1
            }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1605233125, 1),
        "$clusterTime" : {
            "clusterTime" : Timestamp(1605233125, 1),
            "signature" : {
                "hash" : BinData(0,"YRSyg35SnZWz4ag7heHNPwRP+dY="),
                "keyId" : NumberLong("6894420926767562753")
            }
        }
    }

看清楚"stateStr"相应状态分别为: "PRIMARY","SECONDARY","ARBITER",收工

后话:

   Replica Set 是我现在主要使用的集群方式,也是我使用过最稳定和高效的无规则大数据存储方式。这样的配置要求运行环境需要至少三台windows/ubuntu,当然我们可以使用VM来进行虚拟化测试,在项目实施的过程中还是建议多台服务器进行配置,如果有能力当然可以上虚拟+存储。至于大数据的数据检索部分,千万级别以下的使用mongodb的索引完全能解决,过亿建议使用检索平台,最近个人在研究 elasticseach 大数据检索平台,如果有兴趣的可以一起学习了解~ 以上是mongodb Replica Set 的配置过程。 小的敬上!
————————————————
版权声明:本文为CSDN博主「嗜湮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/y6300023290/article/details/89213950

posted @ 2021-05-10 17:28  seasonzone  阅读(464)  评论(0编辑  收藏  举报