ÏßÉÏÔËÐеķþÎñ»á²úÉú´óÁ¿µÄÔËÐм°·ÃÎÊÈÕÖ¾£¬ÈÕÖ¾Àï»á°üº¬Ò»Ð©´íÎó¡¢¾¯¸æ¡¢¼°Óû§ÐÐΪµÈÐÅÏ¢£¬Í¨³£·þÎñ»áÒÔÎı¾µÄÐÎʽ¼Ç¼ÈÕÖ¾ÐÅÏ¢£¬ÕâÑù¿É¶ÁÐÔÇ¿£¬·½±ãÓÚÈÕ³£¶¨Î»ÎÊÌ⣬µ«µ±²úÉú´óÁ¿µÄÈÕÖ¾Ö®ºó£¬ÒªÏë´Ó´óÁ¿ÈÕÖ¾ÀïÍÚ¾ò³öÓмÛÖµµÄÄÚÈÝ£¬ÔòÐèÒª¶ÔÊý¾Ý½øÐнøÒ»²½µÄ´æ´¢ºÍ·ÖÎö¡£
±¾ÎÄÒÔ´æ´¢ web ·þÎñµÄ·ÃÎÊÈÕ־ΪÀý£¬½éÉÜÈçºÎʹÓà MongoDB À´´æ´¢¡¢·ÖÎöÈÕÖ¾Êý¾Ý£¬ÈÃÈÕÖ¾Êý¾Ý·¢»Ó×î´óµÄ¼ÛÖµ£¬±¾ÎĵÄÄÚÈÝͬÑùʹÓÃÆäËûµÄÈÕÖ¾´æ´¢ÐÍÓ¦Óá£
ģʽÉè¼Æ
Ò»¸öµäÐ͵Äweb·þÎñÆ÷µÄ·ÃÎÊÈÕÖ¾ÀàËÆÈçÏ£¬°üº¬·ÃÎÊÀ´Ô´¡¢Óû§¡¢·ÃÎʵÄ×ÊÔ´µØÖ·¡¢·ÃÎʽá¹û¡¢Óû§Ê¹ÓõÄϵͳ¼°ä¯ÀÀÆ÷ÀàÐ͵È
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] " GET /apache_pb.gif HTTP/1.0" 200 2326 " [http://www.example.com/start.html] (http://www.example.com/start.html)" "Mozilla/4.08 [en] (Win98; I ;Nav)" |
×î¼òµ¥´æ´¢ÕâЩÈÕÖ¾µÄ·½·¨ÊÇ£¬½«Ã¿ÐÐÈÕÖ¾´æ´¢ÔÚÒ»¸öµ¥¶ÀµÄÎĵµÀÿÐÐÈÕÖ¾ÔÚMongoDBÀïÀàËÆ
{ _id: ObjectId('4f442120eb03305789000000'), line: '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 " [http://www.example.com/start.html] (http://www.example.com/start.html)" "Mozilla/4.08 [en] (Win98; I ;Nav)"' } |
ÉÏÊöģʽËäÈ»Äܽâ¾öÈÕÖ¾´æ´¢µÄÎÊÌ⣬µ«Ê¹µÃÕâЩÊý¾Ý·ÖÎöÆðÀ´±È½ÏÂé·³£¬ÒòΪÎı¾·ÖÎö²¢²»ÊÇMongoDBËùÉó¤µÄ£¬¸üºÃµÄ°ì·¨Ê±£¬ÔÚ°ÑÒ»ÐÐÈÕÖ¾´æ´¢µ½MongoDBµÄÎĵµÀïǰ£¬ÏÈÌáÈ¡³ö¸÷¸ö×ֶεÄÖµ£¬ÈçÏÂËùʾ£¬ÉÏÊöµÄÈÕÖ¾±»×ª»»ÎªÒ»¸ö°üº¬ºÜ¶à¸ö×ֶεÄÎĵµ¡£
{ _id: ObjectId('4f442120eb03305789000000'), host: "127.0.0.1", logname: null, user: 'frank', time: ISODate("2000-10-10T20:55:36Z"), path: "/apache_pb.gif", request: "GET /apache_pb.gif HTTP/1.0", status: 200, response_size: 2326, referrer: "[http://www.example.com/start.html] (http://www.example.com/start.html)", user_agent: "Mozilla/4.08 [en] (Win98; I ;Nav)" } |
ͬʱ£¬ÔÚÕâ¸ö¹ý³ÌÖУ¬Èç¹ûÄã¾õµÃÓÐЩ×ֶζÔÊý¾Ý·ÖÎöûÓÐÈκΰïÖú£¬Ôò¿ÉÒÔÖ±½Ó¹ýÂ˵ô£¬ÒÔ¼õÉÙ´æ´¢ÉϵÄÏûºÄ£¬±ÈÈç
Êý¾Ý·ÖÎö²»»á¹ØÐÄuserÐÅÏ¢¡¢request¡¢statusÐÅÏ¢£¬Õ⼸¸ö×Ö¶Îû±ØÒª´æ´¢
ObjectIdÀï±¾Éí°üº¬ÁËʱ¼äÐÅÏ¢£¬Ã»±ØÒªÔÙµ¥¶À´æ´¢Ò»¸ötime×Ö¶Î (µ±È»´øÉÏtimeÒ²Óкô¦£¬time¸üÄÜ´ú±íÇëÇó²úÉúµÄʱ¼ä£¬¶øÇÒ²éѯÓï¾äдÆðÀ´¸ü·½±ã£¬¾¡Á¿Ñ¡Ôñ´æ´¢¿Õ¼äÕ¼ÓÃСµÄÊý¾ÝÀàÐÍ£©
»ùÓÚÉÏÊö¿¼ÂÇ£¬Ò»ÐÐÈÕÖ¾×îÖÕ´æ´¢µÄÄÚÈÝ¿ÉÄÜÀàËÆÈçÏÂ
{ _id: ObjectId('4f442120eb03305789000000'), host: "127.0.0.1", time: ISODate("2000-10-10T20:55:36Z"), path: "/apache_pb.gif", referer: "[http://www.example.com/start.html] (http://www.example.com/start.html)", user_agent: "Mozilla/4.08 [en] (Win98; I ;Nav)" } |
дÈÕÖ¾
ÈÕÖ¾´æ´¢·þÎñÐèÒªÄÜͬʱ֧³Ö´óÁ¿µÄÈÕ־дÈ룬Óû§¿ÉÒÔ¶¨ÖÆ writeConcern À´¿ØÖÆÈÕ־дÈëÄÜÁ¦,ÃÍ»÷ÕâÀïÏêϸÁ˽âwriteConcern
db.events.insert({ host: "127.0.0.1", time: ISODate("2000-10-10T20:55:36Z"), path: "/apache_pb.gif", referer: "[http://www.example.com/start.html] (http://www.example.com/start.html)", user_agent: "Mozilla/4.08 [en] (Win98; I ;Nav)" } ) |
Èç¹ûÒªÏë´ïµ½×î¸ßµÄдÈëÍÌÍ£¬¿ÉÒÔÖ¸¶¨ writeConcern Ϊ {w: 0}
¶øÈç¹ûÈÕÖ¾µÄÖØÒªÐԱȽϸߣ¨±ÈÈçÐèÒªÓÃÈÕÖ¾À´×÷Ϊ¼Æ·Ñƾ֤£©£¬Ôò¿ÉÒÔʹÓøü°²È«µÄwriteConcern¼¶±ð£¬±ÈÈç
{w: 1} »ò {w: "majority"}
ͬʱ£¬ÎªÁË´ïµ½×îÓŵÄдÈëЧÂÊ£¬Óû§»¹¿ÉÒÔ¿¼ÂÇÅúÁ¿µÄдÈ뷽ʽ£¬Ò»´ÎÍøÂçÇëÇóдÈë¶àÌõÈÕÖ¾¡£
db.events.insert([doc1, doc2, ...]) |
²éѯÈÕÖ¾
µ±ÈÕÖ¾°´ÉÏÊö·½Ê½´æ´¢µ½ MongoDB ºó£¬¾Í¿ÉÒÔÂú×ã¸÷ÖÖ²éѯÐèÇó
²éѯËùÓзÃÎÊ /apache_pb.gif µÄÇëÇó
q_events = db.events.find({'path': '/apache_pb.gif'}) |
Èç¹ûÕâÖÖ²éѯ·Ç³£Æµ·±£¬¿ÉÒÔÕë¶Ôpath×ֶν¨Á¢Ë÷Òý£¬ÒÔ¸ßЧµÄ·þÎñÕâÀà²éѯ
db.events.createIndex({path: 1}) |
²éѯijһÌìµÄËùÓÐÇëÇó
q_events = db.events.find ({'time': { '$gte': ISODate("2016-12-19T00:00:00.00Z"), '$lt': ISODate("2016-12-20T00:00:00.00Z")}}) |
ͨ¹ý¶Ôtime×ֶν¨Á¢Ë÷Òý£¬¿É¼ÓËÙÕâÀà²éѯ
db.events.createIndex({time: 1}) |
²éѯij̨Ö÷»úÒ»¶Îʱ¼äÄÚµÄËùÓÐÇëÇó
q_events = db.events.find({ 'host': '127.0.0.1', 'time': {'$gte': ISODate("2016-12-19T00:00:00.00Z"), '$lt': ISODate("2016-12-20T00:00:00.00Z" }}) |
ͨ¹ý¶Ôhost¡¢time½¨Á¢¸´ºÏË÷Òý¿ÉÒÔ¼ÓËÙÕâÀà²éѯ
db.events.createIndex({host: 1, time: 1}) |
ͬÑù£¬Óû§»¹¿ÉÒÔʹÓÃMongoDBµÄaggregation¡¢mapreduce¿ò¼ÜÀ´×öһЩ¸ü¸´ÔӵIJéѯ·ÖÎö£¬ÔÚʹÓÃʱӦ¸Ã¾¡Á¿½¨Á¢ºÏÀíµÄË÷ÒýÒÔÌáÉý²éѯЧÂÊ¡£
Êý¾Ý·ÖƬ
µ±Ð´ÈÕÖ¾µÄ·þÎñ½ÚµãÔ½À´Ô½¶àʱ£¬ÈÕÖ¾´æ´¢µÄ·þÎñÐèÒª±£Ö¤¿ÉÀ©Õ¹µÄÈÕ־дÈëÄÜÁ¦ÒÔ¼°º£Á¿µÄÈÕÖ¾´æ´¢ÄÜÁ¦£¬Õâʱ¾ÍÐèҪʹÓÃMongoDB
shardingÀ´À©Õ¹£¬½«ÈÕÖ¾Êý¾Ý·ÖÉ¢´æ´¢µ½¶à¸öshard£¬¹Ø¼üµÄÎÊÌâ¾ÍÊÇshard keyµÄÑ¡Ôñ¡£
°´Ê±¼ä´Á×Ö¶Î·ÖÆ¬
Ò»ÖÖ¼òµ¥µÄ·½Ê½ÊÇʹÓÃʱ¼ä´ÁÀ´½øÐÐ·ÖÆ¬£¨ÈçObjectIdÀàÐ͵Ä_id£¬»òÕßtime×ֶΣ©£¬ÕâÖÖ·ÖÆ¬·½Ê½´æÔÚÈçÏÂÎÊÌâ
ÒòΪʱ¼ä´Áһֱ˳ÐòÔö³¤µÄÌØÐÔ£¬ÐµÄдÈë¶¼»á·Öµ½Í¬Ò»¸öshard£¬²¢²»ÄÜÀ©Õ¹ÈÕ־дÈëÄÜÁ¦
ºÜ¶àÈÕÖ¾²éѯÊÇÕë¶Ô×îеÄÊý¾Ý£¬¶ø×îеÄÊý¾Ýͨ³£Ö»·ÖÉ¢ÔÚ²¿·ÖshardÉÏ£¬ÕâÑùµ¼Ö²éѯҲֻ»áÂäµ½²¿·Öshard
°´Ëæ»ú×Ö¶Î·ÖÆ¬
°´ÕÕ_id×Ö¶ÎÀ´½øÐÐhash·ÖƬ£¬Äܽ«Êý¾ÝÒÔ¼°Ð´Èë¶¼¾ùÔȶ¼·ÖÉ¢µ½¸÷¸öshard£¬Ð´ÈëÄÜÁ¦»áËæshardÊýÁ¿ÏßÐÔÔö³¤£¬µ«¸Ã·½°¸µÄÎÊÌâʱ£¬Êý¾Ý·ÖÉ¢ºÁÎÞ¹æÂÉ£¬ËùÓеķ¶Î§²éѯ£¨Êý¾Ý·ÖÎö¾³£ÐèÒªÓõ½£©¶¼ÐèÒªÔÚËùÓеÄshardÉϽøÐвéÕÒÈ»ºóºÏ²¢²éѯ½á¹û£¬Ó°Ïì²éѯЧÂÊ¡£
°´¾ùÔÈ·Ö²¼µÄkey·ÖƬ
¼ÙÉèÉÏÊö³¡¾°Àï path ×ֶεķֲ¼ÊDZȽϾùÔȵ쬶øÇҺܶà²éѯ¶¼Êǰ´pathά¶ÈÈ¥»®·ÖµÄ£¬ÄÇô¿ÉÒÔ¿¼Âǰ´ÕÕpath×ֶζÔÈÕÖ¾Êý¾Ý½øÐÐ·ÖÆ¬£¬ºÃ´¦ÊÇ
дÇëÇó»á±»¾ù·Öµ½¸÷¸öshard
Õë¶ÔpathµÄ²éѯÇëÇó»á¼¯ÖÐÂ䵽ij¸ö£¨»ò¶à¸ö£©shard£¬²éѯЧÂʸß
²»×ãµÄµØ·½ÊÇ
Èç¹ûij¸öpath·ÃÎÊÌØ±ð¶à£¬»áµ¼Öµ¥¸öchunkÌØ±ð´ó£¬Ö»ÄÜ´æ´¢µ½µ¥¸öshard£¬ÈÝÒ׳öÏÖ·ÃÎÊÈȵã
Èç¹ûpathµÄȡֵºÜÉÙ£¬Ò²»áµ¼ÖÂÊý¾Ý²»Äܺܺõķֲ¼µ½¸÷¸öshard
µ±È»ÉÏÊö²»×ãµÄµØ·½Ò²Óа취¸Ä½ø£¬·½·¨ÊǸø·ÖƬkeyÀïÒýÈëÒ»¸ö¶îÍâµÄÒò×Ó,±ÈÈçÔÀ´µÄshard keyÊÇ
{path: 1}£¬ÒýÈë¶îÍâµÄÒò×Óºó±ä³É
{path: 1, ssk: 1} ÆäÖÐssk¿ÉÒÔÊÇÒ»¸öËæ»úÖµ£¬ ±ÈÈç_idµÄhashÖµ£¬»òÊÇʱ¼ä´Á ÕâÑùÏàͬµÄpath»¹ÊǸù¾Ýʱ¼äÅÅÐòµÄ |
ÕâÑù×öµÄЧ¹ûÊÇ·ÖÆ¬keyµÄȡֵ·Ö²¼·á¸»£¬²¢ÇÒ²»»á³öÏÖµ¥¸öÖµÌØ±ð¶àµÄÇé¿ö¡£
ÉÏÊö¼¸ÖÖ·ÖÆ¬·½Ê½¸÷ÓÐÓÅÁÓ£¬Óû§¿ÉÒÔ¸ù¾Ýʵ¼ÊÐèÇóÀ´Ñ¡Ôñ·½°¸¡£
Ó¦¶ÔÊý¾ÝÔö³¤
·ÖƬµÄ·½°¸ÄÜÌṩº£Á¿µÄÊý¾Ý´æ´¢Ö§³Ö£¬µ«Ëæ×ÅÊý¾ÝÔ½À´Ô½¶à£¬´æ´¢µÄ³É±¾»á²»¶ÏµÄÉÏÉý£¬¶øÍ¨³£ºÜ¶àÈÕÖ¾Êý¾ÝÓиöÌØÐÔ£¬ÈÕÖ¾Êý¾ÝµÄ¼ÛÖµËæÊ±¼äµÝ¼õ£¬±ÈÈç1Äêǰ¡¢ÉõÖÁ3¸öÔÂǰµÄÀúÊ·Êý¾ÝÍêȫûÓзÖÎö¼ÛÖµ£¬Õⲿ·Ö¿ÉÒÔ²»Óô洢£¬ÒÔ½µµÍ´æ´¢³É±¾£¬¶øÔÚMongoDBÀïÓкܶ෽·¨Ö§³ÖÕâÒ»ÐèÇó¡£
TTL Ë÷Òý
MongoDB µÄTTLË÷Òý ¿ÉÒÔÖ§³ÖÎĵµÔÚÒ»¶¨Ê±¼äÖ®ºó×Ô¶¯¹ýÆÚɾ³ý£¬ÀýÈçÉÏÊöÈÕÖ¾time×ֶδú±íÁËÇëÇó²úÉúµÄʱ¼ä£¬Õë¶Ô¸Ã×ֶν¨Á¢Ò»¸öTTLË÷Òý£¬ÔòÎĵµ»áÔÚ30Ììºó×Ô¶¯±»É¾³ý¡£
db.events.createIndex( { time: 1 }, { expireAfterSeconds: 108000 } ) |
TTL Ë÷ÒýĿǰÊǺǫ́µ¥Ïß³ÌÀ´¶¨ÆÚ£¨Ä¬ÈÏ60sÒ»´Î£©È¥É¾³ýÒѹýÆÚµÄÎĵµ£¬Èç¹ûдÈëºÜ¶à£¬µ¼Ö»ýÀÛÁË´óÁ¿´ý¹ýÆÚµÄÎĵµ£¬Ôò»áµ¼ÖÂÎĵµ¹ýÆÚÒ»Ö±¸ú²»É϶øÒ»Ö±Õ¼ÓÃ×Å´æ´¢¿Õ¼ä¡£
ʹÓÃCapped¼¯ºÏ
Èç¹û¶ÔÈÕÖ¾±£´æµÄʱ¼äûÓÐÌØ±ðÑϸñµÄÒªÇó£¬Ö»ÊÇÔÚ×ܵĴ洢¿Õ¼äÉÏÓÐÏÞÖÆ£¬Ôò¿ÉÒÔ¿¼ÂÇʹÓÃcapped collectionÀ´´æ´¢ÈÕÖ¾Êý¾Ý£¬Ö¸¶¨Ò»¸ö×î´óµÄ´æ´¢¿Õ¼ä»òÎĵµÊýÁ¿£¬µ±´ïµ½ãÐֵʱ£¬MongoDB»á×Ô¶¯É¾³ýcapped
collectionÀï×îÀϵÄÎĵµ¡£
db.createCollection("event", {capped: true, size: 104857600000} |
¶¨ÆÚ°´¼¯ºÏ»òDB¹éµµ
±ÈÈçÿµ½Ôµ׾ͽ«events¼¯ºÏ½øÐÐÖØÃüÃû£¬Ãû×ÖÀï´øÉϵ±Ç°µÄÔ·ݣ¬È»ºó´´½¨ÐµÄevents¼¯ºÏÓÃÓÚдÈ룬±ÈÈç2016ÄêµÄÈÕÖ¾×îÖջᱻ´æ´¢ÔÚÈçÏÂ12¸ö¼¯ºÏÀï
events-201601 events-201602 events-201603 events-201604 .... events-201612 |
µ±ÐèÒªÇåÀíÀúÊ·Êý¾Ýʱ£¬Ö±½Ó½«¶ÔÓ¦µÄ¼¯ºÏɾ³ýµô
db["events-201601"].drop() db["events-201602"].drop() |
²»×㵽ʱºò£¬Èç¹ûÒª²éѯ¶à¸öÔ·ݵÄÊý¾Ý£¬²éѯµÄÓï¾ä»áÉÔ΢¸´ÔÓЩ£¬ÐèÒª´Ó¶à¸ö¼¯ºÏÀï²éѯ½á¹ûÀ´ºÏ²¢ |