| ±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËMongoDB
ÌØµã¡¢ÒªËØ¡¢Êý¾Ý¿â¡¢½áºÏ¡¢ÊÓͼ¡¢Ë÷Òý¼°¸´ÖƼ¯µÈ»ù´¡ÖªÊ¶¡£Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×Ô΢ÐŹ«ÖÚºÅÊý¾Ý·ÖÎöÓ뿪·¢£¬ÓÉ»ðÁú¹ûÈí¼þLinda±à¼¡¢ÍƼö¡£ |
|
MongoDB ×÷Ϊһ¿îÓÅÐãµÄ»ùÓÚ·Ö²¼Ê½Îļþ´æ´¢µÄ NoSQL Êý¾Ý¿â£¬ÔÚÒµ½çÓÐ׏㷺µÄÓ¦Óá£ÏÂÎĶÔ
MongoDB µÄһЩ»ù´¡¸ÅÄî½øÐмòµ¥½éÉÜ¡£
1 MongoDB ÌØµã
ÃæÏò¼¯ºÏ´æ´¢£ºMongoDB ÊÇÃæÏò¼¯ºÏµÄ£¬Êý¾ÝÒÔ collection ·Ö×é´æ´¢¡£Ã¿¸ö collection
ÔÚÊý¾Ý¿âÖж¼ÓÐΨһµÄÃû³Æ¡£
ģʽ×ÔÓÉ£º¼¯ºÏµÄ¸ÅÄîÀàËÆ MySQL ÀïµÄ±í£¬µ«Ëü²»ÐèÒª¶¨ÒåÈκÎģʽ¡£
½á¹¹ËÉÉ¢£º¶ÔÓÚ´æ´¢ÔÚÊý¾Ý¿âÖеÄÎĵµ£¬²»ÐèÒªÉèÖÃÏàͬµÄ×ֶΣ¬²¢ÇÒÏàͬµÄ×ֶβ»ÐèÒªÏàͬµÄÊý¾ÝÀàÐÍ£¬²»Í¬½á¹¹µÄÎĵµ¿ÉÒÔ´æÔÚͬһ¸ö
collection Àï¡£
¸ßЧµÄ¶þ½øÖÆ´æ´¢£º´æ´¢ÔÚ¼¯ºÏÖеÄÎĵµ£¬ÊÇÒÔ¼üÖµ¶ÔµÄÐÎʽ´æÔڵġ£¼üÓÃÓÚΨһ±êʶһ¸öÎĵµ£¬Ò»°ãÊÇ ObjectId
ÀàÐÍ£¬ÖµÊÇÒÔ BSON ÐÎʽ´æÔڵġ£BSON = Binary JSON£¬ ÊÇÔÚ JSON »ù´¡ÉϼÓÁËһЩÀàÐͼ°ÔªÊý¾ÝÃèÊöµÄ¸ñʽ¡£
Ö§³ÖË÷Òý£º¿ÉÒÔÔÚÈÎÒâÊôÐÔÉϽ¨Á¢Ë÷Òý£¬°üº¬ÄÚ²¿¶ÔÏó¡£MongoDB µÄË÷ÒýºÍ MySQL µÄË÷Òý»ù±¾Ò»Ñù£¬¿ÉÒÔÔÚÖ¸¶¨ÊôÐÔÉÏ´´½¨Ë÷ÒýÒÔÌá¸ß²éѯµÄËÙ¶È¡£³ý´ËÖ®Í⣬MongoDB
»¹Ìṩ´´½¨»ùÓÚµØÀí¿Õ¼äµÄË÷ÒýµÄÄÜÁ¦¡£
Ö§³Ö mapreduce£ºÍ¨¹ý·ÖÖεķ½Ê½Íê³É¸´ÔӵľۺÏÈÎÎñ¡£
Ö§³Ö failover£ºÍ¨¹ýÖ÷´Ó¸´ÖÆ»úÖÆ£¬¿ÉÒÔʵÏÖÊý¾Ý±¸·Ý¡¢¹ÊÕϻָ´¡¢¶ÁÀ©Õ¹µÈ¹¦ÄÜ¡£»ùÓÚ¸´ÖƼ¯µÄ¸´ÖÆ»úÖÆÌṩÁË×Ô¶¯¹ÊÕϻָ´µÄ¹¦ÄÜ£¬È·±£Á˼¯ÈºÊý¾Ý²»»á¶ªÊ§¡£
Ö§³Ö·ÖƬ£ºMongoDB Ö§³Ö¼¯Èº×Ô¶¯ÇзÖÊý¾Ý£¬¿ÉÒÔʹ¼¯Èº´æ´¢¸ü¶àµÄÊý¾Ý£¬ÊµÏÖ¸ü´óµÄ¸ºÔØ£¬ÔÚÊý¾Ý²åÈëºÍ¸üÐÂʱ£¬Äܹ»×Ô¶¯Â·Óɺʹ洢¡£
Ö§³Ö´æ´¢´óÎļþ£ºMongoDB ÖÐ BSON ¶ÔÏó×î´ó²»Äܳ¬¹ý 16 MB¡£¶ÔÓÚ´óÎļþµÄ´æ´¢£¬BSON
¸ñʽÎÞ·¨Âú×ã¡£GridFS »úÖÆÌṩÁËÒ»¸ö´æ´¢´óÎļþµÄ»úÖÆ£¬¿ÉÒÔ½«Ò»¸ö´óÎļþ·Ö¸î³ÉΪ¶à¸ö½ÏСµÄÎĵµ½øÐд洢¡£
2 MongoDB ÒªËØ
database: Êý¾Ý¿â¡£
collection: Êý¾Ý¼¯ºÏ£¬Ï൱ÓÚ MySQL µÄ table¡£
document: Êý¾Ý¼Ç¼ÐУ¬Ï൱ÓÚ MySQL µÄ row¡£
field: Êý¾ÝÓò£¬Ï൱ÓÚ MySQL µÄ column¡£
index: Ë÷Òý¡£
primary key: Ö÷¼ü¡£
3 MongoDB Êý¾Ý¿â
Ò»¸ö MongoDB ʵÀý¿ÉÒÔ´´½¨¶à¸ö database¡£Á¬½ÓʱÈç¹ûû¿ªÆôÃâÈÏ֤ģʽµÄ»°£¬ÐèÒªÁ¬½Óµ½
admin ¿â½øÐÐÈÏÖ¤¡£Èç¹û¿ªÆôÃâÈÏ֤ģʽ£¬Èô²»Ö¸¶¨ database ½øÐÐÁ¬½Ó£¬Ä¬ÈÏÁ¬½ÓÒ»¸ö½Ð db
µÄÊý¾Ý¿â£¬¸ÃÊý¾Ý¿â´æ´¢ÔÚ data Ŀ¼ÖС£Í¨¹ý show dbs ÃüÁî¿ÉÒԲ鿴ËùÓеÄÊý¾Ý¿â¡£Êý¾Ý¿âÃû²»Äܰüº¬¿Õ×Ö·û¡£Êý¾Ý¿âÃû²»ÄÜΪ¿Õ²¢ÇÒ±ØÐëСÓÚ
64 ¸ö×Ö·û¡£
MongoDB Ô¤ÁôÁ˼¸¸öÌØÊâµÄ database¡£
admin: admin Êý¾Ý¿âÖ÷ÒªÊDZ£´æ root Óû§ºÍ½ÇÉ«¡£ÀýÈ磬system.users
±í´æ´¢Óû§£¬system.roles ±í´æ´¢½ÇÉ«¡£Ò»°ã²»½¨ÒéÓû§Ö±½Ó²Ù×÷Õâ¸öÊý¾Ý¿â¡£½«Ò»¸öÓû§Ìí¼Óµ½Õâ¸öÊý¾Ý¿â£¬ÇÒʹËüÓµÓÐ
admin ¿âÉϵÄÃûΪ dbAdminAnyDatabase µÄ½ÇɫȨÏÞ£¬Õâ¸öÓû§×Ô¶¯¼Ì³ÐËùÓÐÊý¾Ý¿âµÄȨÏÞ¡£Ò»Ð©Ìض¨µÄ·þÎñÆ÷¶ËÃüÁîÒ²Ö»ÄÜ´ÓÕâ¸öÊý¾Ý¿âÔËÐУ¬±ÈÈç¹Ø±Õ·þÎñÆ÷¡£
local: local Êý¾Ý¿âÊDz»»á±»¸´ÖƵ½ÆäËû·ÖƬµÄ£¬Òò´Ë¿ÉÒÔÓÃÀ´´æ´¢±¾µØµ¥Ì¨·þÎñÆ÷µÄÈÎÒâ collection¡£Ò»°ã²»½¨ÒéÓû§Ö±½ÓʹÓÃ
local ¿â´æ´¢ÈκÎÊý¾Ý£¬Ò²²»½¨Òé½øÐÐ CRUD ²Ù×÷£¬ÒòΪÊý¾ÝÎÞ·¨±»Õý³£±¸·ÝÓë»Ö¸´¡£
config: µ± MongoDB ʹÓÃ·ÖÆ¬ÉèÖÃʱ£¬config Êý¾Ý¿â¿ÉÓÃÀ´±£´æ·ÖƬµÄÏà¹ØÐÅÏ¢¡£
Ò»¸ö MongoDB ʵÀýµÄÊý¾Ý½á¹¹ÈçÏÂͼ£º

