AzureでのOracleの導入方法、ライセンスとか

# AzureでOracleを使う

## そもそもなぜ Oracle か

**・MySQL や MariaDB で良いのではないのか**

Web・APサーバが Linux であったとしても、DBMS は OSS で行けるとは限らない。
MySQL や MariaDB ではサブクエリでインデックスが使われずに現実的に使えないことは比較的有名（[参考：MySQLではIN句とサブクエリの組み合わせはインデックスが効かない！？](http://tech.aainc.co.jp/archives/397)）で、デベロッパー側で賢いクエリになるように工夫が必要になる。

そういった工夫が難しい開発チームでは、DB側にパフォーマンスの努力をオフセットしなくてはならない。

この段階でNoSQLへと進む会社、開発チームもあるが、それはそれでプログラム構造の見直しが必要なため、既存システムがある場合にはなかなか難しい。その点、商用DBMSなら比較的スムーズに前に進みやすい。

**・SQL Server や SQL Database ではダメなのか**

まったく問題ない。Azure を使うならぜひ PaaS である SQL Database をオススメしたい。SQL Server というと Windows しか使えなさそうなので Linux や Ruby、PHPなどのデベロッパーには「ムリじゃない？」という感じを与えてしまっているが、今やそんなことはなくなった。
私も以前に Linux 上の PHP から Windows サーバ上の SQL Server に接続するのにとんでもなく苦労したが、Azure が出てきてからというもの、Linux からの接続方法や技術情報が Microsoft の公式ページで簡単に見つけられる。
が、Oracle 信奉はまだ根強いので、ここでは Oracle をテーマにして話を進めたい。

**・Oracle でクラウドは可能なのか**
もともとOracleは高いライセンスでビジネスをしているため、どうもクラウドとの親和性が高くはない（クラウド移行をヘタに進めると屋台骨が揺らいでしまうため）のだが、MicrosoftもAzureでSQLサーバをPaaS化したせいか、少しずつクラウドへの対応を進めている。

**・Azure で Oracle しよう**
そんな中で、Azure では公式に Oracle をサポートしており、Microsoft も Oracle 自身も、Oracle インストール済みの VM を Azure 上で提供している。BYOL で使うことももちろん可能となっている。

でもいくつか留意事項というか、知っておいた方が良いことがあるので、まずはそこから押さえておこう。

## ３種類の導入方法

AzureでOracleを使うには、Windows Server か Linux のVMの上で Oracle を使うことになるのだが、大きく分けて３つの導入方法がある。

**1. Windows Server か Linuxサーバ の VM に自分で Oracle インストールする**
・サーバにリモートでログインし、手持ちのメディアから Oracle をインストールする。インストールできるスキルを持った、Oracle に詳しい人以外にはあまりオススメしない。
・だが大きなメリットが１つある。それは BYOL でライセンスを持ち込めること。
・エンタープライズなユーザで、既に Oracle のライセンスを持っている場合にはこの方法がオススメで、ライセンス費用が最も安く上がる。

**2. Microsoft が用意している VM を`ギャラリー`から導入する**
・親切なことに、Microsoft が Oracle インストール済みのVMイメージをギャラリーで提供している。Linux版もある。
・ライセンス費用が VM 利用料に含まれており、価格は高いが安心して使える。
・Oracle のサポートも Azure サポートを通じて Microsoft が提供することになっている。
・Enterprise Editionでもオプションなどはセットアップされていないため、例えばData Guardを導入したい場合とか、ちょっと困る。メディアはあってセットアップはできたとしても、ライセンスをどうしたらよいのか悩む。
・EA で Azure を使っている場合、EA で支払った料金とは別に Oracle のライセンス料を支払わなくてはならないことに注意。

**3. Oracle が用意している VM を`マーケットプレイス`から導入する**
・Oracle 謹製の Oracle インストール済み VM がマーケットプレイスで提供されているので、それを使って VM を立ち上げる。
・ライセンス費用が VM 利用料に含まれており、価格は高いが安心して使える。
![スクリーンショット 2015-10-05 12c 1.png](https://qiita-image-store.s3.amazonaws.com/0/94690/b53cfa99-7cb9-e591-d114-383463a88b86.png)

・こちらは Oracle社がサポートを提供する。
・Enterprise Editionに、データ圧縮やData Guardなどのオプションをセットにした VM も用意されているので便利。
![スクリーンショット 2015-10-05 12c 0.png](https://qiita-image-store.s3.amazonaws.com/0/94690/31ccc1b7-29ce-9f12-37d5-3525d3dc5a5c.png)


・ここが要注意 → VM の`マーケットプレイス`は Azure の「新しいポータル」でのみ利用可能となっている。既存のポータルにはない機能なので、探し回ってしまわないように。

## ライセンス

Oracleのライセンスは高い。
それはクラウドになっても変わらない。
特に、たぶんリストプライス（定価）で価格設定されていると思われ、継続的に使うにはお財布が心配になる。AzureでVMの費用は安いが、Oracleのライセンスを入れると価格が10倍くらいに跳ね上がる。

Azure での Oracle のライセンス料が高額になっていることの解決方法としては、BYOL で手持ちのライセンスをポーティングすること。オンプレで Oracle をガリガリ使っていた会社などでは、余ってくるライセンスをクラウドに移行させよう。

BYOL できず、Oracle ライセンス込みの VM を使うしかない場合でも、コア数を少なめにしてメモリの多いインスタンスにすることで、パフォーマンスを稼げるかもしれず、その場合はトータルで見てTCOを下げられる可能性がある。

Dシリーズなどのディスクが早いインスタンスを使うことで、IOPSを稼いでコア数を減らすことができるかもしれない。Oracle はコア数単位で課金されるため、コア数を減らすとコストがぐっと下がる。

## 可用性を担保するには

要注意なのが、Azure の VM はメンテナンスなどのために勝手に再起動されることがあること。可用性セットを組んで2台以上のサーバにしておかないと、SLAの対象にもならない。

Webサーバなどの場合は複数のサーバを稼働させておけば、一部が再起動対象となってもサービス全体には何ら支障がないが、DBではそれが困った事態となる。DBの場合には、2台以上にするだけでは可用性を確保できず、クラスタ構成などを組んでおかないといけないということ。

さらに、Azure上では（というか多くのIaaSサービスでは）、共有ディスクが提供されていないなどの技術的な課題があって Oracle RAC が使えない。なので別の方法でクラスタというか、HA構成を組まなくてはならない。

その方法は２つある。
１つは Data Guard を使い、2重化すること。
もう１つは、Oracle が買収したテクノロジーの GoldenGate を使い、マルチマスタ構成を組むこと。

GoldenGate の場合には、VarcharやLOBで4KBを越えるデータを同期できないことに注意すれば、Azure Load Balancer で何とDBの負荷分散もできてしまうので、格好いい。但し、GoldenGate はライセンス費用が別途発生するので、価格が高くなる。Oracle謹製のVMでも、GoldenGate まで組み込まれたものは現時点で存在していない。
◆ 参考：[GolddenGateのに関するFAQ（Oracle）](http://www.oracle.com/technetwork/jp/middleware/goldengate/learnmore/gg-faq-1849133-ja.pdf)

まぁ、素直に組むなら Data Guard を使うということになるか。
これなら Oracle謹製のVMで、Enterprise Edition＋Advanced Optionsというやつにすれば、別途費用なしに利用できる。どっちみち、BYOLでなくデータ圧縮を使うなら Advanced Options を使うことになっているはずだし。
◆ 参考：[Oracle を Azure 上で運用する為の基本事項とベストプラクティス](http://www.slideshare.net/MicrosoftAzure_Japan/s13-oracle-database-microsoft-azure)

## パフォーマンスを稼ぐには

Oracle に限らず、DBMSでパフォーマンスを出すためには、IOを早くするか、データブロックやクエリキャッシュをメモリに保持することが重要になる。

この点、Azureは便利にできていて、SSDのドライブを複数マウントしてストライプしてやることで、IOPSを稼ぐことができる。最大 16,000 IOPS まで可能で、数年前ならそれだけで億単位の投資が必要だったものが、月額数万〜数十万円の範囲で利用できる。

なおディスクをストライプさせる方法としては Oracle の ASM と Windows Server のストレージプール機能とがあるが、それぞれ読み書き性能に特徴があり、読み取りが多い場合には ASM、書き込みが多い場合にはストレージプールを選択する方が良い。

そして、メモリも大量に利用できるのがクラウドの特徴で、Azure では最大 112 GB のメモリを搭載した VM が利用可能。

こういった特徴をもとに、作りたいシステムに合わせて最適なパフォーマンスチューニングをしよう。