本文轉載自mysqlplayer,做者洪斌
MySQL Router是InnoDB Cluster架構的訪問入口,在架構部署上,官方給出的建議是router與應用端綁定部署,避免router單點問題。python
以前還有客戶諮詢,可否router不與應用端綁定部署,不便於部署,在此以前都須要在router前面加VIP或者一層負載均衡。mysql
我還在想這事兒就應該由MySQL Connector來實現訪問鏈路的Failover和Loadbalance, 如今有了DNS SRV的支持,router沒必要和應用端綁定部署,也能夠省了VIP和負載均衡,MySQL InnoDB Cluster方案更加完善,配合consul等服務發現組件,更容易適配service mesh架構。 sql
DNS SRV是DNS記錄的一種,用來指定服務地址。SRV記錄不只有服務目標地址,還有服務的端口,而且能夠設置每一個服務地址的優先級和權重。shell
MySQL Connector 8.0.19 覆蓋多種語言支持DNS SRV,包括經典協議和X協議。遵循RFC 2782實現,支持Priority和Weight客戶端必須鏈接優先級值最低的可達地址,若優先級相同,權重值越大的訪問機率越高。架構
咱們來演示下應用是如何使用DNS SRV的,這裏使用consul作服務發現。負載均衡
我在本機作了測試。 測試
1. 首先使用mysql shell建立一組InnoDB Cluster集羣spa
for i in `seq 4000 4002`; do
2. 部署兩個mysql router做爲訪問代理代理
for i in 6446 6556; do
3. 安裝 consul用做服務註冊和DNS解析,在測試環境咱們使用開發模式,只部署一個consul節點,若用在生產環境須要部署多個agent和server日誌
echo "Install consul..."
4. 在consul中註冊兩個router代理服務
echo "Services register..."
5. 測試下DNS SRV是否能正常解析,SRV記錄的應答返回服務端口和服務地址,服務地址有對應的A記錄,是127.0.0.1地址。
echo "Test dns srv..."
6. consul的DNS服務端口是8600 ,須要在本機設置DNS 轉發,將應用對consul服務的DNS請求轉發到consul的端口,這裏我使用dnsmasq作本地轉發,對於生產環境可以使用BIND服務。
echo "Install dnsmasq..."
7. DNS轉發設置完成後,不指定DNS端口,測試轉發是否依然正常解析SRV記錄。
echo "Test dns forwarding..."
8. 安裝 python connector
pip install mysql-connector-python
9. 在設置connector鏈接參數是注意host填寫在consul註冊的服務地址,並加上dns_srv參數,不須要指定端口。
import mysql.connector
從MySQL Router 日誌中能夠看到請求以負載均衡方式發送到兩邊。