mongodb 部署有访问控制的新副本集

前言

这篇笔记是对英文原文 Deploy New Replica Set with Access Control 的意译。

直奔主题吧

  1. 启动副本集的一个成员

    这个 mongod 不可启用 auth

  2. 创建管理用户(administrative users)

    创建两个用户:一个用户管理员(user administrator),可以创建和修改用户;一个 root user,你将使用它完成该教程的剩余部分。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use admin
    db.createUser( {
    user: "myUserAdmin",
    pwd: "<password>",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    });
    db.createUser( {
    user: "siteRootAdmin",
    pwd: "<password>",
    roles: [ { role: "root", db: "admin" } ]
    });
  3. 停止 mongod 实例

  4. 创建供每一个副本集成员使用的 key file

    生成用作 key file 的伪随机数据:

    1
    2
    openssl rand -base64 741 > mongodb-keyfile
    chmod 600 mongodb-keyfile
  5. 将 keyfile 拷贝至副本集的每一个成员

    拷贝 mongodb-keyfile 至要运行 MongoDb 部署组件的主机上,并将该文件权限设置为 600,如此这般就只有该文件的拥有者可以读写它了,系统上的其他用户就木有权限访问这个共享的机密了。因为共享是共享给副本集的其他成员,不是共享给当前主机的其他用户。

  6. 以合适的选项启动每一个副本集成员

    对于每一个成员,启动 mongod,并指定 keyfile 和副本集名称:

    1
    mongod --keyFile /mysecretdirectory/mongodb-keyfile --replSet "rs0"

    当然,也可以换个姿势干这事,比如通过配置文件:

    1
    mongod --config $HOME/.mongodb/config

    至于其他副本集配置项嘛,请猛戳 Replication Options

    在生产部署中,你可以配置 init script 来管理这个进程。

  7. 连接到你在那儿创建了管理用户的那个副本集成员

    连接到那个成员,虽然你可能忘记是哪个了。然后以 siteRootAdmin 用户为登录用户请求认证:

    1
    2
    use admin
    db.auth("siteRootAdmin", "<password>");
  8. 初始化副本集

    只需要在其中一个成员上 运行 rs.initiate() 就够了:

    1
    rs.initiate()

    这样 MongoDB 就初始化了一个副本集,它使用了默认的副本集配置,并且目前只有一个成员。

  9. 核实初始的副本集配置

    运行 rs.conf() 就会显示 replica set configuration object

    1
    rs.conf()

    输出类似于(resembles):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "_id" : "rs0",
    "version" : 1,
    "members" : [
    {
    "_id" : 1,
    "host" : "mongodb0.example.net:27017"
    }
    ]
    }

    恩,确实只有一个成员,这完全是废话。不过你可能会问,我们能不能换个姿势初始化副本集,比如给 rs.conf() 传入一个 json 对象,以便一次搞定副本集配置。
    答案是当然可以!不过这个东东超出了这篇笔记讨论的范围,所以我们还是择日再开篇讨论它吧。

  10. 添加剩余成员到副本集

    首先,你必须得连接到主节点( the primary),然后酱紫就行了:

    1
    2
    3
    rs.add("mongodb1.example.net")
    rs.add("mongodb2.example.net")
    rs.add("mongodbn.example.net")

    如此这般,一个全功能的副本集就新鲜出锅了。这个新副本集自己会选出一个主节点。

    不过有一点值得提醒,某些情况下,rs.add() 会触发一次选举。如果你正连接着的 mongod 变成了从节点(secondary),你就需要连接到新的主节点,好继续添加新成员。那如何发现新的主节点呢?请看下一步。

  11. 查看副本集状态

    1
    rs.status()
  12. 创建额外用户来处理操作性的需求

    你可以使用 built-in roles 创建常见角色的用户,比如 dbOwner 角色用来创建数据库管理员,readWrite 角色用来创建可读写数据的用户,read 角色用来创建只可读取数据的用户。如果已有的每一款都不适合你,你也可以自定义一个角色。

    下面为 products 数据库创建一个数据库管理员吧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use products
    db.createUser(
    {
    user: "productsDBAdmin",
    pwd: "password",
    roles:
    [
    {
    role: "dbOwner",
    db: "products"
    }
    ]
    }
    )

    关于角色和权限(roles and privileges)的概述,请猛戳 Role-Based Access Control。关于添加用户的更多信息,请猛戳 Manage Users and Roles

好了,可以收工了。

0%