pixiv SPRING BOOTCAMP 2015 講義資料
ΫϥυͱΦϯϓϨShunsuke Michii / Harukasan2015-03-11
View Slide
Harukasan / Shunsuke Michii• 2012ʹ৽ଔͱͯ͠ΠϯϑϥνʔϜʹଐ• ίϯςϯπ৴Λ͡Ίͱͯ͠αʔϏεશମͷج൫Λ୲• αʔϏεج൫͚ͩͰͳ͘σʔλղੳج൫ͷߏஙͳͲ• ٕज़ܥࡶࢽͷࣥචͳͲϐΫγϒגࣜձࣾɹΠϯϑϥνʔϜ
Agenda• WebαʔϏεʹ͓͚ΔΠϯϑϥετϥΫνϟ• ΫϥυͱΦϯϓϨϛεͷҧ͍• ΫϥελϦϯάͱΦʔέετϨʔγϣϯ
WebαʔϏεʹ͓͚ΔΠϯϑϥετϥΫνϟ• ͦͦΠϯϑϥετϥΫνϟͱ• ΤϯδχΞϦϯάεέʔϧ͠ͳ͍• ΠϯϑϥνʔϜͱ• ΠϯϑϥετϥΫνϟεέʔϧ͢Δ
Q1 ͋ͳ͕ͨWebαʔϏεΛઃܭ͢ΔͳΒͲͷΑ͏ͳߏΛߟ͑Δ͔ʁ
Application ApplicationDatabaseCache StorageApplicationApplicationLoad BalancerDNS
?? ???? ? ?Application ApplicationDatabaseCache StorageApplicationApplicationLoad BalancerDNS
ServerServerServer ServerServerLocal NetworkInternetServerServer / ApplianceServerServerApplication ApplicationDatabaseCache StorageApplicationApplicationLoad BalancerDNS
HerokuAdd-onAdd-on Add-onApplicationAdd-onDNSDatabaseCache Storage
EC2 EC2RDSElastiCache S3EC2EC2ELBRoute53DatabaseCache StorageApplication ApplicationApplicationApplicationDNS Load Balancer
DNS
ͦͦ ΠϯϑϥετϥΫνϟͱ• αʔϏεΛӡ༻͢Δ্Ͱɺ߃ৗతʹඞཁͱͳΔج൫• αʔϏεΛߏங͢Δ্ͰͱͳΔͷ• ࣗͰΒͳ͍ͱ͜Ζ
ΠϯϑϥετϥΫνϟ ͦΕࣗՁΛੜ·ͳ͍• ຊʹՁ͕͋Δͷӡ༻͍ͯ͠ΔαʔϏεɺ͍҃αʔϏε͕ఏڙ͍ͯ͠ΔͷͰ͋Δ• Πϯϑϥͱͯ͠ԿΛબ͢Δ͔ɺͲ͏͍͏ߏʹ͢Δ͔ͱ͍ͬͨߏஙϊϋ͕ՁʹͳΔ͜ͱ͋Δ͕ɺΠϯϑϥࣗମՁʹͳΒͳ͍
Ͳ͜ͰՁΛੜΉ͔• ΠϯϑϥΑΓ্ͷϨΠϠʔͰՁΛੜΈग़͢• ʢΤϯδχΞͱͯ͠ʣͲ͜ͰՁΛग़͔͕͢ॏཁ
ContentsσβΠϯɾίʔσΟϯάίϯςϯπࣥචDNSvalue value
DNSContentsHerokuAdd-onDatabaseAdd-onCacheAdd-onStorageApplicationσβΠϯɾίʔσΟϯάઃܭɾ։ൃγεςϜઃܭίϯςϯπࣥචvalue valuevaluevalue
ΤϯδχΞϦϯά εέʔϧ͠ͳ͍• ࣗͷೳྗ͕ٸʹ100ഒʹͳΔ͜ͱͳ͍• ʢΤϯδχΞͱͯ͠ʣͲ͜ͰՁΛग़͔͕͢ॏཁ
εέʔϧ͠ͳ͍ͷΛ࡞Βͳ͍• 1ਓ͔͠ఏڙ͠ͳ͍αʔϏεͦΕҎ্ͷՁΛੜΊͳ͍• ਓεέʔϧ͠ͳ͍͕ʢ͠ͳ͍ͷͰʣɺ༻͢Δਓ͕ଟ͍΄Ͳ1ਓʹఏڙ͢ΔαʔϏεͷίετԼ͕Δ• εέʔϧ͢ΔϚʔέοτ͕͋Δ͔
ΠϯϑϥνʔϜͱ• αʔϏεΠϯϑϥΛ։ൃऀʹఏڙ͢Δ• ͬͯΔ͜ͱ֤ࣾΒΒ• ΠϯϑϥνʔϜࣗମ͕Πϯϑϥ
ΠϯϑϥνʔϜApplication
ʢۃΛݴ͏ͱʣࣗͷཱͪҐஔΑΓ ԼͷϨΠϠʔͯ͢Πϯϑϥ• ΠϯϑϥΤϯδχΞ͔ΒݟͨΒDCۀऀΠϯϑϥ• DCۀऀ͔ΒΈͯిؾࣄۀऀΠϯϑϥ• ։ൃऀ͔ΒΈͯΠϯϑϥΤϯδχΞΠϯϑϥ• ܦӦऀ͔ΒΈͯܧଓత։ൃΠϯϑϥʢʹࣄۀج൫ʣ
ΠϯϑϥετϥΫνϟ εέʔϧ͢Δ• ΠϯϑϥετϥΫνϟαʔϏεͱͯ͠εέʔϧ͢Δ• ύλʔϯԽͰ͖Δʹεέʔϧ͢Δ• εέʔϧ͢Ε͢Δ΄ͲίετϝϦοτ͕ग़Δ• ڊਓͷݞʹΔ
IaaS (Infrastructure as a Service)• WebαʔϏεͷΠϯϑϥετϥΫνϟΛαʔϏεͱͯ͠ఏڙ͢Δ• දతͳαʔϏεʹAWSɺGCPɺSoftLayerͳͲ• ࣗࣾͷΠϯϑϥετϥΫνϟج൫ΛαʔϏεͱͯ͠ఏڙ͍ͯ͠Δ
XaaS (X as a Service)• ͳΜͱ͔as a ServiceͱݺΕΔͷશ෦ΠϯϑϥͳͷͰ·ͱΊͯIaaSͰΑ͍• ͲͷϨΠϠʔ·Ͱఏڙ͍ͯ͠Δ͔Θ͔Βͳ͘ͳΔʢൺֱͰ͖ͳ͘ͳΔʣͷͰPaaSΈ͍ͨͳݴ༿͕ΘΕΔ
WebαʔϏεʹ͓͚ΔΠϯϑϥετϥΫνϟ• ࣗͰΒͳ͍ͱ͜Ζ• ʢΤϯδχΞͱͯ͠ʣͲ͜ͰՁΛग़͔͕͢ॏཁ• ΠϯϑϥΛαʔϏεʹ͢Δͱεέʔϧ͢Δ·ͱΊ:
break
IaaSͱΦϯϓϨ• ΦϯϓϨͱʁ• IaaSͱΦϯϓϨͷҧ͍
ΦϯϓϨϛε: On-Premises• ༁͢Δͱ"ߏʹ"ͱͳΔ• ͱͱࣾʹΠϯϑϥετϥΫνϟΛઃஔ͢Δ͜ͱΛ͍ࣔͯͨ͠
ͳͥΦϯϓϨͱݴ͏ͷ͔• Ϋϥυͷରٛޠ͕ͳ͔ͬͨ• Macͷରٛޠͱͯ͠ͷPC
ݱͷΦϯϓϨϛεڥ Ϋϥυʹ͍ۙ• ࣗࣾߏʹαʔό͓͍ͯΔͱ͜ΖͳΜͯ·Ε• ଏʹ”ΦϯϓϨ”ͱݺΕΔͱ͖αʔόIDCʹઃஔ ͯ͋͠Δ• ੈͷதͷ΄ͱΜͲͷΦϯϓϨ”ͳΜͪΌͬͯΦϯϓϨϛε”ʹͳͬͯΔ
ຊͷΦϯϓϨϛε ͳΜͪΌͬͯΦϯϓϨϛεઃஔॴ ࣗࣾDC ϗεςΟϯάαʔόઃஔɾཧ ࣗࣾ IDCɾϕϯμʔௐୡ ࣗࣾ ࣗࣾɾϕϯμʔిݯ ࣗࣾܖ IDCରࡦ ࣗࣾͰઃܭ IDCճઢ ઐ༻ճઢ IDCճઢࢹ ࣗࣾ IDC
Q2 IaaSͱΦϯϓϨϛεͷେ͖ͳҧ͍ͱʁ
IaaSͱΦϯϓϨͷҧ͍• ͚ࣗͩͰ͏͔ɺΈΜͳͰ͏͔• ͍ํ͕ҧ͏ͷͰ՝ۚମܥ͕େ͖͘ҟͳΔ
ΦϯϓϨͷௐୡLoadInfrastructure• ෛՙʹ߹ΘͤͯௐୡܭըΛཱͯΔௐୡλΠϛϯά↓ௐୡλΠϛϯά↓ௐୡλΠϛϯά↓
WasteΦϯϓϨͷௐୡLoad• ෛՙʹ߹ΘͤͯௐୡܭըΛཱͯΔௐୡλΠϛϯά↓ௐୡλΠϛϯά↓ௐୡλΠϛϯά↓
ΦϯϓϨେม• ͏ͷશͯࣗͰ༻ҙࣗ͠Ͱӡ༻͢Δ• εέʔϧ͠ͳ͍• ઌΛಡ·ͳ͍ͱ͍͚ͳ͍
IaaSͷௐୡLoad• ෛՙʹ߹Θͤͯ૿ݮͰ͖Δʢཧʣ
IaaSͷௐୡLoad• ෛՙʹ߹Θͤͯ૿ݮͰ͖Δʢݱ࣮ʣ
IaaS͚ͬ͜͏େม• ݁ہࣗͰεέʔϦϯά͢ΔΑ͏ʹ͠ͳ͚ΕࣗಈͰεέʔϧ͠ͳ͍ʢͪΐͬͱੲͷʣ• ୯Ձ͚ͩͰݟΕߴ͍
CPU୯Ձͷൺֱ• ʢඇެ։ʣ
ωοτϫʔΫ୯Ձͷൺֱ• ʢඇެ։ʣ
ίετͷҧ͍• ୯Ձ͚ͩͰݟΕIaaSͷํ͕ߴͦ͏ʹݟ͑Δ• ࣮ࡍʹӡ༻ʹ͔͔Δਓ݅අɺDCΠϯϑϥʹ͔͔ΔྉۚͳͲ͍ΖΜͳݻఆඅ͕͔͔Δ• େͷ߹IaaSͷํ͕εέʔϧϝϦοτͰ҆͘ͳΔ• ݻఆඅ͕খ͘͞ݟ͑Δ΄Ͳεέʔϧ͢ΕΦϯϓϨͰͬͨํ͕͍҆
IaaSͱΦϯϓϨ• ΦϯϓϨશ͕ͯࣗલͰͳ͍ʢͨΓલʣ• IaaSεέʔϧ͢Δ͜ͱͰϝϦοτΛग़͍ͯ͠Δ• CPU࣌ؒͰΈΔͱ͔ͳΓΑ͘ͳ͖ͬͯͨ• ωοτϫʔΫ͚ͬ͜͏ߴ͍·ͱΊ:
ΫϥελϦϯάͱ ΦʔέετϨʔγϣϯ• ΫϥελϦϯάͱΦʔέετϨʔγϣϯ• ͳͥΫϥελϦϯά͍ͨ͠ͷ͔• ίϯςφΫϥελϦϯά
ΫϥελϦϯάͱ• ଟͷϦιʔεΛ1ͭͷϦιʔεͱͯ͠͏• Ͱ͔͍Πϯελϯεߴ͍͠ɺSPOFʢ୯ҰোʣʹͳΔ• εέʔϦϯά͢Δʹ͍҆ϦιʔεΛͨ͘͞Μฒͯ1ͭͷϦιʔεʹͯ͠Θͳ͍ͱ͍͚ͳ͍
ΦʔέετϨʔγϣϯͱ• Φʔέετϥͷԋํ๏ɺసͯ͡ฤɺ৫ԽΛ ࢦ͢୯ޠʹͳͬͨ• γεςϜ/ϛυϧΣΞͷࣗಈతͳߏཧɺσϓϩΠϝϯτͷ͜ͱΛࢦ͢
ΫϥελϦϯά͍ͨ͠• αʔϏεͷنΛ༧ଌ͢Δͷ͍͠• ༻ҙ͍ͯ͠ΔΠϯϑϥΛ͙͢ʹೖ͍ͨ͠• Ϋϥελશମͷ͏ܾͪ·ׂͬͨ߹ͷϦιʔεΛׂΓ͍ͯͨ
ΦϯϓϨͷௐୡLoad• ෛՙʹ߹ΘͤͯௐୡܭըΛཱͯΔௐୡλΠϛϯά↓ௐୡλΠϛϯά↓ௐୡλΠϛϯά↓ʢ෮शʣ
Server Server Server ServerApplication Application ApplicationLoad balancerApplication Application
ΫϥελϦϯά͢ΔͨΊʹ ίϯςφΛ͏• εέʔϧ͢ΔͨΊʹɺΞϓϦέʔγϣϯɺϛυϧΣΞɺઃఆͳͲ༷ʑͳͷΛσϓϩΠͯ͠ಈ࡞͢ΔΑ͏ʹ͠ͳ͚ΕͳΒͳ͍• ίϯςφ͝ͱσϓϩΠ͢Εྑ͍ =ΦʔέετϨʔγϣϯ͕؆୯
Docker• ίϯςφཧπʔϧ• DockerfileΛॻ͚ͩ͘ͰίϯςφΛϏϧυͰ͖Δ• ͍·ͷͱ͜ΖσϑΝΫτελϯμʔυ
dockerhubbuild pushpullDockerfiledeploymentImage
ͳͥίϯςφʹ͍ͨ͠ͷ͔• ґଘؔΛύοέʔδϯά͍ͨ͠• ։ൃऀ͕ϛυϧΣΞͷґଘؔΛཧ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ• ίϯςφΛ͏ͱ͜Ε·ͰΠϯϑϥͩͬͨͷ͕ ΠϯϑϥͰͳ͘ͳΔ
InfrastructureApplication
InfrastructureApplicationContainer
ίϯςφԽ͞ΕΔͱԿ͕ى͜Δ͔• ΠϯϑϥͷϨΠϠʔ͕1ͭԼ͕Δ• OSͷύοέʔδཧෆཁʹͳΔ• ίϯςφ͝ͱʹࢹ͕ඞཁʹͳΔ
CoreOS• ίϯςφϗετʹ࠷దԽ͞ΕͨLinuxσΟετϦϏϡʔγϣϯ• systemdʹΑΔίϯςφͷཧͱEtcdɺFleetdͱ͍ͬͨΫϥελϦϯάɺΦʔέετϨʔγϣϯπʔϧ͔Βߏ͞ΕΔ• ࣗಈతͳηΩϡϦςΟΞοϓσʔτ
ΦʔέετϨʔγϣϯ͕Γͳ͍• ͍ͭ͘ίϯςφΛσϓϩΠ͢Δ͔• ίϯςφؒͷ૬ޓଓͲ͏͢Δ͔• ͲͷλΠϛϯάͰεέʔϧ͢Ε͍͍͔
Kubernates• Google͕ͭͬͨ͘ίϯςφΫϥελཧπʔϧ• αʔϏε୯ҐͰͷσϓϩΠ͕Ͱ͖Δ• ͍͍ͩͨશ෦ͷػೳ͕͋Δ͚ͲɺͰ͔͗͢Δ
ͦͦࣗͰΔҙຯ• ίϯςφΛσϓϩΠ͢ΔઌΛࣗલͰΒͳͯ͘ྑ͍ͷͰ• ͋ΔఔͷεέʔϧʹͳΔͱࣗͰΔ͜ͱΛߟ͑Δ
ΫϥελϦϯάͱ ΦʔέετϨʔγϣϯ• Ͳ͜·Ͱ͕Πϯϑϥ͔࣌ʹΑͬͯมԽ͢Δ• ίϯςφΛ͏ͱ͍Ζ͍ΖͱมΘΓͦ͏• ͍Ζ͍Ζͱߟ͑ͳ͍ͱ͍͚ͳ͍͜ͱ͕ଟ͍·ͱΊ:
·ͱΊ
ΫϥυͱΦϯϓϨ• ΫϥυͰ͋Δ͔Βͱ͔ɺΦϯϓϨͰ͋Δ͔Βɺ ͱ͍͏ͷ͋·Γେ͖ͳͰͳ͍• ࠷࠷దͳج൫Λબ͢Δͷ͕Α͍• ͩΊʹͳͬͨΒΓ͑Εྑ͍• ʢΤϯδχΞͱͯ͠ʣͲ͜ͰՁΛग़͔͕͢ॏཁ