新农保为什么用MongoDB——一个省级社保系统的分片集群搭建实录
新农保为什么用MongoDB——一个省级社保系统的分片集群搭建实录这不是MongoDB入门教程。这是一个真实的新农保生产环境中4台服务器、2个分片、3个config server副本集的完整部署过程。每一行配置、每一个片键设计都是真实业务场景下的决策。文章目录新农保为什么用MongoDB——一个省级社保系统的分片集群搭建实录一、背景为什么新农保要用MongoDB二、集群规划4台服务器2个分片三、安装与配置3.1 安装3.2 目录规划3.3 mongos 配置3.4 config server 配置3.5 shard 配置四、副本集初始化4.1 Config Server 副本集4.2 Shard 副本集4.3 启动路由层五、分片配置——片键设计的决策5.1 添加分片5.2 启用分片库5.3 创建集合5.4 创建片键片键创建后不可修改5.5 创建索引六、启动与维护6.1 启动顺序6.2 关闭6.3 常用运维命令七、集群架构总结八、结语一、背景为什么新农保要用MongoDB新农保新型农村社会养老保险的数据有一个典型特征参保人数巨大、查询模式单一、写操作集中在建档期。一个省的新农保参保人数在百万到千万级别个人信息、缴费记录、待遇发放——三张大表扛不住高并发读写。传统做法是Oracle分库分表。但社保系统的数据库操作绝大部分是按个人编号aac001查询——翻页、导航、统计全部围绕这个字段。用Oracle分表分表键和查询键不一致会导致跨表join性能不升反降。MongoDB的方案用aac001做片键数据按个人编号均匀分布到两个shard上。同一个人包括它的子集如参保人以单位查询的所有数据在同一个shard上避免了跨节点查询。二、集群规划4台服务器2个分片架构图 客户端请求 │ ▼ mongos (路由) │ ├──→ config server 副本集 (3节点) │ 192.168.0.75:21000 │ 192.168.0.84:21000 │ 192.168.0.86:21000 │ ├──→ shard1 副本集 │ 192.168.0.75:27001 (主) │ 192.168.0.86:27001 (从仲裁) │ └──→ shard2 副本集 192.168.0.84:27002 (主) 192.168.0.86:27002 (从仲裁)3台config server保证集群元数据高可用。2个shard各带1主1从仲裁节点放在第三台服务器上——Shard1的仲裁在Shard2所在服务器Shard2的仲裁在Shard1所在服务器实现互备。三、安装与配置3.1 安装# 解压tar-xzvfmongodb-linux-x86_64-3.4.6.tgz-C/usr/local/mv/usr/local/mongodb-linux-x86_64-3.4.6 /usr/local/mongodb# 环境变量echoexport MONGODB_HOME/usr/local/mongodb/etc/profileechoexport PATH$MONGODB_HOME/bin:$PATH/etc/profilesource/etc/profile3.2 目录规划mkdir-p/usr/local/mongodb/confmkdir-p/usr/local/mongodb/mongos/logmkdir-p/usr/local/mongodb/config/datamkdir-p/usr/local/mongodb/config/logmkdir-p/usr/local/mongodb/shard1/datamkdir-p/usr/local/mongodb/shard1/logmkdir-p/usr/local/mongodb/shard2/datamkdir-p/usr/local/mongodb/shard2/log目录按角色分mongos路由、config配置、shard1/2数据。mos和config在所有3台服务器上创建shard按规划分布。3.3 mongos 配置# /usr/local/mongodb/conf/mongos.confpidfilepath/usr/local/mongodb/mongos/log/mongos.pid logpath/usr/local/mongodb/mongos/log/mongos.log logappendtruebind_ip0.0.0.0 port20000forktrue# 监听的配置服务器configdbconfigs/192.168.0.75:21000,192.168.0.84:21000,192.168.0.86:21000 maxConns20000核心是configdb——路由层通过它知道数据分布在哪里。3.4 config server 配置# /usr/local/mongodb/conf/config.confpidfilepath/usr/local/mongodb/config/log/configsrv.pid dbpath/usr/local/mongodb/config/data logpath/usr/local/mongodb/config/log/configsrv.log logappendtruebind_ip0.0.0.0 port21000forktrueconfigsvrtruereplSetconfigs maxConns20000configsvr true声明这个节点是集群的配置服务器。replSet configs指定副本集名称。3.5 shard 配置# /usr/local/mongodb/conf/shard1.conf (shard2.conf端口改为27002replSet改为shard2)pidfilepath/usr/local/mongodb/shard1/log/shard1.pid dbpath/usr/local/mongodb/shard1/data logpath/usr/local/mongodb/shard1/log/shard1.log logappendtruebind_ip0.0.0.0 port27001forktruehttpinterfacetrueresttruereplSetshard1 shardsvrtruemaxConns20000shardsvr true声明是数据分片节点。httpinterface true开启Web监控。四、副本集初始化4.1 Config Server 副本集# 启动所有config servermongod-f/usr/local/mongodb/conf/config.conf# 连接任意一台mongo--port21000# 初始化副本集config{_id:configs, members:[{_id:0, host:192.168.0.75:21000},{_id:1, host:192.168.0.84:21000},{_id:2, host:192.168.0.86:21000}]}rs.initiate(config)4.2 Shard 副本集# 启动shardmongod-f/usr/local/mongodb/conf/shard1.conf mongod-f/usr/local/mongodb/conf/shard2.conf# 连接shard1mongo--port27001# 初始化shard1副本集config{_id:shard1, members:[{_id:0, host:192.168.0.75:27001},{_id:1, host:192.168.0.86:27001},{_id:2, host:192.168.0.86:27001, arbiterOnly: true}]}rs.initiate(config)shard2同样操作。每个shard使用2个数据节点1个仲裁节点3台服务器刚好满配。4.3 启动路由层mongos-f/usr/local/mongodb/conf/mongos.conf mongo--port20000五、分片配置——片键设计的决策5.1 添加分片use admin sh.addShard(shard1/192.168.0.75:27001,192.168.0.86:27001)sh.addShard(shard2/192.168.0.84:27002,192.168.0.86:27002)5.2 启用分片库db.runCommand({enablesharding:xnb})5.3 创建集合use xnb db.createCollection(ac01)-- 个人信息 db.createCollection(ac02)-- 参保信息 db.createCollection(ac04)-- 缴费档次基数 db.createCollection(ac50)-- 待遇信息 db.createCollection(ac71)-- 发放记录 db.createCollection(ac93)-- 特殊身份 db.createCollection(ae03)-- 转移信息 db.createCollection(ic50)-- 缴费明细 db.createCollection(unit)-- 单位信息5.4 创建片键片键创建后不可修改use admin# 个人的业务——用aac001做片键db.runCommand({shardcollection:xnb.ac01, key:{aac001:1}})db.runCommand({shardcollection:xnb.ac02, key:{aac001:1}})db.runCommand({shardcollection:xnb.ac04, key:{aac001:1}})db.runCommand({shardcollection:xnb.ac50, key:{aac001:1}})db.runCommand({shardcollection:xnb.ac71, key:{aac001:1}})db.runCommand({shardcollection:xnb.ac93, key:{aac001:1}})db.runCommand({shardcollection:xnb.ae03, key:{aac001:1}})db.runCommand({shardcollection:xnb.ic50, key:{aac001:1}})# 单位维度的业务——用unit_id做片键db.runCommand({shardcollection:xnb.unit, key:{unit_id:1}})片键设计的核心逻辑社保的查询永远围绕这个人或这个单位进行。aac001个人编号和unit_id单位编号是天然的片键——同一个人/单位的所有数据落在同一个shard上查询不需要跨节点。5.5 创建索引use xnb# 个人维度的倒排索引支持分页和排序db.ac01.createIndex({aac001:-1})db.ac01.createIndex({aac002:-1})-- aac002是身份证号也需要倒排# 缴费明细按个人编号和批次号索引db.ic50.createIndex({aac001:-1})db.ic50.createIndex({aaz281:-1})# 单位维度——按父单位ID做树形导航db.unit.createIndex({parent_id:-1})注意片键aac001已经自动有索引。额外加的索引是为了身份证号查询aac002和树形单位导航parent_id。六、启动与维护6.1 启动顺序启动顺序必须是config server → shard → mongos。路由层必须等配置中心和分片就绪# 第一步config servermongod-f/usr/local/mongodb/conf/config.conf# 第二步shardmongod-f/usr/local/mongodb/conf/shard1.conf mongod-f/usr/local/mongodb/conf/shard2.conf# 第三步路由mongos-f/usr/local/mongodb/conf/mongos.conf6.2 关闭killallmongodkillallmongos生产环境不建议用killall——应该逐个优雅关闭。但开发/测试环境这个方式最直接。6.3 常用运维命令# 查看索引db.[collection].getIndexes()# 开启慢查询监控200ms以上记录db.setProfilingLevel(1,200)# 查看慢查询db.system.profile.find({millis:{$gt:200}})# 查看记录级别db.getProfilingLevel()# CRUDdb.ac01.find({aac001:10001})# 查询db.ac01.find({aac001:10001}).skip(20).limit(10)# 分页db.ac01.count({aaz031:1})# 统计db.ac01.insert({aac001:10001,aac003:张三})# 插入db.ac01.update({aac001:10001},{$set:{aac003:李四}})# 更新db.ac01.remove({aac001:10001})# 删除七、集群架构总结mongos路由层3节点 │ ┌─────────────┼─────────────┐ │ │ │ configsvr shard1 shard2 配置中心 数据分片1 数据分片2 3节点副本集 2数据1仲裁 2数据1仲裁组件端口数量作用mongos200003路由请求到对应shardconfig server210003存储集群元数据和分片映射shard12700121按aac001存储个人数据shard22700221按aac001存储个人数据八、结语MongoDB在新农保系统里的角色不是替代Oracle是承担Oracle不擅长的高并发接入层。参保人数据按aac001分片后99%的社保业务查询都能在单个shard上完成——这是分片设计最关键的一环。这个集群的实际物理规划、分片策略、片键选择、索引设计——都是在新农保真实业务场景下反复验证过的。不是MongoDB官方文档能告诉你的。片键一选定终身选错了没法改。新农保能从2018年跑到系统下线说明选对了。

