mongodb帶認證的副本集搭建


Mongodb副本集帶用戶認證的

概述

本次實驗是在一台虛擬機上做的,正式環境一定要分開實現,以免影響服務的正常使用和性能。

准備工作:

操作系統:centos7.2

Mongodb版本:3.4.1

服務器ip:192.168.1.11

Mongodb服務端口: 27017、27018、27019

 

1、     首先將下載好的mongodb的安裝包上傳到服務器上

   mongodb-linux-x86_64-rhel70-3.4.1.tgz

 

2、     創建所用到的目錄

    # mkdir /data/{master,slave,arbiter}

    # mkdir /data/log/mongodb/{master,slave,arbiter} -p

 

3、     將剛上傳的mogodb的安裝包解壓到/data目錄並重命名為mongodb

# tar xf mongodb-linux-x86_64-rhel70-3.4.1.tgz

# mv mongodb-linux-x86_64-rhel70-3.4.1   mongodb

 

4、     分別在/data的相應目錄下創建master、slave、arbiter的配置文件

# cat  master.conf

 systemLog:

  destination: file

  logAppend: true

  path: /data/log/mongodb/master/mongodb.log

storage:

  dbPath: /data/master

  journal:

    enabled: true

processManagement:

  fork: true  # fork and run in background

  pidFilePath: /var/run/mongod.pid

net:

  port: 27017

 # bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

replication:

   replSetName: rs1

   oplogSizeMB: 5000

security:

 keyFile: "/data/mongodb.key"

 clusterAuthMode: "keyFile"

 authorization: "enabled"

# cat  slave.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/log/mongodb/slave/mongodb.log

storage:

  dbPath: /data/slave

  journal:

    enabled: true

processManagement:

  fork: true  # fork and run in background

  pidFilePath: /var/run/mongod.pid

net:

  port: 27018

 # bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

replication:

  replSetName: rs1

  oplogSizeMB: 5000

security:

  keyFile: "/data/mongodb.key"

  clusterAuthMode: "keyFile"

  authorization: "enabled"

 

# cat  arbiter.conf

systemLog:

  destination: file

  logAppend: true

  path: /data/log/mongodb/arbiter/mongodb.log

storage:

  dbPath: /data/arbiter

  journal:

    enabled: true

processManagement:

  fork: true  # fork and run in background

  pidFilePath: /var/run/mongod.pid

net:

  port: 27019

 # bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

replication:

  replSetName: rs1

  oplogSizeMB: 5000

security:

  keyFile: "/data/mongodb.key"

  clusterAuthMode: "keyFile"

  authorization: "enabled"

 

5、     由於需要認證,使用keyFile進行授權連接replica sets

創建mongodb.key

# openssl rand -base64 666 > mongodb.key
# chmod 600 mongodb.key

Mongodb.key里面密碼的長度不能超過1024,否則會報錯。

 

將生成的mongodb.key文件分別拷貝到其他服務器上。

 

6、     啟動服務

    啟動服務沒有先后順序

    # mongod -f /data/arbiter/arbiter.conf

# mongod -f /data/master/master.conf

# mongod -f /data/slave/slave.conf

 

7、     配置主,備,仲裁節點

   連接任意一個節點,這里以2017端口為例:

   # mongo 192.168.1.11:27017

   >use admin

   >cfg={_id:"rs1",members:[{_id:0,host:'192.168.1.11:27017',priority:2},{_id:1,host:'192.168.1.11:27018',priority:1},{_id:2,host:'192.168.1.11:27019',arbiterOnly:true}]};

   > rs.initiate(cfg)          #使配置生效

 

# cfg是可以任意的名字,當然最好不要是mongodb的關鍵字,conf,config都可以。最外層的_id表示replica set的名字,members里包含的是所有節點的地址以及優先級。優先級最高的即成為主節點,即這里的'192.168.1.11:27017'。特別注意的是,對於仲裁節點,需要有個特別的配置——arbiterOnly:true。這個千萬不能少了,不然主備模式就不能生效。

上面的命令執行成功會返回1.

 

8、     接下來是在主上進行一系列的操作,創建用戶。Mongo默認沒有管理用戶。

# mongo 192.168.1.11:27017

>use admin

