2013年1月26日土曜日

KVMでRAC+DataGuadの環境を作ってみよう Part3

まだまだ終わりません。あと、タイトルにRACというキーワード加えました。

(7)共有ディスクの設定

RACはシェアードディスクタイプのクラスタなので、 dg01とdg02で共有するディスクイメージをホストOS上で作成します。サイズは50GBとします。
# dd if=/dev/zero of=/vmdata/ss01.img \
  bs=`expr 1024 \* 1024` count=`expr 50 \* 1024`
仮想OSのローカルディスク用イメージとは異なり、QCOW2形式ではなくRAW形式を用います。よく考えれば当たり前ですが、複数の仮想ゲストで動的割当てファイルを共有することはできないようです(最初は気付かずにGrid Infrastructureのroot.shで失敗しまくりました)。

次に仮想ゲストの起動オプションに共有ディスク設定を追加します。
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg01root.img \
  -hdb /vmdata/dg01swap.img \
  -drive file=/vmdata/ss01.img,cache=none \
  -boot c -m 4096 -vnc :1 \
  -net nic,macaddr:=54:52:00:12:01:01,vlan=0 \
  -net tap,ifname=tap0,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:12:01:02,vlan=1 \
  -net tap,ifname=tap6,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:12:01:03,vlan=2 \
  -net tap,ifname=tap11,script=addif.sh,downscript=no,vlan=2
 今まではディスク指定に-hdXというオプションを使ってきましたが、cache=noneを指定するために-driveオプションを利用しています。この指定がないとやはりroot.shが失敗します。

以上の設定を行い仮想ゲストdg01を起動すると、共有ディスクが/dev/sdcとして認識されます。なので同様にss02.img、ss03.imgを作成し、dg03からdg06に追加してきます。

2度書きますが、共有ディスク用のイメージでは以下の2点が重要です。これを守らなくともOracle Universal Installerによる事前チェックは通ることがあるので要注意です。
  • 動的割当を利用しない
  • cache=noneオプションでキャッシュを無効にする 
 (8)Oracleインストール前のゲストOSの設定

インストール要件をクリアしていくために設定を入れていきますが、ここは簡単に。
  •  必要なRPMパッケージのインストールに関してはOracle Linux 6 Update3のDVDの中にある「oracle-rdbms-server-11gR2-preinstall-1.0-6.el6.x86_64.rpm」をyum経由でインストールすれば自動でインストールされるっぽい。マニュアルに比べるとbcコマンドやXクライアントも追加で入ります。ちなみに、oracleユーザも勝手に作ってくれるけどuid=54321になるのが気に入らないので、後で削除。
  • NTPで時刻合わせ。/etc/sysconfig/ntpdで-xオプションでslewモードにすることを忘れずに(インストーラがチェックしてくれますが)。
  • ユーザ作成とディレクトリ設定は以下を参考に。あとは、パスワード設定とSSH透過ログインの設定を。
groupadd -g 1000 oinstall
groupadd -g 1031 dba
groupadd -g 1020 asmadmin
groupadd -g 1021 asmdba
useradd -u 1100 -g oinstall -G asmadmin,asmdba grid
useradd -u 1101-g oinstall  -G dba,asmdba oracle
mkdir -p /u01/app/grid
mkdir -p /u01/app/11.2.0/grid
chown -R grid:oinstall /u01
mkdir -p /u01/app/oracle
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01
  • 共有ディスクのオーナー、パーミッション設定は【こちら】を参考に/etc/udev/rules.d/99-oracle-asmdevicesruleに以下の内容を記述。ちなみにこの設定方法はRHEL6系に固有らしく、後のインストーラによる要件チェックでは正しく設定してもWaringを喰らうようです。
KERNEL=="sdc"、SUBSYSTEM=="block"、ENV{DEVTYPE}=="disk", NAME+="oracleasm/disk1", OWNER="grid", GROUP="asmadmin", MODE="0660"
  •  ネットワークでは/etc/hostsとデフォルトゲートウェイの設定を。今回はSCAN用にDNSは利用しないのでSCAN用IPアドレスは1つのみ指定します。
  • /etc/sysctl.confと/etc/security/limits.confの設定は、今回はインストーラが作成する修正スクリプトに任せます(lmits.confの設定はログインし直さないと有効にならないので、本来は修正スクリプトに頼らず、事前設定が良いみたいですが)。
以上の設定を6台全部に行います。実際は、1台で設定した後に前回記述した方法で仮想ゲストをクローニングしています。

