支撑百亿级访问的MongoDB线上实践指南-链接篇

 

 

Hello!很久不见~~ MongoDB实践指南又如期而至啦!此系列文章是 360DBA 团队在平常运维中积累的一些 MongoDB 使用注意事项,还有一些业务所在线上使用中遇到的问题以及解决方案。php

 

MongoDB读写策略读优先策略读优先策略种类以下:1RP_PRIMARY2RP_PRIMARY_PREFERRED3RP_SECONDARY4RP_SECONDARY_PREFERRED5RP_NEAREST1根据业务需求和场景,选择合适的读优先策略,原则以下:1.若是读写一致性要求很高,建议读优先策略选择主库优先或者只读主库2.若是写请求很高,建议读优先策略选择从库优先 通常场景,能够不设置读优先策略,默认为就近优先使用读优先策略:【示例1】  // Options Description -
 // http://www.php.net/manual/zh/mongoclient.construct.php  $options = array(     'replicaSet' => $replicaSet, //    'username' => $username,       'password' => $password,    'readPreference' =>     MongoClient::RP_SECONDARY   //  );2写策略:默认状况下,类 MongoClient 写策略为 w=1,类 mongo 写策略为 w=0 这种状况写性能很低,安全性很高 通常状况下,建议选择 mongoclient ,默认是w=1,不须要人为设置;若是要求写性能很高,安全性要求不高,能够选择 mongo 类,或者使用 mongoclient, 手动设置 w=01. w=1 确认主库上写入数据成功,能够保证数据(确实)写入到了磁盘2. w=0 不须要确认主从节点数据已经写入,写性能最高,可是,宝能保证数据写入磁盘,安全性低3. w=N 须要确认N个数据节点写入到了磁盘MongoDB用户验证为了保证咱们 MongoDB 数据库的安全性,目前强制开启验证 目前,咱们的用户权限是管理权限(受权db是admin) 程序和命令行使用方式略有不一样1命令行:$mongo -uusername -ppassword ip:port/adminusername,password,ip,port 替换为具体的值2程序以 php 为例,程序访问 MongoDB,是经过驱动的。驱动中,已经默认受权 db 是 admin 了因此,驱动中不须要配置受权 dbMongoDB集群号设置1若是 MongoDB 架构是副本集(咱们默认的结构),须要在程序配置中加上replicaSet 参数,DBA 会给出该参数取值集群参数设置,若是不设置该参数,会出现报错,影响业务访问【案例2】以前不少业务,访问mongodb副本集,不设置replicaset参数,致使程序出现相似“not master...”的报错。缘由是: mongodb的驱动根据mongodb的架构不一样,返回链接的逻辑不一样。 所以,驱动返回给业务的ip有多是主库也有多是从库;当写操做时,遇到从库,就会报错了。 写请求落到主库上,业务不报错,因此,此时,问题表现为时而正常,时而报错。2若是 MongoDB 是单点或者 MongoS 架构, 程序配置中不要设置 replicaset参数MongoDB数据库链接1以 php 为例:不要滥用 new MongoClient,比较高效的作法是:执行一个 new MongoClient, 而后执行多个读写操做,这样避免由于 lvs 没法复用链接致使性能降低【案例3】有几个业务,读写请求量很高,程序经过lvs访问mongodb服务,致使出现大量超时,甚至链接数达到上限 简单来讲,是由于php经过lvs访问mongodb,没法复用链接,致使每次都须要创建新链接,(严重)影响了读写性能当第一次执行new MongoClient时,链接管理器manager会根据ip,port等信息创建hash;初始化函数会调用 mongo_get_connection_single()函数,由于是第一次链接,因此,该函数返回为null;而后,调用mongo_connection_create()函数,建立链接,同时,把该链接注册到链接管理器中,接下来,调用mongo_discover_topology()函数,该函数会吧mongodb集群中各个数据节点创建的链接注册到链接管理器中, 同时校验链接管理器中的各个链接;由于lvs ip不是mongodb的ip,此时,将从链接管理器中销毁掉以lvs ip创建的链接; 第二次乃至后面的访问,每次从库链接管理器中,都没法匹配到链接,因此,每次道须要从新创建链接,致使性能开销很大, 读写请求处理能力降低,尤为是读写请求量很高的场景,该问题显得更加突出。mongodb

 

END数据库

 

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=