2、sharding应用场景(重要)
何时分片
决定何时分片是一个值得权衡的问题。通常不必太早分片,因为分片不仅会增加部署的操作复杂度,还要求作出设计决策,而该决策以后很难再改。另外最好也不要在系统运行太久之后再分片,因为在一个过载的系统上不停机进行分片是非常困难的。
通常,分片用来:
增加可用RAM;
增加可用磁盘空间;
减轻单台服务器的负载;
处理单个mongod无法承受的吞吐量;
因此,良好的监控对应决定应何时分片是十分重要的,不需认真对待其中每一项。由于人们往往过于关注改进其中一个指标,所以应弄明白到底哪一项指标对自己的部署最为重要,并提前做好何时分片以及如何分片的计划。
与米学的业务结合及特点:
凡是涉及到业务明细表/详情表的地方,都需要考虑是否需要用sharding的问题:
如小红花表:基本每日都是几十万的数据增量。总的数据量在1000w+以上。未来的某段时间内,数据量也会呈指数级的增长。
如积分详情表。生产环境上当前数据量:1000w+
3、sharding实战第一步:小红花业务分析(重要)
3.1、web
教师端
- 过程性评价 - 教师根据班级和评价点查看该班级下学生在一段时间范围内(以一周时间为单位)的小红花列表
com.mexue.action.controller.evaluate.teacher.EvaluateGrowthPointerController.topoint
mexue2_2.evaluate_growth_content query: { date: { $gte: "2016-01-11", $lte: "2016-01-17" }, pointId: "5641ac820cf2dfbea02d628c", studentId: { $in: [ "564fb25f0cf21beb00d5fe6e", "564f12a40cf2a657b32518a1", "564fedda0cf21beb00d61d20", "565431c90cf2c904cb582e4f", "5653bf0d0cf273a1fb30cb75", "564ee61e0cf2a657b324ec99", "564ee7510cf2eb1d22ee6286", "564f28120cf21beb00d5f146", "5653ef150cf224b590d70d3c", "5652ccf40cf219d52472015b", "5654020f0cf273a1fb30ee6a", "564fbd8e0cf21beb00d602e0", "5652d5d80cf224b590d6a797", "56514ab20cf20b9363d0bc6b", "564ee9be0cf2a657b324f02e", "56543bc10cf2c904cb58377a", "5654408c0cf2dafd1d017ae5", "56503f870cf2f4fdfd7da578", "5651c0080cf20b9363d0f84f", "564ecab20cf2a657b324e1d3", "5656e4920cf2044f7e4ee114", "564fc6ee0cf2f4fdfd7d64e9", "565022b10cf2f4fdfd7d9604", "564eeaff0cf2eb1d22ee65fa", "565056f10cf21beb00d65607", "56503f120cf21beb00d646e3", "564fc46a0cf21beb00d60620", "564f096c0cf2eb1d22ee844f", "5652b3870cf219d52471f903", "565191fb0cf2624ae16c5957", "564ee7790cf2eb1d22ee62b1", "564fc9a10cf2f4fdfd7d6687", "565054170cf21beb00d65421", "5651b03b0cf2624ae16c6d8a", "564fad790cf2f4fdfd7d5a30", "565434c10cf2c904cb583093", "56504ef80cf2f4fdfd7daf1d", "564ee98f0cf2a657b324f003" ] } }
3.2、web教师端 - 过程性评价 - 教师单个/批量发放小红花
com.mexue.action.controller.evaluate.teacher.EvaluateGrowthPointerController.addContent
mexue2_2.$cmd command: insert: "evaluate_growth_content" [ { _id: ObjectId('568360170cf22522f341a9bb'), termId: "5641a9640cf2fe24019e8bd4", pointId: "5641ad480cf2dfbea02d6517", name: "语文作业", propertyType: 1, content: "又是满分,加油", enabled: 1, date: "2015-12-30", studentId: "564c10fd0cf24a16995ccd62", userId: "5641a98c0cf238217eb966f9", createTime: "2015-12-30 12:39:50" } ]
insert:evaluate_teacher_history evaluate_student_growth_cache evaluate_process_point
3.3、app家长端 - 我的 - 是否有未读的小红花
com.mexue.action.controller.mobile.EvaluateProcessController.hasProcessInfo (m=hasProcessInfo)
mexue2_2.evaluate_student_growth_cache query: { _id: ObjectId('56650ea00cf26ac83e83cbfe') }
3.4、app家长端 - 我的 - 小红花 - 当前学期下所有红花统计列表
com.mexue.action.controller.mobile.EvaluateProcessController.parentProcessList
mexue2_2.evaluate_process_point query: { _id: ObjectId('564eb07a0cf27467d746e238#5641ac810cf2dfbea02d627a') } studentId#pointId
mexue2_2.evaluate_student_growth_cache query: { _id: ObjectId('56650ea00cf26ac83e83cbfe') }
3.5、app家长端 - 我的 - 小红花 - 所有(评价点)红花统计列表 - 单个评价点下获得的小红花历史列表
com.mexue.action.controller.mobile.EvaluateProcessController.parentProcessInfoList (m=parentProcessInfoList)
mexue2_2.evaluate_growth_content query: { $query: { enabled: 1, termId: "564b1c4b0cf203df085136bc", pointId: "566952d10cf2c5c82f6ed2c6", studentId: "566aa58e0cf2eded918e168e", propertyType: -1 }, $orderby: { createTime: -1 }}
3.6、app家长端 - 我的 - 成长档案 - 学业水平 - 红花墙
com.mexue.action.controller.growth.GrowthAPIController.getFlowers
mexue2_2.evaluate_process_point query: { $query:{ "_id" : { "$in" : [ "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d30d" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d347" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d34c" , "56c2d5e60cf2f5317b7c9942#56c194ff0cf2df4ad994d358" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d32d" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d35c" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d342" , "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d31d" , "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d315" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d325" , "56c2d5e60cf2f5317b7c9942#56c195010cf2df4ad994d369" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d335" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d365" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d360" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d33d"]}}
{ "studentId" : { "$in" : [ "56cab6b00cf20eed0e8b6200"]} , "pointId" : { "$in" : [ "5635beeb0cf2dfbea02a1021" , "5635beea0cf2dfbea02a1018" , "5635bee80cf2dfbea02a0fc0" , "5635beea0cf2dfbea02a1014" , "5635bee90cf2dfbea02a0fe2" , "5635bee90cf2dfbea02a0fd1" , "5635beea0cf2dfbea02a1010" , "5635beea0cf2dfbea02a1003" , "5635bee90cf2dfbea02a0ff3" , "5635bee90cf2dfbea02a0fd9" , "5635beea0cf2dfbea02a0ffe" , "5635bee90cf2dfbea02a0fc8" , "5635bee90cf2dfbea02a0ff8" , "5635beea0cf2dfbea02a101d" , "5635bee90cf2dfbea02a0fea"]}}
3.7、app教师端 - 我的 - 发小红花 - 当前班级下,我发过的小红花/问题统计列表
com.mexue.action.controller.mobile.EvaluateProcessController.findEvaluatePoints (m=processCommentList)
mexue2_2.evaluate_process_point query: { $query:{ "_id" : { "$in" : [ "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d30d" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d347" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d34c" , "56c2d5e60cf2f5317b7c9942#56c194ff0cf2df4ad994d358" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d32d" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d35c" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d342" , "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d31d" , "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d315" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d325" , "56c2d5e60cf2f5317b7c9942#56c195010cf2df4ad994d369" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d335" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d365" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d360" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d33d"]}}
{ "studentId" : { "$in" : [ "56cab6b00cf20eed0e8b6200"]} , "pointId" : { "$in" : [ "5635beeb0cf2dfbea02a1021" , "5635beea0cf2dfbea02a1018" , "5635bee80cf2dfbea02a0fc0" , "5635beea0cf2dfbea02a1014" , "5635bee90cf2dfbea02a0fe2" , "5635bee90cf2dfbea02a0fd1" , "5635beea0cf2dfbea02a1010" , "5635beea0cf2dfbea02a1003" , "5635bee90cf2dfbea02a0ff3" , "5635bee90cf2dfbea02a0fd9" , "5635beea0cf2dfbea02a0ffe" , "5635bee90cf2dfbea02a0fc8" , "5635bee90cf2dfbea02a0ff8" , "5635beea0cf2dfbea02a101d" , "5635bee90cf2dfbea02a0fea"]}}
3.8、app教师端 - 我的 - 单个/批量发放小红花 (同web端功能,同消息界面点击加号发放小红花功能)
com.mexue.action.controller.mobile.EvaluateProcessController.publishProcessExcitate (m=addProcessComment)
insert: "evaluate_growth_content" [ { _id: ObjectId('568360170cf22522f341a9bb'), termId: "5641a9640cf2fe24019e8bd4", pointId: "5641ad480cf2dfbea02d6517", name: "语文作业", propertyType: 1, content: "又是满分,加油", enabled: 1, date: "2015-12-30", studentId: "564c10fd0cf24a16995ccd62", userId: "5641a98c0cf238217eb966f9", createTime: "2015-12-30 12:39:50" } ]
insert:evaluate_teacher_history evaluate_student_growth_cache evaluate_process_point
3.9、app教师端 - 我的 - 单个/批量发放小红花 - 查看教师发放的小红花历史记录
com.mexue.action.controller.mobile.EvaluateProcessController.teacherProcessInfoList (m=teacherProcessInfoList)
mexue2_2.$cmd command: count { count: "evaluate_teacher_history", query: { termId: "564977ad0cf2c40ed46863cd", teacherId: "566be1b20cf2fe12b63b1092", date: "2016-01-25" } }
mexue2_2.evaluate_teacher_history query: { $query: { termId: "5630c0580cf2f6d1fc284159", teacherId: "5675f4010cf2e93636933785", date: "2016-01-25" }, $orderby: { createTime: -1 } }
3.10、app教师端 - 我的 - 单个/批量发放小红花 - 根据日期获取教师发布小红花的历史记录
com.mexue.action.controller.mobile.EvaluateProcessController.teacherHistory
(m=calendarAbstract)
mexue2_2.evaluate_teacher_history query: { $query: { termId: "55dd6bea0cf25ba63d83d29d", teacherId: "5678bcbc0cf223517d13937c", date: { $gte: "2016-01-15", $lte: "2016-01-25" } }, $orderby: { createTime: -1 } }
3.11、app教师端(2.5版本之前用到,不包含2.5版本) - 我的 - 日常表现 - 某班级下学生列表 - 根据学生ID,教师ID和学期ID获取其当前学期下获取的所有小红花列表
com.mexue.action.controller.mobile.EvaluateProcessController.
showEvaluateByTeacher (m=processCommentDetail)
mexue2_2.evaluate_process_point query: { studentId: "56c181730cf2908a7d905818", userId: "56c181570cf2908a7d905816", termId: "56c18d990cf2908a7d9058e8" }
3.12、web家长端 - 成长档案 - 成长档案打印 - 红花墙
com.mexue.action.controller.mobile.PrintRecordController.getFlowers
mexue2_2.evaluate_process_point query: { $query:{ "_id" : { "$in" : [ "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d30d" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d347" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d34c" , "56c2d5e60cf2f5317b7c9942#56c194ff0cf2df4ad994d358" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d32d" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d35c" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d342" , "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d31d" , "56c2d5e60cf2f5317b7c9942#56c194fc0cf2df4ad994d315" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d325" , "56c2d5e60cf2f5317b7c9942#56c195010cf2df4ad994d369" , "56c2d5e60cf2f5317b7c9942#56c194fd0cf2df4ad994d335" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d365" , "56c2d5e60cf2f5317b7c9942#56c195000cf2df4ad994d360" , "56c2d5e60cf2f5317b7c9942#56c194fe0cf2df4ad994d33d"]}}
{ "studentId" : { "$in" : [ "56cab6b00cf20eed0e8b6200"]} , "pointId" : { "$in" : [ "5635beeb0cf2dfbea02a1021" , "5635beea0cf2dfbea02a1018" , "5635bee80cf2dfbea02a0fc0" , "5635beea0cf2dfbea02a1014" , "5635bee90cf2dfbea02a0fe2" , "5635bee90cf2dfbea02a0fd1" , "5635beea0cf2dfbea02a1010" , "5635beea0cf2dfbea02a1003" , "5635bee90cf2dfbea02a0ff3" , "5635bee90cf2dfbea02a0fd9" , "5635beea0cf2dfbea02a0ffe" , "5635bee90cf2dfbea02a0fc8" , "5635bee90cf2dfbea02a0ff8" , "5635beea0cf2dfbea02a101d" , "5635bee90cf2dfbea02a0fea"]}}
涉及表说明:
evaluate_growth_content
过程性评价激励内容(小红花/问题)实体类定义 (数据总量:419万)
当前索引:
pointId
studentId
userId + termId
evaluate_teacher_history
教师发布小红花的历史记录 (数据总量:86万)
当前索引:
termId
pointId
teacherId
evaluate_student_growth_cache 学生获得小红花的历史记录
(
数据总量:26万)
当前索引:
无
evaluate_process_point 小红花评价点关系表(小红花汇总表)
当前索引:
无
实体类属性定义:
@Document(collection = "evaluate_growth_content")
public class EvaluateGrowthContent{
@Id
private String id;//ID标识()
private String termId; //学期ID
private String pointId;//评价点ID标识
private String name; //小红花名称
private int propertyType; //属性值(1: -1:)
private String content;//评价内容
private int enabled;//是否可用(1:可用【默认】 0:不可用)
private String date;//评价日期(yyyy-MM-dd)
private String studentId;//学生ID标识
private String userId;
private String createTime;//创建时间
private String modifyTime;//修改时间
@Document(collection = "evaluate_process_point")
public class EvaluateProcessPoint {
@Id
private String id;//studentId#pointId
private int flowerNum;//小红花数量
private int issueNum;//提醒数量
private String createTime;//创建时间
private String pointName; //评价点名称(冗余字段,id中的pointId中可推导)
private String templateId;//手册Id(冗余字段,id中的pointId中可推导)
private String studentId;//学生Id(冗余字段,id中的studentId中可推导)
private String pointId;//评价点Id标识(冗余字段,id中的pointId中可推导)
private String schoolId;//学校Id(冗余字段,id中的studentId中可推导)
private String classId;//班级Id(冗余字段,id中的studentId中可推导)
private String userId;//老师Id(冗余字段,id中的pointId中可推导)
private String termId;//学期Id(冗余字段,id中的pointId中可推导)
@Document(collection = "evaluate_student_growth_cache")
public class EvaluateStudentGrowthCache{
@Id
private String studentId;//ID标识()
private String classId; //班级ID
private String termId; //学期ID
private Set<String> pointIds;
private int status; // 状态(0:未更新;1-有更新)
private String createTime;//创建时间
private String modifyTime;//修改时间
@Document(collection = "evaluate_teacher_history")
public class EvaluateTeacherHistory{
@Id
private String id;//ID标识()
private String termId; //学期ID
private String pointId;//评价点ID标识
private String teacherId;
private String classId;
private String className;
private String studentIds;//学生ID标识(逗号分隔)
private String studentNames;//学生姓名(逗号分隔)
private String name; //小红花名称
private int propertyType; //属性值(1: -1:)
private String content;//评价内容
private String date;//评价日期(yyyy-MM-dd)
private String createTime;//创建时间
private String modifyTime;//修改时间
4、sharding实战第二步:小红花分片方案实施及单元测试
4.1、确定片键
studentId + pointId
原因:不同学校的学生(
studentId)是在不同的时间段内注册的,这样可以将学生数据尽量分散在不同的片中,即使同一个学校的学生也有可能会在不同的片中。
之前片键确定的时候曾走过弯路:
之前的片键选择曾用过:
userId + termId。
原因是当时小红花业务这块量比较大。小红花汇总表启用了好几次没有启用上导致错误判断。
教师历史记录表从:
evaluate_teacher_history 查询。
学生获取的小红花记录从:evaluate_student_growth_cache 查询。
涉及按学期进行查询汇总数据的从:evaluate_process_point 查询。
4.2、现有程序代码查询顺序,逻辑调整
原则:关于sharding表的查询,需要向片键上靠。
4.3、添加sharding分库开关及mongoTemplate操作类代码
environment.properties
#with sharding
ifWriteDataToParentDB=true
//是否向父库(当前指的是评价库)中写入数据【默认true】
ifUseShardingDB=true
//是否启用沙丁 true:使用 false:不使用 还是使用原来的查询评价方式【默认false】
com.mexue.persistence.db.
EvaluateShardingDBOperations
com.mexue.persistence.db.
EvaluateShardingDBOperationsImpl
4.4、spring-mongo配置信息
#定义mongo sharding对象,对应的是mongodb官方jar包中的Mongo,ip地址和端口
evaluate.sharding.host=101.201.176.184
evaluate.sharding.port=30000
evaluate.sharding.connections-per-host=10
evaluate.sharding.threads-allowed-to-block-for-connection-multiplier=1
evaluate.sharding.connect-timeout=1000
evaluate.sharding.max-wait-time=1500
evaluate.sharding.socket-keep-alive=true
evaluate.sharding.socket-timeout=1500
evaluate.sharding.dbname=mexueEvaluate
evaluate.sharding.mongo-ref=mongo_evaluate_sharding
当前mongodb-java-driver 3.2.2版本,只提供两种mongodb连接方式:
1、ip地址 + 端口号;
2、复制集方式(多IP:PORT连接方式);
没有单独的sharding连接方式。 因为即可以单独连接一个mongos(
当前采用方式,或者做个高可用的前端代理[之前采用方式,同时也是当前能查询到的大多数生产环境采用的方式]),也可以把复制集中的多个IP:PORT设置成多个mongos形式。如下:
4.5、单元测试
测试小红花业务相关功能是否正常。
5、sharding实战第三步:小红花分片集成测试
5.1、读是否分散到正确的片中
方法:使用
db.evaluate_growth_content.find
(
{"studentId" : "5678e9e80cf2f26154733e54","pointId" : "563acf500cf253f1f8fd2baa" }
).explain()命令即可看到查询的数据集来自于哪个片,如下图:
5.2、写操作是否
分散到正确的片中
从片2或片3中任意取几条studentId数据,然后用程序批量插入,然后再用5.1中描述的方法查看即可。
5.3、压力测试,批量读看响应时间是否正确,批量写是否可以写到对应的块中?
当前并发1000进行数据同时插入,查询暂未发现问题,其实这里需要更多的压测数据,如:
压测小红花涉及接口
建议:
1.在500万,1000万,2000万,5000万数据量下,小红花涉及接口的表现数据报告
2.在插入大量数据的时候,数据是否直接插入到了对应的分片上测试
(从3个分片上分别抽取不同的studentId,然后批量插入数据后看每个分片上数据块的大小及数据分布情况。这个需要运维配合
5.4、在块迁移过程中,批量写入数据是否正确?当要插入的数据恰恰在要迁移的块中会怎么样呢?
正确。不影响。
6、sharding实战第四步:小红花分片交付测试
交付测试建议(场景):
6.1、测试小红花业务是否可用
按常规测试用例测试小红花业务功能正常即可。
6.2、测试sharding开关是否可用
#with sharding
ifWriteDataToParentDB=true
//是否向父库(当前指的是评价库)中写入数据【默认true】
ifUseShardingDB=true
//是否启用沙丁 true:使用 false:不使用 还是使用原来的查询评价方式【默认false】
写数据:
6.2.1、ifWriteDataToParentDB=true && ifUseShardingDB=true 评价库小红花表数据正确,sharding库小红花表数据正确[该配置会在生产上用一段时间(2周/1月)]
6.2.2、ifWriteDataToParentDB=true && ifUseShardingDB=false评价库小红花表数据正确,sharding库小红花表数据正确(不插入数据)
6.2.3、ifWriteDataToParentDB=false&& ifUseShardingDB=true 评价库小红花表数据正确(不插入数据),sharding库小红花表数据正确[将来生产上要用的配置]
6.2.4、ifWriteDataToParentDB=false&& ifUseShardingDB=false评价库小红花表数据正确,sharding库小红花表数据正确(不插入数据) [兜底,容错配置。同1.2]
读数据:
界面上查询红花数据正常即可。
6.3、测试sharding读取速度如何
压测小红花涉及接口。详细请见之前邮件中说明,在此不再赘述。
测试建议及产出:
在500万,1000万,2000万,5000万数据量下,小红花涉及接口的表现数据报告。
另在插入大量数据的时候,数据是否直接插入到了对应的分片上测试(从3个分片上分别抽取不同的studentId,然后批量插入数据后看每个分片上数据块的大小及数据分布情况。这个需要运维配合@徐岩岩)。
6.4、sharding环境被破坏后小红花业务的表现
当前preonline上sharding架构如下:
3片(单片采用复制集架构),3配置(可以做复制集,未来生产上不打算做复制集,具体原因希望@徐岩岩补充),3mongs(当前方案是会用阿里slb做高可用)
6.4.1、如果前段代理down了怎么办?
6.4.2、单mongs down了,双mongos down,3mongs down 场景如何。
6.4.3、单config down,双config down,3config down 场景如何。
6.4.4、分片1,2,3中的复制及下,1,2,3mongd进程 down了场景如何。
7、sharding实战第五步:小红花分片持续跟踪生产环境及修正完善
7.1、线上评价数据库中小红花详情表与sharding详情表中数据是否能对应上?
上线第一天对不上,后续持续跟踪后可以对应上。
模板:
今日对评价小红花sharding运行情况进行跟踪,结果如下:
综述:截止到2016-04-10上午8点,sharding库和评价库小红花数据正确。皆为:7598366条。
语句如下:
{ "createTime" : {$lte : "2016-04-10 08:00:00" }}
评价:
7598366
沙丁:
7598366
数据正确
7.2、原sharding小红花查询代码中没有设置从片的“从库”中读取数据,已经修正。
com.mexue.framework.config.
ConfigListener
public void contextInitialized(ServletContextEvent contextEvent) {
...
MongoTemplate mongoTemplateEvaluateSharding = wac.getBean("mongoTemplateEvaluateSharding", MongoTemplate.class);
mongoTemplateEvaluateSharding.getDb().setReadPreference(ReadPreference.secondaryPreferred());
}
7.3、持续监控;
8、最佳实践
8.1、如果想彻底了解和学习MongoDB,就必须硬啃它的官方文档。
8.2、在需求分析阶段进行架构设计:该业务涉及的表(集合)将来是否需要考虑分片。
8.3、随着不断增加分片数量,系统性能大致会呈线性增长。但是,如果从一个未分片的系统转换为只有几个分片的系统,性能通常会有所下降。由于迁移数据、维护元数据、路由等开销,少量分片的系统与未分片的系统相比,通常延迟更大,吞吐量甚至可能会更小。因此,至少应该创建3个或以上的分片。
8.4、永远不要直接连接到配置服务器,已防配置服务器数据被不小心修改或删除。应先连接到mongos,然后通过config数据库来查询相关信息,方法与查询其他数据库一样。如果通过mongos操作配置数据(而不是直接连接到配置服务器),mongos会保证将修改同步到所有配置服务器,也会防止危险操作的发生,如意外删除config数据库等。
8.5、其他,正在学习中。。。欢迎大家一起补充。
9、扩展阅读
10、作业与练习
请针对于preonline上的积分详情表(生产环境1000w+数据量)进行sharding分库开发。