DB⚡ パフォーマンス・速度

Uber

Uber、創業期に使っていたPostgreSQLからMySQLベースの独自レイヤーへ移行

PostgreSQLMySQL(Schemaless層)

PostgreSQLはUber創業初期にはうまく機能したが、レプリケーション効率やコネクション処理などスケール面の課題からMySQLベースの独自基盤Schemalessへ移行した。

課題

PostgreSQLの書き込み増幅、非効率なレプリケーション、データ破損バグに直面

アプローチ

InnoDBのバッファプール設計やスレッド単位接続などMySQLの特性を評価しSchemaless層を構築

効果

大部分のデータベースをMySQLベースのSchemalessまたはCassandra等へ置き換え

背景

Uberは創業当初PostgreSQLを主要データベースとして採用していたが、事業拡大とともに複数の技術的課題に直面した。Postgresでは行を更新するたびにすべてのインデックスを更新する必要があり、「1つのインデックスにしかかかっていないフィールドの更新が12個すべてのインデックスに伝播する」といった書き込み増幅が発生した。またPostgresのレプリケーションプロトコルは冗長で、特にデータセンター間レプリケーションで大量のデータ転送を招いた。加えてPostgres 9.2のバグにより本来非アクティブとしてマークされるべきレコードがマークされず重複レコードが返される障害も発生し、ストリーミングレプリカでオープントランザクションがあると更新がブロックされてタイムアウトするリスク、さらに異なるメジャーバージョン間でのレプリケーションができずアップグレードに数時間の停止が必要になるという運用上の制約もあった。

移行のプロセス

エンジニアリングチームはMySQLの特性がUberの用途により適していると判断し、複数の点を評価した。

  • MySQLのInnoDBストレージエンジンではセカンダリインデックスがプライマリキー値へのポインタを保持し、行の更新はその場で行われるため、変更されたインデックスのみを更新すればよい
  • レプリケーションもロジカルな行の更新情報のみを含むためバイナリログがPostgresのWALストリームより大幅にコンパクトになる
  • InnoDB自身がLRUを実装しコンテキストスイッチが少ない
  • MySQLは接続ごとにスレッドを生成する方式のためPostgresのプロセス単位の接続方式より効率的だった

これらの特性を踏まえ、MySQLを基盤とした独自のデータストアレイヤー「Schemaless」を構築して移行を進めた。

結果

移行の結果、現在Uberのデータベースの大部分はMySQLベースのSchemalessレイヤー上に構築されるか、一部の特殊なケースではCassandraなどのNoSQLデータベースに置き換わっている。一部レガシーなPostgreSQLインスタンスも残存している。

学び

技術選択は企業の成長段階に応じて見直す必要があり、初期段階で最適だった選択が大規模運用では制約になり得るという教訓を示している。

2016-07-26
他の事例も見る