相关新闻

Celery+Redis异步任务与定时任务实战:从原理到生产环境部署

Celery+Redis异步任务与定时任务实战:从原理到生产环境部署

1. 项目概述:为什么我们需要异步与定时任务在开发一个Web应用,尤其是用户量上来之后,你肯定会遇到一些“慢”操作。比如用户上传一个视频需要后台转码,用户下单后需要发送邮件或短信通知,又或者每天凌晨需要跑一遍数据…

2026/8/6 10:00:11 阅读更多 →
如何快速制作Windows安装镜像:MediaCreationTool.bat完整指南

如何快速制作Windows安装镜像:MediaCreationTool.bat完整指南

如何快速制作Windows安装镜像:MediaCreationTool.bat完整指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …

2026/8/6 22:56:50 阅读更多 →
Linux物联网网关终极指南:5大优势构建高效边缘计算系统

Linux物联网网关终极指南:5大优势构建高效边缘计算系统

Linux物联网网关终极指南:5大优势构建高效边缘计算系统 【免费下载链接】Linux_Gateway-ioT LInux 平台下物联网网关(多线程实现),嵌入式项目 项目地址: https://gitcode.com/gh_mirrors/li/Linux_Gateway-ioT Linux物联网…

2026/8/6 18:31:10 阅读更多 →