ASMLibやhanguptimer、MTUなど設定すべき項目はまだまだありますが、今回は無視します。

(9) Oracleのインストール・DBの作成

環境が正しく整えば、インストール&DB作成は楽勝ですね。dg01&dg02にRAC環境を作ります。
  • Grid Infrastructureの拡張インストール(クラスタ名:cluster01)
  • Databaseのソフトウェアのみのインストール
  • Examplesのインストール(自分の趣味です)
  • RACデータベースの作成(DB名:ora11ga、インスタンス名:ora11ga1/ora11ga2)

今回はここまでです。次回はフィジカルスタンバイデータベースを作成していきます。もうKVMの話は出てこないかもです。

2013年1月10日木曜日

KVMでDataGuard環境を作ってみよう Part2

冬休みは終わりましたが続きますorz

 (4) 仮想マシンイメージの作成とゲストOSのインストール

まずは仮想マシンイメージファイルを以下のコマンドで作成します。今回はハードディスク容量が400GB弱しかないのに6仮想ゲスト+3DBを作成する必要があるため、容量節約のため動的割り当てファイルを使います。また、Oracleインストールにはある程度のスワップ領域が必要ですが、実際は使わないため、スワップ単体でファイルを作成し、もしサイズが大きくなってしまっても再作成できるようにしておきたいと思います。

# qemu-img create -f qcow2 /vmdata/dg01root.img 15G
# qeme-img create -f qcow2 /vmdata/dg01swap.img 4GB

VirtualBoxがvmdk形式のファイルもいけたので、KVMもいけるかと思い試してみましたが駄目でした (そりゃそうか) 。

仮想ファイル作成後は、仮想ゲストを起動して、OSインストールイメージからOSをインストールします。起動コマンドは以下になるようです (一部実際に利用したのと違うのですが、後述します)。

# /usr/libexec/qemu-kvm -k ja \
                        -hda /vmdata/dg01root.img \
                        -hdb /vmdata/dg01swap.img \
                        -cdrom /root/V33411.iso -boot d \
                        -m 4096 -vnc :1

ここで重要なのが、「-k ja」というオプションです。単に日本語キーボードを使いますよということを指定しているだけなのですが、これがないとデフォルトは英語キーボードとみなされるようですが、コロンとセミコロンのキーを押してもセミコロンになりコロンが入力できない、Shift-^がEscになるなど困ったことになります。特にviで設定ファイルを編集しようとすると保存するときに詰みます。

(実は始めはこのオプションに気付かなかったために、設定ファイルの編集でedやcatを使うという面倒くさいことをやっていました。ちなみに「KVM vnc コロン」とかでGooglingするとsetxkbmapの話ばかりが上位に来ていますが、そもそもX-Window-System絡んでいないのにどう関係しているんでしょうね。)

 あと、「-vnc :1」 でコンソール画面をVNC経由で操作できるようになるのですが、このような表記をするとVNCサーバは127.0.0.1でリッスンするため、ローカルからの接続しか出来ません。今回はSSH転送を利用したので問題ないですが、リモートから繋ぎたい場合は「-vnc dg01:1」のようにホスト名 (リッスンするホスト名orIPアドレス)を明記する必要があるようです。

上述のコマンドを実行した後は、UltraVNC Viewerなどで接続すればOSインストール画面が表示され、OSインストールを行うことが出来ます。ちなみに最初はRealVNC Viewerで接続していたのですが、接続直後にコネクションが切断されるという事象が発生していました。そのためUlraVNCViewerを使っています。

(5) 仮想ゲストのクローニング

今回は仮想ゲストが6台必要ですが、OSインストールを6回繰り返すのは面倒なので、1つインストールしたところで仮想ゲストのイメージをコピーすることで手間を省きたいと思います。

ただ、RedHat系のLinuxではいくつかの設定ファイルでハードウェアの識別IDが直書きされるため、そのままコピーしても上手く起動しなかったり、認識したとおりのデバイス名にならないなどの問題があります。なので、それらの設定を消しこんでから、ホストOS上でcpコマンドでコピーします。
  • /etc/sysconfig/network-scripts/ifcfg-*  (MACアドレス指定)
  •  /etc/udev/rules.d/70-persistent-net.rules  (MACアドレス指定)
  • /etc/fstab  (パーティションUUID指定)
  • /boot/grub/grub.conf  (パーティションUUID指定)
 ここではまず、dg01~dg03のネットワーク通信の確認をしたいので、この3ゲストだけ先に作ってしまいます。(本当はOracleインストールに必要な設定&rpmインストールを終えてからコピーしたいのですが、ネットワーク確認を優先させます。)
