首页 » 编程笔记 » MongoDB » 正文

MongoDB 3.0 复制集集群搭建及安全认证实践

接着上次的mongodb分享说,目前哇晒项目mongodb的环境已经搭建完毕,搭建了mongodb复制集
先说说复制集的作用:复制在为数据提供了冗余同时,也提高了数据的可用性。

正如上图所示,MongoDB 复制集的架构中,主要分为两部分:主节点(Primary)和从节点(Secondary)。

主节点:在一个复制集中只有并且必须有一个主节点,主节点点也是众多实例中唯一可以接收客户端写操作的节点,当然也可以进行读操作;

从节点:从节点会复制主节点的操作,以获取完全一致的数据集。客户端不能够直接对从节点进行写操作,但是可以进行读操作,这个需要通过复制集选项进行设置: SECONDARY> rs.slaveOk()

投票节点:投票节点 并不含有 复制集中的数据集副本,且也 无法 升职为主节点。投票节点的存在是为了使复制集中的节点数量为奇数,这样保证在进行投票的时候不会出现票数相同的情况。如果添加了一个节点后,总节点数为偶数,那么就需要相应的增加一个投票节点。

由于线上只有两台机器,我采用的是一个仲裁,两个节点的架构方式,如图

具体步骤如下:

线上机器两台
A  XXX.XX.XX.XX
B  ZZZ.ZZ.ZZ.ZZ

其中仲裁节点和从节点部署在B机器

主和从节点的配置基本相同, 例如:

systemLog:
   destination: file
   path: "/local/mongodb/logs/mongo.log" #日志路径
   logAppend: true #日志追加
storage: 
   journal:
       enabled: true
   dbPath: "/local/mongodb/data/wdb"
   directoryPerDB: true
   engine: wiredTiger  #启用WT引擎
   wiredTiger:
       engineConfig:
           cacheSizeGB: 10
           directoryForIndexes: true
       collectionConfig:
           blockCompressor: zlib
       indexConfig:
           prefixCompression: true
security:
    authorization: enabled
    keyFile: "/local/mongodb/data/key/r1"   #集群机器之间的安全认证
net:
    port: 27017 
processManagement:
    fork: true

replication:
    oplogSizeMB: 20
    replSetName: demo #集群唯一的名字

 

仲裁节点(由于此节点不做数据存储,所以配置比较简单):

systemLog:
   destination: file
   path: "/local/mongodb/logs/mongo_arb.log"
   logAppend: true
storage: 
   journal:
       enabled: false
   dbPath: "/local/mongodb/data/wdb_arb"

security:
    keyFile: "/local/mongodb/data/key/r1"

net:
    port: 27018 
processManagement:
    fork: true
replication:
    oplogSizeMB: 20
    replSetName: demo

 

三个节点分别启动之后,登陆主节点终端执行:

rs.initiate();
rs.add(‘XXX.XX.XX.XX:27017’);
rs.add(’ZZZ.ZZ.ZZ.ZZ:27017‘);
rs.addArb('ZZZ.ZZ.ZZ.ZZ:27018');

然后执行
use admin
rs.status() 可以看到

2222

配置成功

注意: mongodb 3.0的配置文件都建议用 YAML的格式书写

Changed in version 2.6: MongoDB introduces a YAML-based configuration file format. The 2.4 configuration file formatremains for backward compatibility.

接下来再说说如何在集群中安全认证
首先集群中的安全认证是通过配置
security:
authorization: enabled
keyFile: “/local/mongodb/data/key/r1″

key/r1 的内容是用于标示同一复制集的私钥,三个节点的key必须一致,否则不能连接通

单个节点的安全认证可以执行如下命令搞定:
use admin
db.createUser({user: “xxx”,pwd: “xxx”,roles:[{ role: "readWrite", db: "config" },"clusterAdmin"]});
db.auth(“xxx”,”xxx”);

use  应用的数据库
db.createUser({user: “xxx”,pwd: “xxx”,roles: [ "readWrite", "dbAdmin" ]});
db.auth(“xxx”,”xxx”);

就搞定了

需要注意:

副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设 定:–oplogSize 1000,单位是M。

注意:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务

之所以引入仲裁节点是由于,如果是一主一从的架构方式的话,无论是主节点还是从节点的其中一个挂了的话,剩下的一个节点都会自动降级为从节点,这样的话集群只能读不能写

所以:官方推荐的最小的副本集也应该具备一个primary节点和两个secondary节点。两个节点的副本集不具备真正的故障转移能力。