Ava*_*lon 7 replication mongodb pymongo
我采用了pymongo的MongoClient类连接到一个复制集,它有三个节点,1个主要2个辅助节点.代码段如下:
c = MongoClient([secondary1_hostname, secondary2_hostname], replicaSet='rs0')
Run Code Online (Sandbox Code Playgroud)
当检查三个mongod的日志时,我发现始终与主要主机建立了连接,但是其他2个从未接收到来自客户端的连接请求或者连接立即断开连接.似乎客户端首先到达一个二级获得主要地址然后删除连接并创建与主要的长期连接.
但是,当我使用MongoReplicaSetClient类时,使用以下代码:sinppet:
c = MongoReplicaSetClient(secondary1_name, replicaSet='rs0')
Run Code Online (Sandbox Code Playgroud)
每个副本集成员始终创建3个连接,从mongod的日志文件中获取.
那么,为什么MongoClient的行为总是只创建与主要的连接?我阅读了PyMongo的手册,但没有找到答案.任何建议表示赞赏.
MongoClient仅用于单个连接,当与MongoD它交谈时,它将选择数据库列表中的最后一个。添加replicaSetpymongo 时,它将验证它连接到的副本集是否与此名称匹配。意味着指定的主机是一个种子列表,pymongo 应该尝试找到set 的所有成员,然后它将连接到主节点。
MongoClient接受多个主机的另一个原因是处理Mongos和高可用性:http : MongoClient//api.mongodb.org/python/current/examples/high_availability.html#high-availability-and-mongos 还处理副本集配置,以便通过蒙古人。
MongoReplicaSetClient专门用于副本集连接,它尝试查找集合的所有成员。它还启动副本集监视器,使其能够快速响应副本集配置的更改。
使用当前的 pymongo (=3.2):
c = pymongo.MongoClient('mongodb://user:passwd@node1:p1,node2:p2/?replicaSet=rsname')
time.sleep(2)
print c.nodes
frozenset([(u'node1', p1), (u'node2', p2)])
Run Code Online (Sandbox Code Playgroud)
传递给 MongoClient() 的地址称为种子。只要至少有一个种子在线,MongoClient 就会发现副本集中的所有成员,并确定哪些是当前的主节点,哪些是辅助节点或仲裁节点。
| 归档时间: |
|
| 查看次数: |
7741 次 |
| 最近记录: |