# cp /vmdata/dg01root.img /vmdata/dg02root.img
# cp /vmdata/dg01root.img /vmdata/dg03root.img
# cp /vmdata/dg01swap.img /vmdata/dg02swap.img
# cp /vmdata/dg01swap.img /vmdata/dg03swap.img
(よくよく考えればcpするだけならパーティションのUUIDは変わらないはずなので、/etc/fstabと/boot/grub/grub.confの修正は必要なかったのかも知れません。)

(6) 複数の仮想ゲスト起動とネットワーク疎通確認

仮想ホストが3つ出来たところで、ネットワーク設定含め仮想ホストを起動します(前回作成したaddif.shと同じディレクトリで実行します)

  • dg01
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg01root.img \
  -hdb /vmdata/dg01swap.img \
  -boot c -m 4096 -vnc :1 \
  -net nic,macaddr:=54:52:00:12:01:01,vlan=0 \
  -net tap,ifname=tap0,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:
12:01:02,vlan=1 \
  -net tap,ifname=tap6,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:
12:01:03,vlan=2 \
  -net tap,ifname=tap11,script=addif.sh,downscript=no,vlan=2
  • dg02
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg02root.img \
  -hdb /vmdata/dg02swap.img \
  -boot c -m 4096 -vnc :2 \
  -net nic,macaddr:=54:52:00:
12:02:01,vlan=0 \
  -net tap,ifname=tap1,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:
12:02:02,vlan=1 \
  -net tap,ifname=tap7,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:
12:02:03,vlan=2 \
  -net tap,ifname=tap12,script=addif.sh,downscript=no,vlan=2

  • dg03
# /usr/libexec/qemu-kvm -k ja \
  -hda /vmdata/dg03root.img \
  -hdb /vmdata/dg03swap.img \
  -boot c -m 4096 -vnc :3 \
  -net nic,macaddr:=54:52:00:
12:03:01,vlan=0 \
  -net tap,ifname=tap2,script=addif.sh,downscript=no,vlan=0 \
  -net nic,macaddr:=54:52:00:
12:03:02,vlan=1 \
  -net tap,ifname=tap8,script=addif.sh,downscript=no,vlan=1 \
  -net nic,macaddr:=54:52:00:
12:03:03,vlan=2 \
  -net tap,ifname=tap13,script=addif.sh,downscript=no,vlan=2
-netオプションが1仮想ホストにつき6つ出てきますが、2つ1組で1つの仮想NICの設定に対応します。これで仮想OSを起動した後に、VNC経由でコンソールに接続し、IPアドレスやホスト名などのネットワーク設定を入れていきます。

仮想ホスト起動コマンドのオプションについていくつか補足を。

まず、netオプション内でMACアドレスを指定していますが、複数仮想ホストを扱う場合は必須の設定になります。Webの情報では最近のKVMはMACアドレスは重複しないように自動採番されると記載されていることが多いです。確かに、指定しなかった場合、1番目のNICは54:52:00:12:34:56なら2番目のNICは54:52:0:12:34:57と+1されて重複しません。しかし、重複回避は1仮想ホスト内での話であり、2番目の仮想ホストではしっかりと1番目の仮想ホストと同じMACアドレスを割当てようとします。つまり指定しないとdg01のeth0とdg2のeth0でMACアドレスが被ります。

ifnameで仮想NICに接続するTAPインターフェース名を指定します。実際にTAPインターフェースは仮想ホスト起動時に作成されますが、ネットワーク(ブリッジ) に接続する処理は前回作成したaddif.shが担います。そのスクリプトファイルはscript=...で指定します。仮想ホスト終了時にTAPインターフェースは自動削除されますが、その際に実行するスクリプトはdownscript=...で指定します。今回は何もしないのでnoを指定しています。