4 MongoDB ¼¯ºÏ
MongoDB ¼¯ºÏ´æÔÚÓÚÊý¾Ý¿âÖУ¬Ã»Óй̶¨µÄ½á¹¹£¬¿ÉÒÔÍù¼¯ºÏ²åÈ벻ͬ¸ñʽºÍÀàÐ͵ÄÊý¾Ý¡£¼¯ºÏ²»ÐèÒªÊÂÏÈ´´½¨¡£µ±µÚÒ»¸öÎĵµ²åÈ룬»òÕßµÚÒ»¸öË÷Òý´´½¨Ê±£¬¼¯ºÏ¾Í»á±»´´½¨¡£¼¯ºÏÃû±ØÐëÒÔÏ»®Ïß»òÕß×Öĸ·ûºÅ¿ªÊ¼£¬²¢ÇÒ²»Äܰüº¬
$£¬²»ÄÜΪ¿Õ×Ö·û´®£¨±ÈÈç ""£©£¬²»Äܰüº¬¿Õ×Ö·û£¬ÇÒ²»ÄÜÒÔ system. Ϊǰ׺¡£
capped collection Êǹ̶¨´óСµÄ¼¯ºÏ£¬Ö§³Ö¸ßÍÌ͵IJåÈë²Ù×÷ºÍ²éѯ²Ù×÷¡£ËüµÄ¹¤×÷·½Ê½ÓëÑ»·»º³åÇøÀàËÆ£¬µ±Ò»¸ö¼¯ºÏÌîÂúÁ˱»·ÖÅäµÄ¿Õ¼ä£¬Ôòͨ¹ý¸²¸Ç×îÔçµÄÎĵµÀ´ÎªÐµÄÎĵµÌÚ³ö¿Õ¼ä¡£ºÍ±ê×¼µÄ
collection ²»Í¬£¬capped collection ÐèÒªÏÔʽ´´½¨£¬Ö¸¶¨´óС£¬µ¥Î»ÊÇ×Ö½Ú¡£
capped collection ¿ÉÒÔ°´ÕÕÎĵµµÄ²åÈë˳Ðò±£´æµ½¼¯ºÏÖУ¬¶øÇÒÕâЩÎĵµÔÚ´ÅÅÌÉÏ´æ·ÅλÖÃÒ²Êǰ´ÕÕ²åÈë˳ÐòÀ´±£´æµÄ£¬ËùÒÔ¸üÐÂ
capped collection ÖеÄÎĵµ£¬²»¿ÉÒÔ³¬¹ý֮ǰÎĵµµÄ´óС£¬ÒÔ±ãÈ·±£ËùÓÐÎĵµÔÚ´ÅÅÌÉϵÄλÖÃÒ»Ö±±£³Ö²»±ä¡£
5 MongoDB ÊÓͼ
ÊÓͼ»ùÓÚÒÑÓеļ¯ºÏ½øÐд´½¨£¬ÊÇÖ»¶ÁµÄ£¬²»Êµ¼Ê´æ´¢Ó²ÅÌ£¬Í¨¹ýÊÓͼ½øÐÐд²Ù×÷»á±¨´í¡£ÊÓͼʹÓÃÆäÉÏÓμ¯ºÏµÄË÷Òý¡£ÓÉÓÚË÷ÒýÊÇ»ùÓÚ¼¯ºÏµÄ£¬ËùÒÔÄã²»ÄÜ»ùÓÚÊÓͼ´´½¨¡¢É¾³ý»òÖØ½¨Ë÷Òý£¬Ò²²»ÄÜ»ñÈ¡ÊÓͼµÄË÷ÒýÁÐ±í¡£Èç¹ûÊÓͼÒÀÀµµÄ¼¯ºÏÊÇ·ÖÆ¬µÄ,
ÄÇôÊÓͼҲÊÓΪ·ÖƬµÄ¡£ÊÓͼÊÇʵʱ¼ÆËã²¢¶ÁÈ¡µÄ¡£
6 MongoDB Ë÷Òý
MongoDB Ö§³Ö·á¸»µÄË÷Òý·½Ê½¡£Èç¹ûûÓÐË÷Òý£¬¶Á²Ù×÷¾Í±ØÐëɨÃ輯ºÏÖеÄÿ¸öÎĵµ²¢É¸Ñ¡·ûºÏ²éѯÌõ¼þµÄ¼Ç¼¡£Ë÷ÒýÄܹ»Ôںܴó³Ì¶ÈÉÏÌá¸ß²éѯËÙ¶È¡£
µ¥×Ö¶ÎË÷Òý£ºÓÐÈýÖÖ·½Ê½£¬£¨1£©ÔÚµ¥¸ö×Ö¶ÎÉÏ´´½¨Ë÷Òý£»£¨2£©ÔÚǶÈëʽ×Ö¶ÎÉÏ´´½¨Ë÷Òý£»£¨3£©ÔÚÄÚǶÎĵµÉÏ´´½¨Ë÷Òý¡£
¸´ºÏË÷Òý£ºÖ§³ÖÔÚ¶à¸ö×Ö¶ÎÉÏÆ¥ÅäµÄ²éѯ¡£¶ÔÈκθ´ºÏË÷ÒýÊ©¼Ó 32 ¸ö×ֶεÄÏÞÖÆ¡£¶ÔÓÚ¸´ºÏË÷Òý£¬MongoDB
¿ÉÒÔʹÓÃË÷ÒýÀ´Ö§³Ö¶ÔË÷Òýǰ׺µÄ²éѯ¡£
¶à¼üË÷Òý£ºÎªÁËË÷Òý°üº¬Êý×éÖµµÄ×ֶΣ¬MongoDB ΪÊý×éÖеÄÿ¸öÔªËØ´´½¨Ò»¸öË÷Òý¼ü¡£ÕâЩ¶à¼üË÷ÒýÖ§³Ö¶ÔÊý×é×ֶεĸßЧ²éѯ¡£
Îı¾Ë÷Òý£ºÖ§³Ö¶Ô×Ö·û´®ÄÚÈݵÄÎı¾ËÑË÷²éѯ¡£Îı¾Ë÷Òý¿ÉÒÔ°üº¬ÈκÎֵΪ×Ö·û´®»ò×Ö·û´®ÔªËØÊý×éµÄ×ֶΡ£Ò»¸ö¼¯ºÏ×î¶à¿ÉÒÔÓÐÒ»¸öÎı¾Ë÷Òý¡£
ͨÅä·ûË÷Òý£ºÖ§³ÖÕë¶Ôδ֪»òÈÎÒâ×ֶεIJéѯ¡£ÀýÈ磺db.collection.createIndex(
{"a.$**" : 1 } ) ¿ÉÖ§³ÖÖîÈç db.collection.find({
"a.b" : 1 })¡¢db.collection.find({ "a.c"
: { $lt : 2 } }) µÈ²éѯ£¬Ìá¸ß²éѯЧÂÊ¡£²»ÄÜʹÓÃͨÅä·ûË÷ÒýÀ´·ÖƬ¼¯ºÏ¡£²»ÄÜΪͨÅä·û´´½¨¸´ºÏË÷Òý¡£
ͨÅä·ûÎı¾Ë÷Òý£ºÍ¨Åä·ûÎı¾Ë÷Òý²»Í¬ÓÚͨÅä·ûË÷Òý¡£Í¨Åä·ûË÷Òý²»Ö§³ÖʹÓà $text²Ù×÷·ûµÄ²éѯ¡£Í¨Åä·ûÎı¾Ë÷ÒýΪ¼¯ºÏÖÐÿ¸öÎĵµÖаüº¬×Ö·û´®Êý¾ÝµÄÿ¸ö×ֶν¨Á¢Ë÷Òý¡£Ë÷ÒýµÄ´´½¨·½Ê½Ê¾Àý£ºdb.collection.createIndex(
{ "$**": "text" } )¡£
2dsphere Ë÷Òý£ºÖ§³ÖÇòÌåÉϵĵØÀí¿Õ¼ä²éѯ£º°üº¬¡¢ÏཻºÍÁÚ½ü¶È²éѯ¡£
hashed Ë÷Òý£ºÖ§³ÖʹÓùþÏ£µÄ·ÖƬ¼ü½øÐÐ·ÖÆ¬¡£»ùÓÚ¹þÏ£µÄ·ÖƬʹÓÃ×ֶεÄÉ¢ÁÐË÷Òý×÷Ϊ·ÖƬ¼ü£¬ÒÔ±ã¿ç·ÖƬ¼¯Èº¶ÔÊý¾Ý½øÐзÖÇø¡£MongoDB
Ö§³ÖÈκε¥¸ö×ֶεĹþÏ£Ë÷Òý£¬µ«²»Ö§³Ö´´½¨¾ßÓжà¸ö¹þÏ£×ֶεĸ´ºÏË÷Òý£¬Ò²²»ÄÜÔÚË÷ÒýÉÏÖ¸¶¨Î¨Ò»¹þÏ£Ë÷Òý¡£
ttl Ë÷Òý£ºÒ»ÖÖÌØÊâµÄµ¥×Ö¶ÎË÷Òý£¬Ö§³ÖÔÚÒ»¶¨µÄʱ¼ä»òÌØ¶¨µÄÆÚÏÞºó×Ô¶¯´Ó¼¯ºÏÖÐɾ³ýÎĵµ¡£TTL Ë÷Òý²»Äܱ£Ö¤¹ýÆÚÊý¾ÝÔÚ¹ýÆÚʱÁ¢¼´É¾³ý¡£Ä¬ÈÏÿ
60 ÃëÔËÐÐÒ»´Îɾ³ý¹ýÆÚÎĵµµÄºǫ́½ø³Ì¡£capped collection ²»Ö§³Ö ttl Ë÷Òý¡£
ΨһË÷Òý£ºÈ·±£Ë÷Òý×ֶβ»»á´æ´¢Öظ´Öµ¡£Èç¹û¼¯ºÏÒѾ´æÔÚÁËÎ¥·´Ë÷ÒýµÄÎ¨Ò»Ô¼ÊøµÄÎĵµ£¬Ôòºǫ́´´½¨Î¨Ò»Ë÷Òý»áʧ°Ü¡£
²¿·ÖË÷Òý£ºÖ»Ë÷Òý¼¯ºÏÖÐÂú×ãÖ¸¶¨É¸Ñ¡Æ÷±í´ïʽµÄÎĵµ¡£ÀýÈ磺db.collection.createIndex({
a:1 },{ partialFilterExpression: { b: { $lt: 100 }
} }) ±íʾֻ¶Ô¼¯ºÏÖÐ b ×Ö¶ÎСÓÚ 100 µÄÎĽøÐÐË÷Òý£¬´óÓÚµÈÓÚ 100 µÄÎĵµ²»»á±»Ë÷Òý¡£Õâ¿ÉÒÔÓÐЧÌá¸ß´æ´¢Ð§ÂÊ¡£
Ï¡ÊèË÷Òý£ºÖ»°üº¬ÓÐË÷Òý×ֶεÄÎĵµµÄÌõÄ¿£¬¼´Ê¹Ë÷Òý×ֶΰüº¬¿ÕÖµ¡£Ë÷Òý»áÌø¹ýÈκÎȱÉÙË÷Òý×ֶεÄÎĵµ¡£·ÇÏ¡ÊèË÷Òý°üº¬¼¯ºÏÖеÄËùÓÐÎĵµ£¬ÎªÄÇЩ²»°üº¬Ë÷Òý×ֶεÄÎĵµ´æ´¢¿ÕÖµ¡£
7 MongoDB ObjectId
ObjectId ¿ÉÒÔ¿ìËÙÉú³É²¢ÅÅÐò£¬³¤¶ÈΪ 12 ¸ö×Ö½Ú£¬°üÀ¨£º
Ò»¸ö 4 ×Ö½ÚµÄʱ¼ä´Á£¬±íʾ unix ʱ¼ä´Á
5 ×Ö½ÚËæ»úÖµ
3 ×Ö½ÚµÝÔö¼ÆÊýÆ÷£¬³õʼ»¯ÎªËæ»úÖµ
ÔÚ MongoDB ÖУ¬´æ´¢ÔÚ¼¯ºÏÖеÄÿ¸öÎĵµ¶¼ÐèÒªÒ»¸öΨһµÄ _id ×Ö¶Î×÷ΪÖ÷¼ü¡£Èç¹û²åÈëµÄÎĵµÊ¡ÂÔÁË
_id ×ֶΣ¬Ôò×Ô¶¯ÎªÎĵµÉú³ÉÒ»¸ö _id¡£
8 MongoDB ¸´ÖƼ¯
MongoDB µÄ¸´ÖƼ¯ÓÖ³ÆÎª¸±±¾¼¯£¨Replica Set£©£¬ÊÇÒ»×éά»¤ÏàͬÊý¾Ý¼¯ºÏµÄ mongod
½ø³Ì¡£¸´ÖƼ¯°üº¬¶à¸öÊý¾Ý½ÚµãºÍÒ»¸ö¿ÉÑ¡µÄÖٲýڵ㣨arbiter£©¡£ÔÚÊý¾Ý½ÚµãÖУ¬ÓÐÇÒ½öÓÐÒ»¸ö³ÉԱΪÖ÷½Úµã£¨primary£©£¬ÆäËû½ÚµãΪ´Ó½Úµã£¨secondary£©¡£
Ò»¸öµäÐ͵ĸ´ÖƼ¯¼Ü¹¹Í¼ÈçÏ£º

