端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV
作者:洪斌
MySQL Router 是 InnoDB Cluster 架構(gòu)的訪問入口,在架構(gòu)部署上,官方給出的建議是 router 與應(yīng)用端綁定部署,避免 router 單點(diǎn)問題。
之前還有客戶咨詢,能否 router 不與應(yīng)用端綁定部署,不便于部署,在此之前都需要在 router 前面加 VIP 或者一層負(fù)載均衡。
我還在想這事兒就應(yīng)該由 MySQL Connector 來實(shí)現(xiàn)訪問鏈路的 Failover 和 Loadbalance,現(xiàn)在有了 DNS SRV 的支持,router 不必和應(yīng)用端綁定部署,也可以省了 VIP 和負(fù)載均衡,MySQL InnoDB Cluster 方案更加完善,配合 consul 等服務(wù)發(fā)現(xiàn)組件,更容易適配 service mesh 架構(gòu)。
DNS SRV 是 DNS 記錄的一種,用來指定服務(wù)地址。SRV 記錄不僅有服務(wù)目標(biāo)地址,還有服務(wù)的端口,并且可以設(shè)置每個(gè)服務(wù)地址的優(yōu)先級(jí)和權(quán)重。
MySQL Connector 8.0.19 覆蓋多種語言支持 DNS SRV,包括經(jīng)典協(xié)議和 X 協(xié)議。遵循 RFC 2782 實(shí)現(xiàn),支持 Priority 和 Weight 客戶端必須連接優(yōu)先級(jí)值最低的可達(dá)地址,若優(yōu)先級(jí)相同,權(quán)重值越大的訪問概率越高。
- Connector/NET
 - Connector/ODBC
 - Connector/J
 - Connector/Node.js
 - Connector/Python
 - Connector/C++
 
我們來演示下應(yīng)用是如何使用 DNS SRV 的,這里使用 consul 做服務(wù)發(fā)現(xiàn)。
1. consul agent 與 MySQL Router 部署在相同節(jié)點(diǎn),檢查服務(wù)活性,并向 consul server 注冊(cè)服務(wù)信息。
2. 應(yīng)用端的 Connector 配置了服務(wù)地址,訪問 DB 時(shí)先向 consul server 發(fā)起 DNS SRV 服務(wù)請(qǐng)求。
3. consul server 回復(fù)應(yīng)用端 MySQL Router 的服務(wù)地址和端口,應(yīng)用端再去訪問 MySQL Router。
我在本機(jī)做了測(cè)試。
1. 首先使用 mysql shell 創(chuàng)建一組 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. 部署兩個(gè) 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 用作服務(wù)注冊(cè)和 DNS 解析,在測(cè)試環(huán)境我們使用開發(fā)模式,只部署一個(gè) consul 節(jié)點(diǎn),若用在生產(chǎn)環(huán)境需要部署多個(gè) agent 和 server
echo "Install consul..." brew install consul consul agent -dev &4. 在 consul 中注冊(cè)兩個(gè) router 代理服務(wù)
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. 測(cè)試下 DNS SRV 是否能正常解析,SRV 記錄的應(yīng)答返回服務(wù)端口和服務(wù)地址,服務(wù)地址有對(duì)應(yīng)的 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 服務(wù)端口是 8600,需要在本機(jī)設(shè)置 DNS 轉(zhuǎn)發(fā),將應(yīng)用對(duì) consul 服務(wù)的 DNS 請(qǐng)求轉(zhuǎn)發(fā)到 consul 的端口,這里我使用 dnsmasq 做本地轉(zhuǎn)發(fā),對(duì)于生產(chǎn)環(huán)境可使用 BIND 服務(wù)。
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 轉(zhuǎn)發(fā)設(shè)置完成后,不指定 DNS 端口,測(cè)試轉(zhuǎn)發(fā)是否依然正常解析 SRV 記錄。
echo "Test dns forwarding..." dig router.service.consul SRV8. 安裝 python connector
pip install mysql-connector-python9. 在設(shè)置 connector 連接參數(shù)是注意 host 填寫在 consul 注冊(cè)的服務(wù)地址,并加上 dns_srv 參數(shù),不需要指定端口。
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 日志中可以看到請(qǐng)求以負(fù)載均衡方式發(fā)送到兩邊。
總結(jié)
以上是生活随笔為你收集整理的端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: hashmap为什么用红黑树_要看Has
 - 下一篇: 埋线多少钱啊啊?