csuka.mongodb_ubuntu

MongoDB

这是一个Ansible角色,用于在Ubuntu 22.04上安装、配置和管理MongoDB。

RHEL类似的版本可以在这里找到

在部署此Ansible角色之前,请仔细阅读此文件

功能

  • 应用推荐的生产注意事项,如 numa禁用透明大页面
  • 在PSA架构(主节点、从节点、仲裁者)中引导集群
    • 包括集群验证
  • 通过自动生成的密钥文件加密流量,确保连接安全
  • 安装社区版或企业版
  • 易于配置,具有未来可扩展的配置方法
  • 更新剧本,支持补丁版本
  • 增加用户定义的用户
  • 增加用户定义的数据库
  • 使用mongodump进行备份
  • 日志轮换,可在mongo内部设置

该角色是幂等的,并通过ansible-lint检查。
可以与Ansible版本2.9及以上一起使用,也可能支持早期版本。

要求

  • 大脑
  • 在控制节点上,确保安装了mongodb集合
  • 主机之间能够相互连接,最好使用主机名,并设置端口,默认是27017
  • 确保数据盘和备份(如果设置了)有足够的磁盘空间

断言

有几个断言可以确保最小有效配置。当然,它不能涵盖每种用例,但大多数用例都能覆盖。请仔细遵循此自述文件。作为提示,对于有效的配置,请查看molecule文件夹中的变量文件。

版本和版本

可以设置版本和版本。默认情况下,会添加官方的mongodb存储库和gpg密钥。

mongo_repo: true
mongo_version: 6.0
mongo_edition: org  # 或 enterprise

到目前为止,Ubuntu 22.04仅支持MongoDB 6.0,不支持更低版本。

无日志

出于安全原因,默认情况下,多个任务的日志记录是关闭的。要开启它:

mongo_no_log: true

建议

本节参考了MongoDB的官方生产注意事项

此角色包括一些配置建议,但并不是全部。例如:“关闭包含数据库文件的存储卷的atime。” 这样的任务超出了此角色的范围。

该角色会应用一些已设置的任务,包括:

  • 使用numactl启动MongoDB,在systemd文件中设置
  • 禁用区域回收
  • 禁用透明大页面
  • 配置调整配置文件

有关系统实际更改,请查看tasks/thp.ymltasks/numa.yml

这些配置建议默认应用。

mongo_thp: true
mongo_numa: true

配置变量

首先,请查看defaults/main.yml

配置文件放置在/etc/mongod.conf

在Ansible配置中设置的值会完全对应于主机上的配置文件。只有键是预定义的。例如:

# 在Ansible配置中设置的变量
mongo_operationprofiling:
  my_Value:
    anotherValue: something

将在磁盘上的配置文件中产生:

operationProfiling:
  my_Value:
    anotherValue: something

如果键设置为空字符串,它将在磁盘上的配置文件中被注释掉。

可以设置的可能键有:

mongo_systemlog
mongo_storage
mongo_processmanagement
mongo_security
mongo_operationprofiling
mongo_replication
mongo_sharding
mongo_auditlog
mongo_snmp

有预定义值,这是Mongo的默认值。 如果出于某种原因,想要设置自定义的键值,请使用:

mongo_custom_cnf:
  my_key:
    my_value: true

授权

根据设计,创建了三个用户:adminbackupadminuser。 admin具有root角色,backup用户具有backup角色,adminuser具有userAdminAnyDatabase角色。

mongo_admin_pass: 'change_me'
mongo_adminuser_name: adminuser
mongo_adminuser_pass: 'change_me'

数据库和用户

取自文档,定义自己的一组用户/数据库。

有关可能角色,请参见文档内置角色

用户和数据库始终通过localhost进行配置,通过用户admin和数据库admin进行配置。 当配置一个集群时,数据库和用户的配置将在主机上执行。

设置如下:

mongo_user:
# 在最简单的形式
  - database: my_db
    name: my_user

# 标准值
  - database: another_db
    name: another_user
    update_password: on_create
    password: "123ABC!PASSWORD_XYZ"
    roles: 'readWrite,dbAdmin,userAdmin'
    state: present

# 所有可能的变量
  - database: my_db
    name: someone
    password: my_password
    update_password: on_create             # 默认始终
    roles: 'readWrite,dbAdmin,userAdmin'   # 默认省略
    state: absent                          # 默认present
    ssl: true                              # 默认省略
    ssl_ca_certs: /path/to/ca_certs        # 默认省略
    ssl_cert_reqs: CERT_REQUIRED           # 默认省略
    ssl_certfile: /path/to/ssl_certfile    # 默认省略
    ssl_crlfile: /path/to/ssl_crlfile      # 默认省略
    ssl_keyfile: /path/to/ssl_keyfile      # 默认省略
    ssl_pem_passphrase: 'something'        # 默认省略
    auth_mechanism: PLAIN                  # 默认省略
    connection_options: my_conn_options    # 默认省略
    create_for_localhost_exception: value  # 默认省略

为保持角色的幂等性,应将update_password的值设置为on_create。仅在实际更新密码时,将其设置为always,然后切换回on_create

集群

当剧本中有多个主机时,Ansible假定配置了集群。

在PSA(主/从/仲裁)架构中可以进行集群,或者主/从/从设置。

出于安全原因,主机之间的连接通过密钥文件进行加密。

密钥文件会自动生成并被视为安全

mongo_security:
  keyFile: /etc/keyfile_mongo