8.1 ¸´ÖƼ¯½ÚµãÀàÐÍ
Ö÷½Úµã£º½ÓÊÕËùÓеÄд²Ù×÷£¬²¢½«¼¯ºÏËùÓеı仯¼Ç¼µ½²Ù×÷ÈÕÖ¾ÖУ¬¼´ oplog¡£
´Ó½Úµã£ºÍ¨¹ý¸´ÖÆÖ÷½ÚµãµÄ²Ù×÷À´Î¬»¤Ò»¸öÏàͬµÄÊý¾Ý¼¯¡£´Ó½ÚµãÓм¸¸öÑ¡ÅäÏv ²ÎÊý¾ö¶¨ÊÇ·ñ¾ßÓÐͶƱȨ£»priority
²ÎÊý¾ö¶¨½ÚµãÑ¡Ö÷¹ý³ÌʱµÄÓÅÏȼ¶£»hidden ²ÎÊý ¾ö¶¨ÊÇ·ñ¶Ô¿Í»§¶Ë¿É¼û£»slaveDelay ²ÎÊý±íʾ¸´ÖÆ
n Ãë֮ǰµÄÊý¾Ý£¬±£³ÖÓëÖ÷½ÚµãµÄʱ¼ä²î¡£´Ó½Úµã¿ÉÒÔÅäÖÃ³É 0 ÓÅÏȼ¶£¬×èÖ¹ËüÔÚÑ¡¾ÙÖгÉΪÖ÷½Úµã£¬ÊÊÓÃÓÚ½«¸Ã½Úµã²¿ÊðÔÚ±¸ÓÃÊý¾ÝÖÐÐÄ£¬»òÕß½«Ëü×÷Ϊһ¸öÀä½Úµã£»¿ÉÒÔÅäÖÃΪÒþ²Ø¸´ÖƼ¯£¬·ÀÖ¹Ó¦ÓóÌÐò´ÓËü¶ÁÈ¡Êý¾Ý£¬ÊÊÓÃÓÚÔڸýڵãÉÏÔËÐÐÐèÒªÓëÕý³£Á÷Á¿·ÖÀëµÄ³ÌÐò£»¿ÉÒÔÅäÖÃΪÑÓ³Ù¸´ÖƼ¯£¬±£³ÖÒ»¸öÀúÊ·¿ìÕÕ£¬ÒÔ±ã×ö°´Ìض¨Ê±¼äµÄ¹ÊÕϻָ´¡£
Öٲýڵ㣺Èç¹û½«Ò»¸ö mongod ʵÀý×÷ΪÖٲýڵãÌí¼Óµ½Ò»¸ö¸´ÖƼ¯ÖУ¬¸Ã½Úµã¿ÉÒÔ²ÎÓëÖ÷½ÚµãÑ¡¾Ù£¬µ«²»±£´æÊý¾Ý¡£ÖٲýڵãÓÀÔ¶Ö»ÄÜÊÇÖٲýڵ㡣
8.2 ¸´ÖƼ¯Ñ¡Ö÷
MongoDB µÄ¸±±¾¼¯ÐÒ飨ÓÖ³ÆÎª pv1)£¬ÊÇÒ»ÖÖ raft-like ÐÒ飬¼´»ùÓÚ raft
ÐÒéµÄÀíÂÛ˼ÏëʵÏÖ£¬²¢ÇÒ¶ÔÖ®½øÐÐÁËһЩÀ©Õ¹¡£µ±Íù¸´ÖƼ¯Ìí¼ÓÒ»¸ö½Úµã£¬»òµ±Ö÷½ÚµãÎÞ·¨ºÍ¼¯ÈºÖÐÆäËû½ÚµãͨÐŵÄʱ¼ä³¬¹ý²ÎÊý
electionTimeoutMillis ÅäÖÃµÄÆÚÏÞʱ£¬´Ó½Úµã»á³¢ÊÔͨ¹ý pv1 ÐÒé·¢ÆðÑ¡¾ÙÀ´ÍƼö×Ô¼º³ÉΪÐÂÖ÷½Úµã¡£
ÔÚÑ¡¾Ùǰ¾ßÓÐͶƱȨµÄ½ÚµãÖ®¼äÁ½Á½»¥Ïà·¢ËÍÐÄÌø£¬ÒÔÕì²â½ÚµãÊÇ·ñ´æ»î¡£¸´ÖƼ¯½ÚµãÿÁ½ÃëÏò±Ë´Ë·¢ËÍÐÄÌø¡£Èç¹ûÐÄÌøÎ´ÔÚ
10 ÃëÄÚ·µ»Ø£¬Ôò·¢ËÍÐÄÌøµÄÒ»·½½«±»·¢ËÍ·½±ê¼ÇΪ²»¿É·ÃÎÊ£¬Ò²¾ÍÊÇ˵£¬Ä¬Èϵ± 5 ´ÎÐÄÌøÎ´ÊÕµ½Ê±ÅжÏΪ½ÚµãʧÁª¡£
Èç¹ûʧÁªµÄÊÇÖ÷½Úµã£¬´Ó½Úµã»á·¢ÆðÑ¡¾Ù£¬Ñ¡³öеÄÖ÷½Úµã£»Èç¹ûʧÁªµÄÊÇ´Ó½ÚµãÔò²»»á²úÉúеÄÑ¡¾Ù¡£Ñ¡¾Ù»ùÓÚ
raft Ò»ÖÂÐÔË㷨ʵÏÖ£¬ÔÚ´ó¶àÊýͶƱ½Úµã´æ»îÏÂÑ¡¾Ù³öÖ÷½Úµã¡£Ö»ÓÐÄܹ»Óë¶àÊý½Úµã½¨Á¢Á¬½ÓÇÒ¾ßÓнÏеÄ
oplog µÄ½Úµã²Å¿ÉÄܱ»Ñ¡¾ÙΪÖ÷½Úµã£¬Èç¹û¼¯ÈºÀïµÄ½ÚµãÅäÖÃÁËÓÅÏȼ¶£¬ÄÇô¾ßÓнϸߵÄÓÅÏȼ¶µÄ½Úµã¸ü¿ÉÄܱ»Ñ¡¾ÙΪÖ÷½Úµã¡£
¸´ÖƼ¯ÖÐ×î¶à¿ÉÒÔÓÐ 50 ¸ö½Úµã£¬µ«¾ßÓÐͶƱȨµÄ½Úµã×î¶à 7 ¸ö¡£
8.3 ¸´ÖƼ¯×÷ÓÃ
Ö÷½Úµã·¢Éú¹ÊÕÏʱ×Ô¶¯Ñ¡¾Ù³öÒ»¸öеÄÖ÷½Úµã£¬ÒÔʵÏÖ failover¡£
½«Êý¾Ý´ÓÒ»¸öÊý¾ÝÖÐÐĸ´ÖƵ½ÁíÒ»¸öÊý¾ÝÖÐÐÄ£¬¼õÉÙÁíÒ»¸öÊý¾ÝÖÐÐĵĶÁÑÓ³Ù¡£
ʵÏÖ¶Áд·ÖÀë¡£
ʵÏÖÈÝÔÖ£¬¿ÉÒÔÔÚÊý¾ÝÖÐÐĹÊÕÏʱ¿ìËÙÇл»µ½Í¬³Ç»òÒìµØµÄÊý¾ÝÖÐÐÄ¡£
9 MongoDB ·ÖƬ¼¯
MongoDB Ö§³Öͨ¹ý·ÖƬ¼¼ÊõÀ´Ö§³Öº£Á¿Êý¾Ý´æ´¢¡£½â¾öÊý¾ÝÔö³¤µÄÀ©Õ¹·½Ê½ÓÐÁ½ÖÖ£º´¹Ö±À©Õ¹ºÍˮƽÀ©Õ¹¡£´¹Ö±À©Õ¹Í¨¹ýÔö¼Óµ¥¸ö·þÎñÆ÷µÄÄÜÁ¦À´ÊµÏÖ£¬±ÈÈç´ÅÅ̿ռ䡢ÄÚ´æÈÝÁ¿¡¢CPU
ÊýÁ¿µÈ£»Ë®Æ½À©Õ¹Ôòͨ¹ý½«Êý¾Ý´æ´¢µ½¶à¸ö·þÎñÆ÷ÉÏÀ´ÊµÏÖ¡£MongoDB ͨ¹ý·ÖƬʵÏÖˮƽÀ©Õ¹¡£
Ò»¸öµäÐ굀ᅮ¬¼¯Èº¼Ü¹¹ÈçÏ£º

9.1 ·ÖƬ¼¯×é¼þ
shard£ºÃ¿¸ö·ÖƬÉÏ¿ÉÒÔ±£´æÒ»¸ö¼¯ºÏµÄ×Ó¼¯£¬ËùÓÐ·ÖÆ¬ÉϵÄ×Ó¼¯µÄÊý¾Ý»¥²»Ïཻ£¬¹¹³ÉÍêÕûµÄ¼¯ºÏ¡£Ã¿¸ö·ÖƬ¿ÉÒÔ±»²¿ÊðΪ¸´ÖƼ¯¼Ü¹¹¡£×î´óΪ
1024 ¸ö·ÖƬ¡£
mongos£º³äµ±²éѯ·ÓÉÆ÷£¬ÔÚ¿Í»§¶ËºÍ·ÖƬ¼¯Ö®¼äÌṩ¶Áд½Ó¿Ú¡£mongos Ìṩ¼¯Èºµ¥Ò»Èë¿Ú£¬×ª·¢Ó¦ÓöËÇëÇó£¬Ñ¡ÔñºÏÊʵÄÊý¾Ý½Úµã½øÐжÁд£¬ºÏ²¢¶à¸öÊý¾Ý½ÚµãµÄ·µ»Ø¡£mongos
ÊÇÎÞ״̬µÄ£¬·ÖƬ¼¯ÈºÒ»°ãÐèÒªÅäÖÃÖÁÉÙ 2 ¸ö mongos¡£
config server£º´æ´¢·ÖƬ¼¯µÄÏà¹ØÅäÖÃÐÅÏ¢¡£
9.2 ·ÖƬ¼ü
MongoDB ¼¯ºÏÈôÒª²ÉÓÃ·ÖÆ¬£¬±ØÐëÒªÖ¸¶¨·ÖƬ¼ü£¨shard key£©¡£·ÖƬ¼üÓÉÎĵµÖеÄÒ»¸ö»ò¶à¸ö×Ö¶Î×é³É¡£·ÖƬ¼¯ºÏ±ØÐë¾ßÓÐÖ§³Ö·ÖƬ¼üµÄË÷Òý£¬Ë÷Òý¿ÉÒÔÊÇ·ÖÆ¬¼üµÄË÷Òý£¬Ò²¿ÉÒÔÊÇÒÔ·ÖÆ¬¼üÊÇË÷Òýǰ׺µÄ¸´ºÏË÷Òý¡£Òª¶ÔÒÑÌî³äµÄ¼¯ºÏ½øÐÐ·ÖÆ¬£¬¸Ã¼¯ºÏ±ØÐë¾ßÓÐÒÔ·ÖÆ¬¼ü¿ªÍ·µÄË÷Òý£»·ÖƬһ¸ö¿Õ¼¯ºÏʱ£¬Èç¹û¸Ã¼¯ºÏ»¹Ã»Óаüº¬Ö¸¶¨·ÖƬ¼üµÄË÷Òý£¬Ôò
MongoDB »áĬÈϸø·ÖƬ¼ü´´½¨Ë÷Òý¡£
¶ÔÓÚÒ»¸ö¼´½«Òª·ÖƬµÄ¼¯ºÏ£¬Èç¹û¸Ã¼¯ºÏ¾ßÓÐÆäËûΨһË÷Òý£¬ÔòÎÞ·¨·ÖƬ¸Ã¼¯ºÏ¡£
¶ÔÓÚÒÑ·ÖÆ¬µÄ¼¯ºÏ£¬²»ÄÜÔÚÆäËû×Ö¶ÎÉÏ´´½¨Î¨Ò»Ë÷Òý¡£
4.2 °æ±¾¿ªÊ¼¿ÉÒÔ¸ü¸ÄÎĵµµÄ·ÖƬ¼üÖµ£¬³ý·Ç·ÖƬ¼ü×Ö¶ÎΪ²»¿É±äµÄ _id ×ֶΡ£¸üÐÂ·ÖÆ¬¼üʱ±ØÐëÔÚÊÂÎñÖлòÒÔ¿ÉÖØÊÔдÈëµÄ·½Ê½ÔÚ
mongos ÉÏÔËÐУ¬²»ÄÜÖ±½ÓÔÚ·ÖÆ¬ÉÏÖ´ÐвÙ×÷¡£ÔÚ´Ë֮ǰÎĵµµÄ·ÖƬ¼ü×Ö¶ÎÖµÊDz»¿É±äµÄ¡£
4.4 °æ±¾¿ªÊ¼£¬¿ÉÒÔÏòÏÖÓÐÆ¬¼üÖÐÌí¼ÓÒ»¸ö»ò¶à¸öºó׺×Ö¶ÎÒÔÓÅ»¯¼¯ºÏµÄƬ¼ü¡£
5.0 °æ±¾¿ªÊ¼£¬ÊµÏÖÁËÊµÊ±ÖØÐÂ·ÖÆ¬£¨live resharding£©£¬¿ÉÒÔʵÏÖ·ÖÆ¬¼üµÄÍêÈ«ÖØÐÂÑ¡Ôñ¡£live
resharding »úÖÆÏ£¬Êý¾Ý½«¸ù¾ÝÐ嵀ᅮ¬¹æÔò½øÐÐÇ¨ÒÆ£¬²»¹ýÓÐһЩÏÞÖÆ£¬±ÈÈçÒ»¸öʵÀýÖÐÓÐÇÒÖ»ÄÜÓÐÒ»¸ö¼¯ºÏÔÚÏàͬµÄʱ¼äÏÂ
resharding µÈ¡£
Êý¾Ý¿â¿ÉÒÔ»ìºÏʹÓÃ·ÖÆ¬ºÍδ·ÖƬ¼¯ºÏ¡£·ÖƬ¼¯ºÏ±»·ÖÇø²¢·Ö²¼ÔÚ¼¯ÈºÖеĸ÷¸ö·ÖƬÖС£¶øÎ´·ÖƬ¼¯ºÏ½ö´æ´¢ÔÚÖ÷·ÖƬÖС£
ÉèÖà shard key ʱӦ¸Ã³ä·Ö¿¼ÂÇȡֵ»ùÊýºÍȡֵ·Ö²¼¡£·ÖƬ¼üÓ¦±»¾¡¿ÉÄܶàµÄÒµÎñ³¡¾°Óõ½¡£¾¡¿ÉÄܱÜÃâʹÓõ¥µ÷µÝÔö»òµÝ¼õµÄ×Ö¶Î×÷Ϊ·ÖƬ¼ü¡£
9.3 ·ÖƬ²ßÂÔ
MongoDB ½«·ÖƬÊý¾Ý²ð·Ö³É¿é¡£Ã¿¸ö·Ö¿é¶¼ÓÐÒ»¸ö»ùÓÚ·ÖÆ¬¼üµÄÉÏÏÂÏÞ·¶Î§ ¡£·ÖƬ²ßÂÔ°üÀ¨¹þÏ£·ÖƬ¡¢·¶Î§·ÖƬºÍ×Ô¶¨Òå
zone ·ÖƬ¡£
¹þÏ£·ÖƬ»á¼ÆËã·ÖƬ¼ü×ֶεĹþÏ£Öµ£¬Õâ¸öÖµ±»ÓÃ×÷Ƭ¼ü£¬È»ºó¸ù¾Ý¹þÏ£ÖµµÄÉ¢ÁÐΪÿ¸ö¿é·ÖÅäÒ»¸ö·¶Î§¡£
·¶Î§·ÖƬ¸ù¾Ý·ÖƬ¼üµÄÖµ½«Êý¾Ý»®·ÖΪ¶à¸öÁ¬Ðø·¶Î§¡££¬È»ºó»ùÓÚ·ÖÆ¬¼üµÄÖµ·ÖÅäÿ¸ö¿éµÄ·¶Î§¡£µ±Æ¬¼üµÄ»ùÊý´ó¡¢ÆµÂʵÍÇÒÖµ·Çµ¥µ÷±ä¸üʱ£¬·¶Î§·ÖƬ¸ü¸ßЧ¡£
×Ô¶¨Òå zone ·ÖƬ»ùÓÚ shard key ´´½¨¡£Ã¿¸ö zone Ó뼯ȺÖеÄÒ»¸ö»òÕ߸ü¶à·ÖƬ¹ØÁª¡£Ò»¸ö·ÖƬ¿ÉÒÔºÍÈÎÒâÊýÄ¿µÄ·Ç³åÍ»
zone Ïà¹ØÁª¡£
10 MongoDB ¾ÛºÏ
MongoDB ¾ÛºÏ¿ò¼Ü£¨Aggregation Framework£©ÊÇÒ»¸ö¼ÆËã¿ò¼Ü£¬¹¦ÄÜÊÇ£º
×÷ÓÃÔÚÒ»¸ö»ò¼¸¸ö¼¯ºÏÉÏ¡£
¶Ô¼¯ºÏÖеÄÊý¾Ý½øÐеÄһϵÁÐÔËËã¡£
½«ÕâЩÊý¾Ýת»¯ÎªÆÚÍûµÄÐÎʽ¡£
MongoDB ÌṩÁËÈýÖÖÖ´Ðоۺϵķ½·¨£º¾ÛºÏ¹ÜµÀ£¬map-reduce ºÍµ¥Ò»Ä¿µÄ¾ÛºÏ·½·¨£¨Èç count¡¢distinct
µÈ·½·¨£©¡£
10.1 ¾ÛºÏ¹ÜµÀ
ÔھۺϹܵÀÖУ¬Õû¸ö¾ÛºÏÔËËã¹ý³Ì³ÆÎª¹ÜµÀ£¨pipeline£©£¬ËüÊÇÓɶà¸ö²½Ö裨stage£©×é³ÉµÄ£¬ ÿ¸ö¹ÜµÀµÄ¹¤×÷Á÷³ÌÊÇ£º
½ÓÊÜһϵÁÐÔʼÊý¾ÝÎĵµ
¶ÔÕâЩÎĵµ½øÐÐһϵÁÐÔËËã
½á¹ûÎĵµÊä³ö¸øÏÂÒ»¸ö stage
¾ÛºÏ¼ÆËã»ù±¾¸ñʽÈçÏ£º

10.2 map-reduce
map-reduce ²Ù×÷°üÀ¨Á½¸ö½×¶Î£ºmap ½×¶Î´¦Àíÿ¸öÎĵµ²¢½« key Óë value ´«µÝ¸ø
reduce º¯Êý½øÐд¦Àí£¬reduce ½×¶Î½« map ²Ù×÷µÄÊä³ö×éºÏÔÚÒ»Æð¡£map-reduce
¿ÉʹÓÃ×Ô¶¨Òå JavaScript º¯ÊýÀ´Ö´ÐÐ map ºÍ reduce ²Ù×÷£¬ÒÔ¼°¿ÉÑ¡µÄ finalize
²Ù×÷¡£Í¨³£Çé¿öÏÂЧÂʱȾۺϹܵÀµÍ¡£
10.3 µ¥Ò»Ä¿µÄ¾ÛºÏ·½·¨
Ö÷Òª°üÀ¨ÒÔÏÂÈý¸ö£º
db.collection.estimatedDocumentCount()
db.collection.count()
db.collection.distinct()
11 MongoDB Ò»ÖÂÐÔ
·Ö²¼Ê½ÏµÍ³Óиö PACELC ÀíÂÛ¡£¸ù¾Ý CAP£¬ÔÚÒ»¸ö´æÔÚÍøÂç·ÖÇø£¨P£©µÄ·Ö²¼Ê½ÏµÍ³ÖУ¬ÒªÃæÁÙÔÚ¿ÉÓÃÐÔ£¨A£©ºÍÒ»ÖÂÐÔ£¨C£©Ö®¼äµÄȨºâ£¬³ý´ËÖ®Í⣨E£©£¬¼´Ê¹Ã»ÓÐÍøÂç·ÖÇøµÄ´æÔÚ£¬ÔÚʵ¼ÊϵͳÖУ¬ÎÒÃÇÒ²ÒªÃæÁÙÔÚ·ÃÎÊÑÓ³Ù£¨L£©ºÍÒ»ÖÂÐÔ£¨C£©Ö®¼äµÄȨºâ¡£MongoDB
µÄÒ»ÖÂÐÔÄ£ÐͶԶÁд²Ù×÷ L ºÍ C µÄÑ¡ÔñÌṩÁ˷ḻµÄÑ¡Ïî¡£
11.1 Òò¹ûÒ»ÖÂÐÔ
µ¥½ÚµãµÄÊý¾Ý¿âÓÉÓÚΪ¶Áд²Ù×÷ÌṩÁË˳Ðò±£Ö¤£¬Òò´ËʵÏÖÁËÒò¹ûÒ»ÖÂÐÔ¡£·Ö²¼Ê½ÏµÍ³Í¬Ñù¿ÉÒÔÌṩÕâЩ±£Ö¤£¬µ«±ØÐë¶ÔËùÓнڵãÉϵÄÏà¹ØÊ¼þ½øÐÐе÷ºÍÅÅÐò¡£
ÒÔÏÂÊÇÒ»¸ö²»×ñÑÒò¹ûÒ»ÖÂÐÔµÄÀý×Ó£º

ΪÁ˱£³ÖÒò¹ûÒ»ÖÂÐÔ£¬±ØÐëÓÐÒÔϱ£Ö¤£º

ʵÏÖÒò¹ûÒ»ÖÂÐԵĵ¥ºÅ¶ÁдӦ×ñÑÒÔÏÂÁ÷³Ì£º

ΪÁ˽¨Á¢¸´ÖƼ¯ºÍ·ÖƬ¼¯Ê¼þµÄÈ«¾ÖÆ«Ðò¹ØÏµ£¬MongoDB ʵÏÖÁËÒ»¸öÂ߼ʱÖÓ£¬³ÆÎª lamport
logical clock¡£Ã¿¸öд²Ù×÷ÔÚÓ¦ÓÃÓÚÖ÷½Úµãʱ¶¼»á±»·ÖÅäÒ»¸öʱ¼äÖµ¡£Õâ¸öÖµ¿ÉÒÔÔÚ¸±±¾ºÍ·ÖƬ֮¼ä½øÐбȽϡ£
´ÓÇý¶¯µ½²éѯ·ÓÉÆ÷ÔÙµ½Êý¾Ý³ÐÔØ½Úµã£¬·ÖƬ¼¯ÈºÖеÄÿ¸ö³ÉÔ±¶¼±ØÐëÔÚÿÌõÏûÏ¢Öиú×ٺͷ¢ËÍÆä×îÐÂʱ¼äÖµ£¬´Ó¶øÔÊÐí·ÖƬ֮¼äµÄÿ¸ö½ÚµãÔÚ×îÐÂʱ¼ä±£³ÖÒ»Ö¡£
Ö÷½Úµã½«×îеÄʱ¼äÖµ¸³Öµ¸øºóÐøµÄдÈ룬ÕâΪÈκÎһϵÁÐÏà¹Ø²Ù×÷´´½¨ÁËÒ»¸öÒò¹û˳Ðò¡£½Úµã¿ÉÒÔʹÓÃÕâ¸öÒò¹û˳ÐòÔÚÖ´ÐÐËùÐèµÄ¶Á»òд֮ǰµÈ´ý£¬ÒÔÈ·±£ËüÔÚÁíÒ»¸ö²Ù×÷Ö®ºó·¢Éú¡£
´Ó MongoDB 3.6 ¿ªÊ¼£¬ÔÚ¿Í»§¶Ë»á»°ÖпªÆôÒò¹ûÒ»ÖÂÐÔ£¬±£Ö¤ read concern Ϊ
majority µÄ¶Á²Ù×÷ºÍ write concern Ϊ majority µÄд²Ù×÷µÄ¹ØÁªÐòÁоßÓÐÒò¹û¹ØÏµ¡£Ó¦ÓóÌÐò±ØÐëÈ·±£Ò»´ÎÖ»ÓÐÒ»¸öÏß³ÌÔÚ¿Í»§¶Ë»á»°ÖÐÖ´ÐÐÕâЩ²Ù×÷¡£
¶ÔÓÚÒò¹ûÏà¹ØµÄ²Ù×÷£º
¿Í»§¶Ë¿ªÆô¿Í»§¶Ë»á»°£¬ÐèÂú×ãÒÔÏÂÌõ¼þ£ºread concern Ϊ majority£¬Êý¾ÝÒѱ»´ó¶àÊý¸´ÖƼ¯³ÉԱȷÈϲ¢ÇÒÊdz־û¯µÄ£»write
concern Ϊ majority£¬È·ÈϸòÙ×÷ÒÑÓ¦ÓÃÓÚ¸´ÖƼ¯Öдó¶àÊý¿ÉͶƱ³ÉÔ±¡£
µ±¿Í»§¶Ë·¢³ö read concern Ϊ majority µÄ¶Á²Ù×÷ºÍ write concern
Ϊ majority µÄд²Ù×÷µÄÐòÁÐʱ£¬¿Í»§¶Ë½«»á»°ÐÅÏ¢°üº¬ÔÚÿ¸ö²Ù×÷ÖС£
¶ÔÓÚÓë»á»°Ïà¹ØÁªµÄÿ¸ö read concern Ϊ majority µÄ¶Á²Ù×÷ºÍ write concern
Ϊ majority µÄд²Ù×÷£¬¼´Ê¹²Ù×÷³ö´í£¬MongoDB Ò²»á·µ»Ø²Ù×÷ʱ¼äºÍ¼¯ÈºÊ±¼ä¡£
Ïà¹ØµÄ¿Í»§¶Ë»á»°»á¸ú×ÙÕâÁ½¸öʱ¼ä×ֶΡ£
11.2 ÏßÐÔÒ»ÖÂÐÔ
ÏßÐÔÒ»ÖÂÐÔÓÖ±»³ÆÎªÇ¿Ò»ÖÂÐÔ¡£CAP ÖÐµÄ C Ö¸µÄ¾ÍÊÇÏßÐÔÒ»ÖÂÐÔ¡£Ë³ÐòÒ»ÖÂÐÔÖнø³ÌÖ»¹ØÐĸ÷×ÔµÄ˳ÐòÒ»Ñù¾ÍÐУ¬²»ÐèÒªÓëÈ«¾ÖʱÖÓÒ»Ö¡£ÏßÐÔÒ»ÖÂÐÔÊÇ˳ÐòÒ»ÖÂÐԵĽø»¯°æ£¬ÒªÇó˳ÐòÒ»ÖÂÐÔµÄÕâÖÖÆ«Ðò£¨partial
order£©Òª´ïµ½È«Ðò£¨total order£©¡£
ÔÚʵÏÖÁËÏßÐÔÒ»ÖÂÐÔµÄϵͳÖУ¬ÈκβÙ×÷ÔÚ¸ÃϵͳÉúЧµÄʱ¿Ì¶¼¶ÔӦʱ¼äÖáÉϵÄÒ»¸öµã¡£°ÑÕâЩʱ¿ÌÁ¬½Ó³ÉÒ»ÌõÏߣ¬ÔòÕâÌõÏß»áÒ»Ö±ÑØÊ±¼äÖáÏòǰ£¬²»»á·´Ïò¡£ÈκβÙ×÷¶¼ÐèÒª»¥Ïà±È½Ï¾ö¶¨·¢ÉúµÄ˳Ðò¡£
ÒÔÏÂÊÇÒ»¸öÏßÐÔÒ»ÖÂÐÔµÄϵͳʾÀý£º

