システムの要素を循環させることによって可用性を実現する基盤技術
松本亮介、近藤宇智朗*、三宅悠介、力武健次**、栗林健太郎 / ペパボ研究所 / *GMOペパボ / **力武健次技術士事務所 2017.06.24 第38回 情報処理学会 インターネットと運用技術研究会
γεςϜͷཁૉΛ॥ͤ͞Δ͜ͱʹΑͬͯՄ༻ੑΛ࣮ݱ͢Δج൫ٕज़দຊ྄հɺۙ౻Ӊஐ࿕*ɺࡾ༔հɺྗ݈࣍**ɺ܀ྛ݈ଠ / ϖύϘݚڀॴ / *GMOϖύϘ / **ྗ݈ٕ࣍ज़࢜ࣄॴ2017.06.24 ୈ38ճ ใॲཧֶձ Πϯλʔωοτͱӡ༻ٕज़ݚڀձFastContainer: WebΞϓϦέʔγϣϯίϯςφͷঢ়ଶΛϦΞΫςΟϒʹܾఆ͢ΔίϯςφཧΞʔΩςΫνϟ
View Slide
1. എܠͱత2. ԾԽج൫ͷεέʔϦϯάͱӡ༻ٕज़ͷ՝3. FastContainerΞʔΩςΫνϟ4. ࣮ݧͱߟ5. ·ͱΊ2࣍
1.എܠͱత
• ݸਓ͕ͨΓલʹଟछଟ༷ͳWebαΠτΛ࣋ͭ࣌• VPSͷΑ͏ͳࣗ༝ͱִڥٻΊΒΕ͖͍ͯͯΔ• SNSΛհͯ͠ݸਓͷίϯςϯπΛ֦ࢄ͍࣌͢͠• ݸਓͷWebαΠτͷΞΫηεूத͢Δػձͷ૿େ• ਝʹࣗಈෛՙࢄ(Φʔτεέʔϧ)Ͱ͖Δج൫͕ඞཁ4ݸਓͷWebαΠτͷΞΫηεूதͷରԠ
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞3. ۭ͖Ϧιʔε֬ೝͷͨΊͷεέδϡʔϦϯάॲཧͷԆ5ҰൠతͳԾԽج൫ͷΦʔτεέʔϧͷ՝1.ͱ2.ͷ՝ΛղܾͰ͖ΔΞʔΩςΫνϟͷఏҊ
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱΛղܾ• ΠϯελϯεͷఀࢭɾىಈΛߴʹ॥• Πϯελϯε͕ࣗͷϦιʔεมԽΛࢹɾݕɾࢦࣔ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞Λղܾ• ϦΫΤετ͕ແ͍ΠϯελϯεҰఆظؒىಈޙʹఀࢭϦΫΤετ୯ҐͰΠϯελϯεͷঢ়ଶΛܾఆ͢Δख๏ͷఏҊ6Πϯελϯε͕॥͢ΔมԽʹڧ͍ج൫ͷఏҊ
ηΩϡϦςΟӡ༻ٕज़ͷ՝ಉ࣌ʹղܾ• ϗετ͕॥͢ΔͷͰϥΠϒϥϦ͕ࣗવʹߋ৽͞Ε͍ͯ͘• ऩ༰ઌใΛม͑Δ͚ͩͰࣗવʹऩ༰αʔόؒΛҠಈՄೳ• ϝϯςφϯεোରԠ͕༰қ7Πϯελϯε͕॥͢ΔมԽʹڧ͍ج൫ͷఏҊ
2.ԾԽج൫ͷεέʔϦϯάͱӡ༻ٕज़ͷ՝
1. ΠϯελϯεՃॲཧ͕Ͱ͋Δ͜ͱ2. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞3. ۭ͖Ϧιʔε֬ೝͷͨΊͷεέδϡʔϦϯάॲཧͷԆ9ಥൃతͳΞΫηεूதʹର͢Δෛՙࢄ͕ࠔຊൃදͰ1.ͱ2.ͷ՝Λείʔϓͱ͢Δ
• Φʔτεέʔϧ࣌ͷݕ͔Βεέʔϧࢦࣔͷཻ͕ૈ͍• ֎෦͔ΒͷఆظతͳϦιʔεࢹʹΑΔݕͱՃࢦࣔ• ࢹରͷ૿Ճʹ͍ࢹִؒࢹޮ͕Լ• VMͷ߹ɺݕ͔ΒͷΠϯελϯεىಈʹ͕͔͔࣌ؒΔ• ಥൃతͳΞΫηε࣌ʹεέʔϧॲཧ͕ؒʹ߹Θͳ͍101. ΠϯελϯεͷՃॲཧ͕Ͱ͋Δ͜ͱ
• Πϯελϯε͕جຊతʹىಈ͠ϦιʔεΛ༗͠ଓ͚Δ• Πϯελϯε͕VMͷ߹ʹ༻͢ΔϦιʔεྔଟ͍• HTTPϦΫΤετ୯Ґʹىಈ͢Δʹىಈίετ͕ߴ͍• Ұൠతʹৗ࣌Πϯελϯε͕ىಈ͠ଓ͚Δํࣜ• ϝϞϦϦʔΫ͢ΔΑ͏ͳιϑτΣΞͷ߹େม112. ϋʔυΣΞϦιʔεͷར༻ޮͷ͞
• ੬ऑੑରԠόʔδϣϯΞοϓͷίετ͕ߴ͍• αʔϏεͷఀࢭˠόʔδϣϯΞοϓˠىಈͳͲ• ϝϯςφϯε࣌ͷௐͷίετ͕ߴ͍• ऩ༰αʔόͷҠಈͷίετ• αʔϏεఀࢭ࣌ؒͷௐͳͲߴ͍සͰͷ࣮ࢪ͕ࠔ12ͦͷଞͷӡ༻ٕज़ηΩϡϦςΟͷ՝
• ಥൃతͳΞΫηε͚࣌ͩεέʔϧ͢Δͷͳ͍ͥ͠ͷ͔ʁ• γεςϜ͕ෆมੑΛ࣋ͭͱมԽେ͖ͳίετ͕͏• γεςϜͷߏཁૉෆมੑΛ࣋ͪঢ়ଶมԽͷίετ͕ߴ͍• ෆมੑΛҡ࣋͢Δ͜ͱ͕γεςϜཧͷతͰ͋Δ• ఆͷൣғͰ࣭Λ࠷େԽ͢Δ͜ͱΛతͱ͍ͯ͠Δ• ఆͰ͖ͳ͍ΞΫηεूத͕ଟൃ͢Δ࣌ʹෆ͖13ෆมੑΛ͏γεςϜͷ՝
3.FastContainerΞʔΩςΫνϟ
• ঢ়ଶͷมԽΛߴʹߦ͑ͯԠతʹಈ࡞Ͱ͖Δ͜ͱΛॏࢹ• γεςϜͷཁૉͷఀࢭ͔ΒىಈॲཧͷޮԽʹண• γεςϜͷཁૉͷఀࢭঢ়ଶΛڐ༰͢ΔγεςϜ• ৗʹఀࢭͱىಈ͕॥Մೳͳ߃ৗੑΛ࣋ͭγεςϜΛࢦ͢• ॥Մೳ = Մ༻ੑ͕ߴ͘ৗʹมԽՄೳͳج൫͕࣮ݱͰ͖Δ15Մ༻ੑߴ͘มԽʹڧ͍ج൫Λઃܭ͢Δʹʁ
มԽ͠ଓ͚Δ͜ͱ͔ΒಘΒΕΔ҆ఆੑ16ϗετ"ϗετ"ϗετ"ϗετ" ϗετ"Πϯλʔωοτϗετ"ϗετ"ϗετ"͕ͯఀࢭԠతʹىಈԠతʹεέʔϧΞοϓऩ༰αʔόAऩ༰αʔόBHTTPϦΫΤετԠతʹεέʔϧΞτ• ϗετͷىಈͱఀࢭΛ॥• ৗʹ॥͠ଓ͚ΔΞʔΩςΫνϟ• มԽ͠ଓ͚Δ͜ͱʹΑΔ҆ఆੑ• ॥ͷվળΛٻৗʹมԽՄೳͰ͋ΔͨΊಥൃతͳΞΫηεूதͷΑ͏ͳมԽʹੑͷ͋ΔΞʔΩςΫνϟΛ࣮ݱՄೳ
• ϗετͷىಈɾෳɾఀࢭɾ૿ڧॲཧͷޮԽΛॏࢹ• ֤छॲཧΛHTTPϦΫΤετ࣌ʹϦΞΫςΟϒʹ࣮ࢪ• ϗετʹίϯςφܕԾԽΛ࠾༻ͯ͠ىಈΛߴʹ࣮ݱ• ίϯςφͷϞχλϦϯάίϯςφ͕࣮ࣗࢪͯ͠ݕ• ϦΫΤετʹج͍ͯϦΞΫςΟϒʹίϯςφͷঢ়ଶΛܾఆ17FastContainerΞʔΩςΫνϟͱ໋໊
HTTP FastContainerͷϑϩʔ188FC1SPYZʢ[email protected]$.%#ʴ"1*-PDBM8FC1SPYZ[email protected]$MJFOU ίϯςφίϯςφίϯςφw )551ϦΫΤετͷ)PTUOBNFΛΩʔʹɺ$.%# ߏཧ%#͔ΒίϯςφͷใΛऔಘ)551 4ϦΫΤετw ίϯςφͷ*1ͱϙʔτʹج͍ͯίϯςφʹϓϩΩγw ίϯςφ͕-JTUFO͍ͯ͠ͳ͍߹$.%#͔ΒίϯςφใΛಘͯىಈ$POUBJOFS&OHJOFIBDPOJXB
HTTPϦΫΤετܖػͰͷՃɾఀࢭॲཧ19-PDBM8FC1SPYZ$.%#ʴ"1*ίϯςφίϯςφw ϦΫΤετॲཧ࣌ʹίϯςφͷϦιʔε༻ྔ͕ߴ͘ͳͬͨ͜ͱΛݕͨ͠Β"1*ʹίϯςφͷՃࢦࣔʢ͘ͳͬͨΒআࢦࣔʣw $.%#ʹίϯςφͷใ͕͋Εىಈͯ͠ϦΫΤετΛసૹw ىಈॲཧதىಈࡁΈͷίϯςφʹҰ୴ϦΫΤετΛసૹͯ͠ىಈޙʹৼΓ͚։࢝8FC1SPYZw ΫʔϧμϯλΠϜͱ͍͏֓೦Λઃ͚ɺසൟʹՃɾఀࢭॲཧ͕ൃੜ͠ͳ͍Α͏ʹࢦࣔڐՄ࣌ؒΛઃఆऩ༰αʔόࢹɾݕ
• ϦΫΤετ୯ҐͰߴʹεέʔϧΞοϓɾεέʔϧΞτՄೳ• εέʔϧՄ൱ͷݕϦΫΤετ୯ҐͰ࣮ࢪ• Ұఆ࣌ؒܦա͔ͭϦΫΤετॲཧ͕ͳ͔ͬͨΒίϯςφఀࢭ• ίϯςφΛ͍ࣺͯՄೳʹ → immutability• Ұఆ࣌ؒىಈ͢Δ͜ͱͰىಈΑΓߴԽ → mortality• ίϯςφ͕ϦΫΤετΛॲཧ͍ͯ͠Δ࣌ؒͷΈ՝͕ۚՄೳ20FastContainerΞʔΩςΫνϟͷ·ͱΊ
• ίϯςφ͕॥͢ΔͷͰϥΠϒϥϦ͕ࣗવʹߋ৽͞Ε͍ͯ͘• ར༻ऀʹͱͬͯηΩϡϦςΟ্• ఏڙଆʹͱͬͯ੬ऑੑରԠόʔδϣϯΞοϓͷޮԽ• CMDBͷऩ༰ઌใΛม͑Δ͚ͩͰࣗવʹऩ༰αʔόΛҠಈ• ϝϯςφϯεোରԠ࣌ͷແఀࢭରԠ͕༰қʹͳΔ• ߟ͑ํʹΑͬͯϝϞϦϦʔΫ͢ΔιϑτΣΞΛڐ༰21FastContainerΞʔΩςΫνϟͷ·ͱΊ
4.࣮ݧͱߟ
ݱࡏ࣮தͷFastContainerΞʔΩςΫνϟ23CMDBʹߏίϯςφͷঢ়ଶ͕શͯอଘ͞Ε͍ͯΔɻUserProxyͱCompute͕ϦΫΤετʹج͍ͯCoreAPIܦ༝ͰCMDB͔Βঢ়ଶΛऔಘɾมߋ͠ߏΛมԽͤ͞ΔɻComputeෳͰDataPoolΛڞ༗͠ɺίϯςφΛHTTPϦΫΤετ͔ΒϦΞΫςΟϒʹىಈ͢Δɻ
24࣮ݧڥ ߲ ༷$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ສϦΫΤετ͔ΒεέʔϧॲཧΛߦ͍ɺॲཧ͕٧·Δ͜ͱͳ͘ෛՙࢄग़དྷ͍ͯΔ͔Λ֬ೝɻ
2510ສϦΫΤετதɺ5ສϦΫΤετ͔ΒεέʔϧΞτΛߦ͍ɺϨεϙϯεʹӨڹΛ༩͑Δ͜ͱͳ͘ॠ࣌ʹෛՙࢄ͕Ͱ͖͍ͯΔɻ5ສϦΫΤετҎ߱2ίϯςφʹεέʔϧΞτ͞ΕͨͨΊɺϨεϙϯελΠϜ͕ҎԼͱͳͬͯΓͷ5ສϦΫΤετ࣌ؒͰॲཧ͍ͯ͠Δ͜ͱ͕͔Δɻ
2610ສϦΫΤετதɺ5ສϦΫΤετ͔ΒCPU2ഒͷεέʔϧΞοϓΛߦ͍ɺϨεϙϯεʹӨڹΛ༩͑Δ͜ͱͳ͘ॠ࣌ʹෛՙࢄ͕Ͱ͖͍ͯΔɻ5ສϦΫΤετҎ߱CPU͕ݩͷ2ഒʹڧԽ͞ΕͨͨΊɺϨεϙϯελΠϜ͕ͱͳͬͯΓͷ5ສϦΫΤετ࣌ؒͰॲཧ͍ͯ͠Δ͜ͱ͕͔Δɻ
5.·ͱΊ
• ΦʔτεέʔϧͷॲཧίετͱϦιʔεޮԽͷ՝ʹண• ෆมੑΛ͏ج൫ͷηΩϡϦςΟͱӡ༻ٕज़ͷ՝ʹண• Πϯελϯε͕॥͠มԽʹڧ͍ԾԽج൫ٕज़ͷఏҊ• immutabilityɺmortalityɺreactivity͕ಛ• Πϯελϯεͷঢ়ଶมԽͷίετޮԽʹண28·ͱΊ
• ϓϩμΫτͱͯ͠ϦϦʔε࣮͠ӡ༻্ͷޮՌΛଌఆ• Πϯελϯεͷ॥ʹGCͷΑ͏ͳϞσϧΛద༻ͯ͠ޮԽ• CRIUʹΑΓԠతىಈΛαεϖϯυతىಈʹରԠ• ىಈͷ͍ίϯςφ(JVMͳͲ)ʹରԠՄೳ͔ݕূ• ະղܾͷϋʔυΣΞεέδϡʔϦϯάͷ՝ͷରԠ29ࠓޙͷ՝
ݚڀһɺੵۃతʹืूதʂhttp://rand.pepabo.com/