端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV
作者:洪斌
MySQL Router 是 InnoDB Cluster 架構的訪問入口,在架構部署上,官方給出的建議是 router 與應用端綁定部署,避免 router 單點問題。
之前還有客戶咨詢,能否 router 不與應用端綁定部署,不便于部署,在此之前都需要在 router 前面加 VIP 或者一層負載均衡。
我還在想這事兒就應該由 MySQL Connector 來實現訪問鏈路的 Failover 和 Loadbalance,現在有了 DNS SRV 的支持,router 不必和應用端綁定部署,也可以省了 VIP 和負載均衡,MySQL InnoDB Cluster 方案更加完善,配合 consul 等服務發現組件,更容易適配 service mesh 架構。
DNS SRV 是 DNS 記錄的一種,用來指定服務地址。SRV 記錄不僅有服務目標地址,還有服務的端口,并且可以設置每個服務地址的優先級和權重。
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 集群
for i in `seq 4000 4002`; doecho "Deploy mysql sandbox $i"mysqlsh -- dba deploy-sandbox-instance $i --password=root doneecho "Create innodb cluster..." mysqlsh root@localhost:4000 -- dba create-cluster cluster01 mysqlsh root@localhost:4000 -- cluster add-instance --recoveryMethod=clone --password=root root@localhost:4001 mysqlsh root@localhost:4000 -- cluster add-instance --recoveryMethod=clone --password=root root@localhost:40022. 部署兩個 mysql router 作為訪問代理
for i in 6446 6556; doecho "Bootstrap router $i"mysqlrouter --bootstrap root@localhost:4000 --conf-use-gr-notifications -d router_$i --conf-base-port $i --name router_$ised -i 's/level = INFO/level = DEBUG/g router_$i/mysqlrouter.confsh router_$i/stop.shsh router_$i/start.sh done3. 安裝 consul 用作服務注冊和 DNS 解析,在測試環境我們使用開發模式,只部署一個 consul 節點,若用在生產環境需要部署多個 agent 和 server
echo "Install consul..." brew install consul consul agent -dev &4. 在 consul 中注冊兩個 router 代理服務
echo "Services register..." consul services register -name router -id router1 -port 6446 -tag rw consul services register -name router -id router2 -port 6556 -tag rw5. 測試下 DNS SRV 是否能正常解析,SRV 記錄的應答返回服務端口和服務地址,服務地址有對應的 A 記錄,是 127.0.0.1 地址。
echo "Test dns srv..." dig router.service.consul SRV -p 8600 ;; QUESTION SECTION: ;router.service.consul. IN SRV;; ANSWER SECTION: router.service.consul. 0 IN SRV 1 1 6556 MBP.node.dc1.consul. router.service.consul. 0 IN SRV 1 1 6446 MBP.node.dc1.consul.;; ADDITIONAL SECTION: MBP.node.dc1.consul. 0 IN A 127.0.0.1 MBP.node.dc1.consul. 0 IN TXT "consul-network-segment=" MBP.node.dc1.consul. 0 IN A 127.0.0.1 MBP.node.dc1.consul. 0 IN TXT "consul-network-segment="6. consul 的 DNS 服務端口是 8600,需要在本機設置 DNS 轉發,將應用對 consul 服務的 DNS 請求轉發到 consul 的端口,這里我使用 dnsmasq 做本地轉發,對于生產環境可使用 BIND 服務。
echo "Install dnsmasq..." brew install dnsmasq echo 'server=/consul/127.0.0.1#8600' > /usr/local/etc/dnsmasq.d/consul sudo brew services restart dnsmasq7. DNS 轉發設置完成后,不指定 DNS 端口,測試轉發是否依然正常解析 SRV 記錄。
echo "Test dns forwarding..." dig router.service.consul SRV8. 安裝 python connector
pip install mysql-connector-python9. 在設置 connector 連接參數是注意 host 填寫在 consul 注冊的服務地址,并加上 dns_srv 參數,不需要指定端口。
import mysql.connector cnx = mysql.connector.connect(user='root', password='root', database='mysql_innodb_cluster_metadata', host='router.service.consul', dns_srv=True) cursor = cnx.cursor() query = ("select instance_id from v2_this_instance") cursor.execute(query) for (instance_id) in cursor:print("instance id: {}".format(instance_id)) cursor.close() cnx.close()從 MySQL Router 日志中可以看到請求以負載均衡方式發送到兩邊。
總結
以上是生活随笔為你收集整理的端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hashmap为什么用红黑树_要看Has
- 下一篇: 埋线多少钱啊啊?