利用CoreDNS设置mongo支持SRV连接

2022-05-30 14:31:23 浏览数 (1)

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/

0 人点赞