>db.createUser({user:"hqmg",pwd:"huoqiu123",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"clusterAdmin",db:"admin"}]});

 

額,報錯了。原因是沒有執行認證操作。

>db.auth("hqmg","huoqiu123")

這下好了,可以放心的執行操作了

>show dbs

admin   0.000GB

local   0.000GB

     

9、     創建數據庫並創建用戶,為用戶賦予不同的權限,常用的兩種:

read: 只讀權限; readWrite:讀寫權限

  • 數據庫用戶角色:read、readWrite;
  • 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
  • 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  • 備份恢復角色:backup、restore;
  • 所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超級用戶角色:root // 這里還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
  • 內部角色:__system
角色說明:
Read:允許用戶讀取指定數據庫
readWrite:允許用戶讀寫指定數據庫
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級賬號,超級權限

用戶和授權認證是跟隨數據庫的,在那個庫里面創建的用戶,就要在那里授權認證。

!創建一個測試庫,並分別創建只讀、讀寫的用戶。

       如果是新的庫,要先登陸admin庫,進行認證后才可以操作

       # mongo  192.168.1.11:27017 –uhqmg  -phuoqiu123

       >use saturn

       創建讀寫用戶:

       >db.createUser({user:"cuishuai",pwd:"cuishuai123",roles:[{role:"readWrite",db:"saturn"}]})

       

        創建只讀用戶:

       >db.createUser({user:"azui",pwd:"azui123",roles:[{role:"read",db:"saturn"}]})

 

10、   修改用戶權限

有兩種方式,一種是db.grantRolesToUser在原有基礎上追加,一種是db.updateUser替換原有的角色。

1)>db.grantRolesToUser("azui",[{role:"readWrite",db:"saturn"}])

2) >db.updateUser("azui",{roles:[{role:"readWrite",db:"saturn"}]})

11、   刪除用戶權限

>db.revokeRolesFromUser("azui",[{role:"readWrite",db:"saturn"}])

 

12、oplog讀權限

    

Oplog是一種特殊的Capped collections,特殊之處在於它是系統級Collection,記錄了數據庫的所有操作,集群之間依靠Oplog進行數據同步。Oplog的全名是local.oplog.rs,位於local數據下。由於local數據不允許創建用戶,如果要訪問Oplog需要借助其它數據庫的用戶,並且賦予該用戶訪問local數據庫的權限:

 

1)修改現有用戶,使其具有oplog的讀權限:

> db.grantRolesToUser("azui",[{role:"read",db:"local"}])

 

2)創建新用戶:

>db.creatUser({user:"azui",pwd:"azui123",roles:[{role:"read",db:"saturn"},{role:"read",db:"local"}]})

})

3)查詢過程:

>use  saturn

>db.auth('azui','azui123')

>use local

>db.oplog.rs.find()

 

13、   接下來還有重要的一步,日志分割,使用的是logrotate做的。

# cat /etc/logrotate.d/mongodb

/data/log/mongodb/arbiter/mongodb.log{

             daily

             dateext

             compress

             delaycompress

             copytruncate

             create 0644 root root

             rotate 5

             size 500M

}

/data/log/mongodb/master/mongodb.log{

             daily

             dateext

             compress

             delaycompress

             copytruncate

             create 0644 root root

             rotate 5

             size 500M

}

/data/log/mongodb/slave/mongodb.log{

             daily

             dateext

             compress

             delaycompress

             copytruncate

             create 0644 root root

             rotate 5

             size 500M

}

 

添加周期計划任務:

# crontab –e

0 */3 * * *  /usr/sbin/logrotate  /etc/logrotate.d/mongodb 2>&1 >>/dev/null

 

14、   編寫刪除腳本

# cat rmlog.sh

#!/bin/bash

dir1=/data/log/mongodb/arbiter

dir2=/data/log/mongodb/master

dir3=/data/log/mongodb/slave

find $dir1 -mtime +7 -name "*2017*" -exec rm -rf {} \;

find $dir2 -mtime +7 -name "*2017*" -exec rm -rf {} \;

find $dir3 -mtime +7 -name "*2017*" -exec rm -rf {} \;

# chmod +x rmlog.sh

添加周期計划任務:

# crontab –e

    0 */3 * * * /root/cuishuai/rmlog.sh  2>&1 >>/dev/null


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM