MongoDB 从3.6开始,就支持mongo srv “DNS Seed List Connection Format”这种格式的连接串。
对客户端来说它可以隐藏后端mongo服务节点的变化,其显而易见的好处就是后端mongo节点的变化无需修改客户端连接参数,也就无需进行应用的重新部署。其工作原理主要是利用DNS对SRV/TXT记录的支持,因此为了使用mongo srv,我们需要一个DNS服务器并在其中设置指向mongo后端节点的SRV记录。
这里以docker的方式运行CoreDNS来作为本地DNS服务器使用本地环境演示一下如何配置以支持mongo srv。
MongoDB
MongDB这部分无需特殊配置,只要把MongoDB在本地以复制集(名为rs0)安装并运行起来就好。
运行CoreDNS
运行CoreDNS容器,并把本地~/dockerSrvStorage/dockerEnv/coredns 映射为coredns容器里的/root目录。
配置CoreDNS使用容器里的/root/Corefile(对应于本地的~/dockerSrvStorage/dockerEnv/coredns/Corefile)作为配置文件。
代码语言:javascript复制docker run -d –name coredns –restart=always
–volume=~/dockerSrvStorage/dockerEnv/coredns/:/root/
-p 53:53/udp coredns/coredns
-conf /root/Corefile
配制CoreDNS
Corefile内容如下。其中定义了一个dns zone ‘local.env’,对应的DNS记录文件使用/root/local.env。因为上一步已经把本地的~/dockerSrvStorage/dockerEnv/coredns 映射为了容器里的/roo目录,所以在本地的这个目录创建local.env这个文件就可以了。
Corefile:
代码语言:javascript复制.:53 {
forward . 8.8.8.8 114.114.114.114
log
errors
}
local.env:53 {
file /root/local.env
log
errors
}
local.env
下面的配置表示本地机器域名设置为dev.local.env,机器名mongo.local.env是dev.local.env这个机器的别名。
假设本地运行了一个数据库DB1以两个replicaset(名字是rs0)方式运行的mongo实例,分别侦听在端口27017,27117上。下面的配置就可以提供一个mongosrv连接。
mongo srv://DB1.mongo.local.env。
代码语言:javascript复制@ 3600 IN SOA dns.local.env. dhyuan.google.com. (
2022030456 ; serial
7200 ; refresh (2 hours)
3600 ; retry (1 hour)
1209600 ; expire (2 weeks)
3600 ; minimum (1 hour)
)
dev.local.env. IN A 127.0.0.1
mongo.local.env. IN CNAME dev.local.env.
redis.local.env. IN CNAME dev.local.env.
zk.local.env. IN CNAME dev.local.env.
_mongodb._TCP.DB1.mongo.local.env. 86400 IN SRV 0 0 27017 mongo.local.env.
_mongodb._TCP.DB1.mongo.local.env. 86400 IN SRV 0 0 27117 mongo.local.env.
DB1.mongo.local.env. 86400 IN TXT "replicaSet=rs0&authSource=DB1"
更改本地/etc/resolv.conf
把’nameserver 127.0.0.1’ 加在文件末尾,让本地的CoreDns参与解析。
验证
dig -t srv DB1.mongo.local.env
也可以通过文章https://www.mongodb.com/blog/post/mongodb-3-6-here-to-srv-you-with-easier-replica-set-connections 中 Reading SRV and TXT Records部分提供的python解析srv的代码验证。
pip3 install srvlookup
pip3 install dnspython
python3 mongodb_srv_records.py DB1.mongo.local.env
Reference:
https://dev.to/robbmanes/running-coredns-as-a-dns-server-in-a-container-1d0
https://datatracker.ietf.org/doc/html/rfc2052
https://docs.mongodb.com/manual/reference/connection-string/
https://www.mongodb.com/blog/post/mongodb-3-6-here-to-srv-you-with-easier-replica-set-connections
https://coredns.io/manual/toc/