ÔÚÒÔÉÏϵͳÖУ¬Ð´²Ù×÷ÉúЧ֮ǰµÄÈκÎʱ¿Ì£¬¶Áȡֵ¾ùΪ 1£¬ÉúЧºó¾ùΪ 2¡£Ò²¾ÍÊÇ˵£¬ÈκζÁ²Ù×÷¶¼ÄܶÁµ½Ä³¸öÊý¾ÝµÄ×î½üÒ»´ÎдµÄÊý¾Ý¡£ÏµÍ³ÖеÄËùÓнø³Ì¿´µ½µÄ²Ù×÷˳Ðò£¬¶¼×ñÑÈ«¾ÖʱÖÓµÄ˳Ðò¡£
11.3 read concern
read concern ÊÇÕë¶Ô¶Á²Ù×÷µÄÅäÖá£Ëü¿ØÖƶÁÈ¡Êý¾ÝµÄнü¶ÈºÍ³Ö¾ÃÐÔ¡£read concern
Ñ¡Ïî¿ØÖÆÊý¾Ý¶ÁÈ¡µÄÒ»ÖÂÐÔ£¬·ÖΪ local¡¢available¡¢majority¡¢linearizable
ËÄÖÖ£¬ËüÃǶÔÒ»ÖÂÐԵijÐŵÒÀ´ÎÓÉÈõµ½Ç¿¡£ÆäÖÐ linearizable ±íʾÏßÐÔÒ»ÖÂÐÔ£¬ÁíÍâ 3 ÖÖ¼¶±ð´ú±íÁË
MongoDB ÔÚʵÏÖ×îÖÕÒ»ÖÂÐÔʱ£¬¶Ô·ÃÎÊÑÓ³ÙºÍÒ»ÖÂÐÔµÄÈ¡Éá¡£
local/available: ÓïÒå»ù±¾Ò»Ö£¬¶¼ÊǶÁ²Ù×÷Ö±½Ó¶ÁÈ¡±¾µØ×îеÄÊý¾Ý£¬µ«²»±£Ö¤¸ÃÊý¾ÝÒѱ»Ð´Èë´ó¶àÊý¸´ÖƼ¯³ÉÔ±¡£Êý¾Ý¿ÉÄܻᱻ»Ø¹ö¡£Ä¬ÈÏÊÇÕë¶ÔÖ÷½Úµã¶Á¡£Èç¹û¶ÁÈ¡²Ù×÷ÓëÒò¹ûÒ»ÖµĻỰÏà¹ØÁª£¬ÔòÕë¶Ô¸±½Úµã¶Á¡£Î¨Ò»µÄÇø±ðÔÚÓÚ£¬avaliable
ÔÚ·ÖÆ¬¼¯Èº³¡¾°Ï£¬ÎªÁ˱£Ö¤ÐÔÄÜ£¬¿ÉÄÜ·µ»Ø¹Â¶ùÎĵµ¡£
majority£º¶ÁÈ¡ majority committed µÄÊý¾Ý£¬¿ÉÒÔ±£Ö¤¶ÁÈ¡µÄÊý¾Ý²»»á±»»Ø¹ö£¬µ«ÊDz¢²»Äܱ£Ö¤¶Áµ½±¾µØ×îеÄÊý¾Ý¡£ÊÜÏÞÓÚ²»Í¬½ÚµãµÄ¸´Öƽø¶È£¬¿ÉÄÜ»á¶ÁÈ¡µ½¸ü¾ÉµÄÖµ¡£µ±Ð´²Ù×÷¶ÔÓ¦µÄ
write concern ÅäÖÃÖÐ w µÄÖµÔ½´ó£¬Ôòд²Ù×÷ÔÚÀ©É¢µ½¸ü¶àµÄ¸´ÖƼ¯½ÚµãÉÏÖ®ºó²Å·µ»ØÐ´³É¹¦£¬Õâʱͨ¹ý
read concern ±»ÅäÖÃΪ majority µÄ¶Á²Ù×÷½øÐжÁÈ¡Êý¾Ý£¬¾ÍÓиü´óµÄ¸ÅÂʶÁÈ¡µ½×îеÄÊý¾Ý¡£
linearizable£º¶ÁÈ¡ majority committed µÄÊý¾Ý£¬µ«»áµÈ´ýÔÚ¶Á֮ǰËùÓеÄ
majority committed È·ÈÏ¡£Ëü³ÐŵÏßÐÔÒ»ÖÂÐÔ£¬ÒªÇó¶Áд˳ÐòºÍ²Ù×÷ÕæÊµ·¢ÉúµÄʱ¼äÍêȫһÖ£¬¼È±£Ö¤ÄܶÁÈ¡µ½×îеÄÊý¾Ý£¬Ò²±£Ö¤¶Áµ½Êý¾Ý²»»á±»»Ø¹ö¡£Ö»¶Ô¶ÁÈ¡µ¥¸öÎĵµÊ±ÓÐЧ£¬ÇÒ¿ÉÄܵ¼Ö·dz£ÂýµÄ¶Á£¬Òò´Ë×ÜÊǽ¨ÒéÅäºÏʹÓÃ
maxTimeMS ʹÓá£
linearizable Ö»ÄÜÓÃÔÚÖ÷½ÚµãµÄ¶Á²Ù×÷ÉÏ£¬¿¼Âǵ½Ð´²Ù×÷Ò²Ö»ÄÜ·¢ÉúÔÚÖ÷½ÚµãÉÏ£¬Ï൱ÓÚ˵ MongoDB
µÄÏßÐÔÒ»ÖÂÐÔ±»ÏÞ¶¨ÔÚµ¥»ú»·¾³ÏÂʵÏÖ¡£ÊµÏÖ linearizable£¬¶ÁÈ¡µÄÊý¾ÝÓ¦¸ÃÊDZ» write
concern Ϊ majority µÄд²Ù×÷дÈëµ½ MongoDB ¼¯ÈºÖеġ¢Çҳ־û¯µ½ÈÕÖ¾ÖеÄÊý¾Ý¡£
Èç¹ûÊý¾ÝдÈëµ½¶àÊý½Úµãºó£¬Ã»ÓÐÔÚÈÕÖ¾Öг־û¯£¬µ±ÕâЩ½Úµã·¢ÉúÖØÆô»Ö¸´£¬ÄÇô֮ǰͨ¹ýÅäÖà read concern
Ϊ linearizable µÄ¶Á²Ù×÷¶ÁÈ¡µ½µÄÊý¾Ý¾Í¿ÉÄܶªÊ§¡£¿ÉÒÔͨ¹ý writeConcernMajorityJournalDefault
Ñ¡Ïî±£Ö¤Ö¸¶¨ write concern Ϊ majority µÄд²Ù×÷ÔÚÈÕÖ¾ÖÐÊÇ·ñ³Ö¾Ã»¯¡£Èç¹ûд²Ù×÷³Ö¾Ã»¯µ½ÁËÈÕÖ¾ÖУ¬µ«ÊÇûÓи´ÖƵ½¶àÊý½Úµã£¬ÔÚÖØÐÂÑ¡Ö÷ºó£¬Í¬Ñù¿ÉÄܻᷢÉúÊý¾Ý¶ªÊ§£¬Î¥±³Ò»ÖÂÐÔ³Ðŵ¡£
snapshot: Óë¹ØÏµÐÍÊý¾Ý¿âÖеĿìÕÕ¸ôÀë¼¶±ðÓïÒåÒ»Ö¡£×î¸ß¸ôÀë¼¶±ð£¬½Ó½üÓÚ serializable¡£ÊǰéËæ×Å
MongoDB 4.0 °æ±¾ÖÐгöÏֵĶàÎĵµÊÂÎñ¶øÉè¼ÆµÄ£¬Ö»ÄÜÓÃÔÚÏÔʽ¿ªÆôµÄ¶àÎĵµÊÂÎñÖС£Èç¹ûÊÂÎñÊÇÒò¹ûÒ»Ö»ỰµÄÒ»²¿·Ö£¬ÇÒ
write concern Ϊ majority£¬ÔòÔÚÊÂÎñÌá½»ºó£¬¶Á²Ù×÷¿ÉÒÔ±£Ö¤ÒÑ´Ó¶àÊýÌá½»Êý¾ÝµÄ¿ìÕÕÖжÁÈ¡£¬¸Ã¿ìÕÕÌṩÓë¸ÃÊÂÎñ¿ªÊ¼Ö®Ç°µÄ²Ù×÷µÄÒò¹ûÒ»ÖÂÐÔ¡£
Ëü¶ÁÈ¡ majority committed µÄÊý¾Ý£¬µ«¿ÉÄܶÁ²»µ½×îеÄÒÑÌá½»Êý¾Ý¡£snapshot
±£Ö¤ÔÚÊÂÎñÖеĶÁ²»³öÏÖÔà¶Á¡¢²»¿ÉÖØ¸´¶ÁºÍ»Ã¶Á¡£ÒòΪËùÓеĶÁ¶¼½«Ê¹ÓÃͬһ¸ö¿ìÕÕ£¬Ö±µ½ÊÂÎñÌύΪֹ¸Ã¿ìÕղű»ÊÍ·Å¡£
ÏÂÃæ½èÓÃÒ»ÕÅͼչʾ majority ºÍ linearizable µÄÇø±ð£º

