Slide 1

Slide 1 text

Copyright © 2024 HeatWavejp All Rights Reserved. HeatWavejp Meetup #08 OCI GoldenGate を用いた Autonomous Database から MySQL HeatWave へのデータ連携 2024年6月17日(月) 株式会社スマートスタイル DB&クラウド事業部 技術本部 クラウド部 稲葉 祐人

Slide 2

Slide 2 text

Copyright © 2024 HeatWavejp All Rights Reserved. 1. OCI GoldenGate とは 2. データ連携の全体像 3. データ連携の手順 4. 補足 5. まとめ アジェンダ

Slide 3

Slide 3 text

Copyright © 2024 HeatWavejp All Rights Reserved. OCI GoldenGate とは① OCI GoldenGateとは • 「Oracle GoldenGate」というデータ・レプリケーション製品のOCI上のマネージド・サービス • GoldenGateの魅力は、複数のデータソース/ターゲット間で低遅延のデータ・レプリケーションを実現可能

Slide 4

Slide 4 text

Copyright © 2024 HeatWavejp All Rights Reserved. OCI GoldenGate とは② Source Trail File Service Manager Administration Server GoldenGate Deployment Target ①Extractが変更履歴を抽出し、 Trail Fileへ書き込む ②ReplicatがTrail Fileを読み込み、 同じトランザクションを実行 Service Manager (OCIではコンソール)が デプロイメント全体を管理 Administration Server (OCIではGoldenGateコンソール)で 各プロセス実装・運用・監視・管理 GoldenGateの基本的な構成

Slide 5

Slide 5 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の全体像① Oracle Modern Data Platform Reference Architecture(MySQL HeatWave)

Slide 6

Slide 6 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の全体像② ソースDB ターゲットDB データ連携の流れ • 以下の公式チュートリアルで紹介されている手順を参考にソースとターゲット変更して実施 OCI MySQL HeatWaveデータベースからAutonomous Data Warehouseへのデータのレプリケート (oracle.com)

Slide 7

Slide 7 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⓪ ソースDBとターゲットDBの作成 1. 対象となるDBとVCNを作成します。 • ソースDB : Autonomous Database (ATP 19c) • ターゲットDB: MySQL HeatWave (MySQL 8.4.0 - LTS) • VCN :「インターネット接続性を持つ」ウィザードで作成し、セキュリティリストを修正 ADBの構築方法に関する 弊社ブログ HeatWave構築に関する 弊社ホワイトペーパー

Slide 8

Slide 8 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順① ソースDB ターゲットDB データ連携の準備

Slide 9

Slide 9 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順② データ連携の準備(ターゲットDB ー MySQL HeatWave) 1. Oracle社提供のSQLスクリプトをダウンロードします。 2. Insert文は実行せずに、 SRC_OCIGGLLデータベースを作成します 3. SRC_OCIGGLLデータベース内に以下の6つの空テーブルを作成します。 • SRC_CITY • SRC_CUSTOMER • SRC_ORDERS • SRC_ORDER_LINES • SRC_PRODUCT • SRC_REGION 4. 作成したテーブルが空であることを確認します。

Slide 10

Slide 10 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順③ 空テーブルの作成 空テーブルであることの確認

Slide 11

Slide 11 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順④ データ連携の準備(ターゲットDB ー MySQL HeatWave) 5. 各テーブルに対してプライマリーキーを追加します。 mysql> alter table SRC_OCIGGLL.SRC_CITY add primary key (CITY_ID); 6. 各テーブルに対してHeatWaveを利用するという設定(RAPID設定)を行います。 mysql> alter table SRC_OCIGGLL.SRC_CITY secondary_engine RAPID; プライマリーキーの追加 RAPID設定

Slide 12

Slide 12 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑤ データ連携の準備(ターゲットDB ー MySQL HeatWave) 7. SRC_OCIGGLLデータベースのテーブルのデータをMySQL HeatWaveにロードします。 8. OCI GoldenGateで使用するユーザを作成し、権限を付与します。 HeatWaveへのロード ggadminユーザの作成と権限付与

Slide 13

Slide 13 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑥ ソースDB ターゲットDB データ連携の準備

Slide 14

Slide 14 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑦ データ連携の準備(ソースDB ー ADB) 1. ADBのツール「Database Actions」からGGADMINユーザを有効化します。 2. Database ActionsなどでADBに接続し、サプリメンタル・ロギングを有効化します。 SQL> alter pluggable database add supplemental log data; GGADMINユーザの有効化 サプリメンタル・ロギングの有効化

