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

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

fcfc1f71069443b05be20c390af980f8.png

MongoDB Seed列表

mongodb+srv 语法是怎么定义的哪?

在MongoDB 3.6, 我们引入了一个seed列表的概念, 它由DNS记录来指定, 尤其是SRV和TXT记录。你会想起客户端使用MongoDB副本集进行连接的时候, 必须指定至少一个副本集成员(也可能指定副本集中的好几个), 这使得客户端可以连接到一个副本集上, 即便其中的一个节点是不可用的。

你可以看一个3.4版本集群连接字符串的例子:

2beb3b09a7129a5bf68c5f2ec4499a17.png

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

9c49368bd43339f725adc7ab299bb65d.png

在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连接字符串中指定的结点作为参数来运行脚本。

206bfa84dec6b659e515fac30f2a3a8e.png

$ 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域名。

0a53f6a45509bf734b8b48a901c4d93c.png

我们可以在每个节点上通过执行如下的命令来启动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是:

d8c5fa02d554c212d2125446398c263c.png

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

4ba5114c55c8a8dec4ac83ce3bc2f617.png

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

在AWS Route 53我们可以这么做:

fbfbb8895335dfa98310932bea7fbb45.png

这会创建如下TXT记录:

a5b7ea39acb483268efc84710f61bb8c.png

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

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

这会获取一个用来连接服务的完整的URL和连接字符串。

整个过程概括如下:

160bd9fb8745a8d9ba8c7e077cb943d9.png

一旦你设定了SRV和TXT记录, 你可以很容易的在不影响客户端情况下, 更改端口号并且,你也可以添加和删除集群成员。

SRV记录是MongoDB的另外一种让各地开发者生活更容易的方式。

你也应该查看在MongoDB 3.6 SRV和TXT的完整文档。

原文链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值