Mackerelチームにおけるインフラオーナーシップ
MackerelνʔϜʹ͓͚ΔΠϯϑϥΦʔφʔγοϓגࣜձࣾͯͳ id:itchyny2018/6/23 ͯͳɾϖύϘٕज़େձ#4
View Slide
ࣗݾհגࣜձࣾͯͳ ΞϓϦέʔγϣϯΤϯδχΞMackerelνʔϜ ࢛͖: Go, Rust, Scala, Haskell, VimϓϩάϥϜϞάϞά itchyny.hatenablog.com⅓ా ݈ id:itchyny
ϓϩάϥϜϞάϞάද࡞: lightline.vim
ʮΠϯϑϥΦʔφʔγοϓʯ
ΠϯϑϥΦʔφʔγοϓ• ։ൃνʔϜ͕ΠϯϑϥͷΦʔφʔγοϓΛ࣋ͭ• ϞχλϦϯάɾϗετཧɾΩϟύγςΟϓϥϯχϯά ։ൃڥCIڥͷߏஙɾΠϯϑϥߏͷઃܭ• ΠϯϑϥνʔϜωοτϫʔΫͳͲͷڞ௨ج൫ʹઐ೦• DevOpsͷ͋ΓํΛݟͨ݁͠Ռ৴པੑͱඅ༻ΛαʔϏε։ൃνʔϜ͕Λ࣋ͭ
͜Ε·Ͱ• ΠϯϑϥνʔϜ (ԣ۲৫) ͕ݸʑͷαʔϏεΛ୲• αʔόʔͷཧϞχλϦϯάΠϯϑϥϝϯόʔ͕୲• αʔϏεʹΑͬͯٻΊΒΕΔΠϯϑϥ͕ࣝΒΒ• Apache + mod_perl + MySQL ΦϯϓϨ ͷαʔϏε͕ଟ → Scala + PostgreSQL / Go on EC2, ECS, Lambda…• ٻΊΒΕΔ৴པੑ (Մ༻ੑ): ಛʹtoBtoBtoC
• Πϯϑϥϝϯόʔͷ୲αʔϏεͷࣄ͕ଟ͘ɺ ج൫γεςϜͷཧ։ൃ͕͓Ζ͔ͦʹ…• Πϯϑϥϝϯόʔͷ୲αʔϏεସ͕͑ࠔ• োରԠଞͷΠϯϑϥϝϯόʔʹ͍͠• ։ൃνʔϜ͕Մ༻ੑΠϯϑϥඅ༻Λग़࣌͢ʹ ΠϯϑϥνʔϜΛר͖ࠐ·ͳ͍ͱ͍͚ͳ͍
͜Ε͔Β• ։ൃνʔϜ͕αʔόʔ͔ΒϛυϧΣΞͷཧΛߦ͏• αʔόʔߏங/ཧɾΩϟύγςΟϓϥϯχϯά ։ൃڥɾCIڥߏஙɾϞχλϦϯάɾোରԠ• αʔϏεͷ৴པੑͱඅ༻Λ֤։ൃνʔϜ͕ཧ• ΠϯϑϥνʔϜԾԽɾωοτϫʔΫج൫ɾOSΛ୲
։ൃνʔϜʹͱͬͯ• ΠϯϑϥࣝΛ͚͍͔ͭͯ͘͠ͳ͍• αʔόʔΛཱͯΒΕΔΑ͏ʹͳΔ• దͳࢹΛઃఆͰ͖ΔΑ͏ʹͳΔ• োରԠͰ͖ΔΑ͏ʹͳΔ• Մ༻ੑΛτϥοΩϯάͰ͖ΔΑ͏ʹͳΔ
։ൃνʔϜͲ͏͢ΕΠϯϑϥͷΦʔφʔγοϓΛࣗ৴ΛͬͯऔΕΔΑ͏ʹͳΔͷ͔
Mackerelmackerel.io
Mackerelͱ• SaaSͷαʔόʔཧɾࢹπʔϧ• ͯͳࣾͷαʔόʔཧγεςϜΛαʔϏεԽͯ͠ެ։• Mackerelࡾ• Scala + Go / PostgreSQL + Redis
ݱࡏͷνʔϜͷମ੍• ΞϓϦέʔγϣϯΤϯδχΞ໊ + σβΠφʔ + Director + Producer + Sales + CRE• Πϯϑϥϝϯόʔ1ਓ͕νʔϜʹೖ͍ͬͯΔ• ேձνʔϜͷձٞʹࢀՃ• σεΫྡ: ίϛϡχέʔγϣϯେࣄ
ೖࣾͨ࣌͠ͷࢲ• ΣϒΞϓϦέʔγϣϯͷΈΛΒͳ͍• SQLΛΒͳ͍• LinuxΛΒͳ͍ (ͳ͔ͥMacΛ͍ͬͯΔ)• AWSΛΒͳ͍• ίʔυͪΐͬͱॻ͚Δ (ͳ͔ͥHaskellͱVim͕͖)
ඞཁͳࣝ• ͦͦαʔόʔͱɺࢹͱ…• σβΠφʔʹجຊతͳ͜ͱཧղͯ͠Β͏• LinuxɾWindowsͷγεςϜϝτϦοΫ• ֤छϛυϧΣΞͷಛࢹɾϝτϦοΫɾάϥϑͷݟํ• ϚωʔδυαʔϏε• ֤छνϟοτπʔϧͱͷ࿈ܞɹChefɾAnsible• rpm/debϦϙδτϦɾWindows msi
υοάϑʔσΟϯά• MackerelνʔϜ࠷ߴͷυοάϑʔσΟϯά͕Ͱ͖Δ• ࡞͍ͬͯΔαʔϏεΛΔ → ࣗͷαʔϏεΛࢹ͢Δ• ࢹ͍ͯ͠ͳ͍ͱ͜Ζ͕͔Δ → ࡞Δ → ࢹΛ࢝ΊΔ• ։ൃΤϯδχΞසൟʹը໘ΛݟΔ• ۀʹΈࠐΉ·Ͱ͕ػೳ։ൃ ྫ: σϓϩΠͰάϥϑΞϊςʔγϣϯ• ଞνʔϜͷ։ൃΤϯδχΞMackerelΛΑ͘͏
σϓϩΠ• σϓϩΠ୲ͷΤϯδχΞΛॱ൪ʹΞαΠϯ• ୲ΤϯδχΞμογϡϘʔυΛॱ൪ʹݟ͍ͯ͘• ීஈͷϝτϦοΫͷ༷ࢠΛΔ܇࿅ ࢹ͢Δ = ҟৗঢ়ଶΛఆΊΔ = ීஈΛΔ• σϓϩΠΠϯϑϥΛݟΔྑ͍ػձ• σϓϩΠͱɺͲ͜ʹԿΛͲ͏͢Δ͜ͱͳͷ͔ʁ• σϓϩΠίϚϯυͷཪଆͰԿ͕ى͖͍ͯΔͷ͔ʁ
MackerelνʔϜͷΤϯδχΞීஈͷ։ൃΛ͠ͳ͕ΒΠϯϑϥΛֶΜͰ͍Δֶ͟ΔΛಘͳ͍αʔϏεΛ࡞͍ͬͯΔ
͍߹Θͤͷྫ• MySQL/DockerϓϥάΠϯͰϝτϦοΫ͕औಘͰ͖ͳ͍• ϒϥβʔͰݟΕΔͷʹ֎ܗࢹͰΤϥʔ͕ग़Δ• CPU steal͕100%ʹுΓ͍͍ͯΔ• WindowsͰprocess queue length͕औΕ͍ͯͳ͍• loadavg͕7࣌ؒ͝ͱʹ্ঢ͢Δ֤छϛυϧΣΞOSɺ֎ܗࢹͰDNSͷΈͳͲͷ͕ࣝΘΕΔ
https://mackerel.io/ja/blog/entry/tech/high-loadavg-every-7-hours
αϙʔτ୲• αϙʔτ͔ΒͷௐࠪґཔΛड͚ΔΤϯδχΞΛॱ൪ʹ୲• ຖि୲Λճͯ͠શһ͕͋ͨΔ• ͔Βͳ͚Εଞͷਓͱڞʹௐࠪɾݟͷڞ༗• ෆ۩߹ͷൃݟ मਖ਼ผλεΫͱͯ͠issueΛཱͯΔ ؆୯ͳͷ͍ͭͰʹ͢͜ͱ͋Δ
αϙʔτ୲Λճ͢͜ͱͰΒͳ͍ػೳϛυϧΣΞΛֶͿௐࠪํ๏ɾΠϯϑϥࣝͷԣల։loadavgʹ͍ͭͯҟৗʹৄ͘͠ͳͬͨΓ͢Δ
PWG• Performance Working Group• ύϑΥʔϚϯεͷ֬ೝɾى͖ͨোͱରࡦਐḿͷ֬ೝ• ࢀՃऀΠϯϑϥΤϯδχΞͱ։ൃΤϯδχΞશһ• ࢘ձ୲Λॱ൪ʹճ͢: ϝϯόʔͷཧղΛਂΊΔ ฉ͚ͩ͘ΑΓɺ࢘ձͱͯ͠આ໌͢Δ͜ͱͰཧղ• άϥϑΛݟΔίʔφʔ
োରԠৼΓฦΓ• োͷৼΓฦΓͱผʹɺରԠͨ͠खॱͳͲΛ֬ೝ• ଐਓੑ: ܦݧଟ͍ΤϯδχΞ͕ҰॠͰͯ͠͠·͏ ԿΛࢥͬͯԿΛͲ͏ݟͯͲͷΑ͏ʹஅ͔ͨ͠• ͲͷάϥϑΛݟ͔ͨɺͲͷαʔόʔͷϩάΛݟ͔ͨ• ରԠ͠ͳ͔ͬͨਓ͕stagingͰ࣮ࡍʹखॱΛ࠶ݱ• ো࣌ͷௐࠪͷͨΊͷΈͮ͘Γ ϩάཧը໘ͷվળɾμογϡϘʔυ࡞ͳͲোى͖ͯཉ͘͠ͳ͍͕ɺى͖ͨͱ͖ଟ͘ͷֶͼΛಘΔ
Մ༻ੑɾίεττϥοΩϯά• Մ༻ੑ: ো͝ͱʹه͠ɺPWGͰ֬ೝ• ։ൃνʔϜ͕ظ͝ͱʹඪΛ࣋ͭ• SLAެ։Λࢦ͢• ίετ: ΠϯϑϥϝϯόʔͱσΟϨΫλʔ͕֬ೝձ• ։ൃϝϯόʔAWS cost explorerͰ֬ೝͰ͖Δ• Node.js 6.10→8.10 Ͱ Lambdaͷίετ1ׂݮ
ϚωʔδυαʔϏε• ࣌ܥྻσʔλϕʔε: LambdaɾDynamoDBɾS3• Πϯϑϥ৮Γ͘͢ͳ͖͍ͬͯͯΔ• ΩϟύγςΟʔมߋ୭ͰͰ͖Δ࣌• ʮ࣌ܥྻσʔλϕʔεݟڞ༗ձʯ• ։ൃΤϯδχΞࣗવͱίετΛݟΔΑ͏ʹͳΔ• Cost ExplorerͰreportΛඋ
ίϯςφԽ• deploy / rollback͕ѹతʹָʹͳΔ• ΦʔτεέʔϧΛߟྀͨ͠ίϯςφج൫• ࣾͷChefڞ௨ج൫ͷґଘΛࣙΊΒΕΔ• ϞχλϦϯάؚΊͯࠓͷ՝• MackerelͷίϯςφରԠ։ൃதͰ͢• Dockerfileͱ͍͏ڞ௨ݴޠɾϛυϧΣΞͱͷଓΛએݴతʹߦ͏
࠷ۙͷMackerelνʔϜͷձ• DevʮݴͬͯͨϓϥάΠϯͷόάͨ͠ͷͰΞοϓσʔτ͓͍ͯͨ͠ʯ OpsʮͲͲʯ• Devʮ͜͜ϝτϦοΫݟ͓͚ͯΑͦ͞͏ͳͷͰࢹ࡞͓͍ͬͯͨΑʯ Opsʮྃղʯ• DevʮલݴΘΕͯͨ৽ػೳ࣮ͨ͠Αʙʯ Opsʮͬͨʔศརʙʯ• Opsʮstagingͷ΄͛΄͛ΛίϯςφԽ͠·ͨ͠ʯ Devʮ͗͢͢͝Δʯ
·ͱΊ• ΠϯϑϥΛֶͿͷָ͍͠• ٕज़ͷਐาͰΠϯϑϥཧָʹͳ͖͍ͬͯͯΔ• ௐୡɾεέʔϧΞτɾϩʔϧόοΫAPIͰͰ͖Δ࣌• ιϑτΣΞʹΑͬͯࣗಈԽ͞ΕΔ࣌• ΠϯϑϥΤϯδχΞωοτϫʔΫ/OSͷϨΠϠʔʹઐ೦• ΦϖϨʔγϣϯπʔϧΛ͘͢࡞ΕΔਓڧ͍
αʔϏεզ͕ࢠ