利用CoreDNS设置mongo支持SRV连接

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)作为配置文件。

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:

.: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。

@    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/