




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
mongodb 阶段性技术总结 生产环境最佳实践1.linux 系统:1】关闭文件系统/分区的atime 选项Vi /etc/fstab在对应的分区项后面添加noatime ,nodiratimeLABEL=/1 / ext3 defaults 1 1LABEL=/data1 /data ext4 defaults,noatime,nodiratime 1 22】设置文件句柄,目前该配置已经集成到启动脚本中。Vi /etc/security/limit.conf* soft nproc 65536* hard nproc 65536* soft nofile 65536* hard nofile 655363】不要使用large vm page (不要使用大内存页选项)Linux 大内存页参考:/155/krishnakumar.html4】用dmesg 查看主机的信息。2.linux 文件系统的选择:Mongodb 采用预分配的大文件来存储数据,我们推荐1】ext42】xfs3.内核版本:网络上对2.6.33-31 以及2.6.32 的表现持怀疑度, 而强力推荐2.6.364.线程堆栈的尺寸默认的线程堆栈尺寸为10m ,调整为1m ,已经集成在启动脚本中。项目过程中的总结与建议1.大小写问题mongodb 是默认区分大小写的,但是这会不会衍生出跟mysql 一样的问题?(mysql 区分大小写,导致windows 与linux 下的表名,字段名不一致)。如果无特别用途,建议表名,字段名全部用小写字母。2.尽可能的缩短字段名的长度mongodb 的schema free 导致了每笔数据都要存储他的key 以及属性,这导致了这些数据的大量冗余。开发同事也许考虑到,从易读性出发设计的key 基本比较长,基本都是按照起字面意思去设计的。这导致key 很长。对应的数据存储占用了很大的空间。必要的时候,可以考虑建立一个key 与实际意义的map 表,尽量降低key 的长度。示例定义:/ 基本信息static final String _ID = _id;static final String STATUS_CODE = sc;/ 缓冲static final String DATE = date;static final String MAX_AGE = age;/ 内容static final String CONTENT = content;static final String CONTENT_TYPE = ctype;static final String CONTENT_LENGTH = clen;static final String ZIP = zip;3. mongodb 单表最大索引数为64无索引排序的最大数据量为4M, 超过则报错退出。建议where 条件尽量落在索引字段上,排序字段需要建立索引,索引的使用原则与oraclemysql 一致,尽量降低索引数量,索引长度。mongodb 的查询每次只能用到一个索引,对数据的查询不会“并发”执行例如: db.tab.find(id=1,name=2) 如果id,name 列上分别有索引对查询效率提升意义不大,如果索引为(id,name) 则大幅提升效率。4.mongodb 添加字段如果添加字段且带有default 值,需要全部数据都要修改,这也是设计阶段需要考虑的事情,这个问题的另外一种解法是应用代码里做一次判断。5.测试过程的密码问题对于用作数据库使用的Mongodb,在代码测试阶段都应加上密码验证,目前上线阶段基本都会在密码验证方面出现问题(做缓存使用的可以不做密码验证)。6.数据源连接方式使用连接池模式,尽量减少认证带来的性能额外消耗建议采用标准的uri 连接方式: mongodb:/user:passwdhost:port,host:port/db7.Mongodb日志量正常情况下不需要开启-v 日志选项。Mongodb 的-v 日志适合在开发环境的调试线上部署不建议采用这个参数,目前线上部署的情况,-v 日志一天也会有几个G 的日志量,去掉这个参数,跟数据查询相关的操作就不会记日志了,数据库的内部的重要操作还是会写日志的。8.连接数大小的设置Mongodb 驱动程序采用的连接池的方式连接到数据库,目前从观察到的情况是应用一开启便根据变量的设置,建立全部连接,然后提供给程序使用,并且一旦其中某个连接到数据库的访问失败,则会清空整个连接池到这台数据库的连接,并重新建立连接。而mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式,如果驱动程序端配置的连接数过大,一旦发生重连,则会导致mongo 端堆积大量的垃圾连接数据,导致主机资源耗尽。建议: mongodb 驱动的连接池大小的设置一般应该控制100 以下,一般情况30-50 足够支撑应用访问。9.锁的问题Mongodb 对数据库的访问全部加锁,如果是查询请求则设置共享锁,数据修改请求,则设置全局排他锁,并且是实例级别的排他锁。并且写锁会阻塞读请求,如果长时间持有写锁,会阻塞整个实例的读请求。部署建议:1】一般情况下,建议不同的应用不要合用一套示例。2】如果资源不满足,需要合用,应该具有相同属性的应用合用一套实例。例如合同mongo 的应用都是读多写少,防止一台写多应用阻塞读请求。10.关于map/reduce问题mongodb 对map/reduce 的支持是单线程的,我们不建议在前台使用该功能, group by是通过map/reduce 实现的,开发过程中,要慎用。11.安全问题1】Mongodb 运行在mongodb 用户之上,并禁止mongodb 用户登录2】使用Mongodb 自带的认证方法(adduser、auth)限制用户访问行为3】将Mongodb 置于内网环境中4】Mongodb 必须暴露在外网环境中的时候,使用IPTABLES 等网络层技术进行防护5】网络层面内容为明文传输,可以考虑存储加密文档,应用端,加解密。12.性能监控Mongodb 自带有性能数据收集系统Mongostat 实时采集数据库的多项指标,提供http console 端口号为应用端口号+1000。关注的主要性能指标:1】Faults:显示Mongodb 每秒页面故障的数量,这个是mongoDB 映射到虚拟地址空间,而不是物理内存,这个值如果飙高的话,可能意味着机器没有足够的内存来存储数据和索引。2】Flushes:每秒做了多少次fsync,显示多少次数据被刷新进了磁盘3】locked:写锁4】idx miss:索引未命中比例5】qr | qw:读写锁的请求队列长度。6】conn: 当前已经建立的连接数。其他命令:Db.stat()db.serverStatuse()Db.collection.stats()13.碎片问题Mongodb 数据库如果数据修改很频繁,会出现比较严重的空间碎片问题,表现在磁盘文件扩张与实际数据量不相符,内存不够用,索引命中率低,查询效率降低。碎片整理,目前我们采用的版本没有太有效的方法。可以用db.repaireDatabase() 来整理数据库,这个过程非常的慢如果是Master-slave 模式则相当于执行一次主从切换,然后从新建立从库。如果是replSet 架构可以停掉数据库,然后删除数据目录,从新从复制复制组中全同步数据,这个时候要考虑oplog 的尺寸。一个大体的步骤:1.】先调用rs.freeze(1200),将每个不想让它成为primary 的机器让它在1200 秒内无法成为primary(这步也可以不做)2. 】将primary stepDown,不出意外新的primary 会起来.3. 】将原primary kill 掉.4. 】删掉所有data 数据(调用repair 很慢,真不如干掉重新来)5. 】再重启动原primary 的进程6. 】以此循环完成整个复制组的全部重建。14.系统备份:Mongodb 目前不支持在线备份,只能离线备份。我们采用的架构为replSet 和Master-slave .基于我们目前的架构以及数据一致性要求,我们没有安排相关的备份系统。15.应用代码中Mongodb连接问题在有些应用在使用Mongodb 过程中会存在以下两个小问题:1. 在应用启动过程中,应用存在要求连接池中所有的连接都建立成功才让应用正常启动,这种做法不可取,因为存在网络问题、Mongodb 拒绝连接或Mongodb 假死情况,如果没加外部try catch 做防护,则Resin 不断重启也不能正常启动端口。2.有些应用在使用Mongodb 中连接池配置了safe=true,w=1;这种配置意味着客户端在插入数据或更新数据的时候,要求mongodb 必须将所更新的数据写入磁盘并返回更新成功的信息给程序。如果碰上应用程序访问压力大,mongodb 就会反应迟钝,并会发生假死可能,针对此情况,需要评估数据的一致性需求,做出合适调整。我们一般建议关闭此选项。16.补充开发方面的一些问题1】skip+limit翻页,越往后面越慢,有资料说用数组元素的分页可以解决,目前还没试过,比较靠谱的做法是,先找出上次的id,翻页的时候不用skip:last_row_id = ObjectId(.);db.activity_stream-find(_id:$lt: last_row_id ,user_id:20 ).sort( _id:-1 ).limit(10);2】.只有真正需要的字段才select出来3】.更新的某条数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 知识产权职工培训心得课件
- 钻井设备安全知识培训课件
- 2025年党政干部选拔面试题难度分析
- 笋芽儿课文教学课件
- 知识产权年度培训计划课件
- 2025年安全员伦理与道德测试题及答案
- 2025年文物保护师初级笔试题集
- 2025年高级增材制造设备操作员(三级)技能认定理论考试题(附答案)
- 知识产权培训课堂内容课件
- 知识产权培训结业课件
- T/CAQI 27-2017中小学教室空气质量规范
- 病原微生物实验室安全课件
- 私人光伏安装合同协议
- 电化学微针的应用进展
- 餐饮油烟防治管理制度
- 小学语文教科书三年级上册第五单元(习作单元)教材解读和教学目标
- 湘教版五年级科学上册全册教案
- 2025年生猪屠宰兽医卫生检疫人员考试题(附答案)
- 《班主任如何说话学生才喜欢听》
- 实验室危险化学品管理与职责
- 2025秋季美术教学方法与计划
评论
0/150
提交评论