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.yml
和tasks/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
授权
根据设计,创建了三个用户:admin
、backup
和adminuser
。
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