Slide 15

Slide 15 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑧ データ連携の準備(ソースDB ー ADB) 3. Oracle社提供のSQLスクリプトzipファイルをダウンロードします。 4. zipファイルを解凍し、以下のファイルのSQLスクリプトをDatabase Actionsなどで実行します。 • OCIGGLL_OCIGGS_SETUP_USERS_ATP.sql • OCIGGLL_OCIGGS_SRC_USER_SEED_DATA.sql ファイル選択 SQLスクリプトの実行

Slide 16

Slide 16 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑨ データ連携の準備(ソースDB ー ADB) ※ 注意 「OCIGGLL_OCIGGS_SRC_USER_SEED_DATA.sql」を実行するときに、 SQLスクリプトのデータ型が適切でないというエラーが出るので、 197行目~209行目を以下のように書き換えてみてください!

Slide 17

Slide 17 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑩ ソースDB ターゲットDB データ連携の準備

Slide 18

Slide 18 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑪ データ連携の準備(OCI GoldenGate ー ADB) 1. OCIのコンソール画面のハンバーガーメニューから「Oracle Database」を選択し、 「GoldenGate」をクリックします。 2. 以下の項目を入力し、ADB用のデプロイメントを作成します。 • 名前:GGOracleATP(任意のもので可) • デプロイメント方法:開発またはテスト(検証のため) • OCPU数:1(検証のため) • サブネット:プライベートサブネット • ライセンスタイプ:ライセンス込み • ネットワーク(オプション):GoldenGateコンソール・パブリック・アクセスを有効化

Slide 19

Slide 19 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑫ データ連携の準備(OCI GoldenGate ー ADB) 2. (続き) 以下の項目を入力し、ADB用のデプロイメントを作成します。 • デプロイメント・タイプ:データ・レプリケーション • テクノロジ:Oracle Database • バージョン:oggoracle:21.14.0.0.0_240525.0856_994 • GoldenGateインスタンス名:GGinstOracleATP • 管理者ユーザー名:oggadmin • パスワード・シークレット:作成したシークレットキーを選択 ※シークレットは、OCI上のVaultサービスを活用し、作成します。その際に「手動シークレット作成」、 「プレーンテキスト」を選択し、GoldenGateにログインするパスワードを入力してください。 詳細は以下のドキュメントを参照してください。 参考:Vaultでのシークレットの作成 (oracle.com)

Slide 20

Slide 20 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑬ データ連携の準備(OCI GoldenGate ー ADB) 3. ソースDBであるADBにアクセスするために、接続オブジェクトを作成します。 4. コンソール上で「GoldenGate」から「接続」を選択し、以下の項目を入力して作成します。 • 名前:srcoracleatp • タイプ:Oracle Autonomous Database • 接続詳細:「データベースの選択」をクリック • データベース:準備で作成したADBを選択 • データベース・ユーザー名:ggadmin • データベース・ユーザー・パスワード:GGADMINを有効化した際のパスワードを入力 • ネットワーク接続:共有エンドポイント 5. 接続オブジェクトをデプロイメントにアタッチします。

Slide 21

Slide 21 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑭ デプロイメントの作成 接続オブジェクトのアタッチ

Slide 22

Slide 22 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑮ データ連携の準備(OCI GoldenGate ー MySQL HeatWave) 1. OCIのコンソール画面のハンバーガーメニューから「Oracle Database」を選択し、 「GoldenGate」をクリックします。 2. 以下の項目を入力し、MySQL HeatWave用のデプロイメントを作成します。 ※ADBとの相違点のみ太文字にしています。 • 名前: GGMySQLHW(任意のもので可) • デプロイメント方法:開発またはテスト(検証のため) • OCPU数:1(検証のため) • サブネット:プライベートサブネット • ライセンスタイプ:ライセンス込み • ネットワーク(オプション):GoldenGateコンソール・パブリック・アクセスを有効化

Slide 23

