当你需要用到一个MongoDB 副本集集群,用于开发测试时, 可以通过下面的步骤简单完成。

版本及环境 MongoDB4.4  Centos6.5 

  一. 下载安装 MongoDB Server 及 MongoDB Shell

  二. 副本集启动,初始化

三. 配置用户 增加 访问控制

  一、下载 MongoDB Server 及 MongoDB Shell

   MongoDB Server 提供数据库服务。 Mongo Shell 可以理解为命令行的客户端程序。

   下载地址:https://www.mongodb.com/try/download/community

   此处选择对应的,版本, 平台,Package类型(server /shell)

    4.4.12 MongoDB Server:https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.12-1.el6.x86_64.rpm

MongoDB Shell:https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.12-1.el6.x86_64.rpm

    RMP 安装

rpm -ivh mongodb-org-server-4.4.12-1.el6.x86_64.rpm

rpm -ivh mongodb-org-shell-4.4.12-1.el6.x86_64.rpm

  二、副本集初始化

副本集(replica set)是一组维护相同数据的mongod进程, 提供了高可用性。部分节点故障了,还可以自动选取主节点,继续提供服务。

由于副本集的链接方式和单点有些区别,所以测试环境也按照副本集方式部署。

    

   MongoDB 手册中关于副本集的部分在:https://docs.mongodb.com/v4.4/replication/

    1. 首先创建下数据库数据存储目录,用于存储数据。  环境是单机,三个节点的目录,都是在一台机器创建的,伪分布式。

mkdir -p /srv/mongodb/rs0-0  /srv/mongodb/rs0-1 /srv/mongodb/rs0-2 

    2. 依次启动三个mongod实例

mongod --replSet rs0 --fork --logpath  /srv/mongodb/0 --logappend --port 27017 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-0  --oplogSize 128

mongod --replSet rs0 --fork  --logpath  /srv/mongodb/1 --logappend --port 27018 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-1  --oplogSize 128

mongod --replSet rs0 --fork  --logpath  /srv/mongodb/2 --logappend --port 27019 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-2  --oplogSize 128

    

    启动后, ps -axu |grep mongo 看一下 3个进程 mongod 是不是都ok。

    3.使用mongo shell 连接其中一个节点。进行副本集初始化。

   

    mongo --port 27017

    进入shell后, 执行如下命令。注意替换“10.13.50.40” 为实际IP

rsconf = {
_id: "rs0",
members: [
{
_id: 0,
host: "10.13.50.40:27017"
},
{
_id: 1,
host: "10.13.50.40:27018"
},
{
_id: 2,
host: "10.13.50.40:27019"
}
]
}
rs.initiate( rsconf )

    初始化完成后,可以通过

rs.conf()

    查看副本集配置。

    到这里3个节点的副本集已经配置好了。可以连接进行读写操作了。

但目前连接是没有访问控制的, 下面来增加访问控制。

  三、增加访问控制  

    在副本集中启用访问控制,需要进行两项配置。

    1. 副本集节点成员间的安全认证,支持keyfiles 或者 x.509 证书 认证。

            2. 副本集服务与数据库连接客户端间的安全认证 , 用户名,密码。权限基于用户所属角色。

      副本集节点间的内部认证, 这里使用keyfiles。 通俗说就是所有节点共享相同的keyfile 作为密码。keyfile正确, 才能够加入副本集,实现了副本集节点间的身份验证。 

      创建一个keyfile, 复制三份,供3个节点使用。下面按官方手册, 使用openssl 生成随机密码,修改权限为400. 复制到3个目录备用。

openssl rand -base64 756 > key

chmod  400 key

mkdir -p  /srv/mongodb/k0 /srv/mongodb/k1   /srv/mongodb/k2

cp key /srv/mongodb/k0/
cp key /srv/mongodb/k1/
cp key /srv/mongodb/k2/

下面创建用户,指定角色。 如前述,使用 mongo shell 连接数据库。创建用户需要在主节点进行。如果连接的节点不是当前主节点。可以用 rs.status(); 查看主节点ip端口后连接。进入mongo shell后, 输入如下命令。

admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "admin",
pwd: "admin!@#$",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

    创建一个用户名未 admin 角色为 userAdminAnyDatabase 的用户, 密码为 admin!@#$。 关于内建角色的更多信息可以在这里了解。

  https://docs.mongodb.com/v4.4/reference/built-in-roles/

    准备就绪后。 需要重启mongo server服务, 启用访问控制机制。 下面关闭所有节点。

mongo --port 27017 --eval 'db.adminCommand("shutdown")'
mongo --port 27018 --eval 'db.adminCommand("shutdown")'
mongo --port 27019 --eval 'db.adminCommand("shutdown")'

    重新启动mongod,启用访问控制 --auth --keyFile

mongod --replSet rs0 --fork --auth  --keyFile  /srv/mongodb/k0/key --logpath  /srv/mongodb/0 --logappend --port 27017 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-0  --oplogSize 128

mongod --replSet rs0 --fork --auth --keyFile  /srv/mongodb/k1/key  --logpath  /srv/mongodb/1 --logappend --port 27018 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-1  --oplogSize 128

mongod --replSet rs0 --fork --auth  --keyFile  /srv/mongodb/k2/key  --logpath  /srv/mongodb/2 --logappend --port 27019 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-2  --oplogSize 128

  此时,已经启用了访问控制, 无权限用户无法对数据库进行读写,无法新增用户。下面使用 带认证的方式登录。 --username 及 --password

mongo admin --username admin --password 'admin!@#$'  --host rs0/10.13.50.40:27017,10.13.50.40:27018,10.13.50.40:27019

     admin的角色userAdminAnyDatabase 具有用户管理权限,但无数据库读写权限。 登陆后在 mongo shell中创建一个数据库库读写用户,读写特定数据库。test 用户具有对数据库 mytest 的读写权限, 属于内置的 readWrite 角色。

db.createUser( {user: "test",pwd: "test!@#$",roles: [ { role: "readWrite", db: "mytest" } ]})

    然后mongo shell 使用 test 登录 验证。

mongo test --username test --password 'test!@#$'  --host rs0/10.13.50.40:27017,10.13.50.40:27018,10.13.50.40:27019

  test登录后,在mongo shell 中测试读写

use mytest

db.col.insert({name:'测试',age:1})

db.col.find()

   查询结果  { "_id" : ObjectId("61f3da65e72c3f10edef9a78"), "name" : "测试", "age" : 1 }

至此。一个三个节点的, 带有访问控制的副本集,就搞定收工。

最新文章

  1. Android中数据存储(一)
  2. Rotating Image Slider - 图片旋转切换特效
  3. 【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参
  4. 匹配img和a
  5. Sea.js创始人玉伯的前端开发之路
  6. 字符串常量演示Demo
  7. hashCode之一--两个对象值相同,有相同的hash code
  8. asp.net 1.1网站开发配置出现”Visual Studio .NET 无法创建或打开应用程序”解决方法
  9. C++之对象存储空间_对象模型
  10. sql: sql developer tunnel转接
  11. 快速傅里叶变换(FFT)算法【详解】
  12. Resin4安装配置
  13. mybatis支持oracle批量插入
  14. Dynamics CRM2016 The value of field on record of type entity is outside the valid range问题的解决方法
  15. PHP中的面向对象思想
  16. Android破解学习之路(十六)—— dll破解的IL指令
  17. Java 处理 XML
  18. sql cast,convert,QUOTENAME,exec 函数学习记录
  19. 算法笔记--斜率优化dp
  20. css实现自适应正方形的方法

热门文章

  1. 《剑指offer》面试题50. 第一个只出现一次的字符
  2. Sentry 开发者贡献指南 - 什么是 Scope, 什么是 Hub?
  3. Filter的生命周期及FilterConfig类介绍
  4. Android Native -- Message/Handler/Looper机制(原理篇)
  5. linux下怎么挂载U盘
  6. python 求模运算符--判断奇偶数
  7. 基于 esbuild 的 universal bundler 设计
  8. B/S与C/S
  9. Java与网页JSP文件编码的小总结
  10. python日志装饰器实现