MySQL 8.0.19支持DNS SRV

本文轉載自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客戶端必須鏈接優先級值最低的可達地址,若優先級相同,權重值越大的訪問機率越高。架構

  • Connector/NET 
  • Connector/ODBC 
  • Connector/J 
  • Connector/Node.js
  • Connector/Python 
  • Connector/C++

咱們來演示下應用是如何使用DNS SRV的,這裏使用consul作服務發現。負載均衡

  1. consul agent與MySQL Router部署在相同節點,檢查服務活性,並向consul server 註冊服務信息。
  2. 應用端的Connector配置了服務地址,訪問DB時先向consul server發起DNS SRV服務請求。
  3. consul server回覆應用端 MySQL Router的服務地址和端口,應用端再去訪問MySQL Router。

我在本機作了測試。 測試

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 日誌中能夠看到請求以負載均衡方式發送到兩邊。

相關文章
相關標籤/搜索