最新新闻

《向量检索召回率优化性能 Benchmark 线上高并发排障实战》

《向量检索召回率优化性能 Benchmark 线上高并发排障实战》

《向量检索召回率优化性能 Benchmark 线上高并发排障实战》 作者: 赵谷雨 (Zho Gǔ Yǔ) (赵咕咕)技术方向: AI Agent 与大模型应用开发、向量检索与 RAG 系统、异步编程与高性能优化、多 Agent 协作框架 💡 导语与现场排障背景 在最近一次线上压测复盘中&#xff…

2026/8/7 19:11:08 阅读更多 →
【面试】数据平台产品经理面试知识点总结

【面试】数据平台产品经理面试知识点总结

距离上次写作已经过去3年,再次回看以前的文章,觉得很有冲劲,现在的我反而没有当初的纯粹。 今天是周六,强行让自己起来,写点东西,不知道以后的自己看到会有什么感受呢 基础介绍 本人从事金融科技行业&…

2026/8/7 19:11:08 阅读更多 →
《CSS 高级动效生成艺术案例 线上高并发排障实战》

《CSS 高级动效生成艺术案例 线上高并发排障实战》

《CSS 高级动效生成艺术案例 线上高并发排障实战》 作者: 李慕杰 (Leo)技术方向: AI 辅助 UI 生成、智能动效设计、设计系统自动化、跨端界面生成与评审 💡 导语与现场排障背景 在最近一次线上压测复盘中,我们的 AI 智能服务集群触发了 P99 延迟陡增告警…

2026/8/7 19:11:08 阅读更多 →
抖音下载神器:3分钟搞定无水印高清视频保存,支持批量、直播、收藏夹

抖音下载神器:3分钟搞定无水印高清视频保存,支持批量、直播、收藏夹

抖音下载神器:3分钟搞定无水印高清视频保存,支持批量、直播、收藏夹 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, an…

2026/8/7 19:11:08 阅读更多 →
哈希加密计算API在数据完整性校验中的实际应用与接入指南

哈希加密计算API在数据完整性校验中的实际应用与接入指南

适用场景:哈希计算在业务中的真实需求 在业务系统的日常开发中,哈希计算并不是一个高频但复杂的独立模块,而是嵌入在各类基础链路中的必要环节。以下三个场景是我们在实际项目中遇到最多的诉求: 数据完整性校验:文件上…

2026/8/7 19:11:07 阅读更多 →
(分块)洛谷 P3203 弹飞绵羊 题解

(分块)洛谷 P3203 弹飞绵羊 题解

题意 L 在地上沿着一条直线摆上 nnn 个装置,每个装置设定初始弹力系数 kik_iki​,当绵羊达到第 iii 个装置时,它会往后弹 kik_iki​ 步,达到第 ikiik_iiki​ 个装置,若不存在第 ikiik_iiki​ 个装置,则绵羊…

2026/8/7 19:10:07 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →