FastContainer:実行環境の変化に素早く適応できる恒常性を持つシステムアーキテクチャ
システムの要素を循環させることによって可用性を実現する基盤技術
松本亮介、近藤宇智朗、三宅悠介、力武健次*、栗林健太郎 / ペパボ研究所 / *力武健次技術士事務所 2017.12.08 第10回インターネットと運用技術シンポジウム IOTS2017
γεςϜͷཁૉΛ॥ͤ͞Δ͜ͱʹΑͬͯՄ༻ੑΛ࣮ݱ͢Δج൫ٕज़দຊ྄հɺۙ౻Ӊஐ࿕ɺࡾ༔հɺྗ݈࣍*ɺ܀ྛ݈ଠ / ϖύϘݚڀॴ / *ྗ݈ٕ࣍ज़࢜ࣄॴ2017.12.08 ୈ10ճΠϯλʔωοτͱӡ༻ٕज़γϯϙδϜ IOTS2017FastContainer:࣮ߦڥͷมԽʹૉૣ͘దԠͰ͖Δ߃ৗੑΛ࣋ͭγεςϜΞʔΩςΫνϟ
View Slide
1. എܠͱత2. ԾԽج൫ͷεέʔϦϯάͱӡ༻ٕज़ͷ՝3. FastContainerΞʔΩςΫνϟ4. ࣮ݧͱߟ5. ·ͱΊ2࣍
1.എܠͱత
• ݸਓ͕ͨΓલʹଟछଟ༷ͳWebαΠτΛ࣋ͭ࣌• VPSͷΑ͏ͳࣗ༝ͱִڥٻΊΒΕ͖͍ͯͯΔ• SNSΛհͯ͠ݸਓͷίϯςϯπΛ֦ࢄ͍࣌͢͠• ݸਓͷWebαΠτͷΞΫηεूத͢Δػձͷ૿େ• ݸਓαΠτͰਝʹΦʔτεέʔϧͰ͖Δج൫͕ඞཁ4ݸਓͷWebαΠτͷΞΫηεूதͷରԠ
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞3. εέʔϦϯά͖͢ঢ়گݕͷϦΞϧλΠϜੑͷ͞4. ۭ͖Ϧιʔε֬ೝͷͨΊͷεέδϡʔϦϯάॲཧͷԆ5ҰൠతͳԾԽج൫ͷΦʔτεέʔϧͷ՝ͦͦΦʔτεέʔϧΛݸਓͷαΠτʹద༻͢Δͷ͍͠…
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞3. εέʔϦϯά͖͢ঢ়گݕͷϦΞϧλΠϜੑͷ͞4. ۭ͖Ϧιʔε֬ೝͷͨΊͷεέδϡʔϦϯάॲཧͷԆ6ҰൠతͳԾԽج൫ͷΦʔτεέʔϧͷ՝ຊൃදͰ1.ͱ2.ͷ՝ΛղܾͰ͖ΔΞʔΩςΫνϟͷఏҊ→ ݸਓ͕ҙࣝͤͣͱ͑ΔαʔϏεͷ࣮Λࢦ͢
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱΛղܾ• Πϯελϯεͷঢ়ଶͷఀࢭɾىಈɾมߋΛߴʹ॥• ϦΫΤετ୯ҐͰঢ়ଶΛܾఆ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞Λղܾ• ϦΫΤετ͕ແ͍ΠϯελϯεҰఆظؒىಈޙʹఀࢭϦΫΤετ୯ҐͰΠϯελϯεͷঢ়ଶΛܾఆ͢Δख๏ͷఏҊ7Πϯελϯε͕॥͢ΔมԽʹڧ͍ج൫ͷఏҊ
• ϗετ͕॥͢ΔͷͰϥΠϒϥϦ͕ࣗવʹߋ৽͞Ε͍ͯ͘• ऩ༰ઌใΛม͑Δ͚ͩͰࣗવʹऩ༰αʔόؒΛҠಈՄೳ• WordPressͷҰൠతͳCMSΛஔɾΦʔτεέʔϧՄೳ• ΫϥυϓϩόΠμࢦఆͷίʔσΟϯάͷඞཁͳ͍• ྫɿAWS lambdaʹྨ͢ΔServerless Architecture8ηΩϡϦςΟӡ༻ٕज़ͷ՝ಉ࣌ʹղܾ
2.ԾԽج൫ͷεέʔϦϯάͱӡ༻ٕज़ͷ՝
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞3. εέʔϦϯά͖͢ঢ়گݕͷϦΞϧλΠϜੑͷ͞4. ۭ͖Ϧιʔε֬ೝͷͨΊͷεέδϡʔϦϯάॲཧͷԆ10ҰൠతͳԾԽج൫ͷΦʔτεέʔϧͷ՝ຊൃදͰ1.ͱ2.ͷ՝Λείʔϓͱ͢Δ
• VMͷ߹ɺݕ͔ΒͷΠϯελϯεىಈʹ͕͔͔࣌ؒΔ• ಥൃతͳΞΫηε࣌ʹεέʔϧॲཧ͕ؒʹ߹Θͳ͍• εέʔϧΞοϓʢׂΓͯϦιʔε૿ڧʣ؆୯ʹͰ͖ͳ͍111. ΠϯελϯεͷՃॲཧ͕Ͱ͋Δ͜ͱ
• Πϯελϯε͕جຊతʹىಈ͠ϦιʔεΛ༗͠ଓ͚Δ• Πϯελϯε͕VMͷ߹ʹ༻͢ΔϦιʔεྔଟ͍• Ұൠతʹৗ࣌Πϯελϯε͕ىಈ͠ଓ͚Δํࣜ• ىಈΠϯελϯεͷ͚ͩৗ࣌ϦιʔεΛ༗͢Δ• ϝϞϦϦʔΫ͢ΔϓϩηεͷӨڹड͚͍͢122. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞
• ੬ऑੑରԠόʔδϣϯΞοϓͷίετ͕ߴ͍• αʔϏεͷఀࢭˠόʔδϣϯΞοϓˠىಈͳͲ• ϝϯςφϯε࣌ͷௐͷίετ͕ߴ͍• ऩ༰αʔόͷҠಈͷίετ• αʔϏεఀࢭ࣌ؒͷௐͳͲߴ͍සͰͷ࣮ࢪ͕ࠔ13ͦͷଞͷӡ༻ٕज़ηΩϡϦςΟͷ՝
3.FastContainerΞʔΩςΫνϟ
• ঢ়ଶͷมԽΛߴʹߦ͑ͯԠతʹಈ࡞Ͱ͖Δ͜ͱΛॏࢹ• γεςϜͷཁૉͷఀࢭ͔ΒىಈॲཧͷޮԽʹண• γεςϜͷཁૉͷఀࢭঢ়ଶΛڐ༰͢ΔγεςϜ• ৗʹఀࢭͱىಈ͕॥Մೳͳ߃ৗੑΛ࣋ͭγεςϜΛࢦ͢• ॥Մೳ = Մ༻ੑ͕ߴ͘ৗʹมԽՄೳͳج൫͕࣮ݱͰ͖Δ15Մ༻ੑߴ͘มԽʹڧ͍ج൫Λઃܭ͢Δʹʁ
มԽ͠ଓ͚Δ͜ͱ͔ΒಘΒΕΔ҆ఆੑ16ϗετ"ϗετ"ϗετ"ϗετ" ϗετ"Πϯλʔωοτϗετ"ϗετ"ϗετ"͕ͯఀࢭԠతʹىಈԠతʹεέʔϧΞοϓऩ༰αʔόAऩ༰αʔόBHTTPϦΫΤετԠతʹεέʔϧΞτ• ϗετͷىಈͱఀࢭΛ॥• ৗʹ॥͠ଓ͚ΔΞʔΩςΫνϟ• มԽ͠ଓ͚Δ͜ͱʹΑΔ҆ఆੑ• ॥ͷվળΛٻৗʹมԽՄೳͰ͋ΔͨΊಥൃతͳΞΫηεूதͷΑ͏ͳมԽʹੑͷ͋ΔΞʔΩςΫνϟΛ࣮ݱՄೳ
• ϗετͷىಈɾෳɾఀࢭɾ૿ڧॲཧͷޮԽΛॏࢹ• ֤छॲཧΛHTTPϦΫΤετ࣌ʹϦΞΫςΟϒʹ࣮ࢪ• ϗετʹίϯςφܕԾԽΛ࠾༻ͯ͠ىಈΛߴʹ࣮ݱ• ϦΫΤετʹج͍ͯϦΞΫςΟϒʹίϯςφͷঢ়ଶΛܾఆ17FastContainerΞʔΩςΫνϟͱ໋໊
ίϯςφ࣌ͷWebαʔϏεج൫Ϟσϧ18ΦʔέετϨʔγϣϯ(,& &$4 .BSBUIPO LT %PDLFS4XBSN /)).4UBDLετϥςδʔ3BODIFS 'BTU$POUBJOFSαʔϏείϯςφʹΔ۩ମతͳ8FCΞϓϦαʔϏεΠϯϑϥετϥΫνϟ($1 "[VSF "84 0QFO4UBDL .FTPT #BSF.FUBM -JOVY,JU /ZBIίϯςφϥϯλΠϜ%PDLFS .PCZ DPOUBJOFSE -9$ SLU )BDPOJXB$POUBJOFS3VOUJNF*OUFSGBDF $3*ຊΞʔΩςΫνϟͷείʔϓFastContainerཧతʹΦʔέετϨʔγϣϯҎԼͷπʔϧ܈Ͱ࣮ՄೳͰ͋Δ
HTTP FastContainerͷϑϩʔ198FC1SPYZʢOHY@NSVCZ$.%#ʴ"1*-PDBM8FC1SPYZOHY@NSVCZ$MJFOU ίϯςφίϯςφίϯςφw )551ϦΫΤετͷ)PTUOBNFΛΩʔʹɺ$.%# ߏཧ%#͔ΒίϯςφͷใΛऔಘ)551 4ϦΫΤετw ίϯςφͷ*1ͱϙʔτʹج͍ͯίϯςφʹϓϩΩγw ίϯςφ͕-JTUFO͍ͯ͠ͳ͍߹$.%#͔ΒίϯςφใΛಘͯىಈ$POUBJOFS&OHJOFIBDPOJXB
ΦʔτεέʔϦϯάݕͷΞʔΩςΫνϟ20
• ϦΫΤετ୯ҐͰߴʹεέʔϧΞοϓɾεέʔϧΞτՄೳ• ίϯςφʹ߃ৗੑΛ࣋ͨͤΔ͜ͱͰϦιʔεͷޮԽ• ίϯςφΛ͍ࣺͯՄೳʹ → immutability• Ұఆ࣌ؒىಈ͢Δ͜ͱͰىಈΑΓߴԽ → mortality• ߟ͑ํʹΑͬͯϝϞϦϦʔΫ͢ΔιϑτΣΞΛڐ༰21FastContainerΞʔΩςΫνϟͷ·ͱΊ
• ίϯςφ͕॥͢ΔͷͰϥΠϒϥϦ͕ࣗવʹߋ৽͞Ε͍ͯ͘• ར༻ऀʹͱͬͯηΩϡϦςΟ্• ఏڙଆʹͱͬͯ੬ऑੑରԠόʔδϣϯΞοϓͷޮԽ• CMDBͷऩ༰ઌใΛม͑Δ͚ͩͰࣗવʹऩ༰αʔόΛҠಈ• ϝϯςφϯεোରԠ࣌ͷແఀࢭରԠ͕༰қʹͳΔ22FastContainerΞʔΩςΫνϟͷ·ͱΊ
4.࣮ݧͱߟ
FastContainerΞʔΩςΫνϟͷ࣮24CMDBʹߏίϯςφͷঢ়ଶ͕શͯอଘ͞Ε͍ͯΔɻUserProxyͱCompute͕ϦΫΤετʹج͍ͯCoreAPIܦ༝ͰCMDB͔Βঢ়ଶΛऔಘɾมߋ͠ߏΛมԽͤ͞ΔɻComputeෳͰDataPoolΛNFSͰڞ༗͠ɺίϯςφΛHTTPϦΫΤετ͔ΒϦΞΫςΟϒʹىಈ͢Δɻ
25࣮ݧڥ ߲ ༷$PNQVUF$16.FNPSZ/*$04*OUFM9FPO&()[DPSF(CZUF(CQT6CVOUV,FSOFM6TFS1SPYZ$16.FNPSZ/*$04*OUFM9FPO&()[DPSF(CZUF(CQT6CVOUV,FSOFM$PSF"1*$16.FNPSZ/*$04*OUFM9FPO&()[DPSF(CZUF(CQT6CVOUV,FSOFM$.%#$16.FNPSZ/*$04*OUFM9FPO&()[DPSF(CZUF(CQT6CVOUV,FSOFM%BUB1PPM$16.FNPSZ/*$04*OUFM9FPO&()[DPSF(CZUF(CQT6CVOUV,FSOFMOpenStackͰߏங͞ΕͨԾج൫্Ͱ֤ίϯϙʔωϯτΛVM্Ͱ࣮͠ɺ࣮ݧΛ࣮ࢪɻίϯςφphpinfo()͕ಈ࡞͢Δmod_phpΛΈࠐΜͩApache࣮ߦڥɻઃఆσϑΥϧτɻCPU1ίΞͷ30%ɺϝϞϦ512MBΛׂΓͯɻεέʔϧΞτͱεέʔϧΞοϓͷਝੑΛධՁ͢ΔͨΊʹɺ10ສϦΫΤετͷ5ສϦΫΤετ͔ΒεέʔϧॲཧΛߦ͍ɺॲཧ͕٧·Δ͜ͱͳ͘ෛՙࢄग़དྷ͍ͯΔ͔Λ֬ೝɻ
26335ඵ࣌ͰεέʔϧΞτΛ࣮ࢪ͠ɺ340ඵ࣌Ͱෛՙࢄ͕։࢝͞Ε͍ͯΔɻ5ສϦΫΤετҎ߱2ίϯςφʹεέʔϧΞτ͞ΕͨͨΊɺϨεϙϯελΠϜ͕ҎԼͱͳͬͯΓͷ5ສϦΫΤετ࣌ؒͰॲཧ͍ͯ͠Δ͜ͱ͕͔Δɻ
27301ඵ࣌ͰCPU2ഒͷεέʔϧΞοϓΛ࣮ࢪ͠ɺ302ඵ͔ΒϨεϙϯελΠϜ͕ঃʑʹૣ͘ͳΓ304ඵͰͷϨεϙϯελΠϜʹͳ͍ͬͯΔɻ5ສϦΫΤετҎ߱CPU͕ݩͷ2ഒʹڧԽ͞ΕͨͨΊɺϨεϙϯελΠϜ͕ͱͳͬͯΓͷ5ສϦΫΤετ࣌ؒͰॲཧ͍ͯ͠Δ͜ͱ͕͔Δɻ
5.·ͱΊ
• ΦʔτεέʔϧͷॲཧίετͱϦιʔεޮԽͷ՝ʹண• ෆมੑΛ͏ج൫ͷηΩϡϦςΟͱӡ༻ٕज़ͷ՝ʹண• Πϯελϯε͕॥͠มԽʹڧ͍ԾԽج൫ٕज़ͷఏҊ• ϩϦϙοϓʂϚωʔδυΫϥυͱͯ͠αʔϏεϦϦʔε• ຊΞʔΩςΫνϟͱࣗ࡞ίϯςφΤϯδϯΛ࣮࣮ͯ͠ݱ29·ͱΊ
• αʔϏεͱ࣮࣮ͯ͠͠ӡ༻্ͷޮՌΛଌఆத• ॳճىಈ࣌ؒͱىಈܧଓ࣌ؒͱΞΫηεͷؔΛߟ• ϢʔβମݧΛଛͳΘͳ͍ىಈܧଓ࣌ؒͷదԠతܾఆ͕Մೳ͔• CRIUʹΑΓίϯςφͷΞϓϦΛΠϝʔδԽͯ͠ߴىಈ• ߃ৗੑʹΑΔϦιʔεޮԽΛभେֶͱڞಉͰ࣮ূ࣮ݧத30ࠓޙͷ՝
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞3. εέʔϦϯά͖͢ঢ়گݕͷϦΞϧλΠϜੑͷ͞4. ۭ͖Ϧιʔε֬ೝͷͨΊͷεέδϡʔϦϯάॲཧͷԆ31ҰൠతͳԾԽج൫ͷΦʔτεέʔϧͷ՝ਐḿ
• σʔλऩूࣗମेඵ୯Ґ• εέʔϦϯάͷτϦΨʔݕ࠷େ3ඞཁ• ޡݕΛݮΒ͠ͳ͕Βૉૣ͘εέʔϦϯάΛݕͰ͖Δ͔• εέʔϧΞτɾΠϯ͕ແବʹසൃ͠ͳ͍Α͏ͳϧʔϧઃܭ• ΦϯϥΠϯʹదͨ͠มԽݕग़ͷΑ͏ͳ౷ܭతख๏ʹؼண32εέʔϦϯά͖͢ঢ়گͷݕʹؔ͢Δ՝