Quipperã§ã¯ã¡ã¤ã³ã®ãã¼ã¿ãã¼ã¹ã¨ãã¦MongoDBãæ´»ç¨ãã¦ããããã¼ã¿ãµã¤ãºã¯1TBãè¶
ãã¦ãã¾ãã
ããã¾ã§ã¦ã¼ã¶ã¼ããã¼ã¿ãå¢ãããã³ã«ã¹ã±ã¼ã«ã¢ãããç¹°ãè¿ãã¦ããã®ã§ãAWSã®æé«æ§è½ã®ãµã¼ãã使ãç¶æ³ã«ãªã£ã¦ãã¾ããã ãã®ãããªå¤§è¦æ¨¡ãªãµã¼ãã¹ã«ãããMongoDBã®éç¨ã«ã¤ãã¦æ¸ãã¦ããããã¨æãã¾ãã
ä»åã¯ã¤ã³ããã¯ã¹ç·¨ã§ãã
ã¯ããã«
å½è¨äºã§ç»å ´ããMongoDBã®æ§æ
- ã¯ã©ã¹ã¿ã¼ç®¡ç: MongoDB Cloud Manager & AWS EC2
- ReplicaSet Cluster: Primary, Secondary, Hidden Secondary
- EC2 instance type; i3en.24xlarge (Primary/Secondary)
- RAM: 768GB (Primary/Secondary)
- MongoDB Version: 4.0
MongoDBã®ã¤ã³ããã¯ã¹ã¨ã¯
MongoDBã¯ã¹ãã¼ãã¬ã¹ãªNoSQLã§ãããã¤ã³ããã¯ã¹ã«é¢ãã¦ã¯RDBã®ã¤ã³ããã¯ã¹ã¨åããããªå½¹å²ããã¾ãã
ä¾ãã°ãã¼ã¿ãæ¤ç´¢ããã¨ãã«ãã¤ã³ããã¯ã¹ãå¼µã£ã¦ããªããã£ã¼ã«ãããã¼ã«ããã¨ãã£ã¹ã¯ä¸ã®ãã¹ã¦ã®ãã¼ã¿ãæ¤ç´¢ããªããã°ãªãã¾ããã
ããã§äºãæ¤ç´¢ããããã£ã¼ã«ãããã¨ãã°ã¦ã¼ã¶ã¼IDãªã©ã«ã¤ã³ããã¯ã¹ãä»ãã¦ããã°ãããããã¼ã«å¿ è¦æå°éã®ãã¼ã¿ã ãããã£ã¹ã¯ã«åãã«è¡ããããã«ãªãã¾ãã
ã¤ã³ããã¯ã¹ã«é¢ããä¸è¬çãªèãæ¹ã¨å¤§è¦æ¨¡ãµã¼ãã¹ã«ãããèãæ¹ã®éã
以ä¸ã®ããã«ããã©ã¼ãã³ã¹ã»ãã¥ã¼ãã³ã°ããããã¨ãããã¨æãã¾ãã
äºä¾ï¼ã¯ã¨ãªãé ãåå ã調ã¹ã¦ãã®ã¯ã¨ãªã使ããã¼ã«ã¤ã³ããã¯ã¹ããªãå ´åã«ã¤ã³ããã¯ã¹ã追å
ä¸è¬çã«ããã¯æ£ãã対å¦ã ã¨æãããã¼ããçµé¨ãããã¾ãã
ããããMongoDBã®å ´åãæ¦ãã¤ã³ããã¯ã¹ããã¹ã¦ã¡ã¢ãªä¸ã«ä¹ããå¿ è¦ãããã¨ããç¹ãèæ ®ããªããã°ãªãã¾ããã å ¬å¼ããã¥ã¡ã³ãã«ä»¥ä¸ã®ããã«æ¸ããã¦ãã¾ãã
Ensure Indexes Fit in RAM
For the fastest processing, ensure that your indexes fit entirely in RAM so that the system can avoid reading the index from disk.
å®éã«Quipperã§ã¯ããããæºãããã¦ããªãã¨ãã«DBã®ããã©ã¼ãã³ã¹ãè½ã¡ãã¨ããäºè±¡ãçºçãã¦ããããMongoDB社ã®ã¨ãã¹ãã¼ãã«ã³ã³ãµã«ãã£ã³ã°ãåããéã«ããã®ç¹ãææããã¾ããã
ã¤ã³ããã¯ã¹ã«å¿ è¦ãªãµã¼ãã¡ã¢ãªã®è¨ç®
ä¾ãã°ã以ä¸ã®ãããªãµã¤ãºã®ãã¼ã¿ãã¼ã¹ãããã¨ãã¾ãã
- ãã¼ã¿ãµã¤ãº: 200GB
- ã¤ã³ããã¯ã¹åè¨ãµã¤ãº: 20GB
ã¤ã³ããã¯ã¹ã®åè¨ãµã¤ãºã20GBã®å ´åããµã¼ãã®ã¡ã¢ãªãµã¤ãºãã ããã50GB以ä¸ã¯å¿ è¦ã§ãã
MongoDBã¯WiredTigerã¨ããã¹ãã¬ã¼ã¸ã¨ã³ã¸ã³ã使ãã¾ããããã©ã«ãã§ãµã¼ãã®ç©çã¡ã¢ãªã®50%ãWiredTigerãã£ãã·ã¥ã«å²ãå½ã¦ã¾ããæ®ãã®50%ã¯OSã®ãã¡ã¤ã«ã·ã¹ãã ãã£ãã·ã¥ã¨ãã¦æ®ããã¦ãã¾ãã
ããã¦WiredTigerãã£ãã·ã¥ã¯ä½¿ç¨çã80%ãè¶ ããã¨Evictionã¨ããã¡ã¢ãªã®éæ¾ãå§ã¾ãã¾ãã
ããã©ã«ãã®WiredTigerãã£ãã·ã¥å²å½: 50% 50GB x 50% = 25GB WiredTigerãã£ãã·ã¥ã®å©ç¨ä¸éã®ç®å®: 80% 25GB x 80% = 20GB
WiredTigerãã£ãã·ã¥ã«ã¯ã¤ã³ããã¯ã¹ä»¥å¤ã«ããã¼ã¿èªä½ãä¹ãã®ã§ãå®éã«ã¯ããå°ãä½è£ããã£ã¦ãè¯ãã§ãããã
AWSã®æå¼·ãµã¼ãã使ã£ãå ´åã®ã¤ã³ããã¯ã¹ãµã¤ãºã®éç
MongoDBã®ãµã¼ãã«ã¯AWS EC2ã使ã£ã¦ãã¾ãã
ã¡ã¢ãªãµã¤ãºã ãã§èããã°ãä¸çªå¤§ãããµã¼ãã¯4TBãããã®ãµã¼ããããã¾ããããã¼ã¿ãã¼ã¹ã®æ¸ãè¾¼ã¿ãå¤ãå ´åã¯ã¡ã¢ãªãµã¤ãºã ãã§ã¯ãªãDisk I/Oãé«éã§ããå¿ è¦ãããã¾ãã
AWSã®ãããããµã¼ãã®æ§è½ãã¹ããå®æ½ããä¸ã§ãQuipperã§ã¯i3enã¤ã³ã¹ã¿ã³ã¹ãã¡ããªã¼ã使ã£ã¦ãã¾ãã i3enã®æ大ã¡ã¢ãªã¯i3en.24xlargeã®768GBã§ãã
ãã®å ´åãWiredTigerãã£ãã·ã¥ã¯ã ããã384GBãããã«ãªãã¾ãã
ããã©ã«ãã®WiredTigerãã£ãã·ã¥å²å½: 50% 768GB x 50% = 384GB WiredTigerãã£ãã·ã¥ã®å©ç¨ä¸éã®ç®å®: 80% 384GB x 80% = 307GB
ãã®ã¨ããWiredTigerãã£ãã·ã¥ã®80%ã¯307GBã§ãã ã¤ã³ããã¯ã¹ã®åè¨ã¯307GBæªæºã«åããã®ãè¯ãã§ãããã å®éã«ã¯ãã¼ã¿ãã¯ã¨ãªã«ããã¾ããç®å®ã¨ãã¦307GBãè¶ ããããããã©ã¼ãã³ã¹é害ã®ãªã¹ã¯ãé«ãã¨æãã¾ãã
ã³ã¬ã¯ã·ã§ã³ãã¨ã®ã¤ã³ããã¯ã¹ãµã¤ãºã®ç¢ºèªæ¹æ³
Mongo Shellã§ä»¥ä¸ã®ã³ã¼ããå®è¡ããã¨ä»»æã®ãã¼ã¿ãã¼ã¹ã®ãã¹ã¦ã®ã³ã¬ã¯ã·ã§ã³ã®ã¤ã³ããã¯ã¹ã®æ å ±ãåå¾ãããã¨ãã§ãã¾ãã
use <ãã¼ã¿ãã¼ã¹å>; db.getCollectionNames().forEach(function(collection) { if (collection != "system.users") { indexes = db[collection].stats(); print("DB Stats for " + collection + ":"); printjson(indexes); } });
ããã³ã¬ã¯ã·ã§ã³ã®ã¤ã³ããã¯ã¹
"nindexes" : 5, "totalIndexSize" : 14610313216, "indexSizes" : { "owner_id_1" : 1905123328, "trackable_id_1" : 1721237504, "context_id_1_context_type_1_key_1_created_at_1" : 3997839360, "recipient_id_1" : 1324498944, "_id_" : 5661614080 },
ãã®ã³ã¬ã¯ã·ã§ã³ã¯5ã®ã¤ã³ããã¯ã¹ãæã£ã¦ãããåè¨ã§ããã14.6GBã§ãã Quipperã§ã¯ããããDatadogã«éã£ã¦å¯è¦åï¼ç£è¦ãã¦ãã¾ãã
éçãè¶ ããå ´åã®å¯¾å¦
å ã»ã©è¨ç®ããããã«ãi3en.24xlargeã¨ããEC2ãµã¼ãã使ã£ãå ´åã«ãä»®ã«ã¤ã³ããã¯ã¹ã®åè¨ãµã¤ãºã307GBãè¶ ããã¨ããå¾ããªãç¶æ ã«ãªãã¾ãã
é常æ段ã¨ãã¦ã¯ãã£ãã·ã¥ã¡ã¢ãªã®å²åãããã©ã«ãã®50%ãã70%ã¾ã§å¼ãä¸ããæ¹æ³ãããã¾ãã quipper.hatenablog.com
ããã70%ã¾ã§ä½¿ãã®ã¯æå¾ã®é常æ段ã¨ãã¦æ®ãã¦ãããã»ããè¯ãããããã¾ãããï¼ã¾ã ã¹ã±ã¼ã«ã¢ããã§ããä½è£ãããã°ããµã¼ãã³ã¹ããæããããã«70%ã«ä¸ãããã¨ã¯ããã ã¨æãã¾ãï¼
éçãæ¥ãåã«å¯¾å¿ããæ段ã¨ãã¦ã¯ãã¾ã¨ã¾ãã®ãããã¼ãã«ï¼ã³ã¬ã¯ã·ã§ã³ï¼ãã¨ã«ãã¼ã¿ãã¼ã¹ãåå²ãããã¨ã§ãã
Quipperã§ã¯ãå¥ã®MongoDBã¯ã©ã¹ã¿ã¼ãä½ã£ã¦ããã¼ã¿éã®å¤ããã¼ãã«ã移åãããããã¤ã¯ããµã¼ãã¹åãã¦Postgresã«ç§»æ¤ããããã¦ãã¾ãã
ã¤ã³ããã¯ã¹ãµã¤ãºã®ç¯ç´
大è¦æ¨¡ãµã¼ãã¹ã«ãããMongoDBã®éç¨ã§ã¯ãåç´ã«ã¤ã³ããã¯ã¹ãå¢ããã®ã¯ããã©ã¼ãã³ã¹å£åã®ãªã¹ã¯ãããã¨ãããã¨ãç解ã§ããã§ããããï¼
ä¸æ¹ã§ã¤ã³ããã¯ã¹ã®åè¨ãµã¤ãºãæ¸ãããã¨ãã§ããã°ç·åçãªè¦³ç¹ã§æ¹åããä½å°ãããã¾ããï¼æªæ¥ã®ã¦ã¼ã¶ã¼å¢å ã«ä½è£ãæããããã¨ãã§ããï¼
ããã§ã¤ã³ããã¯ã¹ãµã¤ãºãç¯ç´ããï¼ã¤ã®æ¹æ³ããç´¹ä»ãã¾ãã
- åç §ãããªãã¤ã³ããã¯ã¹ã®åé¤
- å¤ããã¼ã¿ã®åé¤
- é åºãéãè¤åã¤ã³ããã¯ã¹ã®çµ±å
åç §ãããªãã¤ã³ããã¯ã¹ã®åé¤
Mongo Shellã§ä»¥ä¸ã®ã³ã¼ããå®è¡ããã¨ãæå¾ã«mongodãèµ·åãã¦ããã¤ã³ããã¯ã¹ãåç §ãããåæ°ãåå¾ã§ãã¾ãã
use <ãã¼ã¿ãã¼ã¹å>; db.getCollectionNames().forEach(function(collection) { if (collection != "system.users") { var indexes = db[collection].aggregate({$indexStats:{}}); print("Indexes for " + collection + ":"); printjson(indexes._batch); } });
çµæãä¸é¨æç²
[ { "name" : "school_id_1", "key" : { "school_id" : 1 }, "host" : "mongodb-f03.qs.production:27000", "accesses" : { "ops" : NumberLong(464057), "since" : ISODate("2020-11-26T23:03:32.395Z") } }, { "name" : "city_id_1", "key" : { "city_id" : 1 }, "host" : "mongodb-f03.qs.production:27000", "accesses" : { "ops" : NumberLong(0), "since" : ISODate("2020-11-26T23:03:32.395Z") } },
accesses.opsã¨ããé¨åã§ä½ååç §ãããããããã¾ãã
- school_id_1: 464057
- city_id_1: 0
ãã®å ´åãschool_id_1ã¨ããã¤ã³ããã¯ã¹ã¯ä½¿ããã¦ãã¾ãããcity_id_1ã¨ããã¤ã³ããã¯ã¹ã¯ä½¿ããã¦ããªãã®ã§åé¤ãã¦ãåé¡ãªãã§ãããã
ãã ããåç §ããã¦ããªãã¤ã³ããã¯ã¹ã¯ã¡ã¢ãªã«ä¹ã£ã¦ãã¾ãããè¨ç®ä¸ã®åè¨ã¤ã³ããã¯ã¹ãµã¤ãºã¯æ¸ãã¾ãããå®è³ªçã«ä½¿ããã¦ããã¡ã¢ãªã®ç¯ç´ã«ã¯ç¹ããã¾ããã
å¤ããã¼ã¿ã®åé¤
ç¾å¨ã¯ä½¿ããã¦ããªãå¤ããã¼ã¿ãåé¤ããã¨ã¡ã¢ãªã®ç¯ç´å¹æã«ç¹ããã¾ãã
å ã»ã©ã使ããã¦ããªãã¤ã³ããã¯ã¹ã¯ã¡ã¢ãªã«ä¹ã£ã¦ããªãã¨èª¬æãã¾ããããããªã®ã«å¤ããã¼ã¿ã¯ã¡ã¢ãªã«ä¹ã£ã¦ããã®ã§ããããï¼
ä¾ãã°ä»¥ä¸ã®ãããªãã¼ãã«ãããã¨ãã¾ãã
- ãã¼ã¿ãµã¤ãº: 100GB
- ãã¼ã¿ä»¶æ°: 1å件
- ï¼ä½¿ãããªããã¼ã¿3,000ä¸ä»¶ãå ¨ä½ã®30%ï¼
- ã¤ã³ããã¯ã¹ãµã¤ãº: 10GB
ãã®å ´åãã¤ã³ããã¯ã¹ã¯10GBå ¨é¨ã¡ã¢ãªã«ä¹ããå¿ è¦ãããã¾ãã
ãã3,000ä¸ä»¶ã®ãã¼ã¿ãåé¤ããã°ãã¤ã³ããã¯ã¹ã30%å°ãããªã7GBãããã«ãªãã¾ãã ã¤ã¾ãã3GBã®ã¡ã¢ãªç¯ç´å¹æã«ç¹ããã¾ãã
å ã»ã©ã®ä½¿ããã¦ããªãã¤ã³ããã¯ã¹ã¨ã®éãã¯ãã¡ã¢ãªã«ä¹ã£ã¦ããªãã¤ã³ããã¯ã¹ãåé¤ããããã¡ã¢ãªã«ä¹ã£ã¦ããã¤ã³ããã¯ã¹ããªãã¹ãå°ãããããã®éãã§ãã
é åºãéãè¤åã¤ã³ããã¯ã¹ã®çµ±å
MongoDBã§ã¯ãè¤æ°ã®ãã£ã¼ã«ããçµã¿åãããè¤åã¤ã³ããã¯ã¹ãä½ããã¨ãã§ãã¾ãã
ãã¨ãã°ä»¥ä¸ã®ï¼ã¤ã®è¤åã¤ã³ããã¯ã¹ãããå ´åãï¼ã¤ã«ã¾ã¨ãããã¨ãæ¤è¨ãã¦ãã ããã
- å¦æ ¡ID-ã¦ã¼ã¶ã¼ID
- ã¦ã¼ã¶ã¼ID-å¦æ ¡ID-æ´æ°æ¥ä»
ã¯ã¨ãªåä½ã§ããã©ã¼ãã³ã¹ãè¦ãå ´åã¯ã両æ¹ã®ã¤ã³ããã¯ã¹ãããæ¹ãã¬ã¹ãã³ã¹ãæ©ããªãå¯è½æ§ãããã¾ããããã¼ã¿ä»¶æ°ãã¤ã³ããã¯ã¹ãµã¤ãºãå«ãã¦ç·åçã«èããå¿ è¦ãããã¾ãã
ã¤ã³ããã¯ã¹1GBãããã®ã³ã¹ãè¨ç®
å ã»ã©ç´¹ä»ããi3en.24xlargeã®ï¼ã¶æã®ã³ã¹ãã¯$9,320ï¼æ±äº¬ãªã¼ã¸ã§ã³ããªã¶ã¼ããªãï¼ã§ãã æ¬çªç°å¢ã§ã¯ï¼å°å¿ è¦ãªã®ã§$18,640ã§ãã
ãããã¤ã³ããã¯ã¹ã«ä½¿ãããã£ãã·ã¥ã¡ã¢ãªãµã¤ãºã§å²ã£ã¦ã¿ã¾ãããã
$18,640 / 307GB = $60.7/GB
ããã©ã¼ãã³ã¹ãåªå ãã¹ããä¾¡æ ¼ãåªå ãã¹ãããèããï¼ã¤ã®ææã¨ãã¦ã¤ã³ããã¯ã¹1GBãã¨ã«$60.7/monthãããã¨ããææ¨ãç¨ãããã¨ãã§ãããã§ãã
SREã¨ãã¦ãªã³ã©ã¤ã³æè²ãæ¯ãã
ã¼ããã¯äºæ¥ã¨ãã¦ãµã¼ãã¹ãéçºéå¶ãã¦ããã®ã§ãä¿¡é ¼æ§ãé«ããã°é«ãã»ã©è¯ãããã§ã¯ãªãããã³ã¹ããå®ããã°å®ãã»ã©è¯ãããã§ãããã¾ããã
ã¦ã¼ã¶ã¼æ°ã売ä¸ã伸ã³ã¦ããäºæ¥ãªã競åã«å·®ãã¤ããããã«ã³ã¹ããããã¦ä¿¡é ¼æ§ãé«ãããã¨ãããä¸æ¹ã§ãææ¿å ·ããè²·ããªãå½ã®åã©ããã¡ã«æè²ãå±ããããã«ã¯ãå°ãã§ãå®ããµã¼ãã¹ãæä¾ãããã¨ãèããå¿ è¦ãããã¾ãã
Quipperã§ã¯ä¸çã®ãªã³ã©ã¤ã³æè²ãæ¯ããã¨ã³ã¸ãã¢ãæ¢ãã¦ãã¾ãã
è: 深尾ãã¨ã®ã¶