Slide 23 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑯ データ連携の準備(OCI GoldenGate ー MySQL HeatWave) 2. (続き) 以下の項目を入力し、ADB用のデプロイメントを作成します。 • デプロイメント・タイプ:データ・レプリケーション • テクノロジ:MySQL • バージョン: oggmysql:21.14.0.0.0_240404.1108_994 • GoldenGateインスタンス名:GGinstMySQLHW • 管理者ユーザー名:oggadmin • パスワード・シークレット:作成したシークレットキーを選択(ADBと同じキーでも可) ※シークレットは、OCI上のVaultサービスを活用し、作成します。その際に「手動シークレット作成」、 「プレーンテキスト」を選択し、GoldenGateにログインするパスワードを入力してください。 詳細は以下のドキュメントを参照してください。 参考:Vaultでのシークレットの作成 (oracle.com)

Slide 24

Slide 24 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑰ データ連携の準備(OCI GoldenGate ー MySQL HeatWave) 3. ターゲットDBであるHeatWaveにアクセスするために、接続オブジェクトを作成します。 4. コンソール上で「GoldenGate」から「接続」を選択し、以下の項目を入力して作成します。 • 名前:trgmysqlhw • タイプ:OCI MySQL HeatWave • 接続詳細:「 MySQLデータベース・システムの選択」をクリック • データベース:準備で作成したHeatWaveを選択 • データベース名: SRC_OCIGGLL • データベース・ユーザー名:ggadmin • データベース・ユーザー・パスワード:ggadminを有効化した際のパスワードを入力 • SSL詳細:TLS(セキュリティ・プロトコル)/優先(SSLモード) 5. 接続オブジェクトをデプロイメントにアタッチします。

Slide 25

Slide 25 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑱ デプロイメントの作成 接続オブジェクトのアタッチ

Slide 26

Slide 26 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑲ ソースDB ターゲットDB ソースデータベースからデータを抽出する

Slide 27

Slide 27 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順⑳ Extractの作成(OCI GoldenGate ー ADB) 1. OCIのコンソール画面の「GoldenGate」からADB用のデプロイメントを選択し、 「コンソールの起動」をクリックし、管理者ユーザーoggadminでログインします。 OCI GoldeGateログイン画面 OCI GoldeGateコンソール画面

Slide 28

Slide 28 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉑ Extractの作成(OCI GoldenGate ー ADB) 2. 管理サービスの画面上部にある「+」のボタンをクリックし、以下の項目を入力してExtractを追加します。 • 抽出タイプ:統合Extract • プロセス名:CDCEXT • トレイル名:C1 • 資格証明ドメイン:OracleGoldenGate • 資格証明別名:srcoracleatp(接続オブジェクト作成時の名前) • パラメーター・ファイル:最後の行に「 TABLE SRC_OCIGGLL.*; 」を追加

Slide 29

Slide 29 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉒ Extractの作成(OCI GoldenGate ー ADB) 3. 再度「+」のボタンをクリックし、以下の項目を入力して初期ロード用のExtractを追加します。 • 抽出タイプ:Extractの初期ロード • プロセス名:ILEXT • パラメーター・ファイル:以下の内容を最後に追加します。 ※統合Extractと違い、トレイル名などをパラメーター・ファイルに記述するのは仕様らしいです USERIDALIAS srcoracleatp DOMAIN OracleGoldenGate EXTFILE I1 , PURGE TABLE SRC_OCIGGLL.*;

Slide 30

Slide 30 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉓ Extractの作成(OCI GoldenGate ー ADB) 4. 初期ロード用のExtractと、更新用のExtractが追加されていることを確認します。 ※初期ロード用のExtractは、初期読み込みが成功するとステータスが「黄色」になります 変更用Extract 初期ロード用Extract

Slide 31

Slide 31 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉔ ソースDB ターゲットDB 初期ロード用配布パス

Slide 32

Slide 32 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉕ 初期ロード用の配布パスの準備(OCI GoldenGate ー MySQL HeatWave) 1. OCIのコンソール画面の「GoldenGate」からHeatWave用のデプロイメントを選択し、 「コンソールの起動」をクリックし、管理者ユーザーoggadminでログインします。 2. ナビゲーションメニューから「管理者」を選択し、「+」ボタンから以下の項目を入力しユーザを発行します。 • ユーザ名:ggsnet • ロール:演算子(英語だとOperator) • タイプ:パスワード • パスワード:任意のパスワードを入力

Slide 33

