ペパボ・はてな技術大会〜インフラ技術基盤〜@福岡 vol.3 で発表した内容となります。 下記スライドの続きとなっているので下記スライドから見ると流れがわかりやすいと思います。 https://speakerdeck.com/yuukit/the-concept-of-hatena-system
ͯͳͷΠϯϑϥετϥΫνϟઃܭߏϖύϘɾͯͳٕज़େձ~ Πϯϑϥٕज़ج൫ ~ @Ԭɹɹɹɹɹid:masayoshi
View Slide
ΞδΣϯμ• ࣗݾհ• ͡Ίʹ• ͯͳγεςϜ• ͳͥղͱ࠶ߏஙΛϏδϣϯʹͨ͠ͷ͔?• ࣾߏཧπʔϧ• ղͱ࠶ߏஙྫͷհ• ΞʔΩςΫνϟͷղͱ࠶ߏங• ػೳͷղͱ࠶ߏங
ࣗݾհ• id:masayoshi• twitter: yoyogidesaiz• WebΦϖϨʔγϣϯΤϯδχΞ 2016ೖࣾ• ओʹωοτϫʔΫɺԾαʔόج൫ํ໘ͷ୲
͡Ίʹ• ղͱ࠶ߏஙʹΑ࣮ͬͯݱ͢ΔΠϯϑϥج൫ߏΛ͠·͢• y_uukiͷൃදΑΓ͏Ұา۩ମతͳ༰Λ͠·͢• ͜͜Ͱ͍͏Πϯϑϥج൫ʮͯͳͷʯΠϯϑϥج൫Ͱ͢• ࣄۀ༰,نʹΑͬͯΠϯϑϥج൫େ͖͘ҟͳΓ·͢• ͥͻϖύϘɾͯͳͰͷҧ͍Λתೳ͍ͯͩ͘͠͞ʂ• SREຊΛಡΉͱGoogleͷΠϯϑϥج൫ʹ৮ΕΔ͜ͱग़དྷΔͰ͠ΐ͏※1 https://landing.google.com/sre/book.html※1
ͯͳγεςϜ
ͯͳγεςϜ• ղͱ࠶ߏங• Repairable Infrastructure• ؍ଌͱ࣮ݧ• Experimental Infrastructure• ࠓճͪ͜Βѻ͍·ͤΜ
ͳͥզʑղͱ࠶ߏஙΛϏδϣϯʹͨ͠ͷ͔?
10ͷॏΈ• ઌఔͷฐࣾy_uukiͷʮͯͳγεςϜߏʯ• 10ͭʹ?• ࣾαʔόߏཧπʔϧ• ࣮ࡍʹ10ࢧ͑ͨͯͳͷΠϯϑϥج൫ͷத• 2007ࠒ͔Β։ൃελʔτͨ͠• վળ͠ͳ͕Βདྷ͕ͨ৭ʑͭΒ͘ͳ͖ͬͯͨ
ͪͳΈʹ2007͝Ζ(10લ)͜Μͳ࣌ʂʂ• CentOS5͕ϦϦʔε͞ΕΔ• Linux Kernel 2.60.20 ͕ϦϦʔε͞ΕKVM͕౷߹͞Εͨ• 2006ʹAWS S3, EC2͕αʔϏεఏڙ։࢝• ౦ژϦʔδϣϯ2011։ઃ• iPhoneॳ͕ൃച• Androidࡌͷܞଳిൃച͕2008
2007ʹ࡞͞Εͨࣾαʔόߏཧπʔϧ• ϋΠύʔόΠβʔܕͷԾϚγϯલఏͷߏ• σʔληϯλΛલఏʹͨ͠ઃܭ• ϥοΫྻͱ͔ిѹͱ͔• αʔϏεͱϩʔϧͷΈ߹ΘͤʹΑΔαʔόཧ• Hatena-Blog—DB, Hatena-Blog—Proxy• αʔϏε,ϩʔϧʹج͍ͮͨDNSϨίʔυͷੜ• db.hatena-blog.service.hosts 192.168.0.1• ωοτϫʔΫʹԠͨ͡IPΞυϨεͷ͍ग़͠• εςʔλεใͷཧ(working, standby, maintenance,…)• ࢹઃఆͷࣗಈઃఆ• αʔόຖʹϝτϦοΫΛRRDToolʹΑΔՄࢹԽ·ͩ·ͩػೳ͋Δͧ!!!
طଘͷࣾαʔόߏཧπʔϧͷྑ͔ͬͨ• αʔϏεɾϩʔϧͱεςʔλεʹج͍༷ͮͨʑͳػೳ• DNSͷϨίʔυੜ• σϓϩΠઌαʔόͷಛఆ• ࢹઃఆͷࣗಈԽɺࢹͷ௨on,off• ͯͳͷΠϯϑϥج൫Λ10ࢧ͑ͨ• վमΛॏͶͯෛ࠴ଟ͍͕͔ͬ͠Γࢧ͑ͨ
طଘͷࣾαʔόߏཧπʔϧͷ• ઐଐͷϝϯςφʔෆࡏ• ࣾπʔϧͷϝϯςφϯε์ஔ͞Ε͕ͪ• ߏཧπʔϧͰ͔͗͢Δ• શ෦͕ґଘ͍ͯͯ͠มߋͷίετ͕ߴ͍• ྑ͍OSS͕ग़ͨͱ͖ʹ͚ͦͩ͜Ҡߦ͢Δͷ͕͍͠• ωοτϫʔΫଆͷػೳͳͲΛΓࠐΈ͗ͨ͢
ݱࡏͷࣾαʔόߏཧπʔϧࣄ• MackerelΛαʔόࢹαʔϏεͱͯ͠ϦϦʔε• ߏཧπʔϧͷྑ͍ͱ͜ΖΛ͠ɺࣾࣄΛഉআ• αʔϏεʹͳΕϝϯςφʔͭ͘ʂʂ• ʮࣾͷΞϓϦέʔγϣϯΛOSSʹ͢Δʯͱࣅͨٞ• ͱ͍͑ࣾࣄΠϯϑϥج൫ͰΧόʔ͢Δඞཁ͕͋Δ• MackerelΛ͍ͭͭɺطଘͷߏཧπʔϧซ༻• ࣾࣄΛΧόʔ͢Δɺ࣍ͷ10Λࢧ͑Δ৽نΠϯϑϥج൫ͷඋ͕ඞཁ
কདྷͷΠϯϑϥج൫ʹٻΊΒΕΔ͜ͱ• ઐଐͷϝϯςφϯε୲͕͚ͭΒΕͳ͍͜ͱ͋Δ• 10ઌΛݟӽͨ͠ᘳͳઃܭ΄΅ෆՄೳ• 3ఔͰϦϓϨʔε͢Δඞཁ͕͋Δ• શػೳΛશͯΛϦϓϨʔε͢Δඞཁͳ͍Ұ෦ػೳΛ3ఔͰϦϓϨʔεՄೳͳΠϯϑϥج൫Repairable Infrastructure
Repairable Infrastructure~ ղͱ࠶ߏங ~
Repairable InfrastructureΛࢦͨ͢Ίʹ• ղͱ࠶ߏஙΛ͠ɺRepairable InfrastructureΛࢦ͢• ΞʔΩςΫνϟͷղͱ࠶ߏங• ػೳͷղͱ࠶ߏங
ΞʔΩςΫνϟͷղͱ࠶ߏங~ ղͱ࠶ߏங ~
ΞʔΩςΫνϟͷղͱ࠶ߏங• ࠓ·Ͱͷ֊ߏΛҰճղ͠ɺ࠶ߏங• ໌֬ͳ୯ޠ͕ͳ͍ͱ͜Ζ৽ͨʹఆٛ• ࠶ఆٛྫΛ2ͭհ
શମͷཧϨΠϠʔߏ(چ)DataCenter or CloudContainer or ServerlessInfrastructureApplication 4FSWJDF" 4FSWJDF# 4FSWJDF$*OGSBTUSVDUVSF$MPVE )PVTJOH• σʔληϯλ͔ΒΫϥυͳͲେ͖ͳڥͷมԽ• αʔϏε͕૿͑Δͱ”ྫ֎ͳΠϯϑϥ”͕૿͍͑ͯ͘• InfrastructureͰ࣮͢ΔͱαʔϏε͕૿͑Δͨͼʹվम͕ࠔ• Applicationͱ͍͏ͷԿ͔ҧ͏…
શମͷཧϨΠϠʔߏ(৽)ResourceDomestic InfrastructureService AdapterService Application 4FSWJDF" 4FSWJDF# 4FSWJDF$*OGSBTUSVDUVSF$MPVE )PVTJOH4FSWJDF"PS# 4FSWJDF$• Service Adapter ͰαʔϏεࠩҟΛٵऩ• Domestic Infrastructure ͰࣾࣄΛٵऩ• Resource AWSɺΦϯϓϨڥɺαʔόϨεͷϦιʔεͳͲ
Service Adapter LayerΛઃ͚ͨཧ༝• Πϯϑϥج൫ΛRepairableʹ͢ΔͨΊ• ಛఆαʔϏεͷҝͷ֦ுΛ܁Γฦ͢• αʔϏεͷมԽʹΠϯϑϥج൫͕͍͚ͭͳ͍• ΞϓϦέʔγϣϯRepairableʹͳΔ• ୲ྖҬͷ໌֬Խ• ΞϓϦέʔγϣϯΤϯδχΞ͕ΠϯϑϥࣾࣄͷѲࠔ• ΠϯϑϥΤϯδχΞ͕֤αʔϏεͷίʔυঢ়گѲࠔ• Service Adapter྆ऀ͕৮Δ
%FCJBO%FCJBOαʔόͷϨΠϠʔߏ• γεςϜ(OS)ʹΠϯετʔϧ͞Ε͍ͯΔͷΛར༻͢Δ• OSͷมߋͷࡍͷӨڹ͕େ͖͍ => RepairableͰͳ͍1FSM 1FSM"11 "11APP LayerOS Layer
%FCJBO%FCJBO$POUBJOFSDISPPU$POUBJOFSDISPPUαʔόͷϨΠϠʔߏ• APP͕͔ͭ͏lib, ϛυϧΣΞ, ࣮ߦڥΛՄೳͳݶΓ• OSͷมߋ͕͠қ͍ => Repairable !System Library LayerLocal Library Layer1FSM 1FSM1FSM 1FSM"11 "11APP LayerOS Layer
αʔόͷϨΠϠʔߏ• localͱsystemͷΛ࣮ݱ͢ΔγεςϜ• rbenv, plenv, pyenv, mysqlenv,…..• chroot• ίϯςφٕज़• ্هͷதͰchroot͕γϯϓϧ͔ͭ൚༻ੑ͕ߴ͍• dockerศར͕ͩɺ͜ͷͨΊ͚ͩʹ͏ͷॏ͍• ίϯςφٕज़ͷҰ෦(namespace)ͱchrootͷΈ߹Θͤ• => drootͷ։ൃ• ͜Εػೳͷղͱ࠶ߏஙͱ͍͑Δ
ΞʔΩςΫνϟͷղͱ࠶ߏங• ͜ͷΑ͏ͳײ͡ͰΞʔΩςΫνϟΛ࠶ఆ͍ٛͯ͘͠• ղͱ࠶ߏஙιϑτΣΞωοτϫʔΫΛࢀߟʹ
ػೳͷղͱ࠶ߏங~ ղͱ࠶ߏங ~
ػೳͷղͱ࠶ߏங• ػೳͷղͱ࠶ߏங• ࠶ߏஙͨ͠ΞʔΩςΫνϟͷద߹͢ΔΑ͏ʹղ͠࠶ߏங• ద߹͢ΔOSS, ϚωʔδυαʔϏεΛ୳͢• ػೳ͕Γͳ͚Ε + αͰ࣮͢Δ• ࣮ͷࡍʹRepairable͔Ͳ͏͔ߟྀ࣮ͯ͢͠Δ• ࠶ͼղͱ࠶ߏங͕Ͱ͖Δͷ͔• ґଘϞδϡʔϧͷଟ͞ɺ࣮͕େม͞ͳͲ• কདྷద߹ͨ͠OSS͕ग़͖ͯͨͱ͖ʹҠߦͰ͖Δ͔
ػೳͷղͱ࠶ߏஙྫ• droot• ฐࣾy_uukiͷൃදͰ͋ͬͨͷͰলུ• IP Drawer• IP͍ग़͠ػೳͷ࣮
IP͍ग़͠ػೳ͕ཉ͔ͬͨ͠ཧ༝• Ծαʔό࡞࣌ͷIPΞυϨεܾఆ• DHCPαʔόΛαʔϏεͷՄ༻ੑͰӡ༻ͨ͘͠ͳ͍• ΦϯϓϨԾαʔό࡞࣌ʹݻఆʹ͍ͨ͠• EC2VPCͷDHCPͰΓ͍ͨ• VIPͷܾఆਓ͕Γ͍ͨͷͰਓʹ͍ग़ͯ͠ཉ͍͠• طଘͷߏཧπʔϧ͔ΒIP͍ग़͠ػೳΛ͍ͨ͠• ղͱ࠶ߏங• ඞཁͳͷओʹIPΞυϨεͷ͍ग़͠• DHCPαʔόͰREST APIରԠ͍ͯ͠Δͷ͕Kea͙Β͍ͩͬͨ• IP͍ग़ͯ͠ཉ͍͙͠Β͍ͩͬͨͷͰͰ͔ͦ͏ͩͬͨ• golangͱRedisͰαΫοͱΞϧόΠτʹ࡞ͬͯΒͬͨ
࣮ࡍͷ࣮• IPΞυϨεͷ͍ग़͠RESTͰߦΘΕΔ• DHCPϓϩτίϧͷ࣮Βͳ͔ͬͨ• DHCP͔ΒͷҠߦָ͕ͩ͠ฒߦӡ༻ՄೳͰ༻ΛΊΔ͜ͱ͘͠ͳ͍ਓ*1%SBXFS71$%)$1αʔόαʔό IP͍ग़͠IP͍ग़͠IPϦϦʔεࡁΈIPϦϦʔεࡁΈIPϦϦʔεࡁΈIP͍ग़͠DHCPͰઃఆ͍ͨ͠IPݻఆͰઃఆ͍ͨ͠IPखಈͰઃఆ͍ͨ͠
ػೳͷղͱ࠶ߏங• ࠶ߏங͠ͳ͍Ͱద߹͢ΔͳΒͦΕΛར༻͢Δ• μϝͦ͏ͳΒࣾࣄΛߟྀ͠ɺബ͍࣮Λ͢Δ• Domestic Infrastructure Layerബ͘• ద߹͢Δͷੵۃతʹ Resource LayerͰ• ग़ɺϑϧεΫϥονͷେม͞Λߟྀ࣮͠ΛબͿ
·ͱΊ• ϏδϣϯΛࣔ͢͜ͱʹΑΓઓུతʹվળΛ͢Δ• ݱࡏղͱ࠶ߏஙʹΑΓΞʔΩςΫνϟͳͲΛఆٛ• ΞʔΩςΫνϟʹैͬͯػೳͷղͱ࠶ߏங• ػೳͷΓग़͠Λ͢Δ͔ͳͲͷஅج४ʹ• ࠓޙ؍ଌͱ࣮ݧճͯ͠ߦ͖͍ͨ• MackerelΛ࠷େݶར༻ͨ͠؍ଌ• ࣮ݧͱϑΟʔυόοΫ੍ޚ