MySQL ProxySQL routing lab 的核心責任是讓讀者看到 database proxy 如何把 application query 導向不同 hostgroup。這篇承接 ProxySQL Config。

本篇的範圍是在單節點 lab 上設定 ProxySQL 的 writer / reader hostgroup 與 query rule、從 routing stats 確認 query 落在哪個 hostgroup,並整理 stale read、transaction split 與 failover 等 proxy 風險的控制方式。

Hostgroup Model

Hostgroup model 的核心責任是把 backend 分成 writer 與 reader。

 1-- 在 ProxySQL 所在的機器上連 admin interface:mysql -u admin -padmin -h 127.0.0.1 -P 6032
 2-- hostgroup 10 是 writer、20 是 reader;單節點 lab 讓兩個 hostgroup 指向同一個 MySQL
 3-- hostname 填 ProxySQL 連得到的 MySQL 位址:與 local lab 同一個 compose 時是 service 名稱 mysql
 4INSERT INTO mysql_servers(hostgroup_id, hostname, port)
 5VALUES (10, 'mysql', 3306), (20, 'mysql', 3306);
 6-- application 用這組帳密連 ProxySQL,ProxySQL 也用它連 backend;沒命中任何 query rule 的 query 走 default_hostgroup
 7INSERT INTO mysql_users(username, password, default_hostgroup)
 8VALUES ('app_user', 'app_pw', 10);
 9LOAD MYSQL SERVERS TO RUNTIME;
10LOAD MYSQL USERS TO RUNTIME;

在單節點 lab 中,writer / reader 先指向同一 MySQL;正式環境應用 replica 作 reader,並搭配 replication lag guard。

Query Rule

Query rule 的核心責任是示範 routing policy。

1-- Conceptual ProxySQL admin commands. Adjust host / credential for your lab.
2INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply)
3VALUES
4  (10, 1, '^SELECT', 20, 1),
5  (20, 1, '.*', 10, 1);
6LOAD MYSQL QUERY RULES TO RUNTIME;
7SAVE MYSQL QUERY RULES TO DISK;

這個規則把 SELECT 導向 reader,其餘導向 writer。Production 要排除 SELECT ... FOR UPDATE、transaction、read-after-write 與 session state。

Routing Evidence

Routing evidence 的核心責任是確認 query 真的走到預期 hostgroup。先讓 application 的 query 經過 ProxySQL:連 ProxySQL 的 6033,而不是直連 MySQL。

1# 在 ProxySQL 所在的機器上連 6033(ProxySQL 的 application port)
2mysql -u app_user -papp_pw -h 127.0.0.1 -P 6033 appdb -e "SELECT COUNT(*) FROM accounts;"
3mysql -u app_user -papp_pw -h 127.0.0.1 -P 6033 appdb -e "SELECT id FROM accounts WHERE id = 1 FOR UPDATE;"
4mysql -u app_user -papp_pw -h 127.0.0.1 -P 6033 appdb \
5  -e "INSERT INTO ledger_entries(account_id, amount_cents, idempotency_key) VALUES (1, 5, 'proxy-1');"

再回 admin interface 查 stats:

1SELECT hostgroup, srv_host, Queries
2FROM stats_mysql_connection_pool;
3-- hostgroup 20 收到 2 個 query:兩句 SELECT,包含 FOR UPDATE 那一句
4-- hostgroup 10 收到 1 個 query:INSERT
5
6SELECT rule_id, hits
7FROM stats_mysql_query_rules
8ORDER BY rule_id;
9-- rule 10(^SELECT)hits 2、rule 20(.*)hits 1

SELECT ... FOR UPDATE 被 ^SELECT 導到 reader,就是上面 Query Rule 段要 production 排除它的原因。

Evidence 要和 application log 對齊。若某個 workflow 寫後立刻讀,routing rule 要保證它走 writer 或具備 freshness policy。

Failure Note

Failure note 的核心責任是記錄 proxy 常見風險。

風險控制方式
Stale readlag guard、read-after-write to writer
Transaction splittransaction pinning、query rule review
Bad regexquery digest / allowlist
Backend unhealthyhealth check、hostgroup failover
Credential driftProxySQL user sync / secret rotation

完成本篇後,完整設定讀 ProxySQL Config;replica 與 failover 讀 Replication Failover Lab。