<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="drawio" version="30.3.14" agent="Codex drawio-skill">
  <diagram id="clone-map" name="01-角色模板安装与责任交接">
    <mxGraphModel dx="1800" dy="1200" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="p1-title" value="三全前厅：角色模板安装、客户应用与后调整" style="text;html=1;align=left;verticalAlign=middle;fontFamily=PingFang SC;fontSize=28;fontStyle=1;fontColor=#1f2937;" vertex="1" parent="1">
          <mxGeometry x="40" y="20" width="1100" height="50" as="geometry" />
        </mxCell>
        <mxCell id="p1-subtitle" value="Codex 安装、验证并封板五台 01 模板；客户技术应用模板并配置客机 IP/hostname；Codex 接管后调整软件身份、角色与高可用" style="text;html=1;align=left;verticalAlign=middle;fontFamily=PingFang SC;fontSize=15;fontColor=#4b5563;" vertex="1" parent="1">
          <mxGeometry x="40" y="70" width="1500" height="30" as="geometry" />
        </mxCell>

        <mxCell id="p1-golden" value="1  五类独立角色模板  |  每台只安装本角色" style="swimlane;startSize=46;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#f3f0ff;swimlaneFillColor=#ffffff;strokeColor=#7c6ab0;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#3f3663;" vertex="1" parent="1">
          <mxGeometry x="40" y="120" width="500" height="950" as="geometry" />
        </mxCell>
        <mxCell id="p1-golden-note" value="共同模板条件&#xa;openEuler 24.03 LTS-SP1 · 五台 01 均可出向公网&#xa;正式数据、生产凭据和在线集群状态不进模板" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c6ab0;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#3f3663;align=left;spacingLeft=12;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="65" width="460" height="90" as="geometry" />
        </mxCell>
        <mxCell id="p1-edge-stack" value="Nginx01 模板&#xa;Nginx1.26 · Keepalived2.3.4 · HAProxy2.8.26&#xa;Orchestrator3.2.6-22 · Sentinel 运行文件" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=13;fontStyle=1;fontColor=#6b3b00;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="180" width="215" height="105" as="geometry" />
        </mxCell>
        <mxCell id="p1-app-stack" value="App01 模板&#xa;Nginx1.26 · PHP7.3.33 / 7.4.33&#xa;Supervisor4.3 · Redis/MQTT 扩展" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=PingFang SC;fontSize=13;fontStyle=1;fontColor=#1f4e79;" vertex="1" parent="p1-golden">
          <mxGeometry x="265" y="180" width="215" height="105" as="geometry" />
        </mxCell>
        <mxCell id="p1-db-stack" value="MySQL01 模板&#xa;MySQL 5.6.51 :3306&#xa;MySQL 8.0.46 :3308" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;fillColor=#d5e8d4;strokeColor=#82b366;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#24552a;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="315" width="215" height="110" as="geometry" />
        </mxCell>
        <mxCell id="p1-redis-stack" value="Redis01 模板&#xa;Redis5.0.14 / Redis7.2.14 · 双 Sentinel&#xa;Orchestrator3.2.6-22 运行文件" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=13;fontStyle=1;fontColor=#665200;" vertex="1" parent="p1-golden">
          <mxGeometry x="265" y="315" width="215" height="110" as="geometry" />
        </mxCell>
        <mxCell id="p1-mq-stack" value="EMQX01 模板&#xa;EMQX Open Source 5.8.9&#xa;mosquitto_pub / sub" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#6b2623;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="455" width="215" height="105" as="geometry" />
        </mxCell>
        <mxCell id="p1-food-stack" value="资源 6 · Food01&#xa;本期前厅资源 1-5 范围外&#xa;发布包到位后另行编制方案" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;dashed=1;fillColor=#f5f5f5;strokeColor=#999999;fontFamily=PingFang SC;fontSize=13;fontStyle=1;fontColor=#555555;" vertex="1" parent="p1-golden">
          <mxGeometry x="265" y="455" width="215" height="105" as="geometry" />
        </mxCell>
        <mxCell id="p1-assets" value="每台模板各自保存本角色离线资产&#xa;/opt/zhct-deploy/packages · manifest · SHA256&#xa;安装 · 应用后调整 · 验证 · 回退脚本" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#333333;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="590" width="460" height="105" as="geometry" />
        </mxCell>
        <mxCell id="p1-guard" value="角色模板边界&#xa;不安装其他角色服务端软件 · 无正式业务数据&#xa;无生产凭据 · 无 VIP / 在线集群身份" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#6b2623;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="725" width="460" height="105" as="geometry" />
        </mxCell>
        <mxCell id="p1-source-final" value="实施输入：5 台 01 角色服务器 + 角色物料清单" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;fontFamily=PingFang SC;fontSize=15;fontStyle=1;fontColor=#24552a;" vertex="1" parent="p1-golden">
          <mxGeometry x="20" y="855" width="460" height="60" as="geometry" />
        </mxCell>

        <mxCell id="p1-process" value="2  责任交接与串行门禁" style="swimlane;startSize=46;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#fff7e6;swimlaneFillColor=#ffffff;strokeColor=#d79b00;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#6b3b00;" vertex="1" parent="1">
          <mxGeometry x="580" y="120" width="300" height="950" as="geometry" />
        </mxCell>
        <mxCell id="p1-step1" value="Codex：逐模板基线巡检&#xa;客机配置/状态备份" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="75" width="240" height="65" as="geometry" />
        </mxCell>
        <mxCell id="p1-step2" value="只下载并安装本角色软件&#xa;保留完整离线依赖" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="170" width="240" height="70" as="geometry" />
        </mxCell>
        <mxCell id="p1-step3" value="单机启动 + cache-only 验证" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="270" width="240" height="65" as="geometry" />
        </mxCell>
        <mxCell id="p1-step4" value="清理临时数据与在线身份&#xa;停止状态/消费/定时服务" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="365" width="240" height="70" as="geometry" />
        </mxCell>
        <mxCell id="p1-step5" value="Codex：单角色封板&#xa;输出模板与交接清单" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="465" width="240" height="65" as="geometry" />
        </mxCell>
        <mxCell id="p1-step6" value="客户技术：应用模板到同角色服务器&#xa;配置客机 IP/hostname · VM 网络/资源 · SSH" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="560" width="240" height="85" as="geometry" />
        </mxCell>
        <mxCell id="p1-activate" value="Codex：核验客机 IP/hostname，调整软件身份&#xa;验证软件 + 服务 + 端口 + 重启&#xa;写审计，发用户确认" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#24552a;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="680" width="240" height="100" as="geometry" />
        </mxCell>
        <mxCell id="p1-gate" value="门禁：前一台未 PASS 且未获用户确认，下一台保持锁定" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#6b2623;" vertex="1" parent="p1-process">
          <mxGeometry x="30" y="825" width="240" height="85" as="geometry" />
        </mxCell>

        <mxCell id="p1-targets" value="3  模板应用关系  |  运行态职责" style="swimlane;startSize=46;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#eef5ff;swimlaneFillColor=#ffffff;strokeColor=#4f78a8;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#1f4e79;" vertex="1" parent="1">
          <mxGeometry x="920" y="120" width="920" height="950" as="geometry" />
        </mxCell>
        <mxCell id="p1-dispatch" value="Nginx01→02 · App01→02 · MySQL01→02 · Redis01→02 · EMQX01→02/03（Food01 本期范围外）" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=PingFang SC;fontSize=15;fontStyle=1;fontColor=#4e2f5b;" vertex="1" parent="p1-targets">
          <mxGeometry x="30" y="65" width="860" height="60" as="geometry" />
        </mxCell>
        <mxCell id="p1-role-edge" value="入口 / 代理  |  2 台&#xa;Nginx01 · Nginx02&#xa;&#xa;启动：Nginx · Keepalived · HAProxy · Orchestrator&#xa;Nginx02 额外启动 Sentinel5 / Sentinel7" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;align=left;spacingLeft=14;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#6b3b00;" vertex="1" parent="p1-targets">
          <mxGeometry x="30" y="155" width="415" height="190" as="geometry" />
        </mxCell>
        <mxCell id="p1-role-app" value="应用  |  2 台&#xa;App01 · App02&#xa;&#xa;HTTP / Redis / MQTT / aizhcttime 双机&#xa;临时：cron · 备份 · 文件仅 App01&#xa;目标：共享文件 · 单例任务 Redis 租约" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;align=left;spacingLeft=14;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#1f4e79;" vertex="1" parent="p1-targets">
          <mxGeometry x="475" y="155" width="415" height="190" as="geometry" />
        </mxCell>
        <mxCell id="p1-role-db" value="数据库  |  2 台&#xa;MySQL01 · MySQL02&#xa;&#xa;MySQL5.6.51 :3306 · MySQL8.0.46 :3308&#xa;主从 + Orchestrator 自动提升 + 代理 fencing" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;align=left;spacingLeft=14;fillColor=#d5e8d4;strokeColor=#82b366;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#24552a;" vertex="1" parent="p1-targets">
          <mxGeometry x="30" y="375" width="415" height="190" as="geometry" />
        </mxCell>
        <mxCell id="p1-role-redis" value="缓存  |  2 台&#xa;Redis01 · Redis02&#xa;&#xa;Redis5.0.14 · Redis7.2.14 · 双 Sentinel&#xa;应用固定经 db-proxy-vip 访问当前主节点" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;align=left;spacingLeft=14;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#665200;" vertex="1" parent="p1-targets">
          <mxGeometry x="475" y="375" width="415" height="190" as="geometry" />
        </mxCell>
        <mxCell id="p1-role-mq" value="MQTT  |  3 台&#xa;EMQX01 · EMQX02 · EMQX03&#xa;&#xa;EMQX Open Source 5.8.9 · 三 Core 节点&#xa;匿名兼容模式仅开放业务/设备网" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;align=left;spacingLeft=14;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#6b2623;" vertex="1" parent="p1-targets">
          <mxGeometry x="30" y="595" width="415" height="190" as="geometry" />
        </mxCell>
        <mxCell id="p1-role-food" value="范围说明&#xa;资源 6 · Food01&#xa;&#xa;不属于本期前厅资源 1-5 部署闭环&#xa;发布包到位后另行确认运行时、入口和验收" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;align=left;spacingLeft=14;dashed=1;fillColor=#f5f5f5;strokeColor=#999999;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#555555;" vertex="1" parent="p1-targets">
          <mxGeometry x="475" y="595" width="415" height="190" as="geometry" />
        </mxCell>
        <mxCell id="p1-runtime-rule" value="共同验收：模板来源可追溯；仅安装本角色软件；应启动服务 active；无跨角色进程和端口；目标机身份唯一；重启后结果不变" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;fontColor=#333333;" vertex="1" parent="p1-targets">
          <mxGeometry x="30" y="820" width="860" height="90" as="geometry" />
        </mxCell>

        <mxCell id="p1-edge-source-process" value="逐角色安装" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#7c6ab0;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p1-source-final" target="p1-step1">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="p1-edge-step12" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#a16207;strokeWidth=2;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p1-step1" target="p1-step2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p1-edge-step23" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#a16207;strokeWidth=2;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p1-step2" target="p1-step3"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p1-edge-step34" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#a16207;strokeWidth=2;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p1-step3" target="p1-step4"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p1-edge-step45" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#a16207;strokeWidth=2;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p1-step4" target="p1-step5"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p1-edge-step56" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#a16207;strokeWidth=2;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p1-step5" target="p1-step6"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p1-edge-step6activate" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#a16207;strokeWidth=2;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p1-step6" target="p1-activate"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p1-edge-activate-dispatch" value="目标机验收" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#4f78a8;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p1-activate" target="p1-dispatch"><mxGeometry relative="1" as="geometry" /></mxCell>
      </root>
    </mxGraphModel>
  </diagram>

  <diagram id="runtime-ha" name="02-运行态高可用拓扑">
    <mxGraphModel dx="1800" dy="1500" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1500" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="p2-title" value="三全前厅：运行态高可用服务拓扑" style="text;html=1;align=left;verticalAlign=middle;fontFamily=PingFang SC;fontSize=28;fontStyle=1;fontColor=#1f2937;" vertex="1" parent="1"><mxGeometry x="50" y="20" width="1000" height="50" as="geometry" /></mxCell>
        <mxCell id="p2-subtitle" value="三个 VIP 由入口双节点承载；应用、数据库、缓存和 MQTT 分别独立高可用，控制面采用三投票节点" style="text;html=1;align=left;verticalAlign=middle;fontFamily=PingFang SC;fontSize=15;fontColor=#4b5563;" vertex="1" parent="1"><mxGeometry x="50" y="70" width="1500" height="30" as="geometry" /></mxCell>

        <mxCell id="p2-browser" value="浏览器 / 前厅终端" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=PingFang SC;fontSize=15;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="160" y="120" width="300" height="70" as="geometry" /></mxCell>
        <mxCell id="p2-device" value="设备 / MQTT 客户端" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=15;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="810" y="120" width="300" height="70" as="geometry" /></mxCell>
        <mxCell id="p2-admin" value="VPN / 堡垒机 / 管理网" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;dashed=1;fillColor=#f5f5f5;strokeColor=#666666;fontFamily=PingFang SC;fontSize=15;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="1460" y="120" width="300" height="70" as="geometry" /></mxCell>

        <mxCell id="p2-entry" value="入口与代理层  |  Nginx 双节点" style="swimlane;startSize=44;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#fff7e6;swimlaneFillColor=#ffffff;strokeColor=#d79b00;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#6b3b00;" vertex="1" parent="1"><mxGeometry x="80" y="240" width="1760" height="330" as="geometry" /></mxCell>
        <mxCell id="p2-front-vip" value="front-vip&#xa;10.2.203.115 :8081" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-entry"><mxGeometry x="70" y="65" width="430" height="70" as="geometry" /></mxCell>
        <mxCell id="p2-mqtt-vip" value="mqtt-vip&#xa;10.2.203.116 :1883 / 8083" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-entry"><mxGeometry x="665" y="65" width="430" height="70" as="geometry" /></mxCell>
        <mxCell id="p2-db-vip" value="db-proxy-vip&#xa;10.2.203.117&#xa;MySQL :3306 / 3308 · Redis :6379 / 6387" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;strokeWidth=2;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-entry"><mxGeometry x="1260" y="55" width="430" height="90" as="geometry" /></mxCell>
        <mxCell id="p2-nginx1" value="Nginx01 · 10.2.203.102&#xa;Nginx + Keepalived + HAProxy&#xa;Orchestrator-1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-entry"><mxGeometry x="310" y="180" width="500" height="100" as="geometry" /></mxCell>
        <mxCell id="p2-nginx2" value="Nginx02 · 10.2.203.103&#xa;Nginx + Keepalived + HAProxy&#xa;Orchestrator-2 + Sentinel5/7-3" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-entry"><mxGeometry x="950" y="180" width="500" height="100" as="geometry" /></mxCell>
        <mxCell id="p2-vip-ownership" value="三个 VIP 均由两台入口节点的独立 Keepalived 实例承载；分别健康检查、分别漂移" style="text;html=1;align=center;verticalAlign=middle;fontFamily=PingFang SC;fontSize=13;fontStyle=1;fontColor=#6b3b00;" vertex="1" parent="p2-entry"><mxGeometry x="500" y="145" width="760" height="25" as="geometry" /></mxCell>

        <mxCell id="p2-app" value="应用层  |  双节点" style="swimlane;startSize=44;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#eef5ff;swimlaneFillColor=#ffffff;strokeColor=#6c8ebf;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#1f4e79;" vertex="1" parent="1"><mxGeometry x="80" y="640" width="800" height="300" as="geometry" /></mxCell>
        <mxCell id="p2-app1" value="App01 · 10.2.203.104&#xa;HTTP / Redis / MQTT worker 双活&#xa;临时：cron · 备份 · 本地文件主节点&#xa;目标：共享文件 · 单例任务竞争租约" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-app"><mxGeometry x="40" y="75" width="340" height="110" as="geometry" /></mxCell>
        <mxCell id="p2-app2" value="App02 · 10.2.203.105&#xa;HTTP / Redis / MQTT / aizhcttime 双机&#xa;临时：无 cron/备份/文件写入&#xa;目标：共享文件 · 单例任务竞争租约" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-app"><mxGeometry x="420" y="75" width="340" height="110" as="geometry" /></mxCell>
        <mxCell id="p2-food" value="临时基线：App01 故障时文件与单例任务降级；完整高可用：共享存储与 Redis 原子租约验证前保持阻塞" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=13;fontStyle=1;" vertex="1" parent="p2-app"><mxGeometry x="130" y="215" width="540" height="60" as="geometry" /></mxCell>

        <mxCell id="p2-emqx" value="MQTT 服务层  |  EMQX Open Source 5.8.9 · 三 Core 节点" style="swimlane;startSize=44;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#fff0ef;swimlaneFillColor=#ffffff;strokeColor=#b85450;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#6b2623;" vertex="1" parent="1"><mxGeometry x="940" y="640" width="900" height="300" as="geometry" /></mxCell>
        <mxCell id="p2-emqx1" value="EMQX01&#xa;10.2.203.108" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-emqx"><mxGeometry x="40" y="90" width="240" height="90" as="geometry" /></mxCell>
        <mxCell id="p2-emqx2" value="EMQX02&#xa;10.2.203.109" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-emqx"><mxGeometry x="330" y="90" width="240" height="90" as="geometry" /></mxCell>
        <mxCell id="p2-emqx3" value="EMQX03&#xa;10.2.203.110" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-emqx"><mxGeometry x="620" y="90" width="240" height="90" as="geometry" /></mxCell>
        <mxCell id="p2-emqx-rule" value="node.name 唯一 · cookie 一致 · 匿名兼容模式仅业务网 · Dashboard 仅管理网 · 客户端断线重连" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontFamily=PingFang SC;fontSize=13;" vertex="1" parent="p2-emqx"><mxGeometry x="80" y="215" width="740" height="50" as="geometry" /></mxCell>

        <mxCell id="p2-data" value="数据与控制层" style="swimlane;startSize=44;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#f3faf3;swimlaneFillColor=#ffffff;strokeColor=#82b366;strokeWidth=2;fontFamily=PingFang SC;fontSize=17;fontStyle=1;fontColor=#24552a;" vertex="1" parent="1"><mxGeometry x="80" y="1010" width="1760" height="390" as="geometry" /></mxCell>
        <mxCell id="p2-mysql-group" value="MySQL 双版本主从 + 自动提升" style="swimlane;startSize=38;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#eaf6e8;swimlaneFillColor=#ffffff;strokeColor=#82b366;fontFamily=PingFang SC;fontSize=15;fontStyle=1;fontColor=#24552a;" vertex="1" parent="p2-data"><mxGeometry x="40" y="65" width="760" height="270" as="geometry" /></mxCell>
        <mxCell id="p2-mysql1" value="MySQL01 · 初始主&#xa;10.2.208.106&#xa;5.6.51 :3306 · 8.0.46 :3308" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;fillColor=#d5e8d4;strokeColor=#82b366;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-mysql-group"><mxGeometry x="60" y="70" width="270" height="120" as="geometry" /></mxCell>
        <mxCell id="p2-mysql2" value="MySQL02 · 初始从&#xa;10.2.208.107&#xa;5.6.51 :3306 · 8.0.46 :3308" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;fillColor=#d5e8d4;strokeColor=#82b366;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-mysql-group"><mxGeometry x="430" y="70" width="270" height="120" as="geometry" /></mxCell>
        <mxCell id="p2-mysql-control" value="Orchestrator Raft：Nginx01 + Nginx02 + Redis01&#xa;仅 VIP 接入 · HAProxy 主库标记/关闭旧会话 · 旧主可达时只读或停库" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=12;fontStyle=1;" vertex="1" parent="p2-mysql-group"><mxGeometry x="60" y="205" width="640" height="55" as="geometry" /></mxCell>

        <mxCell id="p2-redis-group" value="Redis5.0.14 / Redis7.2.14 主从 + 三 Sentinel" style="swimlane;startSize=38;horizontal=1;rounded=0;html=1;whiteSpace=wrap;container=1;collapsible=0;pointerEvents=0;fillColor=#fff9e6;swimlaneFillColor=#ffffff;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=15;fontStyle=1;fontColor=#665200;" vertex="1" parent="p2-data"><mxGeometry x="900" y="65" width="820" height="270" as="geometry" /></mxCell>
        <mxCell id="p2-redis1" value="Redis01 · 初始主&#xa;10.2.203.112&#xa;Redis5 :6379 · Redis7 :6387&#xa;Sentinel5/7-1 + Orchestrator-3" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-redis-group"><mxGeometry x="40" y="65" width="300" height="130" as="geometry" /></mxCell>
        <mxCell id="p2-redis2" value="Redis02 · 初始从&#xa;10.2.203.113&#xa;Redis5 :6379 · Redis7 :6387&#xa;Sentinel5/7-2" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=PingFang SC;fontSize=14;fontStyle=1;" vertex="1" parent="p2-redis-group"><mxGeometry x="480" y="65" width="300" height="130" as="geometry" /></mxCell>
        <mxCell id="p2-redis-control" value="第三 Sentinel：Nginx02 · Redis5 :26379 · Redis7 :26387&#xa;应用固定经 db-proxy-vip :6379 / :6387 代理当前 master" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;fontFamily=PingFang SC;fontSize=13;fontStyle=1;" vertex="1" parent="p2-redis-group"><mxGeometry x="80" y="205" width="660" height="55" as="geometry" /></mxCell>

        <mxCell id="p2-edge-browser-front" value="HTTP :8081" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#6c8ebf;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p2-browser" target="p2-front-vip"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-device-mqtt" value="MQTT / WebSocket" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#b85450;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p2-device" target="p2-mqtt-vip"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-admin-entry" value="SSH / 管理" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=blockThin;endFill=1;strokeColor=#666666;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.5;exitY=1;entryX=0.9;entryY=0;" edge="1" parent="1" source="p2-admin" target="p2-entry"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-front-app" value="Nginx upstream :8081" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#6c8ebf;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.3;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p2-entry" target="p2-app"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-mqtt-emqx" value="HAProxy TCP / WebSocket" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#b85450;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.7;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p2-entry" target="p2-emqx"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-db-mysql" value="HAProxy 仅转发当前可写主库" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#82b366;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.85;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="p2-db-vip" target="p2-mysql-group"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1880" y="600" /><mxPoint x="1880" y="980" /><mxPoint x="500" y="980" /></Array></mxGeometry></mxCell>
        <mxCell id="p2-edge-app-redis" value="经 db-proxy-vip 访问当前主节点" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=blockThin;endFill=1;strokeColor=#d6b656;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=0.75;exitY=1;entryX=0.25;entryY=0;" edge="1" parent="1" source="p2-app" target="p2-redis-group"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="700" y="980" /><mxPoint x="1180" y="980" /></Array></mxGeometry></mxCell>
        <mxCell id="p2-edge-app-mqtt" value="发布 / 订阅；唯一 clientId" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=blockThin;endFill=1;strokeColor=#b85450;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=12;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p2-app" target="p2-emqx"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-mysql-repl" value="5.6 / 8.0 独立复制" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=blockThin;startFill=1;endArrow=blockThin;endFill=1;strokeColor=#82b366;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=11;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p2-mysql1" target="p2-mysql2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-redis-repl" value="Redis5 / Redis7 独立复制" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=blockThin;startFill=1;endArrow=blockThin;endFill=1;strokeColor=#d6b656;strokeWidth=2;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=11;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p2-redis1" target="p2-redis2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-emqx12" value="cluster" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=blockThin;startFill=1;endArrow=blockThin;endFill=1;strokeColor=#b85450;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=11;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p2-emqx1" target="p2-emqx2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="p2-edge-emqx23" value="cluster" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;startArrow=blockThin;startFill=1;endArrow=blockThin;endFill=1;strokeColor=#b85450;labelBackgroundColor=#ffffff;fontFamily=PingFang SC;fontSize=11;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="p2-emqx2" target="p2-emqx3"><mxGeometry relative="1" as="geometry" /></mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