11.4 write concern
write concern ÊÇÕë¶Ôд²Ù×÷µÄÅäÖ㬱íʾдÇëÇó¶Ô¶ÀÁ¢ mongod ʵÀý»ò¸´ÖƼ¯»ò·ÖƬ¼¯½øÐÐд²Ù×÷µÄÈ·Èϼ¶±ð¡£ËüÖ÷ÒªÊÇ¿ØÖÆÊý¾ÝдÈëµÄ³Ö¾ÃÐÔ¡£°üº¬Èý¸öÑ¡Ï
w£ºÖ¸¶¨ÁËд²Ù×÷ÐèÒª¸´ÖƲ¢Ó¦Óõ½¶àÉÙ¸ö¸´ÖƼ¯³ÉÔ±²ÅÄÜ·µ»Ø³É¹¦£¬¿ÉÒÔΪÊý×Ö»ò majority¡£
w:0 ±íʾ¿Í»§¶Ë²»ÐèÒªÊÕµ½ÈκÎÓйØÐ´²Ù×÷ÊÇ·ñÖ´Ðгɹ¦µÄÈ·ÈÏ£¬¾ÍÖ±½Ó·µ»Ø³É¹¦£¬¾ßÓÐ×î¸ßÐÔÄÜ¡£
w:1 ±íʾдÖ÷³É¹¦Ôò·µ»Ø¡£
w: majority ÐèÒªÊÕµ½¶àÊý½Úµã£¨º¬Ö÷½Úµã£©¹ØÓÚ²Ù×÷Ö´Ðгɹ¦µÄÈ·ÈÏ£¬¾ßÌå¸öÊýÓÉ MongoDB
¸ù¾Ý¸´ÖƼ¯ÅäÖÃ×Ô¶¯µÃ³ö¡£w ÖµÔ½´ó£¬¶Ô¿Í»§¶ËÀ´Ëµ£¬Êý¾ÝµÄ³Ö¾ÃÐÔ±£Ö¤Ô½Ç¿£¬Ð´²Ù×÷µÄÑÓ³ÙÔ½´ó¡£w:1 ÒªÇóÊÂÎñÖ»ÒªÔÚ±¾µØ³É¹¦Ìá½»¼´¿É£¬¶ø
w: majority ÒªÇóÊÂÎñÔÚ¸´ÖƼ¯µÄ¶àÊýÅɽڵãÌá½»³É¹¦¡£
w:all ±íʾȫ²¿½ÚµãÈ·Èϲŷµ»Ø³É¹¦¡£
j£º±íʾд²Ù×÷¶ÔÓ¦µÄÐÞ¸ÄÊÇ·ñÒª±»³Ö¾Ã»¯µ½´æ´¢ÒýÇæÈÕÖ¾ÖУ¬Ö»ÄÜÑ¡Ìî true »ò false¡£
j:false ±íʾд²Ù×÷µ½´ïÄÚ´æ¼´Ëã×÷³É¹¦¡£
j:true ±íʾд²Ù×÷Âäµ½ journal ÎļþÖвÅËã³É¹¦¡£w:0 Èç¹ûÖ¸¶¨ j:true£¬ÔòÓÅÏÈʹÓÃ
j:true À´ÇëÇó¶ÀÁ¢»ò¸´ÖƼ¯Ö÷¸±±¾µÄÈ·ÈÏ¡£j:true ±¾Éí²¢²»Äܱ£Ö¤²»»áÒò¸´ÖƼ¯Ö÷¹ÊÕÏ×ªÒÆ¶ø»Ø¹öд²Ù×÷¡£
wtimeout£ºÖ÷½ÚµãÔڵȴý×ã¹»ÊýÁ¿µÄÈ·ÈÏʱµÄ³¬Ê±Ê±¼ä£¬µ¥Î»ÎªºÁÃë¡£³¬Ê±·µ»Ø´íÎ󣬵«²¢²»´ú±íд²Ù×÷ÒѾִÐÐʧ°Ü¡£¸ú
w Óйأ¬±ÈÈ磺w ÊÇ 1£¬ÔòÊÇ´øÖ÷½ÚµãÈ·Èϵij¬Ê±Ê±¼ä£»w Ϊ 0£¬ÔòÓÀ²»·µ»Ø´íÎó£»w Ϊ majority£¬±íʾ¶àÊý½ÚµãÈ·Èϵij¬Ê±Ê±¼ä¡£
12 MongoDB WiredTiger ÒýÇæ
´Ó 3.2 °æ±¾¿ªÊ¼£¬Ä¬ÈÏʹÓà WiredTiger ´æ´¢ÒýÇæ£¬Ã¿¸ö±»´´½¨µÄ±íºÍË÷Òý£¬¶¼¶ÔÓ¦¸÷×Ô¶ÀÁ¢µÄ
WiredTiger ±í¡£ÎªÁ˱£Ö¤ MongoDB ÖÐÊý¾ÝµÄ³Ö¾ÃÐÔ£¬Ê¹Óà WiredTiger µÄд²Ù×÷»áÏÈдÈë
cache£¬²¢³Ö¾Ã»¯µ½ WAL£¨write ahead log£©£¬Ã¿ 60s »òÈÕÖ¾Îļþ´ïµ½ 2 GB£¬¾Í»á×öÒ»´Î
checkpoint£¬¶¨ÆÚ½«»º´æÊý¾ÝË¢µ½´ÅÅÌ£¬½«µ±Ç°µÄÊý¾Ý³Ö¾Ã»¯²úÉúÒ»¸öеĿìÕÕ¡£
12.1 WiredTiger Êý¾Ý½á¹¹
MongoDB ²ÉÓòå¼þʽ´æ´¢ÒýÇæ¼Ü¹¹£¬ÊµÏÖÁË·þÎñ²ãºÍ´æ´¢ÒýÇæ²ãµÄ½âñ¿ÉÖ§³ÖʹÓöàÖÖ´æ´¢ÒýÇæ¡£³ý´ËÖ®Í⣬µ×²ãµÄ
WiredTiger ÒýÇæ»¹Ö§³ÖʹÓà B+ Ê÷ºÍ LSM Á½ÖÖÊý¾Ý½á¹¹½øÐÐÊý¾Ý¹ÜÀíºÍ´æ´¢£¬Ä¬ÈÏʹÓÃ
B+ Ê÷½á¹¹×ö´æ´¢¡£Ê¹Óà B+ Ê÷ʱ£¬WiredTiger ÒÔ page Ϊµ¥Î»Íù´ÅÅ̶ÁдÊý¾Ý£¬B+
Ê÷µÄÿ¸ö½ÚµãΪһ¸ö page£¬°üº¬ÈýÖÖÀàÐ굀 page£¬¼´ root page¡¢internal page
ºÍ leaf page¡£
ÒÔÏÂÊÇ B+ Ê÷µÄ½á¹¹Ê¾Òâͼ£º

root page ÊÇ B+ Ê÷µÄ¸ù½Úµã¡£
internal page ÊDz»Êµ¼Ê´æ´¢Êý¾ÝµÄÖмäË÷Òý½Úµã¡£
leaf page ÊÇÕæÕý´æ´¢Êý¾ÝµÄÒ¶×ӽڵ㣬°üº¬Ò³Í·£¨page header£©¡¢¿éÍ·£¨block
header£©ºÍÕæÕýµÄÊý¾Ý£¨key-value ¶Ô£©¡£page header ¶¨ÒåÁËÒ³µÄÀàÐÍ¡¢Ò³´æ´¢µÄ¼Ç¼ÌõÊýµÈÐÅÏ¢£»¿éÍ·¶¨ÒåÁËÒ³µÄУÑéºÍ
checksum¡¢¿éÔÚ´ÅÅÌÉϵÄѰַλÖõÈÐÅÏ¢¡£
ÕæÕýµÄÊý¾ÝÓÉÒ»¸ö WT_ROW ½á¹¹µÄÊý×é±äÁ¿½øÐд洢£¬Ã¿Ò»Ìõ¼Ç¼»¹ÓÐÒ»¸ö cell_offset
±äÁ¿£¬±íʾÕâÌõ¼Ç¼ÔÚ page ÉÏµÄÆ«ÒÆÁ¿¡£WiredTiger ÓÐÒ»¸öÓÃÀ´Îª page ·ÖÅä block
µÄ¿éÉ豸¹ÜÀíÄ£¿é¡£¶¨Î»ÎĵµÎ»ÖÃʱ£¬ÏȼÆËã block µÄλÖã¬Í¨¹ý block µÄλÖÃÕÒµ½Ëü¶ÔÓ¦µÄ
page£¬ÔÙͨ¹ý page ÕÒµ½ÎĵµÐÐÊý¾ÝµÄÏà¶ÔλÖá£
leaf page ΪÁËʵÏÖ MVCC£¬»¹»áά»¤Ò»¸ö WT_UPDATE ½á¹¹µÄÊý×é±äÁ¿£¬Ã¿Ìõ¼Ç¼¶ÔÓ¦Ò»¸öÊý×éÔªËØ£¬Ã¿¸öÔªËØÊÇÒ»¸öÁ´±í£¬½«ËùÓÐÐÞ¸ÄÖµÒÔÁ´±íÐÎʽ±£´æ¡£
12.2 WiredTiger ѹËõ
WiredTiger Ö§³ÖÔÚÄÚ´æºÍ´ÅÅÌÉ϶ÔË÷Òý½øÐÐѹËõ£¬Í¨¹ýǰ׺ѹËõµÄ·½Ê½¼õÉÙ RAM µÄʹÓá£
12.3 WiredTiger Ò»ÖÂÐÔÔÀí
WiredTiger ʹÓÃÁ˶þ¼¶»º´æ WiredTiger Cache ºÍ File System
Cache À´±£Ö¤ Disk ÉÏ Database File Êý¾ÝµÄ×îÖÕÒ»ÖÂÐÔ¡£
WiredTiger Cache£ºÍ¨¹ý B+ Ê÷»º´æÎ´Ñ¹ËõµÄÊý¾Ý£¬²¢Í¨¹ýÌÔÌË㷨ȷ±£ÄÚ´æÕ¼ÓÃÔÚºÏÀí·¶Î§ÄÚ¡£
File System Cache£ºÓɲÙ×÷ϵͳ¹ÜÀí£¬»º´æÑ¹ËõºóµÄÊý¾Ý¡£
Database File£º´æ´¢Ñ¹ËõºóµÄÊý¾Ý¡£Ã¿¸ö WiredTiger ±í¶ÔÓ¦Ò»¸ö¶ÀÁ¢µÄ´ÅÅÌÎļþ¡£´ÅÅÌÎļþ»®·Ö³É¶à¸ö°´
4 KB ¶ÔÆëµÄ extent£¬²¢Í¨¹ý 3 ¸öÁ´±íÀ´¹ÜÀí£ºavailable list£¨¿É·ÖÅäµÄ extent
Áбí) £¬discard list£¨·ÏÆúµÄ extent ÁÐ±í£©ºÍ allocate list£¨µ±Ç°ÒÑ·ÖÅäµÄ
extent ÁÐ±í£©
12.4 WiredTiger MVCC
WiredTiger ʹÓà MVCC ½øÐÐд²Ù×÷£¬¶à¸ö¿Í»§¶Ë¿ÉÒÔ²¢·¢Í¬Ê±Ð޸ļ¯ºÏµÄ²»Í¬Îĵµ¡£ÊÂÎñ¿ªÊ¼Ê±£¬WiredTiger
Ϊ²Ù×÷Ìṩ·´Ó³ÄÚ´æÊý¾ÝµÄÒ»ÖÂÊÓͼµÄʱ¼äµã¿ìÕÕ¡£MVCC ͨ¹ý·ÇËø»úÖÆ½øÐжÁд²Ù×÷£¬ÊÇÒ»ÖÖÀÖ¹Û²¢·¢¿ØÖÆÄ£Ê½¡£WiredTiger
½öÔÚÈ«¾Ö¡¢Êý¾Ý¿âºÍ¼¯ºÏ¼¶±ðʹÓÃÒâÏòËø¡£µ±´æ´¢ÒýÇæ¼ì²âµ½Á½¸ö²Ù×÷Ö®¼ä´æÔÚ³åͻʱ£¬½«Òý·¢Ð´³åÍ»£¬´Ó¶øµ¼ÖÂ
MongoDB ×Ô¶¯ÖØÊԸòÙ×÷¡£
ʹÓà WiredTiger£¬Èç¹ûûÓÐ journal ¼Ç¼£¬MongoDB ÄÜÇÒ½öÄÜ´Ó×îºóÒ»¸ö¼ì²éµã»Ö¸´¡£Èç¹ûÐèÒª»Ö¸´×îºóÒ»´Î
checkpoint Ö®ºóËù×öµÄ¸ü¸Ä£¬ÄÇô¿ªÆôÈÕÖ¾ÊDZØÒªµÄ¡£
13 MongoDB Êý¾Ý¶Áд
13.1 ¶ÁÆ«ºÃ ReadPerference
ĬÈÏÇé¿öÏ£¬¿Í»§¶Ë¶ÁÈ¡¸´ÖƼ¯Ö÷½ÚµãÉϵÄÊý¾Ý¡£µ«¿Í»§¶Ë¿ÉÒÔÖ¸¶¨Ò»¸ö read perference ¸Ä±ä¶ÁÈ¡ÐÐΪ£¬ÒÔ±ã¶Ô¸´ÖƼ¯ÉÏµÄÆäËû½Úµã½øÐÐÖ±½Ó¶Á²Ù×÷¡£¿Éѡֵ°üÀ¨£º

