3TB超のCacooのPostgreSQL 9.3を9.5にアップグレードした話

こんにちは。Cacooチームのイニエスタこと、とおのぶです。CacooはデータベースのPostgreSQLのバージョンアップを実施しました。基本的には公式のpg_upgradeの手順に従っています。ここではドキュメントには記載の少ない具体的な作業内容の流れを紹介したいと思います。

理由

ユーザアンケートからみる Cacoo のコア・バリューで記されたとおり、全体的なパフォーマンスの向上については重要度の高い課題の一つです。PostgreSQL 9.5ではソート性能の大幅な改善が強化点の一つで、パフォーマンスの改善が見込まれます。またフェイルオーバ後、新しいマスターに追従するスタンバイとして、古いマスターサーバをオンラインに戻すことができるpg_rewindも、PostgreSQL 9.5の魅力の一つです。

バージョンアップ前の構成

構成は、マスタとスレーブのストリーミング・レプリケーションの構成です。pg_stat_replicationで、WALのプライマリの送出済みの位置とスタンバイ側でのディスクへの書き込み済みの位置を確認します。大きく位置が異なってないことを確認します。

select sent_location, flush_location from pg_stat_replication;
-[ RECORD 1 ]--+--------------
sent_location | 4444/AAAACCCC
flush_location | 4444/AAAACCCC

1. スレーブとカスケーディングスレーブを作成

最初に、上図のとおりにもう一つスレーブとカスケーディングスレーブを作成し、そのセットをアップグレードする方針としました。アップグレード作業に何らかの問題が発生した場合に備えるためです。こうすることで、万が一、失敗したとしても、アプリケーションの接続を既存の稼働環境に切り替えれることができるので、元の状態に戻すことが簡単にできます。

それぞれに、バージョン9.3とバージョン9.5をインストールしておく必要があり、この段階ではバージョン9.3で動作させ続けます。今回は9.3をソースからインストールし、9.5をパッケージからインストールしました。後述のpg_upgradeで、9.3と9.5両方のバイナリが必要になるためです。また、新しく作ったスレーブのみでinitdbで9.5用にデータベースクラスタを初期化します。カスケーディングスレーブでは初期化する必要ありません。

2. スレーブをマスターに昇格させる

マスターとスレーブの最終チェックポイントの位置が同じかpg_controldataで確認します。

/usr/local/pgsql-9.3/bin/pg_controldata /vol/pgsql-9.3/data | grep 'Latest checkpoint location'
Latest checkpoint location:           4444/AAAADDDD

一緒であれば、スレーブをマスターに昇格させるために、pg_ctl promoteを実施します。

3. 昇格したマスターをバージョン9.5にする

準備は整いました。新マスターと新スレーブが止まっていることを確認して、pg_upgradeを実施してバージョンアップします。成功すると、9.5で動作できます。次の作業に移る前に、新マスターでPostgreSQL 9.5で起動、停止する必要があります。

4. スレーブをバージョン9.5にする

スレーブのバージョンをあげるためには、データベースクラスタのディレクトリをrsyncでコピーします。Cacooでは複数のVolumeで構成されています。Volumeごとにrsyncする必要がありました。

// データベースクラスタのディレクトリ
time rsync -v --archive --delete --hard-links --size-only -R -e ssh pgsql-9.3/data pgsql-9.5/data slave:/vol/
// 各テーブルスペースごと
rsync -v --archive --delete --hard-links --size-only -e ssh table01 slave:/tblspc/

データ量に依存しますが、それぞれ数秒程度で終わりました。rsyncがすべて完了すると、スレーブが9.5で動作できます。

5. 統計情報を収集する

pg_upgradeではオプティマイザの統計情報を移行しないため、最後に、analyze_new_cluster.shを実施して統計情報を収集します。pg_upgradeを実行したディレクトリに生成されるanalyze_new_cluster.shを実行しましょう。これは内部的にはvacuumdbを実行し統計情報を生成します。pg_upgradeのマニュアルには記載ありませんが、pg_upgradeの処理では統計情報が生成されないので、既に稼働している実サービスでは絶対に行なうことをおすすめします。

最後に

バージョンアップの他にも、JDBC DriverのバージョンアップやProtocolバージョンの変更も行っています。このあたりは、反響があればまた書くつもりなので、よろしければ、はてなブックマークやTwitterなどで、感想をいただければと思います。よろしくお願いします。

 


現在、CacooではHTML5への移行も進んでいますが、バックエンド側の処理の一部も一新しようとしています。
一緒にCacooをよりよくするエンジニアも募集していますのでぜひご応募下さい。

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる