网络模型如图:
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认证模式,命令行登录举例:
db30/bin/mongo -uxyz -pxyz 10.142.1.1:7003/abc --authenticationDatabase admin --authenticationMechanism MONGODB-CR
服务端:系统库admin下system.version集合currentVersion设置为3。
通常情况下,配置secondaryPreferred即可,高并发写入建议配置primaryPreferred (高并发写入情况下,从节点可能会被oplog apply阻塞)。
高并发场景下,唯一索引可能极大降低数据库性能,建议程序里优先处理。
索引创建时强烈建议添加{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()用于查看命令的执行情况:
查询优化器选中的执行计划详情:
查询优化器丢弃的候选执行计划列表,当优化器没有多个可选索引的情况下,此列表显示为空。
db.test.find({name:”lidan”}).skip(10000).limit(3)
条件查询+sort+limit+取上一页最后一条记录后:db.test.find({ name : "li",num:{$gt:305} }).limit(3)
数组尾部追加元素时:oplog仅记录追加的元素及位置。
数组非尾部插入元素时,oplog将记录完整的数组字段信息。
对数组建立索引时,数据相对于对数组每一个元素创建索引,如数组元素过多,索引维护成本非常高。
使用注意点:
其中slice:0 将清空整个数组
正数 保留数组最前n个元素
负数 保留数组最后n个元素
本次分享主要针对开发人员在实际业务中最常遇到的一些问题及使用上的一些误解进行了简单介绍,希望对大家有所帮助。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞4
添加新评论2 条评论
2017-09-07 21:09
2017-08-23 10:08