13.2 ÔÚ¸´ÖƼ¯ÉϽøÐжÁд²Ù×÷
¶Á²Ù×÷Óɿͻ§¶ËÖ¸¶¨µÄ read prefenence Ñ¡Ïî¾ö¶¨¡£
ËùÓеÄд²Ù×÷¶¼ÔÚ¼¯ºÏµÄÖ÷½ÚµãÉÏÖ´ÐС£Ö÷½ÚµãÖ´ÐÐд²Ù×÷²¢½«²Ù×÷¼Ç¼ÔÚ²Ù×÷ÈÕÖ¾»ò oplog ÉÏ¡£oplog
ÊÇ local Êý¾Ý¿âµÄÒ»¸ö¼¯ºÏ£¬½Ð local.oplog.rs¡£ÕâÊÇÒ»¸ö capped collection£¬Êǹ̶¨´óС£¬Ñ»·Ê¹Óõġ£oplog
ÊǶÔÊý¾Ý¼¯µÄ¿ÉÖØ¸´²Ù×÷ÐòÁУ¬Æä¼Ç¼µÄÿ¸ö²Ù×÷¶¼ÊÇÃݵȵģ¬Ò²¾ÍÊÇ˵£¬¶ÔÄ¿±êÊý¾Ý¼¯Ó¦ÓÃÒ»´Î»ò¶à´Î oplog
²Ù×÷¶¼»á²úÉúÏàͬµÄ½á¹û¡£
´Ó½Úµã´ÓÉÏÒ»´Î½áÊøÊ±¼äµã½¨Á¢ tailable cursor£¬²»¶ÏµÄ´Óͬ²½Ô´ÀÈ¡ oplog ²¢ÖØ·ÅÓ¦Óõ½×ÔÉí£¬ÇÒÑϸñ°´ÕÕÔʼµÄд˳Ðò¶Ô¸ø¶¨µÄÎĵµÖ´ÐÐд²Ù×÷¡£mongodb
ʹÓöàÏß³ÌÅúÁ¿Ö´ÐÐд²Ù×÷À´Ìá¸ß²¢·¢£¬¸ù¾ÝÎĵµ id ½øÐзÖÅúÖ´ÐС£MongoDB ΪÁËÌáÉýͬ²½Ð§ÂÊ£¬½«ÀÈ¡
oplog ÒÔ¼°ÖØ·Å oplog ·Öµ½Á˲»Í¬µÄÏß³ÌÀ´Ö´ÐС£

´óÖµÄдÁ÷³ÌÈçÏ£º
producer thread ²»¶ÏµÄ´ÓÖ÷½ÚµãÉÏÀÈ¡ oplog£¬²¢°ÑËü¼ÓÈëµ½Ò»¸ö blockQueue
ÀblockQueue ²»ÊÇÎÞÏÞÈÝÁ¿µÄ£¬µ±³¬¹ý×î´ó´æ´¢ÈÝÁ¿£¬producer thread ¾Í±ØÐëµÈµ½
oplog ±» replBatcher thread ´Ó¶ÓÁÐÀïÈ¡³öºó²ÅÄܼÌÐøÀÈ¡ oplog¡£
replBatcher thread ²»¶Ï´Ó producer thread ¶ÔÓ¦µÄ blockQueue
ÀïÈ¡³ö oplog£¬·Åµ½×Ô¼ºµÄÄÚ´æ¶ÓÁÐÀÄÚ´æ¶ÓÁÐÒ²²»ÊÇÎÞÏÞÈÝÁ¿£¬Ò»µ©ÂúÁË£¬¾ÍÐèÒªµÈ´ý±» oplogApplication
thread Ïû·Ñ¡£
oplogApplication thread ²»¶ÏÈ¡³ö replBatch thread ÄÚ´æ¶ÓÁÐÀïµÄËùÓÐÔªËØ£¬·ÖÉ¢µ½²»Í¬µÄ
replWriter thread£¬ÓÉ replWriter thread ¸ù¾Ý oplog ½øÐÐд²Ù×÷¡£µÈ´ýËùÓÐ
oplog ¶¼Ó¦ÓÃÍê±Ï£¬oplogApplication hread ½«ËùÓÐµÄ oplog ˳ÐòдÈëµ½
local.oplog.rs ¼¯ºÏ¡£
13.3 ÔÚ·ÖÆ¬¼¯ÈºÉϽøÐжÁд²Ù×÷
¶ÔÓÚ·ÖÆ¬¼¯Èº£¬ÐèÒªÒ»¸ö mongos ʵÀýÌṩ¿Í»§¶ËÓ¦ÓóÌÐòºÍ·ÖƬ¼¯ÈºÖ®¼äµÄ½Ó¿Ú¡£ÔÚ¿Í»§¶Ë¿´À´£¬¸Ã
mongos ʵÀýµÄÐÐΪÓëÆäËû MongoDB ʵÀýÊÇÏàͬµÄ¡£¿Í»§¶ËÏò·Óɽڵã mongos ·¢ËÍÇëÇó£¬Óɸýڵã¾ö¶¨ÍùÄĸö·ÖƬ½øÐжÁд¡£¶ÔÓÚ¶ÁÈ¡²Ù×÷£¬ÈôÄܶ¨Ïòµ½Ìض¨·ÖƬʱ£¬Ð§ÂÊ×î¸ß¡£
Ò»°ã¶øÑÔ£¬·ÖƬ¼¯ºÏµÄ²éѯӦ°üº¬¼¯ºÏµÄ·ÖƬ¼ü£¬ÒÔ±ÜÃâµÍЧµÄÈ«·ÖƬ²éѯ¡£ÔÚÕâÖÖÇé¿öÏ£¬mongos ¿ÉÒÔʹÓÃÅäÖÃÊý¾Ý¿â
config Öеļ¯ÈºÔªÊý¾ÝÐÅÏ¢£¬½«²éѯ·Óɵ½·ÖƬ¡£Èç¹û²éѯ²»°üº¬·ÖƬ¼ü£¬Ôò mongos ½Úµã±ØÐ뽫²éѯ¶¨Ïòµ½¼¯ÈºÖеÄËùÓÐ·ÖÆ¬£¬È»ºóÔÚ
mongos ÉϾۺÏËùÓÐ·ÖÆ¬µÄ²éѯ½á¹û£¬·µ»Ø¸ø¿Í»§¶Ë¡£
¶ÔÓÚд²Ù×÷£¬ mongos ¶¨Ïòµ½¸ºÔðÊý¾Ý¼¯Ìض¨²¿·ÖµÄ·ÖƬ£¬config Êý¾Ý¿âÉÏÓм¯ºÏÏà¹ØµÄ·ÖƬ¼üÐÅÏ¢£¬mongos
´ÓÖжÁÈ¡ÅäÖ㬲¢Â·ÓÉд²Ù×÷µ½Êʵ±µÄ·ÖƬ¡£

