LMDB_TABLE(5) LMDB_TABLE(5)
名称
lmdb_table - Postfix LMDB 适配器
概述
postmap lmdb:/etc/postfix/文件名
postmap -i lmdb:/etc/postfix/文件名 <输入文件
postmap -d "键名" lmdb:/etc/postfix/文件名
postmap -d - lmdb:/etc/postfix/文件名 <输入文件
postmap -q "键名" lmdb:/etc/postfix/文件名
postmap -q - lmdb:/etc/postfix/文件名 <输入文件
描述
Postfix LMDB 适配器提供了对持久化、内存映射的键值存储的访问能力。
数据库大小仅受内存地址空间限制(32位CPU通常为31位,64位CPU通常为47位)
以及可用文件系统空间限制。
请求处理
LMDB 适配器支持所有 Postfix 查找表操作,使其适用于:
- 地址重写
- 邮件路由
- 访问控制策略
- 缓存系统
- 任何可通过固定键值存储的信息
当事务因数据库空间不足失败时,Postfix 会自动调整数据库大小并重试。
Postfix 表查询可能使用部分匹配键,例如:
- 缺少子域的域名
- 缺少低位字节的网络地址
- 缺少本地部分/域名扩展的邮件地址
此行为与 btree:、hash: 或 ldap: 等表类型一致。
修改 LMDB 数据库后:
- 不会触发自动服务重启
- 无需执行 postfix reload 命令
可靠性
LMDB 采用写时复制架构:
- 优点:确保更新操作的安全性
- 缺点:相比其他平面文件数据库占用更多空间
性能优化:
- 读操作:采用内存映射加速访问
- 写操作:禁用内存映射,防止因指针错误导致静默数据损坏
多进程支持:
- 无需通过 proxymap(8) 服务序列化请求
- 适合作为 verify(8) 和 postscreen(8) 的共享缓存
同步机制
Postfix LMDB 适配器采用特殊的锁机制设计:
安全模型:
- 禁用 LMDB 原生锁协议(需全局可写锁文件,违反安全原则)
- 改用 fcntl(2) 文件锁(基于整个数据库文件)
注意事项:
1. 所有读写事务必须全程保持:
- 共享锁(读操作)
- 独占锁(写操作)
2. 允许锁降级:
- 写事务开始前必须持独占锁
- 可降级为共享锁后开启读事务
3. 进程内保护:
- fcntl(2) 锁不隔离同进程内的并发事务
- 需额外使用进程内互斥锁
配置参数
配置加载策略:
- 短期进程:自动加载 main.cf 变更
- 长期进程:需执行 postfix reload 生效
核心参数:
lmdb_map_size (默认值:16777216)
OpenLDAP LMDB 数据库初始大小限制(单位:字节)
相关文档
命令手册:
- postconf(1):Postfix 支持的查找表类型
- postmap(1):查找表维护工具
- postconf(5):配置参数详解
指南文档:
- DATABASE_README:查找表技术概览
- LMDB_README:OpenLDAP LMDB 专项指南
授权协议
本软件需遵循 Secure Mailer 许可证条款分发。
历史版本
LMDB 支持始于 Postfix 2.11 版本
作者信息
Howard Chu
Symas 公司
Wietse Venema
IBM T.J. Watson 研究院
美国纽约州约克敦高地
704号信箱(邮编:10598)
Wietse Venema
Google 公司
美国纽约州纽约市
第八大道111号(邮编:10011)
LMDB_TABLE(5)