MySQL 数据源
MySQL 数据源适合已经把用户、ACL、黑名单维护在关系型数据库中的场景。
适用场景
- 账号体系已经落在 MySQL,需要直接复用现有表;
- 认证、授权、黑名单需要统一从数据库治理;
- 希望通过 SQL 适配旧系统,而不是迁移到固定表结构。
核心能力
- 通过
query_user/query_acl/query_blacklist从 MySQL 同步数据; - 支持“按查询结果映射”,不强制固定表名;
- 鉴权热路径走内存缓存,MySQL 主要承担同步来源。
运行方式(简要)
- Broker 按配置执行查询,从 MySQL 拉取用户、ACL、黑名单数据;
- 数据写入本地缓存;
- CONNECT 鉴权时只比对内存缓存,不做每次实时查库。
配置说明
mysql_config 关键字段:
mysql_addr:MySQL 地址(如127.0.0.1:3306)database:数据库名username/password:连接凭证query_user:读取用户数据的 SQLquery_acl:读取 ACL 数据的 SQLquery_blacklist:读取黑名单数据的 SQL
使用说明
RobustMQ 会执行 query_user/query_acl/query_blacklist 并把结果映射到内部模型。
因此你可以对接已有表,不必强制使用固定表名。 建议显式使用 AS 并保证字段别名一致,不要使用 SELECT *。
query_user 字段约定
需返回以下 5 个字段(字段名一致,顺序不限):
username(String)password(String)salt(Option<String>)is_superuser(0/1)created(datetime 字符串)
query_acl 字段约定
需返回以下 6 个字段(字段名一致,顺序不限):
permission(0/1)ipaddr(String)username(String)clientid(String)access(0..5)topic(Option<String>)
query_blacklist 字段约定
需返回以下 4 个字段(字段名一致,顺序不限):
blacklist_type(String)resource_name(String)end_time(u64)desc(Option<String>)
示例
toml
[mqtt]
[[mqtt.auth]]
authn_type = "password_based"
[mqtt.auth.config.storage_config]
storage_type = "mysql"
[mqtt.auth.config.storage_config.mysql_config]
mysql_addr = "127.0.0.1:3306"
database = "mqtt"
username = "root"
password = "123456"
query_user = "SELECT username AS username, password AS password, salt AS salt, is_superuser AS is_superuser, created AS created FROM user_table"
query_acl = "SELECT permission AS permission, ipaddr AS ipaddr, username AS username, clientid AS clientid, access AS access, topic AS topic FROM acl_table"
query_blacklist = "SELECT blacklist_type AS blacklist_type, resource_name AS resource_name, end_time AS end_time, `desc` AS `desc` FROM blacklist_table"注意事项
- 查询结果字段名与类型必须匹配(推荐保持固定顺序便于维护);
- 建议给查询条件字段建立索引;
- 大规模场景建议用增量同步策略,避免频繁全量拉取。
