High-level overview on NoSQL
NoSQL ֓2015/9/11DB Tech Showcase SapporoBasho δϟύϯ᷂ɹ্߁ଠ
View Slide
୭ʁ• @kuenishi• Github, Twitter, etc• ࢄγεςϜྺ7• Bashoδϟύϯͷํ͔Βདྷ·ͨ͠• Riak CSͷ։ൃ• ࠷ۙτϥϯβΫγϣϯʹڵຯ͕͋Γ·͢
Ξϯέʔτ•SQL͡Όͳ͍ͱϦϨʔγϣφϧͳσʔλϕʔε࡞Εͳ͍ʁ•ʮཧ͔ΒֶͿσʔλϕʔε࣮ફೖʯΛಡΜͩʁ•ʮNoSQLͷجૅࣝʯΛಡΜͩʁ•Dynamo? BigTable? Tandem?
ΞδΣϯμ•NoSQLΑ͏Θ͔ΒΜʂԿʁʂͱ͍͏ਓͷͨΊʹɺԿͳͷͬͯΛ͠·͢•͍Ζ͍Ζ͋ͬͯΘ͔ΒΜʂͱ͍͏ਓͷͨΊʹྨ࣠ʹ͍͓ͭͯ͠·͢•ͦͷଞɺ༩ଠΛ͠·͢
Relational DBMS•Ұൠతʹ…•ෳͷΫϥΠΞϯτ͔ΒTCP/IPͰଓ͠•ϦϨʔγϣφϧϞσϧΛ࣮༻Խͨ͠SQLͱ͍͏ݴޠΛΠϯλʔϑΣʔεͱ͠•B+treeͱϒϩοΫΩϟογϡͱ͍͏σʔλߏΛ͍ɺ•WALͱB+treeͰӬଓԽΛ͠ʢϨϓϦέʔγϣϯ͠ͳ͍ʣɺ•MVCCͳͲͰฒߦੑ੍ޚΛߦ͏σʔλϕʔεཧγεςϜ
NoSQL?•Not Only?•ݴ༿ͱҟͳΔɺ2௨Γͷ࣮ଶ•A) σʔλϞσϧɺΠϯλʔϑΣʔεͱͯ͠SQLΛ͍ͬͯͳ͍•B) طଘͷτϥϯβΫγϣϯॲཧٕज़ͰͰ͖ͳ͔ͬͨ͜ͱΛ࣮ݱ͢ΔͨΊʹɺผٕज़Λ࠾༻ͨ͠
SQLͰͳ͍ʁ•ϦϨʔγϣφϧϞσϧͰͳ͍ԿΒ͔ͷσʔλϞσϧ•σʔλදݱΫΤϦݴޠʹSQLΛΘͳ͍•υΩϡϝϯτDB: “Semi-structured database”•Redis•KVS (Key-Value Store): ฆΒΘ͍͠
Document DB•ͱͱͷࢥ:•͋ΒΏΔλΠϓͷυΩϡϝϯτΛอଘͯ͠ΫΤϦͰ͖ΔΑ͏ʹ͠Α͏•JSON, XML, PDF, etc…•ݱ࣮: ݁ہ…•KVS ʹ JSON + ΠϯσοΫε + ࢄMapReduce
ACIDͰͳ͍ʁ
ACID•Atomicity•ߋ৽ͷ్தঢ়ଶ͕ݟ͑ͳ͍͜ͱ•Isolation•ଞͷਓ͕ߋ৽͍ͯ͠Δͷ͕ݟ͑ͳ͍͜ͱ•Key-Value StoreͳΒɺ୯ҰͷΤϯτϦΛϩοΫͯ͠ߋ৽͢Δ͚ͩͳͷͰAtomicͩ͠Isolated!! ʢϗϯτʁʣ
ACID•RDBͩͱ•ϦϨʔγϣϯಉ࢜ͷσʔλ͕߹͍ͯ͠Δ͜ͱ•ࢄτϥϯβΫγϣϯͯ͠σʔλ͕ෆ߹͠ͳ͍͜ͱ•ނোͯ͠߹ͨ͠ঢ়ଶͰϦΧόϦͰ͖Δ͜ͱ•NoSQLͩͱ•ϨϓϦέʔγϣϯͯ͠σʔλ͕ෆ߹͠ͳ͍͜ͱ•Key-Value StoreͳΒ…
ACID•RDBͩͱ•ӬଓԽσΟεΫʹॻ͍ͨΒऴΘΓ•σΟεΫյΕͨΒΒͶ•NoSQLͩͱ•σΟεΫյΕͯιϑτΣΞͰԿͱ͔͢Δ•ࣗͰϨϓϦέʔγϣϯΔʂ
εέʔϧΞτʁ•σʔλͷۭؒΛԿΒ͔ͷϧʔϧʹଇׂͬͯ͢Δ•ׂͨ͠σʔλΛࢄͯ͠ཧ͢Δ•ϊʔυΛ૿͢ͱॲཧೳྗ༰ྔ͕૿͑Δʢʁʣ
εέʔϧΞτਤղσʔλׂۭۭؒؒ
B+Tree•ΩʔΠϯσοΫε͔Β O(log N) ҎԼͷίετͰσʔλΛݟ͚ͭΔͨΊͷσʔλߏ•εέʔϧΞτ͢Δͱ…•͍͔ͭ͘ิʢସʣٕज़͕͋Δ•Consistent Hashing•γϟʔσΟϯά (Range Partitioning)•֊γϟʔσΟϯά
εέʔϧΞτͱނোੑ•Q. 1ͷϊʔυͷނো֬Λ p ͱ͢Δͱɺ n ͷΫϥελ͕શͯਖ਼ৗಈ࡞͍ͯ͠Δ֬ʁ1. 1 - p^n2. p^n3. (1 - p)^n•εέʔϧ͕େ͖͍ͱɺͲ͔͕͜΄΅ඞͣյΕ͍ͯΔঢ়ଶʹͳΔ•෦ނো͕ى͖͍ͯͯશମ͕ਖ਼͘͠ಈ࡞͢Δઃܭ͕ඞཁ•ϨϓϦέʔγϣϯʹΑΔࣗಈతͳϑΣΠϧΦʔόʔͳͲ͕ඞཁ
ਖ਼ৗಈ࡞ͷ֬n \ p 0.1 0.01 0.0011 0.9 0.99 0.99910 0.348678440 0.904382075 0.990044880100 0.000026561 0.366032341 0.9047921471000 0 0.000043171 0.367695424※༗ޮࣈ…
εέʔϧΞτਤղ 2σʔλۭؒෳ
ӬଓԽͱ•ܗ͋Δͷ͍͔ͭյΕΔ•ॾߦແৗʢେൠᔷᒒܦʣ•2ͭҎ্ͷίϐʔΛ͓࣋ͬͯ͘Ҏ֎ʹɺσʔλΛӬٱʹอଘ͢Δํ๏ͳ͍•ෳͷͳ͍σʔλϕʔεͳ͍
ෳඞͣ࡞ΒΕΔ•LANͷ͜͏Ͱ•SANͷ͜͏Ͱ•ւͷ͜͏Ͱ•ނো୯Ґ͕ඞ͔ͣΕ͍ͯΔ(C) Evan Amos
ނোͯ͠ಈ࡞ܧଓ͢Δෳ•Ͳ͏͍͏ނোϞσϧΛલఏʹͯ͠ϨϓϦέʔγϣϯΛΜ͔͕ͩॏཁ•Fail-stopΛલఏʹ͍͚ͯ͠ͳ͍•ʮյΕ͔͚ͷRadioʯ•͍ΘΏΔαΠϨϯτނো•ωοτϫʔΫͷஅɺॠஅ•Disk Hiccup(C) Evan Amos
ωοτϫʔΫͷஅ•அͨ͠ΒɺͲͪΒ͕ਖ਼͍͔ܾ͠Ίͳ͚Ε͍͚ͳ͍•ϚχϡΞϧͰհೖ͢ΕܾΊΒΕΔʢ͔͠Εͳ͍ʣ•ࣗಈԽ͢ΔʹɺωοτϫʔΫ͕ΕͯσʔλΛ߹ͤ͞Δෳٕज़͕ඞཁ? ?(C) Evan Amos
ෳͷٕज़ෳͷλΠϓ ނোͳͲͷલఏMaster-slave ಉظ ωοτϫʔΫ͕ނোͨ͠Βࢭ·ΔMaster-slave ඇಉظωοτϫʔΫ͕ނোͨ͠Βσʔλ͕ෆ߹͢Δ͔Consensus (Strong Consistency) ωοτϫʔΫ͕ނোͨ͠ΒҰ෦ಈ࡞Eventual Consistency ωοτϫʔΫ͕ނোͯ͠શಈ࡞
ෳͰͳ͍σʔλͷ߹ੑ•εέʔϧΞτ͢Δͱɺผϊʔυ্ͷผͷσʔλΛ߹ͨ͠ঢ়ଶͰߋ৽͠ͳ͚ΕͳΒͳ͍•ࢄͨ͠ΠϯσοΫεͷߋ৽•֎෦Ωʔͷߋ৽•τϦΨʔͷॲཧ
εέʔϧΞτਤղ 3ςʔϒϧΠϯσοΫε or FKey or else
ෳͰͳ͍σʔλͷ߹ੑอো•2PC (or ࢄϩοΫ)•ϩοΫΛ࣋ͬͨ··ϊʔυ͕ނোͨ͠ͱ͖ͷѻ͍•Cluster-wideͰҰ؏ͯ͠୯ௐ૿Ճ͢ΔԿΒ͔ͷΛੜ͢ΕɺTSOMVCCΛ࣮Ͱ͖Δ•λΠϜελϯϓ … ࣌ܭͷಉظΛอো͢Δํ๏͕ࣗ໌Ͱͳ͍•IDΛൃߦ͢ΔϚελʔϊʔυ … SPoF•͜͜·ͰͪΌΜͱ͍ͬͯΔNoSQL΄ͱΜͲͳ͍
NoSQLͷऴΘΓ•RDBMSͰղ͚ͳ͔͕͍͔ͬͨͭ͘ղ͚ͨͷͰʮͬͺΓSQL͕΄͍͠ʯʮ׳Εٕͨज़ऀ͕ଟ͍ͷͰʯ•ϦϨʔγϣφϧϞσϧʹଇ͍ͯ͠ͳ͍σʔλͰSQLͰΫΤϦΛॻ͚ͯ͠·͏•͍͔ͭ͘ͷNoSQLɺτϥϯβΫγϣϯཧΛͦͦ͜͜ʹ SQL(-like ͳ)ΠϯλʔϑΣʔεΛఏڙͭͭ͋͠Δ•CQL, N1QL, etc..•OLAP͚ͷMPPΤϯδϯSQL͕ඪ४•Impala, Drill, PrestoDB, Calcite
2ͭͷٕज़•ΫΤϦॲཧ•RDBMSͰSQL•RDBMSͰͳͯ͘SQL•τϥϯβΫγϣϯॲཧ•ACIDΛ࣮ݱ͍ͯ͠ΔRDBMS•ࢄ͍ͯͯ͠ACIDΛࢦ͍ͯ͠Δ
Summary•ʢੲʣNoSQL ͱɺطଘͷσʔλϕʔεٕज़Λ1͔Βݟͳ͓ͯ͠ɺRDBMSͰͰ͖ͳ͔ͬͨ͜ͱΛୡ͠Α͏ͱͨ͠Ұ࿈ͷࢼΈ•ϦϨʔγϣφϧϞσϧɺB+treeɺϨϓϦέʔγϣϯ•ʢࠓʣ͏Կ͕ͳΜ͔͔ͩΒͳ͍͘Β͍ଟ༷Խ•ٕज़తͳ؍ʢͷྨʣ•εέʔϧΞτɺނোੑɺ߹ੑʢɺ͋ΔΑ