网络公司网站绪论互联网创业项目app
2026/3/28 16:54:37 网站建设 项目流程
网络公司网站绪论,互联网创业项目app,公司网站静态模板,wordpress文章列表显示05-MongoDB故障案例与性能优化 1、调整oplog大小引发的从库宕机 1.1 背景 调整 oplog window 窗口时间后#xff0c;引发了从库宕机。日志中可见从库同步失败#xff0c;提示 too stale to catch up。 1.2 原因 延迟从库由于延迟#xff0c;还未应用的 oplog 被删除引发了从库宕机。日志中可见从库同步失败提示too stale to catch up。1.2 原因延迟从库由于延迟还未应用的 oplog 被删除drop导致延迟从库处于recovering状态。1.3 解决方案先取消延迟配置扩容延迟从库的 oplog 大小再扩容主库的 oplog。对于主库需先降级rs.stepDown()再进行升级操作。修改 oplog 的四种方法方法一停机操作停掉所有 Secondary 节点。主节点删除 local 目录下文件副本节点删除数据目录下所有文件。修改所有节点的配置文件如oplogSize1000。重启所有节点。重新配置 replica set副本节点重新同步数据initial sync。优点操作简单。缺点需要停服务数据量大时同步代价高。方法二逐个节点替换移除一个 Secondary 节点关闭服务删除数据目录。修改该节点配置oplogSize1000启动服务。在主节点执行rs.add()将其加入副本集。循环上述步骤修改所有副本节点。主节点执行rs.stepDown()降级为副本节点。从新主节点移除该节点并重复步骤 1-3逐个修改每个节点。优点无需停机。缺点每个节点需重新同步时间代价高。方法三维护模式重建 oplog - 官方推荐关闭 mongod主节点先执行rs.stepDown()降级。修改配置文件注释掉replSet和认证设置修改端口。启动实例备份 oplogmongodump -d local -c oplog.rs。进入 local 数据库保存最新 oplog 时间点。删除旧 oplogdb.oplog.rs.drop()。重建 oplog如 2GBdb.runCommand({ create: oplog.rs, capped: true, size: (2 * 1024 * 1024 * 1024) })。插入之前保存的时间点记录。关闭实例恢复配置文件重启服务。方法四MongoDB 4.0 直接调整查看 oplog 大小db.getReplicationInfo()。调整大小db.adminCommand({replSetResizeOpLog:1, size:2000})。验证大小。可选整理碎片db.runCommand({compact: oplog.rs})。2、MongoDB最大连接数限制原因未配置连接数或应用异常导致连接激增。最大连接数与系统max open files有关通常为limit.rlim_cur * 0.8。解决方法配置net.maxIncomingConnections限制连接数。排查应用连接异常增高的原因。3、mongos连接数异常背景Sharding 集群中 mongos 连接数异常导致 ops 抖动。日志特征大量连接被占用连接数持续增长。解决使用net.maxIncomingConnections限制 mongos 和 mongod 的最大连接数。确保 mongod 的最大连接数大于所有 mongos 连接数之和。4、强制重新配置副本集背景副本集节点宕机新节点加入后需强制重新配置。解决方法将其中一个 Secondary 强制设为主节点configrs.conf();config.members[config.members[2]];// 保留健康节点rs.reconfig(config,{force:true});修复其他节点并重新加入副本集。5、其他常见案例解决高峰时段 chunk 迁移导致性能抖动配置迁移窗口时间避免业务高峰期use config;db.settings.update({_id:balancer},{$set:{activeWindow:{start:02,stop:06}}},{upsert:true});客户端与服务器版本不一致导致命令卡住保持客户端与服务器版本一致。6、优化技巧避免使用skip()改用范围查询。用简单唯一值作为_id节省空间。不要用文档作为_id更新困难。尽可能减少磁盘访问。使用索引减少内存占用。返回大量数据时避免使用索引。使用覆盖索引Covered Index加速查询。使用复合索引优化多条件查询。建立分级文档加速扫描。查询优化AND 查询优先使用区分度最大的字段。OR 查询匹配最多的条件放在最前面。7、用repair压缩数据库原理相当于mongodumpmongorestore整理数据、移除碎片。注意事项会阻塞操作建议在热备节点执行。需要至少原数据库两倍的磁盘空间。数据量过大时可手动使用mongodump和mongorestore替代。8、MongoDB的使用规范8.1 数据库的使用规范名称必须为 UTF-8 字符不能为空。只能使用 ASCII 字母、数字和下划线。建议全部小写。长度 ≤ 64 字节。避免使用系统库名admin、local、config。建议命名规则db_xxxx见名知意。8.2 集合使用规范名称必须为 UTF-8 字符不能为空。不能含空字符\0。不能以system.开头。不能包含$字符。长度 ≤ 64 字节。建议只使用小写字母、下划线和点。建议命名规则t_xxxx。写入较大的集合建议“单库单集合”。可使用点分隔子集合如blog.posts。8.3 文档使用规范键不能含空字符\0。键避免使用除下划线外的特殊字符。键建议全部小写。键不建议以数字开头。不建议自定义_id。相似文档放同一集合。查询条件字段值 ≤ 1KB。大小写不敏感字段建议统一大小写。避免用数组字段作为查询条件。同一文档内键名不能重复。9、MongoDB开发最佳实践9.1 关于连接到MongoDB驱动选择与 MongoDB 版本兼容的驱动。连接对象使用单例MongoClient。连接字符串建议在字符串中配置连接选项。节点地址尽可能列出所有节点。使用域名连接便于集群迁移可使用mongodbsrv://协议。避免在 mongos 前使用负载均衡让驱动自行处理负载均衡与故障恢复。游标使用遍历完的游标自动关闭未遍历完需手动close()。9.2 关于查询及索引每个查询都应有对应的索引。尽量使用覆盖索引。使用projection减少返回数据量。9.3 关于写入更新时只包含需要更新的字段。使用批量插入提升性能。使用 TTL 自动过期日志数据。9.4 关于文档结构避免过长的字段名。避免超过两层的数组嵌套。避免使用中文、标点等非拉丁字母作为字段名。9.5 处理分页问题 - 避免使用 count数据量大时避免使用count()计算总页数。直接使用limit()进行分页查询。9.6 处理分页问题 - 巧分页避免skip()/limit()改用范围查询// 第一页db.posts.find({}).sort({_id:1}).limit(20);// 第二页db.posts.find({_id:{$gt:第一页最后一个_id}}).sort({_id:1}).limit(20);9.7 关于事务原则尽量避免使用事务。优先通过模型设计规避事务。事务尽量控制在 1000 个文档更新以内。涉及事务的文档尽量分布在同一个分片上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询