Share
Embed
Amazon Auroraを活用したソーシャルゲームの複数ワールドデータ統合 / AWS Dev Day Online Japan
FUJIWARA Shunichiro
September 29, 2021
Transcript
49 slides
-
Agenda • ΅͘ΒͷߕࢠԂʂϙέοτ ʹ͍ͭͯ • ήʔϜϫʔϧυͷՃͱ౷߹ͷܦҢ • ;ͨͭͷσʔλϕʔεΛͻͱͭʹ • Amazon
Aurora Λ׆༻ͨ͠ߴͳ σʔλҠߦͱݕূ -
΅͘ΒͷʂߕࢠԂϙέοτ αʔόʔڥ 20149݄ϦϦʔε͔࣌Βͯ͢ Amazon Web Services(AWS) Amazon Elastic Compute Cloud
(EC2) Amazon RDS for MySQL Amazon ElastiCache for Redis Amazon Redshift 201610݄ RDS for MySQL → Aurora MySQL 20213݄ EC2 → Amazon Elastic Container Service(ECS) -
ҰൠతͳεϚʔτϑΥϯ͚ήʔϜͷ ϢʔβʔਪҠ (֓೦) 1. ϦϦʔεޙҰఆظؒ·Ͱٸܹʹ૿Ճ 2. ؇͔ʹݮগ 3. ࠂίϥϘࢪࡦͰҰ࣌తʹ૿Ճ 2→3→2→3
Λ܁Γฦ͢ ଛӹذΛԼճΓ ҡ࣋Ͱ͖ͳ͘ͳΔͱαʔϏεऴྃ ͲΕ͚ͩݮগΛ؇͔ʹͰ͖Δ͔Ͱ ण໋͕มΘͬͯ͘Δ -
GvG (guild versus guild) ήʔϜͷಛੑ ϦϦʔε࣌Ͱͻͱͭͷϫʔϧυ͔͠ͳ͔ͬͨ GvG ήʔϜ = ରਓؒ(νʔϜ)ઓ
͍ͬͯΔϢʔβʔ݄ͱͱʹͲΜͲΜڧ͘ͳ͍ͬͯ͘ • ৽نϢʔβʔ͕ೖͬͯͳ͔ͳ͔উͯͳ͍ • ͔ͤͬ͘ೖ͖ͬͯͯ͘Εͨ৽نϢʔβʔ͕ఆண͠ͳ͍ ݮগ͕Ճ͢ΔͱαʔϏε͕ҡ࣋Ͱ͖ͳ͍ 㱺 ·ͬ͞Βͳ৽نϫʔϧυΛՃ͠Α͏ʂ ৽نϢʔβʔ͕ઓ͑ΔੈքΛ༻ҙͯ͠ɺͦ͜Ͱఆணͯ͠Β͏ -
ϫʔϧυՃͷ࣮ࢪ ϦϦʔε͔Β1ޙɺ20162݄ݕ౼։࢝ શʹಠཱͨ͠σʔλϕʔεͱΞϓϦέʔγϣϯΛՃ͢Δ࣮ • Ϛελʔσʔλ(ΞΠςϜͳͲ)શʹಉҰ • ֤ϫʔϧυؒͰϢʔβʔσʔλͷҠߦͰ͖ͳ͍ • ϓϨΠ͢ΔϫʔϧυΛҰબͨ͠Β ผϫʔϧυͰϓϨΠͰ͖ͳ͍
• جຊతʹ֤ϫʔϧυͷαʔόʔؒͰ௨৴͠ͳ͍ (ྫ֎: σϓϩΠૢ࡞RedshiftͷΫΤϦ1Χॴ͔Βߦ͑Δ) -
ͱ͜ΖͰϫʔϧυՃ࣌ͷ࣮… ·ͬͨ͘ผͷγεςϜΛ ͏Ұݸཱͯͨঢ়ଶ ELB, ΞϓϦέʔγϣϯαʔό, Aurora, ElastiCache, ... Auroraʹೖ͍ͬͯΔσʔλͷID AUTO_INCREMENT
Ͱൃ൪ INSERT ͞ΕΔ͝ͱʹ1ͣͭࣗಈͰ૿͑ ͍͕ͯ͘ओΩʔ 㱺 ϫʔϧυA/BͰσʔλͷID͕ॏෳ -
σʔλͷID͕ॏෳɺͱ ͭ·Γ౷߹લ͜͏ • ϫʔϧυA/Bͷ player.id = 100 શ͘ͷผਓ • ϫʔϧυA/Bͷ
player_item.id = 1000 શʹผ • player_item.player_id = 100 ͕ࢀর͢Δઌ(player.id)વผਓ Ͳ͏ͨ͠Β… -
ID ΛৼΓ͢ ϫʔϧυAͷϢʔβʔσʔλͷIDͱϫʔϧυBͷIDΛ ॏෳ͠ͳ͍Α͏ʹશͯ࠶ൃ൪͢Δ • ͻͱͭͷςʔϒϧʹ࠷େͰԯߦ • ͋ΔςʔϒϧͷIDଞͷςʔϒϧͷΧϥϜʹؚ·ΕΔ(֎෦ࢀর) • ςʔϒϧ500Ҏ্
• ༰ྔ2ϫʔϧυ߹ܭ1TBఔ (Aurora snapshotͷαΠζͰ) ͜ΕΛશͯໃ६ͳ͘ॻ͖͑ͳ͍ͱ͍͚ͳ͍ -
ID ରԠදΛ࣋ͭ? ͨͱ͑id_mapςʔϒϧʹ৽چIDͷରԠදΛ࡞Δ? world old_id new_id A 1 1 B
1 2 A 2 3 ... ... ... A 9999 19999 B 9999 20000 A 10000 20001 B 10000 20002 ... ... ... -
world old_id new_id A 9999 19999 B 9999 20000 UPDATE
player SET id=(SELECT new_id FROM id_map WHERE old_id=player.id AND world='A'); UPDATE player_item SET id=(SELECT new_id FROM id_map WHERE old_id=player_item.id AND world='A'), player_id=(SELECT new_id FROM id_map WHERE old_id=player_item.player_id AND world='A'); ͜ͷαϒΫΤϦͰेԯߦΛUPDATE……ͭΒͦ͏ -
ҰൠతͳγϟʔσΟϯά γϟʔσΟϯά(sharding) = σʔλΛׂͯ͠ෳσʔλϕʔεʹ֨ೲ id data 2 AAA 3 BBB
4 CCC 5 DDD Ұ൪୯७ͳͷIDͷ༨(mod)ͰৼΓ͚ ϫʔϧυA: id data 2 AAA 4 CCC ϫʔϧυB: id data 3 BBB 5 DDD -
ࠓճׂͰͳ͘౷߹ͳͷͰٯʹ͢Δ ϫʔϧυA: ৽͍͠IDΛ ʹ͢Δ data id new_id AAA 1 →
2 CCC 2 → 4 ϫʔϧυB: ৽͍͠IDΛ ʹ͢Δ data id new_id BBB 1 → 3 DDD 2 → 5 ͷIDͱ ͷID ౷߹ͯ͠িಥ͠ͳ͍ʂ data id AAA 2 BBB 3 CCC 4 DDD 5 -
SQLͰαϒΫΤϦͳ͠Ͱ؆୯ܭࢉ UPDATE player SET id=(id * 2 + 1); UPDATE
player_item SET id=(id * 2 + 1), player_id=(player_id * 2 + 1); ͯ͢ͷมޙͷIDΛ͋Β͔͡ΊܾఆతʹٻΊΒΕΔ IDৼΓ͠ղܾʂ (ͨͩ͠ʮٕज़తʹՄೳʯঢ়ଶ) -
σʔλͷexportͱimportํ๏Λݕ౼ ୯७ͳํ๏: Aurora MySQL ͔Β mysqldump 1. UPDATE player SET
id=(id * 2 + shard_id)... 2. mysqldump > dump.sql 3. mysql < dump.sql িಥͤ͞ͳ͍ͨΊʹɺઌʹIDΛॻ͖͔͑ͯΒdump͢Δඞཁ͕͋Δ • ࠷ॳͷUPDATEͰֻ͕͔࣌ؒΓͦ͏ • ඦGBͷdumpσʔλ(SQL)ΛऔΓ͜Ήͱ1ʙϨϕϧ(ܦݧଇ) ϝϯςφϯεͰ͖Δ͚͍ͩͨ͘͠ -
mysqldump Ҏ֎ͷํ๏Λߟ͑Δ • ڊେςʔϒϧͷUPDATEʹֻ͕͔࣌ؒΔ 㱺 import͢ΔσʔλࣗମΛIDॻ͖͑ޙͷঢ়ଶʹ͍ͨ͠ • ߴԽͷͨΊɺฒྻॲཧΛ͍ͨ͠ 㱺 ςʔϒϧ୯ҐͰׂͯ͠ॲཧ
(͜ΕmysqldumpͰՄೳ) ʮAmazon Aurora MySQL ͔Β Amazon S3 ʹσʔλΛ ΤΫεϙʔτ͓ΑͼΠϯϙʔτ͢ΔͨΊͷϕετϓϥΫςΟεʯ1 1 https://aws.amazon.com/jp/blogs/news/best-practices-for-exporting-and-importing-data-from-amazon-aurora-mysql-to- amazon-s3/ -
SELECT INTO OUTFILE S3 ͱ LOAD DATA FROM S3 1.
ΫΤϦ݁ՌΛ Amazon S3 ʹ CSV ͱͯ͠ export 2. CSV Λ S3 ͔ΒಡΈࠐΜͰςʔϒϧʹ import ςʔϒϧ୯ҐͰฒྻॲཧ͕Մೳ Aurora 㱻 S3 ؒͰॲཧ͕݁ -
SELECT INTO OUTFILE S3 mysqldumpͱҧ͍ɺҙͷΫΤϦ݁ՌΛS3ʹग़ྗͰ͖Δ IDॻ͖͑ࡁΈͷCSV͕ग़ྗͰ͖ΔͷͰɺͦͷ··औΓ͜ΊΔ 㱺 ڊେςʔϒϧͷ UPDATE ͕ෆཁʹ
SELECT id*2+1 AS id, foo, bar, ... -- IDΛॻ͖͑ͯ͠·͏ FROM player INTO OUTFILE S3 's3://...' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n' MANIFEST ON; MANIFEST ON : ڊେͳςʔϒϧͷ߹ɺෳS3 objectʹׂ͞ΕΔ objectҰཡ͕هࡌ͞ΕΔϚχϑΣετϑΝΠϧΛग़ྗ͢Δ -
LOAD DATA FROM S3 S3ʹଘࡏ͍ͯ͠ΔCSVΛςʔϒϧʹऔΓ͜Ή LOAD DATA FROM S3 MANIFEST
's3://...' INTO TABLE player FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n' (id, foo, bar, ...) SELECT INTO OUTFILE S3 Ͱग़ྗͨ͠ MANIFEST Λ ࢦఆͯ͠औΓࠐΈ -
ฒྻॲཧ͕Մೳ SELECT INTO OUTFILE S3 ͱ LOAD DATA FROM S3
ෳηογϣϯͰಉ࣌ʹൃߦՄೳ σʔλ Aurora 㱻 S3 ؒͰసૹ͞ΕΔ ΫΤϦൃߦݩʹෛՙֻ͕͔Βͳ͍ AuroraͷϚϧνίΞͱڧྗͳετϨʔδ S3 ͷྗΛଘʹ׆༻Ͱ͖Δʂ -
෦తͳϦτϥΠΛ༰қʹ ςʔϒϧ୯ҐͰexport, import͢Δ ࣦഊΛݕͨ͠Βͦͷςʔϒϧ͚ͩϦτϥΠՄೳ λεΫΛࡉׂ͔͘ + ฒྻ࣮ߦͰεϧʔϓοτΛՔ͙ 㱺 λεΫͷࣦഊΛલఏʹɺΫϥυͷྗΛ׆༻͢Δ Α͘ͳ͍Γํͷྫ
$ mysqldump -h src.host mydb | mysql -h dest.host EC2(ͳͲ)ͷ1ʹෛՙֻ͕͔Δ ్தͷͲ͔͜Ͱࣦഊ͢ΔͱϦτϥΠ͕ࠔ Auroraଆ1ίΞ͔͑͠ͳ͍ -
ඦςʔϒϧʹରͯ͠ SQL Λੜ͢Δ खͰແཧͳͷͰ Perl ͷεΫϦϓτͰ…… 1. show tables ͰςʔϒϧҰཡΛऔಘ
2. ࣄલʹચ͍ग़ͨ͠ςʔϒϧ໊ɺΧϥϜ໊Λݩʹ IDม͕ඞཁͳςʔϒϧʹ͍ͭͯ SELECT INTO OUTFILE S3 LOAD DATA FROM S3 ͷSQLΛੜ -
IDมରͷચ͍ग़͠ͱϧʔϧԽ xxx_id ͱ͍͏໊લ͕͍͍ͯΕ େมର ͨͩ͠Ϛελʔσʔλมର Ͱͳ͍ͷͰআ֎ ಓͳચ͍ग़͠࡞ۀͰϧʔϧԽ # ඞͣIDมͷରʹ͢ΔΧϥϜ໊ #
͜͜Ͱఆٛ͞Ε͍ͯΔͷ + # ***_idͱͭ͘ͷͰϚελʔσʔλςʔϒϧ͕ # ଘࡏ͠ͳ͍ͷ͕IDมͷର my $REQUIRED_CONVERT_COLUMN = { id => 1, team_id => 1, team_name_id => 1 }; # IDมͷରʹؚΊͳ͍ΧϥϜ໊ my $IGNORE_CONVERT_COLUMN = { synced_league_id => 1, growth_lock_league_id => 1, post_id => 1, farm_league_id => 1, character_id => 1, # ... -
QAͱϦϋʔαϧ খ͍͞σʔλ͔ΒCI, QAڥʹσʔλΛ౷߹͢ΔπʔϧΛ࡞ CI, QA(ਓྗ)ͰΛચ͍ग़͠ 㱺 QA10ճҎ্࣮ࢪͯ͠Λચ͍ग़ͨ͠ ຊ൪ͷεφοϓγϣοτ͔ΒAuroraΫϥελΛ෮ݩ export, import
ΛεΫϦϓτͰ࣮ߦ ్த͕ى͖ͨΒεΫϦϓτΛमਖ਼ͯ͠Γͳ͓͠ ͳ͘౷߹DB͕Ͱ͖ͨΒ QA ࣮ߦ ຊ൪σʔλͰ5,6ճϦϋʔαϧ -
Կຊ൪ͷσʔλͰϦϋʔαϧ͢ΔͨΊʹ TerraformͰsnapshot͔ΒͷAuroraΫϥελ෮ݩΛࣗಈԽ ࠷৽ͷεφοϓγϣοτIDͰ terraform apply ͢Δ͚ͩ ඦGBͷΫϥελͰ1࣌ؒఔ ࣮֬ʹಉ͡ઃఆͰ෮ݩͰ͖Δ resource "aws_rds_cluster"
"restore" { cluster_identifier = "restore-cluster" engine = "aurora" engine_version = "5.6.mysql_aurora.1.19.5" snapshot_identifier = "arn:aws:rds:ap-northeast-1:..." // ←͚ͩ͜͜ॻ͖͑Δ // ... -
ͦͷଞɺࡉ͔͍ͳͲ ेຊɺܭ3000ߦ΄ͲͷPerl script͕ੜΈग़͞Εͨ • ηΧϯμϦΠϯσοΫεΛ DROP, ADD ͢Δ SQLจੜ •
import࣌ηΧϯμϦΠϯσοΫε͕ͳ͍ํ͕ߴ • importޙʹ·ͱΊͯ ADD INDEX ͢Δ • SELECT ࣌ʹ count(*) ͰҠߦରͷߦΛϑΝΠϧʹه • LOAD ޙʹ count(*) ͨ݁͠Ռͱಥ͖߹ΘͤΔ • Ͳ͏ͯ͠ॏෳͯ͠͠·͏ϨίʔυΛͳΜͱ͔͢Δ • ֎෦αʔϏεͷID͕ه͞Ε͍ͯΔςʔϒϧͰॏෳͳͲ • ΞϓϦέʔγϣϯཁ݅ʹैͬͯ৽͍͠΄͏Λ͢ͳͲରॲ -
Ϧϋʔαϧͷ݁Ռ export, import ෳϓϩηεͰฒྻ࣮ߦ͢Δ Aurora(౷߹લ r5.4xlarge 16ίΞ, ౷߹ޙ r5.8xlarge 32ίΞ)
ͱS3ͷੑೳΛҾ͖ग़ͨ͢Ί export 16ฒྻɺimport 32ฒྻͰ࣮ߦ ඦGBͷIDॻ͖͑ͱσʔλҠߦ͕2࣌ؒͰྃʂ -
ϦϋʔαϧͰൃ֮ͨ͠ importޙɺADD INDEX Λ32ฒྻͰ࣮ߦ͍ͯͨ͠ͱ͜Ζ… Aurora ͷۭ͖ϝϞϦ͕ރׇͯ͠ΫϥογϡˠϑΣΠϧΦʔόʔ ͬͯճ෮͠ͳ͍ ฒྻΛམͱͯ͠ރׇ͕؇͔ʹͳΔ͚ͩ ADD INDEX
Λ΄Ͳ࣮ߦޙɺAuroraΠϯελϯεΛ࠶ىಈ ࠶ىಈޙʹϝϞϦͳ͠ ͕࣌ؒͳ͔ͬͨͨΊݪҼٴఘΊͯ࠶ىಈͰΓΔ͜ͱʹ -
࣮ࡍͷ౷߹ϝϯςφϯε(1) 2021-07-04() 24:00 (ਂ0࣌) ϝϯςφϯε։࢝ 1. ֤ϫʔϧυͰεφοϓγϣοτऔಘ 2. εφοϓγϣοτ͔ΒҠߦ༻Ϋϥε λΛ෮ݩ
3. 01:30 AM ࠒͨ͠ͷͰղࢄ ݩͷΫϥελͦͷ··͓ͯ͘͠ ࠷ѱɺ౷߹લͷঢ়ଶʹΓͨ͢Ί