MongoDB 3.6:给你更简单的副本集连接方式

如果近期你有登录MongoDB Atlas,入门级是免费的, 你可能会注意到在3.6 版本下连接字符串的一个新的语法。
Connection Url1

MongoDB Seed列表

mongodb+srv 语法是怎么定义的哪?
在MongoDB 3.6, 我们引入了一个seed列表的概念, 它由DNS记录来指定, 尤其是SRV和TXT记录。你会想起客户端使用MongoDB副本集进行连接的时候, 必须指定至少一个副本集成员(也可能指定副本集中的好几个), 这使得客户端可以连接到一个副本集上, 即便其中的一个节点是不可用的。
你可以看一个3.4版本集群连接字符串的例子:
connectUrl34

注意, 没有SRV记录的配置, 我们必须列出几个节点(在Atlas里, 我们经常包含所有的集群成员, 尽管这不是强制要求的),我们也必须指定ssl和replicaSet选项。
connectUrl3.4-2

在3.4 或者以前版本的驱动程序, 我们必须在命令行指定使用MongoDB URI语法的所有选项。

SRV记录去除了每一个客户端需要传递一整套集群状态信息的要求, 相反, 单独一个SRV记录指定了集群相关的所有结点(以及它们的端口号), 一个相关的TXT记录定义了URI的选项。

读取SRV和TXT记录

我们可以通过一个简单的Python脚本来看到它实际上如何在MongoDB Altlas集群运行。

import srvlookup #pip install srvlookup
import sys 
import dns.resolver #pip install dnspython

host = None

if len(sys.argv) > 1 :
   host = sys.argv[1]

if host :
   services = srvlookup.lookup("mongodb", domain=host)
   for i in services:
       print("%s:%i" % (i.hostname, i.port))
   for txtrecord in dns.resolver.query(host, 'TXT'):
       print("%s: %s" % ( host, txtrecord))
else:
   print("No host specified")

我们可以使用3.6连接字符串中指定的结点作为参数来运行脚本。
srv

$ python mongodb_srv_records.py freeclusterjd-ffp4c.mongodb.net
freeclusterjd-shard-00-00-ffp4c.mongodb.net:27017
freeclusterjd-shard-00-01-ffp4c.mongodb.net:27017
freeclusterjd-shard-00-02-ffp4c.mongodb.net:27017
freeclusterjd-ffp4c.mongodb.net: "authSource=admin&replicaSet=FreeClusterJD-shard-0"
$

你也可以使用nslookup来查找:

JD10Gen-old:~ jdrumgoole$ nslookup
> set type=SRV
> _mongodb._tcp.rs.joedrumgoole.com
Server:        10.65.141.1
Address:    10.65.141.1#53

Non-authoritative answer:
_mongodb._tcp.rs.joedrumgoole.com    service = 0 0 27022 rs1.joedrumgoole.com.
_mongodb._tcp.rs.joedrumgoole.com    service = 0 0 27022 rs2.joedrumgoole.com.
_mongodb._tcp.rs.joedrumgoole.com    service = 0 0 27022 rs3.joedrumgoole.com.

Authoritative answers can be found from:
> set type=TXT
> rs.joedrumgoole.com
Server:        10.65.141.1
Address:    10.65.141.1#53

Non-authoritative answer:
rs.joedrumgoole.com    text = "authSource=admin&replicaSet=srvdemo"

你可以通过和上面的3.4 连接字符串相比较, 看到它如何被使用来构建一个3.4 版本风格的连接字符串,

正如你看到的, 集群的复杂性以及配置参数被存储在DNS服务器上, 与终端用户相隔离。如果一个节点的IP地址或者名字发生变化, 或者我们想要改变副本集的名字, 这些都可以对客户端透明的来完成。因此, 现在, 无论何时你看到mongodb+srv,你知道你会预期通过一个SRV和一个TXT记录提交客户端的连接字符串。

创建SRV和TXT记录

当然, SRV和TXT记录不仅适用于Atlas, 你也可以为你自己主机上的MongoDB集群创建你自己的SRV和TXT记录。所有你需要做的是登录你的DNS服务器编辑, 以便你可以添加SRV和TXT记录。在下面的例子中, 我们使用AWS Route 53 DNS服务。
我在AWS上创建了一个3节点副本集的演示, 它们是:

rs1.joedrumgoole.com
rs2.joedrumgoole.com
rs3.joedrumgoole.com

每一个mongod进程运行在27017端口, 我设置了一个安全组, 它允许访问我本地笔记本以及副本集节点以便它们可以相互通信。
我也在AWS route 53为这些节点创建DNS域名。
dns

我们可以在每个节点上通过执行如下的命令来启动mongod进程。

$ sudo /usr/local/m/versions/3.6.3/bin/mongod --auth --port 27022 --replSet srvdemo --bind_ip 0.0.0.0 --keyFile mdb_keyfile"

现在我们需要为集群创建SRV和TXT记录。

SRV记录指出组成副本集的一个或者多个成员的服务器。TXT记录定义了副本集的选项, 尤其是用于认证的数据库以及副本集名字, 需要注意很重要的一点:mongodb+srv格式的URI隐式的添加了“ssl=true”。在我们的例子中, 演示实例没有用到SSL, 因此我们必须添加”&ssl=false”到客户端连接器里面。注意, SRV记录是特意设计来在URL开始的时候查找mongodb服务引用。
这个设定在AWS Route 53是:
edit_record_set

这使得在Route 53 的zone文件中有如下条目:
zone_file

现在, 我们可以添加TXT记录,习惯上, 我们和SRV记录一样的名字(rs.joedrumgoole.com)以便MongoDB直到去哪里找到TXT记录。
在AWS Route 53我们可以这么做:
edit_record_set

这会创建如下TXT记录:
txt_record

现在你可以像这样访问该服务:

mongodb+srv://rs.joedrumgoole.com/test

这会获取一个用来连接服务的完整的URL和连接字符串。
整个过程概括如下:
outline

一旦你设定了SRV和TXT记录, 你可以很容易的在不影响客户端情况下, 更改端口号并且,你也可以添加和删除集群成员。
SRV记录是MongoDB的另外一种让各地开发者生活更容易的方式。
你也应该查看在MongoDB 3.6 SRV和TXT的完整文档。

原文链接:

https://www.mongodb.com/blog/post/mongodb-3-6-here-to-SRV-you-with-easier-replica-set-connections

发表评论