PS:丰富的一线技术、多元化的表现形式,尽在“
HULK一线技术杂谈
”,点关注哦!
• 每个连接对应一个线程,每个线程需要分配1M内存资源
• 大量连接的创建与销毁数据库开销较大
• 实例限制最大连接数。MongoDB启动时,可通过maxConns参数控制实例的最大连接数。
• 限制连接池大小,客户端连接数据库时,可通过maxPoolSize配置连接池大小。例如:
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");
默认情况下,MongoDB不开启鉴权,出于安全考虑,建议开启数据库认证。开启安全认证后,连接数据库时则需要提供安全认证库,如图php连接中配置db=>’xxx’(xxx表示认证库通常为admin);
命令行登录:
mongodb30/bin/mongo -uxyz -pxyz 10.142.1.1:7003/abc (abc为业务库) --authenticationDatabase admin(admin为认证库)。
另外mongodb不同版本客户端通常不兼容故不同版本数据库请采用对应版本客户端登陆否则可能出现不可预知的问题
数据库连接的生命周期可由驱动指定。以PHP举例:连数据库时,通过socketTimeoutMS(全局级别)与cursorTimeoutMS(cursor级别)控制超时时间。
更强的加密散列函数SHA-1
Client和Server端双向认证
SCRAM-SHA-1认证过程中需要生产一串叫做server-nonce的随机字符串。
SCRAM-SHA-1认证过程中需要生产一串叫做server-nonce的随机字符串。在Linux平台下是通过/dev/urandom 设备来生成,该设备生成的随机效果较好但性能相对较差。使用这个设备涉及到用户态至内核态的切换,为了避免高并发读返回同样的随机串在内核中使用了spinlock来做控制。
弃用SCRAM-SHA-1选择MONGODB-CR。
客户端:配置MONGODB-CR认证模式,命令行登录举例:
mongodb30/bin/mongo -uxyz -pxyz 10.142.1.1:7003/abc --authenticationDatabase admin --authenticationMechanism MONGODB-CR
服务端:系统库admin下system.version集合currentVersion设置为3。
就近原则,以ping响应速度为准选择可读主从库
通常情况下,配置secondaryPreferred即可,高并发写入建议配置primaryPreferred (高并发写入情况下,从节点可能会被oplog apply阻塞)。
分为2d索引(二维平面)及2dsphere(球面)索引
支持字符串内容的文本搜索查询,其字段值可以是字符串或者字符串元素数组。(text对资源消耗非常大且开源版本不支持,建议采用其他方案)。
高并发场景下,唯一索引可能极大降低数据库性能,建议程序里优先处理。
索引创建时强烈建议添加{background: true}属性,例如:
db.test.ensureIndex({"column1": 1}, {"unique": true, "sparse": true, background: true})
{background: true}表示在后台构建索引,避免写锁阻塞数据库。
索引查询以索引创建顺序为准,与查询字段无关,索引检索遵循最左前缀原则,满足业务需求的情况下,索引越少越好,尽量避免一个查询一个索引。如图:索引{a: 1, b:1, c: 1}可以满足1、2、3及4这四类查询。
explain()用于查看命令的执行情况:
• IXSCAN:表示查询进行了索引扫描,可从indexName字段查看查询计划真实选中的索引信息。
• COLLSCAN:全集合扫描,执行计划出现COLLSCAN,表示该查询没有合适索引。
• SORT:表示查询过程需要进行排序,可能的情况是查询没有走索引或索引不是最优。
查询优化器丢弃的候选执行计划列表,当优化器没有多个可选索引的情况下,此列表显示为空。
•
避免使用Ctrl+c:对于MongoDB 多数情况采用Ctrl+c并不会真正终止对数据的操作,建议优先使用db.currentOp()获取想要终止执行命令的opid,然后通过db.killOp(opid)终止具体操作。
•
考虑使用cursor.maxTimeMS(N):根据业务具体情况设置数据库操作的执行时间(单位:毫秒)。N 毫秒如果操作不返回结果,数据库自动终止该操作。
• 按需获取字段,限制返回数据量,减少数据库及网络开销。
db.test.find({ name : /i/ },{ _id : 0 , birthday : 1 }).limit(10) 返回birthday字段并限制返回10条记录。
•
控制查询条件:
db.test.find({id:{$in:[1,2,3,4,5,6,7,8,9……...]}}),最好限制in条件的个数,巨量条件可分批执行。
•
业务端排序:
db.test.find({ name : /i/ },{ _id : 0 }).sort({birthday:1}),高并发情景下sort操作最好由业务端程序进行。