问题:不可见的拓扑结构
您有 40 个 MariaDB / MySQL 实例。其中一些使用主从复制,另一些运行主主复制。一个 5 节点的 Galera 集群。两个对等连接的 ProxySQL 实例。一个用于读路由的 MaxScale。用于跨数据中心访问的 SSH 隧道。隐藏真实 IP 的 DNS 别名。
一个简单的问题:您能在 5 分钟内画出完整的架构图吗?
在大多数组织中,答案是否定的。拓扑结构存在于过时的 Wiki 页面中、一个无人更新的 Confluence 页面里,或者存储在正在度假的资深 DBA 的大脑中。
Dot3 解决了这个问题。
什么是 Dot3?
Dot3 是 PmaControl 内置的拓扑映射引擎。它使用 Graphviz(DOT 语言)来生成数据库架构的可视化表示。
"Dot3"这个名字来源于该引擎的第三次迭代。前两个版本使用了简单的方法(连接列表、静态树)。Dot3 引入了动态端点解析和上下文渲染。
端点解析
Dot3 的第一步是理解 PmaControl 中配置的每个端点背后隐藏着什么。一个端点可以是:
1. 直接 MariaDB / MySQL 连接
最简单的情况。Dot3 连接到 3306 端口(或其他端口),运行 SHOW VARIABLES 和 SHOW SLAVE STATUS / SHOW REPLICA STATUS,并识别服务器角色(主库、从库、独立实例)。
2. ProxySQL
Dot3 通过检测管理端口(默认 6032)来识别 ProxySQL。通过连接管理端口,它获取:
runtime_mysql_servers:后端列表及其主机组runtime_mysql_replication_hostgroups:写入器/读取器映射proxysql_servers:ProxySQL 对等节点(用于集群)
这使得可以追踪 ProxySQL 与其后端之间的链接,以及 ProxySQL 对等节点之间的链接。
3. MaxScale
MaxScale 通过其 REST API(端口 8989)检测。Dot3 查询 /v1/servers 和 /v1/services 来重建后端拓扑和路由服务。
4. VIP 和浮动地址
当端点是 VIP(由 keepalived 或 Pacemaker 管理的虚拟 IP)时,Dot3 将地址解析到活跃的物理服务器。VIP 在图中以具有不同视觉样式的中间节点表示(菱形而非矩形)。
5. SSH 隧道
对于使用 SSH 隧道的多数据中心架构,Dot3 追踪完整路径:客户端 -> SSH 隧道 -> 真实端点。隧道在图中显示为虚线连接。
6. DNS 别名
Dot3 解析 DNS 别名(CNAME),并同时显示别名和真实主机名,避免同一服务器被多个名称引用时产生混淆。
渲染
一旦所有端点被解析,Dot3 生成一个 DOT 图,由 Graphviz 编译为 SVG(或 PNG)。以下是不同拓扑结构的表示方式。
主从复制
Master [shape=box, color=blue, label="db-master\n10.0.1.10:3306"]
Slave1 [shape=box, color=green, label="db-slave1\n10.0.1.11:3306"]
Slave2 [shape=box, color=green, label="db-slave2\n10.0.1.12:3306"]
Master -> Slave1 [label="repl"]
Master -> Slave2 [label="repl"]
复制箭头从主库指向从库(数据流方向)。当延迟较大时,延迟值显示在边上。
主主复制
双向复制用双箭头表示。当两台服务器通过 SHOW SLAVE STATUS 互相将对方识别为主库时,Dot3 检测到这种情况。
Master1 -> Master2 [dir=both, label="M-M"]
Galera 集群
Galera 节点被分组在一个带有虚线边框的子图中。每个节点根据其 wsrep 状态着色:
- 已同步(Synced):绿色
- 捐赠者/已去同步(Donor/Desynced):橙色
- 加入中(Joining):黄色
- 已断开连接(Disconnected):红色
subgraph cluster_galera_prod {
label="Galera Prod (3 nodes)"
style=dashed
galera1 [color=green]
galera2 [color=green]
galera3 [color=green]
}
ProxySQL 对等连接
ProxySQL 对等节点之间的链接用双向虚线箭头绘制,在视觉上与 MariaDB / MySQL 复制链接区分开来。
SVG 中的 PNG 图标问题
在 Dot3 开发过程中,我们希望集成图标来直观地标识节点类型:MariaDB 图标、ProxySQL 图标、MaxScale 图标。
第一版实现使用了嵌入在 SVG 中的 PNG 图标,通过 <image> 标签配合 base64 href。这在浏览器中可以正常工作,但产生了几个问题:
- Graphviz 不能正确支持在其 SVG 输出中嵌入 PNG——位置会发生偏移
- 在 Retina/HiDPI 屏幕上渲染模糊
- 由于 base64 编码,SVG 文件体积急剧膨胀
解决方案:用原生 SVG 图标替换所有 PNG 图标。我们用纯矢量 SVG 重新创建了 proxysql.svg、maxscale.svg 等图标。效果:
- 任何分辨率下都清晰锐利
- 在 Graphviz 中位置准确
- 文件大小减少了 5 倍
具体示例
以下是 Dot3 为一个电商客户生成的真实(已匿名化)拓扑:
ProxySQL-1 <-> ProxySQL-2 (对等连接)
| |
[HG10: Writer] [HG20: Readers]
| |
Master --> Slave-1 (复制)
| Slave-2
| Slave-3
|
+---------------------+
| Galera Cluster |
| Node-1 Node-2 | (集群)
| Node-3 |
+---------------------+
这张图表是由 Dot3 自动生成的。无需手动配置布局。Dot3 发现拓扑、解析端点,Graphviz 处理布局。
在 PmaControl 中的集成
在 PmaControl 界面中,拓扑图通过拓扑选项卡访问。它自动刷新并反映实时状态:
- 存在复制延迟的从库显示为红色边
- 处于
Donor状态的 Galera 节点会变色 - 丢失后端的 ProxySQL 将其显示为灰色
生成的 SVG 是交互式的:点击节点会打开 PmaControl 中的服务器详情页面。
局限性和计划改进
Dot3 在 1 到 100 个节点的拓扑中运行良好。超过这个规模,Graphviz 的布局可能会变得混乱。计划的改进包括:
- 标签过滤:仅显示拓扑的子集(按环境、客户或数据中心)
- 差异模式:比较两个拓扑快照以可视化变更
- Terraform 导出:生成发现的拓扑的基础设施即代码描述
总结
MariaDB / MySQL 基础架构的拓扑结构不应该是记录在过期 Wiki 中的谜团。Dot3 自动发现、解析并绘制拓扑。
这就是"我认为复制连接到那台服务器"和"我看到复制连接到那台服务器,延迟 3 秒,已持续 14 天"之间的区别。
评论 (0)
暂无评论。
发表评论