Slide 33 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉖ 初期ロード用の配布パスの作成(OCI GoldenGate ー ADB) 1. 先程作成した配布パスユーザをADBのデプロイメントに追加します。 2. ナビゲーションメニューから「構成」を選択し、「+」ボタンから以下の項目を入力し資格証明を追加します。 • 資格証明ドメイン:GGNetwork • 資格証明別名:dpuser • ユーザ名:ggsnet • パスワード:HeatWaveデプロイメントでggsnetに指定したパスワードを入力

Slide 34

Slide 34 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉗ 初期ロード用の配布パスの作成(OCI GoldenGate ー ADB) 3. ADBのデプロイメントコンソールから「分散サービス」を選択し、 右上の 「+」ボタンから以下の項目を入力し配布パスを作成します。 • 配布パス名:dpiext • ソース:Extractは何も選択せず、下の段に「I1」と入力 • ターゲット認証方式:ユーザID別名 • ターゲット:wws • ターゲットホスト:HeatWave用のデプロイメントの詳細にあるURLを入力 ※ https:// 以降で、末尾のスラッシュなしで入力する必要があります

Slide 35

Slide 35 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉘ 初期ロード用の配布パスの作成(OCI GoldenGate ー ADB) 3. (続き) • ポート番号:443 • トレイル名:I1 • ドメイン:GGNetwork • 別名:dpuser

Slide 36

Slide 36 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉙ ソースDB ターゲットDB データをターゲット・データベースに届ける

Slide 37

Slide 37 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉚ 初期ロード用のReplicatの作成(OCI GoldenGate ー MySQL HeatWave) 1. HeatWave用のデプロイメントコンソール画面に移動し、ナビゲーションメニューから「構成」を選択し、 「接続」ボタンをクリックして、MySQL HeatWaveに接続します。 ※接続できない場合は、ggadminユーザのパスワードが一致していない可能性があります 2. 接続に成功すると、チェックポイント表が追加できるようになります。以下の項目を入力して作成します。 • チェックポイント表名: SRC_OCIGGLL.CHECKTABLE

Slide 38

Slide 38 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉛ 初期ロード用のReplicatの作成(OCI GoldenGate ー MySQL HeatWave) 3. ナビゲーションメニューから「概要」を選択し、「+」ボタンから以下の項目を入力しReplicatを追加します。 • プロセス名:RIL • 資格認証ドメイン:OracleGoldenGate • 資格証明別名:trgmysqlhw • トレイル名:I1 • チェックポイント表:SRC_OCIGGLL.CHECKTABLE • パラメーター・ファイル:最後の行に「MAP SRC_OCIGGLL.*, TARGET SRC_OCIGGLL.*;」を追加

Slide 39

Slide 39 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉜ 初期ロード用のReplicatの作成(OCI GoldenGate ー MySQL HeatWave) 4. 配布パスが通常通りに動いていれば、初期ロード用のデータがターゲットDBに挿入されます。 Replicat(RIL)の「アクション」を選択後、「詳細」を選択、「統計」をクリックします。 ソースDBからターゲットDBのテーブルにデータが挿入されたことが確認できます。

Slide 40

Slide 40 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉝ 初期ロード用のReplicatの作成(OCI GoldenGate ー MySQL HeatWave) 5. ターゲットDBであるMySQL HeatWaveにログインし、データが挿入されていることを確認します。 >>snip<< 51行追加された!

Slide 41

Slide 41 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉞ ソースDB ターゲットDB 変更用配布パス

Slide 42

Slide 42 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㉟ 変更用の配布パスの作成(OCI GoldenGate ー ADB) 1. ADBのデプロイメントコンソールから「分散サービス」を選択し、 右上の 「+」ボタンから以下の項目を入力し配布パスを作成します。 • 配布パス名:dpcdcext • ソース:「CDCEXT」を選択し、下の段に「C1」と入力 • ターゲット認証方式:ユーザID別名 • ターゲット:wws • ターゲットホスト:HeatWave用のデプロイメントの詳細にあるURLを入力 ※ https:// 以降で、末尾のスラッシュなしで入力する必要があります

Slide 43

Slide 43 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊱ 変更用の配布パスの作成(OCI GoldenGate ー ADB) 1. (続き) • ポート番号:443 • トレイン名:C1 • ドメイン:GGSNetwork • 別名:dpuser 変更用配布パス 初期ロード用配布パス

Slide 44

Slide 44 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊲ ソースDB ターゲットDB 変更用Replicat

Slide 45