14 MongoDB ÊÂÎñ
14.1 ACID ÌØÐÔ
MongoDB ÔÚÒ»¶¨³Ì¶ÈÉÏÖ§³ÖÁËÊÂÎñµÄ ACID ÌØÐÔ¡£MongoDB 4.0 °æ±¾¿ªÊ¼Ö§³Ö¸´ÖƼ¯ÉϵĶàÎĵµÊÂÎñ£¬4.2
°æ±¾ÒýÈëÁË·Ö²¼Ê½ÊÂÎñ£¬ËüÔö¼ÓÁË¶Ô·ÖÆ¬Èº¼¯É϶àÎĵµÊÂÎñµÄÖ§³Ö¡£
Ô×ÓÐÔ£º³É¹¦Ìá½»ÊÂÎñʱ£¬ÊÂÎñÖÐËùÓÐÊý¾Ý¸üн«ÍêÈ«½øÐгɹ¦£¬²¢ÔÚÊÂÎñÍⲿ¿É¼û¡£ÔÚÌá½»ÊÂÎñ֮ǰ£¬ÊÂÎñÍⲿ¿´²»µ½ÔÚÊÂÎñÖнøÐеÄÈκÎÊý¾Ý¸üС£µ±ÊÂÎñ±»´ò¶Ï»òÖÕֹʱ£¬ÊÂÎñÖнøÐеÄËùÓÐÊý¾Ý¸üж¼½«±»¶ªÆú£¬¶ÔÊÂÎñÍⲿÍêÈ«²»¿É¼û¡£µ«Êǵ±ÊÂÎñдÈë¶à¸ö·ÖƬʱ£¬²¢·ÇËùÓÐÊÂÎñÍâµÄ¶Á²Ù×÷¶¼ÐèÒªµÈ´ýÊÂÎñÌá½»ºóËùÓÐ·ÖÆ¬ÉÏÊý¾ÝÍêÈ«¿É¼û¡£
¸ôÀëÐÔ£ºMongoDB Ìṩ snapshot ¸ôÀë¼¶±ð£¬ÔÚÊÂÎñ¿ªÊ¼´´½¨Ò»¸ö WiredTiger
snapshot£¬È»ºóÔÚÕû¸öÊÂÎñ¹ý³ÌÖУ¬±ã¿ÉÒÔʹÓÃÕâ¸ö¿ìÕÕÌṩÊÂÎñ¶Á¡£
³Ö¾ÃÐÔ£ºÊÂÎñʹÓà write concern Ö¸¶¨ {j: true} ʱ£¬MongoDB »á±£Ö¤ÊÂÎñÈÕÖ¾Ìá½»²Å·µ»Ø£¬¼´Ê¹·¢Éú
crash£¬Ò²Äܸù¾ÝÊÂÎñÈÕÖ¾À´»Ö¸´£»¶øÈç¹ûûÓÐÖ¸¶¨ {j: true} ¼¶±ð£¬¼´Ê¹ÊÂÎñÌá½»³É¹¦ÁË£¬ÔÚ¹ÊÕϻָ´Ö®ºó£¬ÊÂÎñµÄÒ²¿ÉÄܱ»»Ø¹öµô¡£
Ò»ÖÂÐÔ£º²Î¿¼Ç°ÎÄÌáµ½µÄ MongoDB Ò»ÖÂÐÔ¡£
14.2 ÊÂÎñµÄʹÓÃÏÞÖÆ
½ö WiredTiger ÒýÇæÖ§³ÖÊÂÎñ¡£
¶Ô¼¯ºÏµÄ´´½¨ºÍɾ³ý²Ù×÷£¬²»ÄܳöÏÖÔÚÊÂÎñÖС£
¶ÔË÷ÒýµÄ´´½¨ºÍɾ³ý²Ù×÷£¬²»ÄܳöÏÖÔÚÊÂÎñÖС£
²»ÄܶÔϵͳ¼¶±ðµÄÊý¾Ý¿âºÍ¼¯ºÏ½øÐвÙ×÷¡£
ĬÈÏÇé¿öÏ£¬ÊÂÎñ´óСµÄÏÞÖÆÔÚ 16 MB¡£
ĬÈÏÇé¿öÏ£¬ÊÂÎñ²Ù×÷ÕûÌå²»ÔÊÐí³¬¹ý 60 Ãë¡£
ÊÂÎñ²»ÄÜÔÚ session ÍâÔËÐС£
Ò»¸ö session Ö»ÄÜÔËÐÐÒ»¸öÊÂÎñ£¬¶à¸ö session ¿ÉÒÔ²¢ÐÐÔËÐÐÊÂÎñ¡£
²»ÄÜ¶Ô capped collection ½øÐвÙ×÷¡£
²»ÄÜʹÓà explain ²Ù×÷×ö²éѯ·ÖÎö¡£
14.3 ÊÂÎñÓë read concern
ÊÂÎñÖеIJÙ×÷ʹÓÃÊÂÎñ¼¶±ðµÄ read concern¡£ÊÂÎñÄÚ²¿ºöÂÔÔÚ¼¯ºÏºÍÊý¾Ý¿â¼¶±ðÉèÖõÄÈκΠread
concern¡£ÊÂÎñÖ§³ÖÉèÖà read concern Ϊ local¡¢majority ºÍ snapshot
ÆäÖÐÖ®Ò»¡£
µ± read concern Ϊ local ʱ£¬¿É¶ÁÈ¡½Úµã¿ÉÓõÄ×îÐÂÊý¾Ý£¬µ«Êý¾Ý¿ÉÄܻعö¡£¶ÔÓÚ·ÖÆ¬Èº¼¯ÉϵÄÊÂÎñ£¬local
²»Äܱ£Ö¤Êý¾ÝÊÇ´ÓÕû¸ö·ÖƬµÄͬһ¿ìÕÕÊÓͼ»ñÈ¡¡£
µ± read concern Ϊ majority ʱ£¬Èç¹ûÔÚÌá½»ÊÂÎñʱָ¶¨ÁË write concern
Ϊ majority ¼¶±ð£¬Ôò·µ»Ø´ó¶àÊý¸±±¾³ÉÔ±ÒÑÈ·ÈϵÄÊý¾Ý£¨¼´ÎÞ·¨»Ø¹öÊý¾Ý£©¡£Èç¹ûÊÂÎñδָ¶¨ write
concern Ϊ majority ¼¶±ð£¬Ôò²»±£Ö¤¶Á²Ù×÷¿ÉÒÔ¶ÁÈ¡¶àÊýÌá½»µÄÊý¾Ý¡£¶ÔÓÚ·ÖÆ¬Èº¼¯ÉϵÄÊÂÎñ£¬²»Äܱ£Ö¤Êý¾ÝÊÇ´ÓÕû¸ö·ÖƬµÄͬһ¿ìÕÕÊÓͼÖлñÈ¡¡£
µ± read concern Ϊ snapshot ʱ£¬Èç¹ûÔÚÌá½»ÊÂÎñʱָ¶¨ÁË write concern
Ϊ majority ¼¶±ð£¬Ôò´Ó´ó¶àÊýÒÑÌá½»Êý¾ÝµÄ¿ìÕÕÖзµ»ØÊý¾Ý¡£Èç¹ûÊÂÎñδָ¶¨ write concern
Ϊ majority ¼¶±ð£¬Ôò²»±£Ö¤¶Á²Ù×÷ʹÓÃÁË majority commited µÄÊý¾ÝµÄ¿ìÕÕ¡£¶ÔÓÚ·ÖÆ¬Èº¼¯ÉϵÄÊÂÎñ£¬snapshot
¿ç·ÖƬͬ²½¡£
14.4 ÊÂÎñÓë write concern
ÊÂÎñʹÓÃÊÂÎñ¼¶±ðµÄ write concern À´½øÐÐд²Ù×÷Ìá½»£¬¿ÉÒÔͨ¹ýÅäÖà w Ñ¡ÏîÉèÖýڵã¸öÊý£¬À´¾ö¶¨ÊÂÎñдÈëÊÇ·ñ³É¹¦£¬Ä¬ÈÏÇé¿öÏÂΪ
1¡£
w:0 ±íʾÊÂÎñдÈë²»¹Ø×¢ÊÇ·ñ³É¹¦£¬Ä¬ÈÏΪ³É¹¦¡£
w:1 ±íʾÊÂÎñдÈëµ½Ö÷½Úµã¾Í¿ªÊ¼Íù¿Í»§¶Ë·¢ËÍÈ·ÈÏдÈë³É¹¦¡£
w:majority ±íʾ´ó¶àÊý½Úµã³É¹¦ÔÔò£¬ÀýÈçÒ»¸ö¸´ÖƼ¯ 3 ¸ö½Úµã£¬2 ¸ö½Úµã³É¹¦¾ÍÈÏΪ±¾´ÎÊÂÎñдÈë³É¹¦¡£
w:all ±íʾËùÓнڵ㶼дÈë³É¹¦£¬²ÅÈÏΪÊÂÎñÌá½»³É¹¦¡£
j:false ±íʾд²Ù×÷µ½´ïÄÚ´æ¾ÍËãÊÂÎñ³É¹¦¡£
j:true ±íʾд²Ù×÷Ö»ÓмǼµ½ÈÕÖ¾Îļþ²ÅËãÊÂÎñ³É¹¦¡£
wtimeout: дÈ볬ʱʱ¼ä£¬¹ýÆÚ±íʾÊÂÎñʧ°Ü¡£
15 MongoDB Change Stream
15.1 ±ä¸üÁ÷ʹÓó¡¾°
MongoDB 3.6 ÒýÈëÁË change stream£¨±ä¸üÁ÷£©¡£ËüµÄʹÓó¡¾°°üÀ¨£º
Êý¾Ýͬ²½£º¶à¸ö MongoDB ¼¯ÈºÖ®¼äµÄÔöÁ¿Êý¾Ýͬ²½¡£
É󼯣º¶Ô MongoDB ²Ù×÷½øÐÐÉ󼯡¢¼à¿Ø¡£
Êý¾Ý¶©ÔÄ£ºÍⲿ³ÌÐò¶©ÔÄ MongoDB µÄÊý¾Ý±ä¸ü£¬¿ÉÀëÏßÊý¾Ýͬ²½¡¢¼ÆËã»ò·ÖÎöµÈ¡£
15.2 ±ä¸üÁ÷ÌØµã
change stream ÔÊÐíÍⲿ³ÌÐò·ÃÎÊʵʱÊý¾Ý¸ü¸Ä£¬¶ø²»»áÔö¼Ó MongoDB »ù´¡²Ù×÷µÄ¸´ÔÓÐÔ£¬Ò²²»»áµ¼ÖÂ
oplog ÑӳٵķçÏÕ¡£Ó¦ÓóÌÐò¿ÉÒÔʹÓà change stream À´¶©Ôĵ¥¸ö¼¯ºÏ¡¢Êý¾Ý¿â»òÕû¸ö¼¯ÈºÖеÄËùÓÐÊý¾Ý±ä¸ü¡£ÈôÒª¿ªÆô
change stream£¬±ØÐëʹÓà WiredTiger ´æ´¢ÒýÇæ¡£
change stream ¿ÉÓ¦ÓÃÓÚ¸´ÖƼ¯ºÍ·ÖƬ¼¯¡£Ó¦ÓÃÓÚ¸´ÖƼ¯Ê±£¬¿ÉÒÔÔÚ¸´ÖƼ¯ÖÐÈÎÒâÒ»¸ö½ÚµãÉÏ¿ªÆô¼àÌý£»Ó¦ÓÃÓÚ·ÖÆ¬¼¯Ê±£¬ÔòÖ»ÄÜÔÚ
mongos ÉÏ¿ªÆô¼àÌý¡£ÔÚ mongos ÉÏ·¢Æð¼àÌý£¬ÊÇÀûÓÃÈ«¾ÖÂ߼ʱÖÓÌṩÁËÕû¸ö·ÖƬÉϱä¸üµÄ×ÜÌåÅÅÐò£¬È·±£¼àÌýʼþ¿ÉÒÔ°´½ÓÊÕµ½µÄ˳Ðò°²È«µØ½âÊÍ¡£
mongos »áÒ»Ö±¼ì²éÿ¸ö·ÖƬ£¬²é¿´Ã¿¸ö·ÖƬÊÇ·ñ´æÔÚ×îеıä¸ü¡£Èç¹û¶à¸ö·ÖƬÉÏÒ»Ö±ºÜÉÙ³öÏÖ±ä¸ü£¬Ôò¿ÉÄÜ»á¶Ô
change stream µÄÏìӦʱ¼ä²úÉú¸ºÃæÓ°Ï죬ÒòΪ mongos ÈÔ±ØÐë¼ì²éÕâЩÀä·ÖƬ±£³Ö×ÜÌåÓÐÐò¡£
15.3 ±ä¸üÁ÷¼àÌýʼþÀàÐÍ
´Ó change stream ÖÐÄܼàÌýµ½µÄ±ä¸üʼþ°üÀ¨£ºinsert¡¢update¡¢replace¡¢delete¡¢drop¡¢rename¡¢dropDatabase
ºÍ invalidate¡£
15.4 ±ä¸üÁ÷¹ÊÕϻָ´
MongoDB 4.0 Ö®ºó£¬¿ÉÒÔͨ¹ýÖ¸¶¨ startAtOperationTime À´¿ØÖÆ´Óij¸öÌØ¶¨µÄʱ¼äµã¿ªÆô¼àÌý£¬µ«¸Ãʱ¼äµã±ØÐëÔÚËùÑ¡Ôñ½ÚµãµÄÓÐЧ
oplog ʱ¼ä·¶Î§ÄÚ¡£change stream ¼àÌý·µ»ØµÄ×Ö¶ÎÖÐÓиö _id ×ֶΣ¬±íʾµÄÊÇ resume
token£¬ÕâÊÇΨһ±êÖ¾ change stream Á÷ÖеÄλÖõÄ×ֶΡ£
Èç¹û change stream ¼àÌý±ÈÖÐÖ¹ºóÐèÒª¼ÌÐø¼àÌý£¬ÄÇô¿ÉÖ¸¶¨ resumeAfter »Ö¸´¶©ÔÄ¡£Ö¸¶¨
resumeAfter Ϊ change stream Öжϴ¦µÄ _id ×ֶμ´¿É¡£
µ±¼àÌýµÄ¼¯ºÏ·¢Éú rename¡¢drop »ò dropDatabase ʼþ£¬¾Í»áµ¼Ö invalidate
ʼþ£»µ±¼àÌýµÄÊý¾Ý¿â³öÏÖ dropDatabase ʼþ£¬Ò²»áµ¼ÖÂÎÞЧʼþ¡£invalidate ʼþºó
change stream µÄÓαê»á±»¹Ø±Õ£¬Õâʱ¾ÍÐèҪʹÓà resumeAfter Ñ¡ÏîÀ´»Ö¸´ change
stream µÄ¼àÌý£¬ÔÚ 4.2 °æ±¾ºóÒ²¿ÉÒÔͨ¹ý startAfter Ñ¡Ïî´´½¨Ðµĸü¸ÄÁ÷À´»Ö¸´¼àÌý¡£
15.5 ±ä¸üÁ÷ʹÓÃÏÞÖÆ
change stream ÎÞ·¨ÅäÖõ½ÏµÍ³¿â»òÕß system.xxx ±íÉÏ¡£
change stream ÒÀÀµÓÚ oplog£¬Òò´ËÖжÏʱ¼ä²»¿É³¬¹ý oplog »ØÊÕµÄ×î´óʱ¼ä´°¡£
16 MongoDB ÐÔÄÜÎÊÌⶨλ·½Ê½
¿ÉÒÔΪ mongod ʵÀýÆôÓÃÊý¾Ý¿â·ÖÎö¡£Êý¾Ý¿â·ÖÎöÆ÷¼È¿ÉÒÔÔÚʵÀýÉÏÆôÓã¬Ò²¿ÉÒÔÔÚµ¥¸öÊý¾Ý¿â²ãÃæÉÏÆôÓá£ËüÊÕ¼¯ÔÚʵÀýÉÏÖ´ÐеÄ
CRUD ²Ù×÷¡¢ÓαꡢÃüÁî¡¢ÅäÖõÈÏêϸÐÅÏ¢£¬²¢½«ËüÊÕ¼¯µÄËùÓÐÊý¾Ýдµ½ system.profile
¼¯ºÏ¡£ÕâÊÇÒ»¸ö capped collection£¬Ä¬ÈÏÇé¿öÏ£¬system.profile ÈÝÁ¿´óСΪ
4M¡£¿ªÆôʵʱÊý¾Ý¿â·ÖÎöÍùÍù°éËæ×Ÿ±×÷Óã¬Çë½÷É÷ʹÓá£
ʹÓà db.currentOp() ²Ù×÷¡£Ëü·µ»ØÒ»¸öÎĵµ£¬ÆäÖаüº¬ÓйØÊý¾Ý¿âʵÀýÕýÔÚ½øÐеIJÙ×÷µÄÐÅÏ¢¡£
ʹÓà db.serverStatus() ÃüÁî¡£Ëü·µ»ØÒ»¸öÎĵµ£¬ÌṩÊý¾Ý¿â״̬µÄ¸ÅÊö£¬Í¨¹ýËü¿ÉÒÔÊÕ¼¯ÓйظÃʵÀýµÄͳ¼ÆÐÅÏ¢¡£
ʹÓà explain À´ÆÀ¹À²éѯÐÔÄÜ£¬ÀýÈç cursor.explain() »ò db.collection.explain()
·½·¨¿ÉÒÔÓÃÀ´·µ»Ø¹ØÓÚ²éѯִÐеÄÐÅÏ¢¡£
½èÓÃһЩÉÌÒµ¹¤¾ß£¬±ÈÈç MongoDB Ops Manager¡¢Percona µÈ¡£ |