`
wx1568016009
  • 浏览: 23520 次
文章分类
社区版块
存档分类
最新评论

零停机添加mongo集群访问控制

 
阅读更多

点击蓝色字关注我!

?wx_fmt=jpeg

在互联网公司开发过程中,我们常常会遇到,一些一开始没考虑到的场景,等到上线或者服务运行一段时间之后,发现有些东西没做好,需要做一些优化重构啥的。

这些场景包括,某些服务密码配置过于简单(或者没配置),敏感数据没有脱敏(转移),代码没有足够测试用例,日常服务爆出漏洞需要升级修复等等。在优化过程中,我们都希望做到零宕机平滑迁移,以此把服务影响时间降到最低。

今天我说的就是这里场景的一种,mongo实现零重启添加访问控制。

写在前面

本文是在 Ubuntu:16.04, mongo 3.4版本进行

要求:您的副本集可以在现有的primary成员之后(比如宕机)选择一个新的primary。

mongo集群实现零停机添加「身份认证」,需要版本是在mongo 3.4以上版本,原因是mongo在3.4的时候加入了--transitionToAuth 参数,本文主要是通过这个参数做到零停机进行升级认证的。

我们这里以3个节点副本集为例。

创建一个用户管理员

链接到primary进行创建 userAdminAnyDatabase 权限的用户

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "yourname1",    pwd: "changeme1",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

在完成此过程后,任何管理副本集合中的用户的客户端都必须作为该用户进行身份验证,或者具有类似权限的用户。

创建集群管理员

连接到primary节点,创建一个具有clusterAdmin角色的用户。clusterAdmin角色授予对复制操作的访问权,例如配置副本集。

db.getSiblingDB("admin").createUser(
  {    "user" : "yourname2",    "pwd" : "changeme2",
    roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
  }
)

创建客户端应用链接的用户

创建用户允许客户端程序与副本级交互。完成这一步客户端需要通过对应帐号密码来进行链接副本级。

这里面我们需要注意使用readWrite权限对数据进行操作,对特定的数据库(如yourdb)密码建议设置较为复杂来加强系统安全性,这里建议用1password进行生成管理。

db.getSiblingDB("yourdb").createUser(
  {    "user" : "yourname_client",    "pwd" : "changeme2",
    roles: [ { "role" : "readWrite", "db" : "yourdb" } ]
  }
)

客户端认证yourdb可以对其进行读写。

更新客户端应用代码

这一步里面,副本级链接并没有强制要求认证,但是客户端应用程序依然可以通过认证的帐号密码俩进行链接副本级。

这里我们假设你的副本级 replia set 为 yourRepl 进行测试

mongo  -u yourname_client -password changeme2 -authenticationDatabase yourdb —host yourRepl/mongo1.example.net:27017, mongo2.example.net:27017, mongo3.example.net:27017

可以链接成功,然后更新客户端代码,发布上线。

创建密钥文件

openssl rand -base64 756 > <path-to-keyfile><path-to-keyfile>

这里面保证上面这个keyfile,需要mongodb(你启动mongod) 用户可以访问

通过keyfile认证方式,副本级中的每个mongod实例都会使用keyfile的内容作为密码去认证其他成员。只有正确的mongo实例拥有正确的keyfile可以加入副本级。

然后复制keyfile到每一个副本级

添加transitionToAuth,重启实例

注意:在重启之前保证配置文件中有以下配置

security:
  keyFile: &lt;path-to-keyfile&gt;
  transitionToAuth: true # 这个配置很重要replication:
  replSetName: &lt;replicaSetName&gt;
  • 先重启secondary 或arbiter

sudo service mongod restart

  • 在重启针对primary节点需要

rs.stepDown()

一个原则,保持primary在线

去掉transitionToAuth,重启实例

注意:在重启之前保证配置文件中有以下配置

security:
  keyFile: &lt;path-to-keyfile&gt;
replication:
  replSetName: &lt;replicaSetName&gt;
  • 先重启secondary 或arbiter

sudo service mongod restart

  • 重启primary节点需要

rs.stepDown()

至此所有的集群认证已经添加完毕,所有客户端也需要进行认证才能进行链接。

我们这种「边开飞机,边换引擎」方式到此就已经完成了。

分享到:
评论

相关推荐

    mongo集群说明文档

    《mongo集群部署》这篇文章所需要的配置文件以及mongo压缩包和说明文档

    mongo 集群

    不同端口,3个可用的服务,3个分片,每个分片为3个副本的副本集

    mongo集群脚本参考.zip

    5. **安全策略**:设置访问控制,启用身份验证和授权,保护数据安全。 总的来说,MongoDB 的副本集和分片技术是构建大规模、高性能数据存储系统的基石。理解并熟练运用这些技术,结合提供的脚本参考,能够帮助我们...

    mongo集群说明文档加补充

    11. **安全配置**:MongoDB 集群需要配置认证、授权和网络访问控制,以确保数据安全。这通常涉及到设置用户、角色以及应用安全策略。 12. **性能优化**:为了最大化性能,需要考虑索引创建、数据模型设计、硬件选择...

    docker-mongosetup:mongo集群的安装节点

    用于设置mongo集群的Docker映像 支持的标签和相应的Dockerfile链接 有关此图像及其历史记录的更多信息,请参阅的相关清单文件。 什么是docker-mongosetup? 安装了mongo的Docker映像,将运行一些配置脚本。 该图像...

    MongoVUE-Installer

    8. 集群支持:对于部署在MongoDB集群上的数据库,MongoVUE也提供了全面的管理功能,包括分片集群、复制集等。 安装MongoVUE-Installer时,用户应确保计算机已满足软件的系统需求,例如兼容的操作系统版本、足够的...

    使用+StatefulSet+搭建+MongoDB+集群.doc

    【使用 StatefulSet 搭建 MongoDB 集群】 MongoDB 是一款广泛使用的开源、高性能、无SQL的文档型数据库,特别适合处理大规模数据。为了实现高可用性和容错性,通常会采用集群部署模式。在 Kubernetes 环境中,...

    阿里mongo同步工具mongo-shake

    Mongo-shake 是阿里巴巴开发的一款高效、稳定且易于使用的MongoDB数据迁移工具,主要用于实现MongoDB集群之间的数据同步。它支持全量数据迁移和增量数据迁移,确保在不同MongoDB实例之间保持数据的一致性。这款工具...

    mongodb分片集群增加acl

    本文将详细介绍在MongoDB 3.6版本中如何增加分片集群的ACL(访问控制列表)权限,以及在搭建分片集群过程中可能遇到的一些问题及其解决方案。 ### MongoDB分片集群简介 MongoDB分片集群是一种分布式数据存储结构,...

    mongo-docker, 基于 Docker的即时MongoDB集群环境.zip

    mongo-docker, 基于 Docker的即时MongoDB集群环境 即时MongoDB分片集群这个库为 Vagrantfile 。Dockerfile和 Bootstrap 脚本提供了使用Virtualbox软件管理程序构建的虚拟机来创建MongoDB集群。 在安装完成后,在本地...

    mongo分片集群搭建

    6. 配置分片:在 MongoDB 的 admin 数据库中运行命令,添加 shard 到集群,指定其配置服务器和 shard 名称。 7. 分片数据集合:在需要分片的数据库上,指定一个字段作为分片键,这将决定数据如何在 shards 之间分配...

    k8s搭建mongo分片集群

    - 创建 Service,使得应用程序可以通过这个 Service 访问分片集群。 5. **添加分片**: - 使用 `sh.addShard()` MongoDB 命令将分片服务器添加到集群中。 - 分配集合到特定的分片,使用 `sh.enableSharding()` ...

    构建BaaS云数据(CloudData)服务—mongo集群架构设计

    作者:赵静,多年互联网领域从业经验,现服务于Maxleap基础服务及架构组,主要负责云数据(CloudData)架构设计及研发,关注分布式计算、云存储。

    MongoDB集群搭建

    MongoDB MongoDB集群搭建 环境集群搭建 MongoDB MongoDB集群搭建 环境集群搭建

    Mongo学习文档参考手册

    7. 自动分片以支持云级别的伸缩性(处于早期 alpha 阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。 Mongo 的自动分片功能可以实现水平的数据库集群,支持云级别的伸缩性和高可用性。 Mongo 的...

    mongo-cluster-compose:使用Docker组成mongodb集群

    使用Docker创建Mongo集群 设置副本同步延迟 // local/mongo/init-cluster.js // ... cfg . members [ 1 ] . slaveDelay = 30 ; //seconds // ... 复制模式 创建堆栈 sh stack.sh build 破坏堆栈 sh stack.sh ...

    MongoDB集群管理工具mongo3.zip

    mongo 是一款超酷的 MongoDB 集群管理工具,它本身提供一个 web 控制台,让你可以像维护普通数据库一样维护 MongoDB。主要特性:非常容易管理你的 MongoDB 集群信息可以获取你配置的实时快照信息深入集群,数据库,...

    mongodb-cluster-docker-compose:演示一个简单的分片的Mongo集群,并使用docker compose复制

    带有Docker Compose的演示Mongo分片集群 PSS样式(小学-中学-中学) 需要PSA吗? 检查 警告(Windows和OS X) Windows和OS X上的默认Docker设置使用VirtualBox VM托管Docker守护程序。 不幸的是,VirtualBox用于在...

    MongoDB搭建分片集群windows端.txt

    MongoDB搭建分片集群windows端

    mongo VUE客户端

    安装过程中,记得关注任何特定的提示,比如是否需要添加Mongo VUE到系统路径,以便于通过命令行启动。 一旦Mongo VUE安装完毕,接下来是替换原有文件的步骤。这可能意味着你需要将新版本的Mongo VUE程序文件覆盖到...

Global site tag (gtag.js) - Google Analytics