Slide 45 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊳ 変更用のReplicatの作成(OCI GoldenGate ー MySQL HeatWave) 1. HeatWaveのデプロイメントコンソールに移動し、ナビゲーションメニューから「概要」を選択し、 「+」ボタンから以下の項目を入力しReplicatを追加します。 • プロセス名: RCDC • 資格認証ドメイン:OracleGoldenGate • 資格証明別名:trgmysqlhw • トレイル名:C1 • チェックポイント表:SRC_OCIGGLL.CHECKTABLE • パラメーター・ファイル: 最後の行に「MAP SRC_OCIGGLL.*, TARGET SRC_OCIGGLL.*;」を追加

Slide 46

Slide 46 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊴ 変更用のReplicatの作成(OCI GoldenGate ー MySQL HeatWave) 2. 変更用のReplicat(RCDC)が追加されていることを確認します。 変更用Replicat 初期ロード用Replicat

Slide 47

Slide 47 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊵ ソースDB ターゲットDB データの挿入 挿入の確認

Slide 48

Slide 48 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊶ 変更用のデータの追加(ソースDB ー ADB) 1. Database ActionsなどでADBに接続し、 SRC_CITYテーブルに10行のレコードを挿入します。

Slide 49

Slide 49 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊷ 変更用のデータの追加(OCI GoldenGate ー MySQL HeatWave) 1. HeatWaveのデプロイメントコンソールに移動し、 Replicat(RCDC)の「アクション」を選択後、 「詳細」を選択、「統計」をクリックします。 2. 10行分のデータが挿入されたことが確認します。

Slide 50

Slide 50 text

Copyright © 2024 HeatWavejp All Rights Reserved. データ連携の構築手順㊸ 変更用のデータの追加(ターゲットDB ー MySQL HeatWave) 1. ターゲットDBであるMySQL HeatWaveにログインし、データが挿入されていることを確認します。 >>snip<< 61行になっている!

Slide 51

Slide 51 text

Copyright © 2024 HeatWavejp All Rights Reserved. 補足 OCI GoldenGate に 23aiバージョンがリリース • AIワークロードの分散ベクトルのサポート、最新のOracle Database 23aiのサポート • ユーザーインターフェースの刷新 • 可観測性と診断の向上 etc... 参考:https://blogs.oracle.com/oracle4engineer/post/ja-ann-goldengate-23ai

Slide 52

Slide 52 text

Copyright © 2024 HeatWavejp All Rights Reserved. 参考 ◼ Replicate data from OCI MySQL Database to Autonomous Data Warehouse https://docs.oracle.com/en/cloud/paas/goldengate-service/amyql/index.html ◼ Oracle Cloud Infrastructure GoldenGate - Manage connections https://docs.oracle.com/en/cloud/paas/goldengate-service/mcjzr/ ◼ OCI GoldenGateを使ってAutonomous DatabaseからMySQL HeatWaveへのデータ連携を試してみた https://qiita.com/ninomiyatsu/items/b0d83446dac181f85fde ◼ OCI GoldenGate(OCI GG) で BaseDB 19c から ADW-S にレプリケーションしてみる。 https://qiita.com/ora_gonsuke777/items/2116a8f92349fe6c3330 ◼ OCI-GoldenGateの分散パスを利用してOracle Databaseのリージョン間レプリケーションを実装する https://qiita.com/ykuma614/items/9a82986c1fe97182104d ◼ Oracle Database Technology Night #54 Oracle Databaseのアップグレードとクラウド移行実践 GoldenGateとReal Application Testingの活用 Oracle Database Technology Night #54 Oracle Databaseのアップグレードとクラウド移行実践

Slide 53

Slide 53 text

Copyright © 2024 HeatWavejp All Rights Reserved. まとめ ◼ OCI GoldenGate は、OCI上のマネージド・サービスであり、複数のデータソース/ターゲット 間で低遅延のデータ・レプリケーションを実現できる ◼ Autonomous DatabaseからHeatWaveへのデータ連携では、GoldenGateのExtractと Replicatプロセスを組み合わせて行う ◼ 具体的な手順としては、まずAutonomous Database側でExtractを設定し、次に HeatWave側でReplicatを設定する ◼ 初期ロード用と変更用に分けて構築することで、スムーズなデータレプリケーションが可能になる ◼ OCI GoldenGate 23ai がリリース

Slide 54

Slide 54 text

Copyright © 2024 HeatWavejp All Rights Reserved.