Upgrade to Pro — share decks privately, control downloads, hide ads and more …

脱Oracle、MySQL一本化への道 / Engineers-in-CARTA-vol-2

脱Oracle、MySQL一本化への道 / Engineers-in-CARTA-vol-2

CARTA Engineering

December 17, 2021
Tweet

More Decks by CARTA Engineering

Other Decks in Technology

Transcript

  1. 自己紹介
 3 株式会社CARTA HOLDINGS/
 株式会社VOYAGE MARKETING 
 (改メ 株式会社 DIGITALIO

    2022年1月より)
 メディア事業本部
 ポイントメディア事業部
 
 浪川 大輔
 • 入社13年、ECナビに関わって約10年
 • ここ数年はインフラを中心に改善を行うチームに所属
 • 「浪川大輔」の ”声じゃない” 方担当

  2. 2016年ごろのDB事情
 6 • オンプレ時代
 • Oracle
 ◦ ODA X4-2 ってアプライアンス製品


    
 
 
 
 
 • MySQL
 ◦ フロント向け、バックオフィス向けの大きく2つ
 ◦ それぞれmaster1台, slave2台の構成
 構成

  3. 現在のDB事情
 8 • AWS移転後
 • Oracle
 ◦ RDS Oracle Standard

    Edition Two(se2)
 ◦ インスタンスタイプは r5.2xlarge
 • MySQL
 ◦ フロント向け、バックオフィス向けの大きく2つ
 ◦ インスタンスタイプは 
 ▪ フロント向け r5.2xlarge
 ▪ バックオフィス向け r5.large
 ◦ それぞれmaster1台
 構成

  4. 現在のDB事情
 9 テーブル数
 インスタンス
 データベース数
 テーブル数
 Oracle
 1
 650 ->

    180
 MySQL
 (フロント向け)
 5 -> 3
 797 -> 194
 MySQL
 (バックオフィス向け)
 3 -> 2
 235 -> 51
 MySQLはこの後、別の統廃合プロジェクトによって、フロントに1データベー ス、181テーブル、バックオフィスは廃止予定

  5. 現在のDB事情
 10 
 ここまでの奮闘の歴史は
 
 Engineers in VOYAGE
 ~事業をエンジニアリングする技術者たち~ 


    
 第3章 
 VOYAGE MARKETING
 20年級大規模レガシーシステムとの戦い
 
 をお読みいただけると幸いです。
 まとめ

  6. まずは調査
 25 • トリガー -> なし
 • プロシージャ -> なし


    • シーケンス(特殊ケース)-> あり
 ◦ シーケンス:1-テーブル:n で使ってるところ が1箇所
 Oracle独自のもがないか?

  7. 引っ越し
 31 • 低
 ◦ マスターデータ系
 ◦ まとメール
 • 中


    ◦ パスワードリマインダー
 ◦ アドレス変更
 ◦ CSRF対策
 ◦ ポイント失効
 ◦ ナビック新着
 ◦ カードプラス
 ◦ 友達紹介
 ◦ 会員退会
 ◦ 会員停止
 ◦ キャンペーン
 難易度
 • 高
 ◦ まいにち動画
 ◦ ガラポン
 ◦ 誕生日
 ◦ 募金
 ◦ ハッピーアンケート
 ◦ 珍コレ
 ◦ 宝くじ
 ◦ 連携用ユーザID
 ◦ 会員登録
 ◦ ポイント付与API
 ◦ ポイント付与申請
 ◦ タップインセ
 ◦ キャンペーンシステム
 ◦ BID関連
 ◦ MFA系
 ◦ PeX交換
 ◦ アプリ
 • 鬼
 ◦ ポイント
 ◦ 成果案件 + 成果通知
 ◦ ユーザー

  8. 引っ越し
 32 • 以下を1セットとして
 ◦ アプリの調査、データ移行、メンテナンスの入れ方決 定
 ◦ DDLの用意
 ◦

    アプリ改修
 ◦ データ移行準備
 ◦ 動作、パフォーマンス検証
 ◦ メンテナンス日調整
 ◦ 切り替え作業
 どう進める

  9. データ型どうする?
 35 変換ルール
 Oracle MySQL DATE DATETIME NUMBER(n, 0): n

    < 3 TINYINT(n) NUMBER(n, 0): 3 <= n < 10 INT(n) NUMBER(n, 0): 10 <= n < 19 BIGINT(n) NUMBER(n, 0): 20 <= n DECIMAL(n, 0) NUMBER(n, s) DECIMAL(n,s) VARCHAR2(n) VARCHAR(n) CHAR(n) VARCHAR(n)
  10. DDLは?
 37 • AWS Schema Conversion Tool は使わなかった
 ◦ databaseに直接繋ぐ必要がある


    ◦ NUMBERが軒並みDECIMALになったり、細かく マッピングの設定をしないといけなかった
 ◦ DDLの管理はflywayで管理してるのでリリース の兼ね合い
 変換ツール

  11. DDLの罠
 39 • DECIMAL型はauto_incrementが付けれない
 ◦ NUMBER(n, 0): 20 <= n

    に該当した数ケース
 ◦ 自動変換でNUMBER -> DECIMALにしていたら 軒並みハマってた
 ◦ 実データみると、データの増加量みても20桁以 上行きそうにないものばかり
 ◦ 実データと増加量から適切な桁を調べてINT, BIGINTにして対応
 

  12. アプリ改修
 41 SQLの関数周り
 Oracle MySQL sysdate now() rownum limit, offset

    to_date (date型との比較) なし to_char (日付の変換で利用) なし nextval last_insert_id()
  13. アプリ改修
 45 rownum
 こんな実装があると地味にダメージありますw
 
 function find($start, $end, $con) //

    <- 開始行、終了行が引数になってるやつ
 {
 $sql = "SELECT
 ID,
 NAME,
 ROWNUM
 FROM
 USERS
 WHERE
 ROWNUM BETWEEN :start AND :end";
 
 return $con->execute($sql, ['start' => $start, 'end' => $end]);
 }
 
 

  14. アプリ改修
 46 トランザクション
 • OracleとMySQLの両テーブルを更新する場合
 • 例えば: クイズに答えてポイントを取得
 ◦ Oracleのポイントログに追加(ポイントを付与)


    ◦ MySQLのクイズの回答のログに追加
 • Oracleにポイント情報、MySQLにコンテンツ系の 情報を持ってるパターンが結構ある

  15. アプリ改修
 47 トランザクション
 try {
 $oracleCon = Database::getConnection('ORACLE_ECNAVI);
 $mysqlCon =

    Database::getConnection('MYSQL_ECNAVI');
 
 $pointLogDao = Dao::get('POINT_LOG');
 $quizAnswerDao = Dao::get('QUIZ_ANSWER');
 // トランザクション開始
 $oracleCon->begin();
 $mysqlCon->begin();
 // それぞれのテーブルへ追加
 $pointLogDao->insert($userId, $pointValue, $oracleCon); // Oracleのテーブルへの追加
 $quizAnswerDao->insert($userId, $answer, $mysqlCon); // MySQLのテーブルへの追加
 // コミット
 $oracleCon->commit();
 $mysqlCon->commit();
 } catch (Exception $e) {
 if (isset($oracleCon) && $oracleCon->isTransaction()) {
 $oracleCon->rollback();
 }
 if (isset($mysqlCon) && $mysqlCon->isTransaction()) {
 $mysqlCon->rollback();
 }
 }
 
 

  16. アプリ改修
 48 トランザクション
 • こんなコードが結構ある
 • 歴史のある大規模アプリなので、コードの作りに グラデーションがある
 ◦ こんなコードがControllerにあったり、ビジネスロ

    ジッククラスにあったりいろいろパターンがあっ て苦労する
 • 引っ越しの過渡期にはOracleにあったコンテンツ をMySQLに移すので、こんなコードを追加する必 要もある

  17. データ移行
 49 
 • データ移行は以下ツールを利用
 ◦ Embulk
 ▪ 現在Oracle、MySQLからRedshiftへ日次デー タ移行に利用


    ◦ AWS Database Migration Service(DMS)
 ▪ 複数テーブルの移行
 ▪ CDC(差分更新)

  18. IOPS
 50 • データ移行に際して事前にIOPSの確認は重要
 • データ移行先(今回だとMySQL)の書き込みのIOPS がかなり上がる
 • RDSのストレージタイプ(とストレージサイズ)によっ て上限がありそれを超えてI/Oクレジットバランス使

    い切ると極端に性能悪化
 • 移行先はサービスですでに利用しているためデータ 移行によってI/Oクレジットバランス使い切るとサー ビスにも影響が出る
 ◦ この辺は本番と同様のデータの検証環境を使って 事前に確認をとりつつ進めました