最後ですが、なぜかVLANの設定が必要です。パブリックネットワークにはVLAN ID=0を、インターコネクトネットワークにはVLAN ID=1を、データ変更転送用ネットワークにはVLAN ID=2を割当てています。これがないと、仮想OSを1つ起動させた状態では、VNC経由のコンソール画面がログインプロンプト表示後にグレーアウトするという不具合が、仮想OSを2つ以上起動させた状態では、qemu-kvmプロセスがCPUコアを100%使い果たしてしまうという問題に遭遇しています。前者の原因は分かりません。後者はスパニングツリー(L2レベルでのループ)によるブロードキャストストームが原因ですが、何処がループになっているのかは理解できていません。 (試しにvlan指定を取り払い、br0~br4に対してSTPを有効にすると問題なく動作します。本来はこっちが本筋な設定なのかも知れません。)

色々問題ありましたが、ここまでくれば、dg01~dg03はパブリックネットワークとデータ転送用ネットワークを通して互いに通信できますし、dg01とdg02はインターコネクトネットワーク経由で通信できますが、dg03は通信できないという想定通りの挙動が得られます。


今回はここまでです。次回はOracleインストール用に仮想OSの設定を行い、RACをインストールします。 

2013年1月6日日曜日

KVMでDataGuard環境を作ってみよう Part1

(0) 前置き

Oracle DatabaseにはReal Application Clusters(RAC)以外にも可用性を高める仕組みとしてData Guardと呼ばれる機能があります。ざっくり言うと、マスタDBへのデータ変更をスタンバイDBに適用するレプリケーションタイプの冗長構成になります。

仕事柄、RACを組むことは時々あります(最近は若い人に任せっきりですが)。しかし、今までData Guardは組んだことがないので冬休みを機に挑戦してみたいと思います。ただ、冗長構成ということで台数が必要ですが、そんなに物理マシンが手元にあるわけではないので、KVMを利用して仮想マシンを複数台用意して、 その上で構築したいと思います。

目指すのは以下のような環境です。

dg01~dg06が今回作成する仮想マシンです。dg01&dg02、dg03&dg04、dg05&dg06の組でそれぞれRACデータベースを作成し、それぞれプライマリDB、スタンバイDB(物理)、スタンバイDB(論理)とします。RACなのでDB接続を受けるパブリックネットワーク以外に、インターコネクトネットワークも必要になります(今回は異なるDB間のインターコネクト通信は出来ないものとしました)。加えて、適用すべきデータ変更の情報を転送するためのネットワークを別に用意します。

今回利用する物理ハードのスペックは以下になります(借り物です)。
  • CPU:Xeon 5430 2.66GHz(4コア)×2ソケット
  • メモリ:32GB
  • HDD:146GB×4 (RAID5)、実施 400GB
また、仮想化ソフトについては私は普段はVirtualBox使いなのですが、今回は今までに使ったことがないという理由でKVMを採用してみようと思います。OSはなぜかOracleLinux6.3を使います。あと、KVMでは最近libvirtと呼ばれるフロントエンドを利用することが前提のようですが、KVMのコマンドを直接叩いてみたいのでlibvirtは使いません(既に後悔していますが)。

以下、簡単に顛末を書いていきますが、厳密な手順書でない点、不明・不具合がある点、Data Guardとは関係ないメモも含まれる点、そもそも書き始めた時点でData Guardの構築が完了していないため致命的な間違いがあるかもしれない点はご了承ください。

(1) 物理ホストのOSインストール

物理ホストへのOSインストールは特に変わったことをせずに、Minimal構成でインストールします(昔は最小構成でインストールするとその後のrpmインストールが大変でしたが、最近はDVD自体がyumのリポジトリになっているので、最小構成インストールも怖くないですね)。

一点、パーティション構成だけは以下のようにしました。
  • /boot:200MB
  • /:15GB
  • スワップ:1GB
仮想OSのイメージなどを置くパーティションはOSインストール後に作成します。

 (2) 物理ホストOSインストール後の基本設定

OSインストール後にはいくつか追加の設定を入れていきます。
  • ネットワーク設定(最小構成ではインストール時にホスト名しか設定されない)
  • IPv6無効化
  • SELinux無効化
  • 不要なサービス停止
  • 必要なrpmインストール
  • パーティション作成
必要なrpmパッケージについては先に述べたとおりDVDがyumリポジトリになっているので、/etc/yum.repo.d/以下に、baseurl=file:/media/dvd、gpgcheck=0、enabled=1のエントリを作ってあげれば、普通にyum installで依存関係を自動解決するインストールが使えるようになります(/media/dvdはDVDのマウント先)。今回は以下のパッケージをインストールしました(依存するrpmパッケージは記載していないです)。
  • bridge-utils
  • qemu-kvm
  • qemu-kvm-tools
  • openssh-clients:SCPサーバとして動作させるため
  • telnet:ポート疎通確認用
  • bind-utils:dig/nslookupが使いたいため
  • mlocate:locateコマンドが使いたいため
  • sysstat:sarやiostatが使いたいため
