EDB Postgres Advanced Server(以下、EDP Postgres)がOracle互換のデータベースとして浸透しつつありますが、Oracle特有の機能はやはり便利でEDB Postgresが適さないケースもあります。
ORACLE RAC(Oracle Real Application Clusters)がその代表例です。
EDB Postgresには「Streaming Replication」でデータをレプリケートし、「Failover Manager」で監視しながら、スレーブへと仮想IP(VIP)を切り替えることで可用性を実現する仕組みがありますが、これにOracle RAC並みの可用性と拡張性を担保させるのはなかなか困難です。
EDB Postgresの高可用性と拡張性を両立させてみる
副題はやや誇張です。RACの様にインスタンス間でデータ・ブロックのやり取りを行う「キャッシュ・フュージョン」の仕組みはやはりありませんので、更新処理はあくまで1サーバに紐づいたVIPに対してアクセスを行います。また、、各レプリケーション・サーバ自体は物理IPを保有しているので、物理IPを指定すればマスタ・サーバもスレーブ・サーバ自体は利用可能です。
したがって、更新処理はVIPを用いた1台に限定し、参照処理は複数のスレーブ・サーバにロードバランス(クライアント・ロードバランス)を行うことが理にかなっていますが、EDB社のODBCドライバには、クライアント・ロードバランスや複数サーバのフェイル・オーバ機能が実装されていないのです。
EDB Pgpoolを使うことも検討したいところですが、ここでは、よりシンプルに、EDB PostgresにOracle RAC並みの可用性と拡張性を持たせるため、サードパーティー製ドライバ Progress DataDirect for EDB Postgresを使い、クライアント側で参照のロードバランスを実施しながら可用性レベルを高めてみます。
DataDirectとのロードバランス設定
odbc.iniに設定するのみの簡単仕様です。
フェイルオーバの設定
AlternateServers=(HostName=SqlsServer:PortNumber=1433:Database=Sqlsdb1, HostName=255.201.11.24:PortNumber=1434:Database=Sqlsdb2)
ロードバランスの設定
LoadBalancing=1
これでAlternativeServersで指定したサーバへロードバランスを行えます。
詳細のパラメータについてはDataDirectのマニュアルをご覧ください。
DataDirectとEDB Postgres純正ドライバを比較してみる
EDBのODBCドライバには無い、クライアント・ロードバランス機能やフェイル・オーバ機能があるだけで、DataDirectは魅力的ですが、処理性能でもメリットがあります。
すべてのSQLで同じように処理性能が出るのかはわかりませんが、一度試してみるのも良いかと思います。
下のグラフは、EDB PostgreSQLをVirtualBox上のCentOSにデフォルト状態でインストールし、emp表の行数を徐々に増やして、全件検索していった結果です。
メモリ4GB、4コアのVirtualBox環境ですので、それほどスペックは良くありませんが、EDB ODBCドライバは2万行ぐらいから明らかにレスポンスが遅延してきます。(2万行の全件検索が適切かはさておき)
片やDataDirectは78万件ほどで、レスポンスが体感で遅延したように感じられますが、157万件でも5秒程度のレスポンスとなりました。これは、DataDirectの持つ「Wire Protocol」とネットワーク・ソケットの最適化機構によるものと思われます。
まとめ
Oracle RACとほぼ一緒とまでは行かないものの、これまで、Standard EditionでRACを組んでいた環境などは、もしかしたらEDB Failover ManagerとDataDirectで十分なケースもあるかもしれません。
特にBIツールからOracleを参照する際は、JDBCよりもODBCの方が一般的でしょうし、検索の結果セットが大きいというBIのアプリケーション特性から考えると、DataDirectはアドバンテージがありそうです。