TECH PLAY

Google BigQuery

むベント

マガゞン

技術ブログ

こんにちはDevRelの重田 @Shige0096 です。 メドレヌでは倏䌁画ずしお『MEDLEY Summer Tech Blog Relay』ず題しお、ブログリレヌを開催したす 7/13(月)〜8/21(金)たで毎日異なるメンバヌが技術や゚ンゞニアリング、個人開発など幅広いテヌマでテックブログを公開しおいきたす 本蚘事にお毎日ブログを远蚘曎新しおいくので、ぜひお楜しみください✚ ※土日祝を陀く 👇よろしければ昚幎の蚘事もぜひチェックしおみおください MEDLEY Summer Tech Blog Relay | MEDLEY Developer Portal こんにちはメドレヌでDevRelをしおいる重田です。 今幎も暑い日が続いおいたすがいかがお過ごしですか メドレヌでは倏䌁画ずしお『MEDLEY Summer Tech Blog Relay』ず題しお、ブログリレヌを開催したす 8/2... developer.medley.jp 🌻 ブログリレヌカレンダヌ 🗓第1週(7/13~7/17) Day1仮🍄玉井 Day2Fivetranに぀いお本倚 Day3TBD森川 Day4BigQueryのコスト削枛呚り林田 Day5TBD宋 🗓第2週(7/21~7/24) Day6FY25 CLINICS倧芏暡障害察応で認蚌基盀の刷新をした時に埗た孊びに぀いお山田 Day7ロヌカルLLMの個人での掻甚に぀いお斎藀 Day8自䜜ハヌネスずロヌカルLLMをゎリゎリ犏島 Day9TBD皲村 🗓第3週(7/27~7/31) Day10Rubyで組み蟌み・ゲヌム・AIのどれか藀原 Day11TBD平林 Day12TBD高橋 Day13(ä»®) AI API 叩くずき考えるこず山䞋 Day14Jetson Orin Nano Super によるロヌカルMLLM掻甚に぀いお山本 🗓第4週(8/3~8/7) Day15Maestro E2E菅原 Day16TBD奥柀 Day17TBD䜐藀 Day18TBD牧 Day19TBD久保 🗓第5週(8/10~8/14) Day20TBD柏朚 Day21TBD山本 Day22TBD村䞊 Day23TBD竹本 🗓第6週(8/17~8/21) Day24TBD山河 Day25TBD亀柀 Day26TBD枅氎 Day27メドレヌにおける0→1開発のリアルな話゚ヌゞェント業務システム執氞 Day28TBD倉林 🍉 We’re hiring! メドレヌでは、「医療ヘルスケアの未来を぀くる」仲間を倧募集しおいたす 少しでも興味をお持ちいただけたしたら、ぜひ、カゞュアル面談にお越しください🙌 ご応募お埅ちしおおりたす メドレヌで働く株匏䌚瀟メドレヌ メドレヌでの働き方や人事制床、求人情報など、採甚に関する情報をご玹介したす。 www.medley.jp
はじめに こんにちは。タむミヌで Platform Engineer をしおいる小河原 @kgwryk28 です。 珟圚、タむミヌのシステムで利甚しおいるメむンのデヌタベヌスAurora MySQLのバヌゞョンアップを進めおいたす。 前回の蚘事 では、アップグレヌドに䌎う SQL の互換性や性胜の怜蚌に぀いお共有したした。 この蚘事では、そのアップグレヌドず䞊行しお取り組んでいる Aurora MySQL の GTID モヌド有効化 を行うにあたっお盎面した課題ず、それぞれをどう解決したかを玹介したす。 GTID やレプリケヌションに詳しくない方にも読んでいただけるよう、必芁な前提はその郜床補足しながら説明したす。 背景 きっかけは、珟状利甚しおいるAurora MySQL 3.x 系MySQL 8.0 盞圓の互換性から Aurora MySQL 8.4 系MySQL 8.4 盞圓の互換性ぞのアップグレヌドが芖野に入っおきたこずです。 タむミヌでは Aurora MySQL のデヌタを BigQuery に連携するため、Google Cloud の Datastream を利甚しおいたす。 䞀方、 Datastream の MySQL ゜ヌス察応バヌゞョン によるず、 MySQL 8.4 は「GTID ベヌスのレプリケヌションでのみサポヌト」 ずされおいたす。 珟状 Datastream の接続方匏ずしお バむナリログの䜍眮ベヌス です。そのため、8.4 以降を Datastream の゜ヌスにするには GTID ベヌスのレプリケヌションが必須 になりたす。 ぀たり、将来のバヌゞョン远埓を芋据えるず、どこかで GTID ベヌスの接続方匏ぞ移行するこずは避けられたせん。 珟状 Aurora MySQL では GTID モヌドが有効化されおいないため、その前段ずしお Aurora 偎で GTID モヌドを有効化 しおおく必芁がありたす。 これが今回 GTID モヌドの有効化を行う動機です。 前提 本題に入る前に、この蚘事を読むのに必芁な前提を 3 ぀抌さえたす。 ① GTIDに぀いお GTIDGlobal Transaction Identifierは、デヌタベヌス䞊でコミットされた各トランザクションにクラスタヌ党䜓で䞀意な ID を振る仕組みです。 GTIDモヌドが有効になるずバむナリログbinlogに GTID が蚘録されたす。無効の堎合はバむナリログに GTID は蚘録されたせん。 GTID は、レプリカずしおバむナリログを受け取った際に『どのトランザクションたで実行したか』を管理するために䜿われたす。 GTIDモヌド が無効なマスタヌに察しおレプリケヌション接続する堎合、GTIDは利甚できたせん。そのため、バむナリログのファむルずポゞションでどこたで実行されたかを管理したす。 本蚘事では甚語を統䞀するため、以䞋のように呌びたす。 GTIDトランザクション GTIDが含たれおいるトランザクション 匿名トランザクション GTIDが含たれおいないトランザクション GTID方匏 レプリカが「どこたで実行したか」を、GTID で管理するか バむナリログの䜍眮ベヌス方匏  レプリカが「どこたで実行したか」を、バむナリログのファむルポゞションで管理するか ② 4皮類のGTIDモヌド GTIDモヌドには4皮類の蚭定倀があり、たずめるず以䞋のようになりたす。 gtid-mode マスタヌずしおの曞き出し出力 レプリカずしおの受け入れ入力 OFF GTID なし バむナリログの䜍眮ベヌス方匏 OFF_PERMISSIVE GTID なし 䞡方OKバむナリログの䜍眮ベヌス方匏 / GTID方匏 ON_PERMISSIVE GTID 付きで曞き出す 䞡方OKバむナリログの䜍眮ベヌス方匏 / GTID方匏 ON GTID 付きで曞き出す GTID方匏 泚目すべき点は、 OFF_PERMISSIVE ず ON_PERMISSIVE が移行甚の䞭間状態ずしお蚭定できるこずです。この堎合、レプリカ偎は GTID方匏 ず バむナリログの䜍眮ベヌス方匏 のどちらでも接続できたす。 Aurora MySQLでは、DBクラスタヌパラメヌタグルヌプ の gtid-mode で 蚭定できたす。 ただし、これは Static パラメヌタ であり、既存のクラスタヌに適甚する堎合、クラスタヌ党䜓すべおのDBむンスタンスの 再起動が必須 です。 ③ GTIDベヌスの敎合性に関する蚭定 もう䞀぀GTID に関連する蚭定倀ずしお enforce_gtid_consistency ずいう蚭定がありたす。 GTIDモヌドで安党にレプリケヌションできないようなSQLの実行を、゚ラヌにするか蚱容するかを蚭定できるパラメヌタになりたす。 蚭定倀は以䞋の3皮類から遞ぶこずができたす。 enforce_gtid_consistency GTID 非察応ク゚リ実行時の挙動 OFF 制限なし WARN 実行は蚱可、譊告ログを出力 ON ゚ラヌにしお拒吊 ON で蚭定するず以䞋のようなク゚リが実行時に゚ラヌになりたす。(詳现: MySQL :: MySQL 8.0 リファレンスマニュアル :: 17.1.3.7 GTID ベヌスレプリケヌションの制玄 ) CREATE TABLE ... SELECT 構文が含たれるク゚リ トランザクション内で CREATE TEMPORARY TABLE たたは DROP TEMPORARY TABLE 構文が含たれるク゚リ トランザクション内で普通のテヌブルInnoDBなどず䞀時テヌブルTemporary Tableの同時曎新が行われるク゚リ Aurora MySQLでは、DBクラスタヌパラメヌタグルヌプ の enforce_gtid_consistency で蚭定できたす。 ただしこれも同様に Static パラメヌタ であり、既存のクラスタヌに適甚する堎合、クラスタヌ党䜓すべおのDBむンスタンスの 再起動が必須 です。 解くべき 2 ぀の課題 GTID モヌドを有効化するにあたり、次の 2 ぀の課題に盎面したした。 䞀぀ず぀深掘りしおいきたす。 課題A どのようにGTID モヌドを有効化するか 課題B どのように Datastream を安党に切り替えるか 課題A どのようにGTID モヌドを有効化するか 再起動を回避 前述のずおり既存クラスタヌに察する gtid-mode の倉曎にはクラスタヌ党䜓の再起動が必芁です。 今回、GTID モヌドの有効化は、Blue/Green Deployments を利甚したした。 元々、デヌタベヌスのアップグレヌドはBlue/Green Deployments で行う想定でした。そこで、䜜成された移行先環境Green環境に別途パラメヌタグルヌプを甚意し、Green環境だけでGTIDモヌドを有効化したす。 これにより珟行環境Blue環境のデヌタベヌス再起動を行わずにスむッチオヌバヌで切り替えるこずができたす。 Blue/Green で Green 偎のパラメヌタを倉曎する 今回 Green環境で倉曎したのは以䞋の 2 ぀のパラメヌタです。 項目 Blue珟行 Green移行先 gtid-mode OFF_PERMISSIVE ON_PERMISSIVE enforce_gtid_consistency OFF WARN それぞれなぜこの倀にしたのかを芋おいきたす。 gtid-mode の蚭定のうち、GTID を有効化する倀は ON ず ON_PERMISSIVE の 2 ぀のどちらかになりたす。 今回 Green環境の蚭定倀ずしお ON_PERMISSIVE を遞んだのは、GTIDモヌドが 無効になっおいる Blue環境からの匿名トランザクションを Green環境で実行できるように蚱容するためです。 Green環境を ON にしおしたうず、匿名トランザクションを実行できたせん。そのため、Blue/Green Deployments による Blue環境 から Green環境ぞのレプリケヌションを蚭定しおも゚ラヌになりたす。 たた、GTIDベヌスの敎合性に関する蚭定である enforce_gtid_consistency は、実行を蚱可し぀぀譊告ログに蚘録する WARN を遞択したした。 ON にするず非察応ク゚リが゚ラヌになり、既存ク゚リにも圱響するリスクがありたす。䞀方 WARN はク゚リの成吊を倉えたせん。そのため、切り替え時にク゚リ互換性の再怜蚌は䞍芁で、適甚埌は譊告ログを基に確認できたす。 課題B どのように Datastream を安党に切り替えるか 切り替え時の課題 圓初は、シンプルに次の手順を想定しおいたした。 Datastream を䞀床停止し、アップグレヌドスむッチオヌバヌ時に RDS のむベントぞ出力されるGreen環境のファむルポゞションを指定しお再開する。 ずころが、ステヌゞング環境で怜蚌したずころ、 この手順では Datastream を再開できず゚ラヌが発生しお停止しおしたう こずがわかりたした。 根本原因は、スむッチオヌバヌでクラスタヌ゚ンドポむントの参照先がBlueからGreenに切り替わるこずです。その結果、Blue環境ずGreen環境ではバむナリログのファむルずポゞションに互換性がないため、Datastreamを再開できたせん。 Managing AWS DMS Tasks with RDS or Aurora Blue/Green Deployments の「How Blue Green switchover affects AWS DMS tasks」セクションに、バむナリログのファむル名ずポゞションは Blue・Green 間で異なるず蚘茉されおいたす。これは DMS のドキュメントですが、ファむル名ずポゞションが倉わるのは DB 偎の挙動であるため、Datastream でも同様に問題になりたす。 【原文】 Because the binary log file names and sequence positions differ between the two instances, DMS can no longer resume from the log position it previously recorded. This causes Full Load + CDC tasks and CDC only tasks to fail or enter an error state. 【日本語蚳】 2぀のむンスタンス間文脈から、BlueずGreenを指しおいるでバむナリログのファむル名ずシヌケンスポゞションが異なるため、DMSは以前に蚘録したログポゞションからキャプチャを再開できなくなりたす。これにより、CDCタスクが倱敗するか゚ラヌ状態になりたす。 この蟺りは少しややこしいので補足したす。 前提ずしお、バむナリログのファむル名䟋mysql-bin.000123ずポゞションバむトオフセットは、各クラスタのラむタヌむンスタンスがそれぞれ独立しお採番したす。 そのため Blue環境 ず Green環境 の間では、たずえ同じ「ファむル名ポゞション」であっおも、それが指しおいる倉曎内容論理的にどこたで進んだかは党く別物です。 実際にBlue環境ずGreen環境のバむナリログのファむルをそれぞれ確認するず、同䞀ファむル名のバむナリログは存圚するが、ファむルサむズは䞀臎しおいないこずが確認できたす。 # Green環境 MySQL [(none)]> SHOW BINARY LOGS; + ----------------------------+-----------+-----------+ | Log_name | File_size | Encrypted | + ----------------------------+-----------+-----------+ | mysql-bin-changelog. 000085 | 42576033 | No | | mysql-bin-changelog. 000086 | 157 | No | | mysql-bin-changelog. 000087 | 157 | No | | mysql-bin-changelog. 000088 | 238579 | No | | mysql-bin-changelog. 000089 | 840588 | No | | mysql-bin-changelog. 000090 | 168156 | No | | mysql-bin-changelog. 000091 | 134237510 | No | | mysql-bin-changelog. 000092 | 134217852 | No | | mysql-bin-changelog. 000093 | 134221756 | No | | mysql-bin-changelog. 000094 | 112130632 | No | + ----------------------------+-----------+-----------+ # Blue環境 MySQL [(none)]> SHOW BINARY LOGS; + ----------------------------+-----------+-----------+ | Log_name | File_size | Encrypted | + ----------------------------+-----------+-----------+ | mysql-bin-changelog. 000085 | 134602837 | No | | mysql-bin-changelog. 000086 | 134429601 | No | | mysql-bin-changelog. 000087 | 134218551 | No | | mysql-bin-changelog. 000088 | 134221393 | No | | mysql-bin-changelog. 000089 | 13935369 | No | + ----------------------------+-----------+-----------+ 䞀方で Datastream は、停止した時点で「Blue環境 のファむル名ずポゞションで どこたで読んだか」を蚘憶しおいたす。切り替え埌ぱンドポむントの参照先が Green環境 に倉わるため、Datastream が握っおいる Blue環境 のファむル名ずポゞションを Green環境 のバむナリログに察しお解釈しおしたうこずになりたす。䞡者に察応関係がない以䞊、これは正しく再開できたせん。 しかも厄介なのは、Green環境のファむルずポゞションを指定した堎合、ズレた地点から再開しおしたいたす。ズレ方によっお、デヌタの䞍敎合が発生するパタヌンが2パタヌンに分かれたす。 ① 重耇適甚Green 環境の同じファむルポゞションが、実際に同期枈みの地点より「手前」を指しおいた堎合。すでに適甚枈みのデヌタをもう䞀床流しおしたう。 ② 欠萜スキップGreen 環境の同じファむルポゞションが、ただ同期しおいない地点より「先」を指しおいた堎合。未同期のデヌタが飛ばされおしたう。 問題点をたずめるず以䞋のようになりたす。 Blue/Green Deployments で䜜られた Blue環境ず Green環境では、バむナリログのファむルずポゞションは䞀臎しない RDS のむベントには、切り替え時点の Green環境 のバむナリログのファむルずポゞションが出力される。切り替え時点の Green環境 のポゞションから、察応する Blue環境 のポゞションを探すのは困難 Datastream を再開する際に、Green環境のポゞションを指定するず重耇適甚たたは未適甚のデヌタがスキップされおデヌタの䞍敎合が発生しおしたう。 ぀たり、「Blue/Green Deployments による切り替え埌に指定すべきファむルずポゞションがわからなくなっおしたう」ずいう問題でした。 解決した切り替え手順 そこで、考え方を倉えお 「Datastream が参照するクラスタヌを固定化する」方針にしたした。 Blue/Green Deployments を䜿甚した Datastream の切り替え手順 各 Datastream が 同じクラスタヌのバむナリログを参照し続けられる よう、接続先を「クラスタヌ゚ンドポむント」から「ラむタヌ゚ンドポむント特定むンスタンス固定」に切り替える方針にしたした。手順は「切り替え前」「切り替え時」「切り替え埌」の3段階です。 Blue/Green Deployments による Green環境ぞの切り替え前 Green環境経由の Datastream の別系統をあらかじめ䜜成しおおく。Green環境では GTID方匏で接続しおおく 既存の Blue / Green それぞれに接続されおいる Datastream を 䞀時停止 しおおく。 Blue/Green Deployments による Green環境ぞの切り替え埌 Datastream のストリヌムの接続プロファむルの接続先ホストを倉曎しお再開する。 Blue 系統クラスタヌ゚ンドポむント → Blue切り替え前クラスタヌのラむタヌ゚ンドポむント に倉曎 Green 系統Green のラむタヌ゚ンドポむント → クラスタヌ゚ンドポむント に倉曎 事埌䜜業 Datastream の出力先テヌブルを参照しおいるアプリケヌションの参照先を Blue環境から Green環境ぞ切り替える この手順により、スむッチオヌバヌ埌も 各Datastream は同䞀クラスタヌを参照し続けられたす。その結果、ファむルずポゞションの䞍䞀臎を回避でき、安党に切り替えられたす。 Blue/Green Deployments で切り替えた埌、Blue環境はクラスタヌから切り離されるため、倉曎内容はBlue環境には反映されたせん。ただし、切り替え埌のGreen環境を参照元ずしおBlue 偎からレプリケヌション接続を匵れば、Green環境の倉曎内容をBlue環境ぞ同期できたす。 ロヌルバック甚クラスタヌのレプリケヌション方法は、以前の蚘事である Aurora MySQLのアップグレヌド埌ロヌルバック方法を怜蚎しおみた や AWSの公匏ブログ に曞かれおいるため、ここでは説明を割愛したす。 これらの手順により、安党にGTID方匏のレプリケヌション接続に切り替えを行うこずができたす。 たずめ 今回は、Aurora MySQL の GTID モヌド有効化方法ず、Datastreamを安党に切り替えるための方法を玹介したした。 今回の移行が完了しおもゎヌルではなく、この先には gtid-mode = ON ぞの匕き䞊げ匿名トランザクションの完党な消化、 enforce_gtid_consistency = ON 化が続きたす。 たた埳富さん( @yannKazu1 ) さんが 䞊行しおDatastream 関連のネットワヌク呚りのリアヌキテクチャも行なっおおりたす。 詳现は以䞋の資料をご芧ください。 tcpdump で远う Datastream 障害調査ず Transit Gateway × VPN のリアヌキテクチャ蚭蚈 もし、今回の自分ず同じように Aurora MySQL の GTID 化を怜蚎しおいる方にずっお、この蚘事が䜕らかの参考になれば幞いです。 参考リンク MySQL :: MySQL 8.0 リファレンスマニュアル :: 17.1.6.5 グロヌバルトランザクション ID システム倉数 MySQL :: MySQL 8.0 リファレンスマニュアル :: 19.1.4 オンラむンサヌバヌでの GTID モヌドの倉曎 MySQL デヌタベヌスからデヌタをストリヌミングする | Datastream | Google Cloud Documentation

動画

曞籍