あと、ディスク容量の空きを利用して390GB程度の仮想ホストイメージ用のパーティションを作成します。ただ、fdiskでパーティションを表示すると「パーティション?は、シリンダ境界で終わっていません。」というエラーが表示されます。パーティションの作成・マウントは正常に出来るみたいです。Webの情報を見るとfdiskのバグで実際は正常らしいですが、もう少し確認が必要でしょう。

また、ext4からはデフォルトでバリア機能が有効になっているので/etc/fstabでマウントオプションにnobarrierを忘れず書いておきます。以前にバリア機能の有効/無効でどれだけ差が出るか確認したことがありますが、MySQLのデータロードで1.5倍程度性能差が出るので、nobarrierは性能が求められるところでは必須だと認識しています(代わりに何を失うのかはよく理解する必要がありますが)。

  (3) 仮想ホスト用のネットワーク設定

少し本題に近づいていますが、仮想ホスト用にブリッジの設定を入れます。

今回は、パブリックネットワーク×1、インターコネクトネットワーク×3、データ変更転送用ネットワーク×1のため、合計5つのブリッジを作成します。また、パブリックネットワークは物理NICを通して外部と通信できるように設定します。具体的には/etc/sysconfig/network-scripts/に以下の設定を入れます。

  •  ifcfg-br0 (パブリックネットワーク用、IPADDRは物理ホストのIPアドレス、HWADDRは物理NICのMACアドレス)
DEVICE=br0
BOOTPROTO=static
HWADDR=00:23:7D:EE:80:1A
IPADDR=192.168.79.162
NETMASK=255.255255224
NM_CONTROL=yes
ONBOOT=yes 
TYPE=Bridge
  • ifcfg-br1~ifcfgbr3 (インターコネクト用)
DEVICE=brN (N=1..3)
BOOTPROTO=static
ONBOOT=yes 
TYPE=Bridge
  •  ifcfg-br4 (データ変更転送用)
DEVICE=br4
BOOTPROTO=static
ONBOOT=yes 
TYPE=Bridge
  •  ifcfg-eth0 (物理NIC)
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:23:7D:EE:80:1A
NM_CONTROL=yes
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0
ポイントとしては、ネットワークの数だけブリッジを作成し、外部NIC経由で通信できるブリッジに関しては、IPアドレス設定をそのブリッジに移して、物理NICではそのブリッジに接続するという設定を残してIPアドレス設定を消すことでしょうか。(なぜブリッジにIPアドレスを設定するとホストOSと通信できるようになるのかはよく理解していません。ブリッジはデフォルトでホストOSと接続されているのでしょうか?)

ブリッジを作成したところで、KVMゲストはこれらのブリッジとTAPインターフェースを通して接続されます(他にもuser/vde/socketと3つ手段があるようですがよく理解していません)。TAPインターフェース自体はKVMゲスト起動時に自動的に作成されますが、どのブリッジに接続するかは管理者側で設定する必要があります。設定方法の1つとして、TAPインターフェース名を渡すとブリッジに接続するコマンド(brctl addif)を実行するスクリプトを用意しておく方法があるようです。

今回はパブリックネットワークにtap0~tap5、プライベートネットワークにtap6~tap11、データ変更転送用ネットワークにtap12~tap17のそれぞれのTAPインターフェースを利用することとします。すると、上記のスクリプトは以下のようになります(実行ファイルとTAP-ブリッジの関連の情報ファイルを分離しています)。

  • addif.sh
#!/bin/sh

LIST_FILE=tap.list

ifname=$1
brname=`grep "${ifname}," ${LIST_FILE} | cut -d, -f2`
 
ifconfig ${ifname} up
brctl addif ${brname} ${ifname}
  •  tap.list
tap0,br0
tap1,br0
tap2,br0
tap3,br0
tap4,br0
tap5,br0
tap6,br1
tap7,br1
tap8,br2
tap9,br2
tap10,br3
tap11,br3
tap12,br4
tap13,br4
tap14,br4
tap15,br4
tap16,br4
tap17,br4
このスクリプトはKVMゲストを起動させるときに利用します。


今回はここまでです。次回はKVMゲストへのOSインストール、KVMホストの複製、ネットワークの疎通確認を記載します。