两个主机的集群设计基本上是无法维持正常运行的,因为没有法定人数,且节点停机以辅助恢复的能力不足。 当剧本中正好有两个主机时,无法形成集群。 Mongo将无法进行集群,因为必须有一个有效的副本集成员数量。

会有断言来验证剧本中是否存在不均匀数量的主机。

配置如下:

# 为每个主机设置角色。在host_vars中
mongo_replication_role: primary # 或 secondary,或 arbiter

# 在group_vars/all.yml中
mongo_replication:
  replSetName: something
mongo_security:
  keyFile: /etc/keyfile_mongo

可以设置一个主节点和一个仲裁者。

部署后,不应更改集群的设计,例如,将一个从节点改为仲裁者。

仲裁者

根据文档,避免在每个副本集中部署多个仲裁者。

Ansible将确保将仲裁者正确添加到集群中。

mongo_replication_role: arbiter

备份

备份配置为在没有副本的单个主机上设置,或在剧本中的第一个从主机上进行。使用mongodump进行备份,并设置在cron中。

备份脚本放置在第一个适用的从节点上:

- host1 [主节点]   <-- 这里没有备份脚本
- host2 [从节点] <-- 这里放置备份脚本
- host3 [从节点] <-- 这里没有备份脚本
mongo_backup:
  enabled: true
  dbs:
    - admin
    - config
    - local
  user: backup
  pass: change_me
  path: /var/lib/mongo_backups
  owner: mongodb
  group: mongodb
  mode: '0660'
  hour: 2
  minute: 5
  day: "*"
  retention: 46  # 单位:小时

确保更改备份用户的密码,并允许备份用户实际上备份给定的数据库。

在磁盘上的结果将是:

[root@test-multi-03 mongo_backups]# pwd ; ls -larth
/var/lib/mongo_backups
total 4.0K
drwxr-xr-x. 36 root   root   4.0K Jan 20 12:33 ..
lrwxrwxrwx   1 root   root     46 Nov 20 12:37 latest -> /var/lib/mongo_backups/mongo_backup_2021-11-20
drw-rw----   3 mongod mongod   51 Nov 20 12:37 .
drwxr-xr-x   5 root   root     77 Nov 20 12:38 mongo_backup_2021-11-20

日志轮换

阅读文档。确保设置配置正确。

更新

在更新之前,确保进行了适当的测试。首先阅读官方文档中的最新更改。

有一个单独的更新剧本,见playbooks/update.yml。设置正确的主机名,然后简单地运行剧本。

更新可以轻松完成补丁版本,例如从6.0.1更新到6.0.2。 由于每个版本都存在重大变化以及其他明显原因,这个角色不包括主要版本升级。

如果希望进行此操作,更新剧本中逻辑已就位以实际执行重大升级。

更新mongo时可以设置新变量。要更新:

mongo_state: latest

# 更新mongo时可以设置新变量
mongo_net:
  new_variable: true

在更新时,确保应用程序没有写入mongo。此外,确保提前创建了备份。

更新副本集

如果激活了副本集,更新后应维护集群的正常运行。根据文档,将执行以下步骤:

 - 验证集群健康,如果正常,则继续

 - 如果存在则关闭仲裁者上的mongo应用
 - 在仲裁者上更新mongo
 - 在仲裁者上放置配置
 - 启动仲裁者上的mongo

 - 等待集群健康正常

 - 在从节点上关闭mongo应用
 - 在从节点上更新mongo
 - 在从节点上放置配置
 - 启动从节点上的mongo

 - 等待集群健康正常

 - 对其余从节点重复此过程

 - 降级主节点
 - 在原主节点上更新mongo
 - 在原主节点上放置配置
 - 启动原主节点上的mongo

 - 等待集群健康正常

更新分片环境

正在开发中。

开发

  • 有一个重置剧本,用于删除所有mongo文件。这对于开发目的很有用,见tasks/reset.yml。此功能默认被注释掉。

扩展

仍在开发中... 我甚至不确定我是否会使用这个功能,因为目前在mongo 5.0中这甚至不可行。 使用Ansible配置扩展Mongo并不容易,因为方法并不直接。

目前我看到的步骤应如下:

  • 如果仲裁者在配置和系统中存在
    • 从集群中移除仲裁者
  • 添加新的从节点
  • 如果配置存在添加仲裁者

我尝试了无数次进行配置,但总是因系统错误而失败。目前我决定暂时不包括扩展功能。

示例剧本

- hosts:
    - mongo_primary
    - mongo_secondary
    - mongo_arbiter
  roles:
    - ansible_role_mongodb_ubuntu
  any_error_true: true
  vars:
    mongo_restart_config: true
    mongo_restart_seconds: 8
    mongo_thp: true
    mongo_numa: true
    mongo_replication:
      replSetName: replicaset1
    mongo_security:
      authorization: enabled
      keyFile: /etc/keyfile_mongo
    mongo_admin_pass: something
    mongo_adminuser_pass: something
    mongo_net:
      bindIp: 0.0.0.0
      port: 27017
    mongo_systemlog:
      destination: file
      logAppend: true
      path: /opt/somewhere/mongod.log
    mongo_storage:
      dbPath: /opt/mongo/
      journal:
        enabled: true
    mongo_user:
      - database: burgers
        name: bob
        password: 12345
        state: present
        update_password: on_create    
  pre_tasks:
    # 确保完成这个
    # - name: 确保主机能够通过主机名相互连接
    #   template:
    #     src: hosts.j2
    #     dest: /etc/hosts
关于项目

Ansible role to setup and configure MongoDB

安装
ansible-galaxy install csuka.mongodb_ubuntu
许可证
apache-2.0
下载
288
拥有者
Oui oui