ちょっと話題の記事

Direct Connect環境のLifeKeeperでサイボウズガルーンを冗長化してみた

2017.09.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まいど、大阪の市田です。

前回ご紹介したサイボウズガルーン(以下、ガルーンと表記)の「サーバ分離構成」では、DBサーバがSPOFになってしまいます。DBサーバを冗長化する方法はいくつかありそうですが、今回はLifeKeeperを使った冗長化についてご紹介します。

サイボウズ ガルーンをAWSに構築してみた

なお、前回の記事との相違点としては、ガルーンを利用する環境になります。

前回の記事では、クライアントはインターネット経由でガルーンを利用する構成でしたが、今回は「オンプレ環境からDirect Connect経由でガルーンを利用するセキュアな構成」を前提としました。
背景として、最近ビジネスアプリケーションがどんどんAWS上に乗ってくるのに伴い、 今後は専用線接続のケースがますます増えることが想定されるためです。

目次

長いエントリーですので目次を作成しました。なかなかボリュームのある内容ですね(汗)

構成

構成図

可用性を考慮に入れつつ、Direct Connect経由でガルーンを利用することを想定した構成です。

00-garoon-lifekeeper-diagram

構成の説明

それぞれについて簡単に説明します。

  • ガルーンへのアクセス
    • Direct Connect経由でのアクセスを想定の為、各インスタンにはプライベートIPのみ付与
    • Direct Connectからプライベート用のURLに対して、ELB経由でガルーンにアクセス
    • Internal ELBのDNS名に対して、Route53のALIASレコードでelb.garoon-internal.localを指定
    • Direct Connectからの名前解決は、Route53のプライベートホストゾーンと「Simple AD」を利用
  • Appサーバ
    • AutoScaling等、複数台存在することを想定
    • 今回は各アベイラビリティゾーンに1台ずつ手動で配置
    • 仮想IP(10.1.0.10)に対してガルーンのデータへアクセス
      • 仮想IPはActiveなDBサーバのENI(eth0)にrouteが向いています。
  • DBサーバ
    • サーバ上のガルーンデータをLifeKeeper/DataKeeperを用いてHA化
    • ガルーンデータ用の追加EBSを持ち、AppサーバからNFSマウント
    • 死活チェックの追加ENI(Elastic Network Interface)をeth1として追加
  • 各インスタンスでyumを実行するためNAT Gatewayを配置
  • 各インスタンスへは踏み台サーバ(Bastion)からアクセス

追加ENIの補足

LifeKeeperではプライマリ、バックアップの各インスタンスで互いの死活状況をチェックしていますが、この確認用のパス(コミュニケーションパス)を2つ持つことが推奨されています。

パスが1つだけでも利用することが可能ですが、LifeKeeper上では警告が表示されるので上記のような構成にしています。

LifeKeeper/DataKeeperとは

今回利用したLifeKeeper/DataKeeperについてですが、公式サイトでは下記のように説明されています。

LifeKeeperは、システムの障害を監視し、稼動系に障害が生じた場合に待機系に自動的に切り替えを行うことで、システムダウンタイムの時間を短縮 し、ビジネス損失を最小限にするHAクラスターソフトウェアです。

DataKeeperは、稼動中のサーバーのデータを待機系サーバーへリアルタイムにレプリケーション(複製)するソフトウェアです。データ圧縮機能や同期・非同期モードにより遠隔地へのレプリケーションにも適用可能です。

LifeKeeper/DataKeeper | サイオステクノロジー株式会社

つまり、Active/Standby構成となるシステムに対して、データ同期を含めてHAクラスターを組むことができるソフトウェアということになります。さらに、Elastic IPの自動付け替えや、VPCのRoute Tableの自動切替といったAWSへの対応も可能です。

ライセンスの入手

LifeKeeperを利用するにはライセンスが必要で、評価ライセンスを下記Webページから入手可能です。

評価版ダウンロード│LifeKeeper/DataKeeper|サイオステクノロジー株式会社

尚、ガルーンをLifeKeeperで保護する場合は、専用のスクリプト(ガルーン用 Generic ARKスクリプト)が必要なので、今回はサイオステクノロジー様から頂いた評価ライセンスを利用しています。

やってみた

では、早速環境の作成を行っていきたい思います。参考にしたドキュメント等については、本記事の最後でまとめてご紹介していますので、そちらも是非ご参照ください。

AWS環境の作成

VPCのサブネット構成は構成図の通りなので、割愛させて頂きます。

ルートテーブルの作成

今回は6つのルートテーブルを作成しています。NAT Gateway経由でインターネットに出る経路と、Direct Connectからの経路があるので少し多めです。

Internal ELB用のルートテーブル

  • Direct Connect側へのルーティングのみ追加しています。

10-elb-routetb-1

10-elb-routetb-2

NAT Gateway用のルートテーブル

  • インターネットゲートウェイをデフォルトゲートウェイとして指定します。

11-pub-routetb-1

11-pub-routetb-2

Appサーバ用のルートテーブル(ap-northeast-1a用)

  • 同じアベイラビリティゾーン(ap-northeast-1a)のNAT Gatewayをデフォルトゲートウェイにしています。
  • 仮想IPである「10.1.0.10/32」をアクティブなDBサーバのeth0に向けています。
  • フェイルオーバー発生時に、LifeKeeperによりバックアップ側のDBサーバ向けに更新されます。

12-app-routetb-1a-1

12-app-routetb-1a-2

Appサーバ用のルートテーブル(ap-northeast-1c用)

  • yumを利用するので、同じアベイラビリティゾーン(ap-northeast-1c)のNAT Gatewayをデフォルトゲートウェイにしています。
  • 仮想IPである「10.1.0.10/32」をアクティブなDBサーバのeth0に向けています。
  • フェイルオーバー発生時に、LifeKeeperによりバックアップ側のDBサーバ向けに更新されます。
  • Direct Connect側へのルート(198.10.0.0/24)は、作業中に直接Appサーバのウェブ表示を確認したかったので設定したものです。無くても構いません。

13-app-routetb-1c-1

13-app-routetb-1c-2

DBサーバ用のルートテーブル(ap-northeast-1a用)

  • yumを利用するので、同じアベイラビリティゾーン(ap-northeast-1a)のNAT Gatewayデフォルトゲートウェイにしています。

14-db-routetb-1a-1

14-db-routetb-1a-2

DBサーバ用のルートテーブル(ap-northeast-1c用)

  • yumを利用するので、同じアベイラビリティゾーン(ap-northeast-1c)のNAT Gatewayデフォルトゲートウェイにしています。

15-db-routetb-1c-1

15-db-routetb-1c-2

Security Groupの設定

Appサーバ用グループ

  • Appサーバに下記の内容で設定します。
ポート プロトコル ソース 備考
80 TCP ELBのSecurity Group ELBからのアクセス用途です
22 TCP 踏み台サーバのSecurity Group 踏み台サーバからのアクセス用途です

DBサーバ用グループ

  • DBサーバに下記の内容で設定します。
  • eth0、eth1両方のENIに適用します。
  • DBサーバへのアクセスについては、MySQLやNFS、LifeKeeperの死活監視等の通信があります。
    • 今回は簡単にする為に関連サブネットからのアクセスは全て許可しました。
  • 必要に応じてカスタマイズして下さい。
ポート プロトコル ソース 備考
All TCP 10.0.2.0/24
10.0.3.0/24
10.0.5.0/24
10.0.5.0/24
10.0.6.0/24
10.0.12.0/24
10.0.14.0/24
DB、NFS等アクセス用途です
22 TCP 踏み台サーバのSecurity Group 踏み台サーバからのアクセス用途です

ELB用グループ

ポート プロトコル ソース 備考
80 TCP 198.18.0.0/24 ウェブアクセス用途です

踏み台サーバ

  • アクセスする拠点IPを許可して下さい。
  • 今回はLinuxとWindows Serverの2種類の踏み台サーバを使ったので、SSHとRDPのポートを許可しました。

Simple AD用グループ

  • Simple AD作成時に作られるセキュリティグループを下記のように修正します。
ポート プロトコル ソース 備考
All All Simple AD同士 デフォルトで設定されている2台のSimple AD同士の相互通信は全許可
53 TCP 198.18.0.0/24 TCPおよびUDPの53ポートをオンプレミスからのみ許可
53 UDP 198.18.0.0/24 TCPおよびUDPの53ポートをオンプレミスからのみ許可

Route53のプライベートホストゾーンの作成

下記のように設定してみました。

16-route53-private

具体的な作成方法は下記をご参照下さい。

Route 53のPrivate DNS対応を試してみた

NAT Gatewayの作成

具体的な作成方法は下記をご参照下さい。

【新機能】ついに登場!Amazon VPC NAT GatewayでNATがAWSマネージドに

ELB(Application Load Balancer)の作成

今回はInternal ELBとして作成します。具体的な作成方法は下記をご参照下さい。

【新機能】新しいロードバランサー Application Load Balancer(ALB)が発表されました

Simple ADの作成

具体的な作成方法は下記をご参照下さい。

AWS Directory Service(Simple AD)を利用したオンプレミスからのPrivate Hosted Zone名前解決

踏み台サーバ(Windows Server)の構築

LifeKeeperの設定はGUIで行いますが、X Window Systemを使用しているため、クライアント側にもXサーバーが必要となります。

その為、GUI操作用にWindows Serverの踏み台サーバを用意します。今回は「Windows Server 2012R2」を利用し「NAT Gateway」と同じサブネットに作成します。

作成できたらRDPでログオンして、「Teraterm」とWindows用のXサーバとして「Xming」をインストールします。 (Teratermのインストールは割愛させて頂きます。)

Xmingのインストールと設定

Xmingのインストールもインストーラの指示通りに行っていくものですが、初めてでしたので紹介します。
まず、下記サイトからインストーラをダウンロードして実行します。

Xming X Server for Windows 日本語情報トップページ - OSDN

49-setup-xming

ひたすら「Next」をクリックします。

50-setup-xming

51-setup-xming

52-setup-xming

53-setup-xming

54-setup-xming

55-setup-xming

56-setup-xming

Xmingが起動するとタスクトレイにアイコンが表示されます。

57-setup-xming

これでXmingのインストールは完了です。もし出力が文字化けする場合は「「Xming-fonts」もインストールしてみて下さい。

次に、自動的にLifeKeeperのGUIにアクセスできるように「X11 Forwarding」の設定を行います。
Teratermを起動して「SSH転送」をクリックします。

58-teraterm-port-forwarding

「リモートの(X)アプリケーションをローカルのXサーバーに表示する」にチェックを入れます。

59-x-forward

設定を保存します。

60-save-config

DBサーバの構築(クラスターノードの設定)

ここからは各サーバの構築を行っていきます。踏み台を除くインスタンスは全て同じAMIを利用します。

特にクラスターノードを構成するDBサーバについては必ず同じAMIにして下さい。Appサーバは別のAMIでもいいかと思いますが、ガルーンのインストール等も統一したかったので全て同じAMIにしています。また、EBSのガルーン用のボリュームは検証の為、最小の8GBを指定しています。

下記の構成で、MarketplaceのRHELのAMIから作成して下さい。AMIは「ami-0dd8f963」を利用しました。タイミングによって異なるAMIで公開されているかもしれませんので、適宜選択して下さい。
セキュリティグループは前述の「DBサーバ用グループ」の内容のグループを適用して下さい。

ホスト インスタンスタイプ OS EBS ENI
db-01 t2.micro Red Hat Enterprise Linux(RHEL)7.2 ルートボリューム10GB
ガルーン用ボリューム8GB
eth0:10.0.3.4
eth1:10.0.12.4
db-02 t2.micro Red Hat Enterprise Linux(RHEL)7.2 ルートボリューム10GB
ガルーン用ボリューム8GB
eth0:10.0.6.4
eth1:10.0.14.4

今回は全てRHEL7.2のAMIからインスタンスを作成しています。

ENIについては、インスタンス作成時に下記のようにeth0を追加します。

30-db01-add-eni-ec2

EBSはガルーン用ボリュームを下記のように追加します。

31-db01-add-ebs

プライマリENI(eth0)のSource/Dest. Checkの無効化

DBインスタンスが作成できたら、各DBサーバの「eth0」のENIに対して「Source/Dest. Check」を「Disabled」に変更します。これはeth0に対して、仮想IP(10.1.0.10)宛の通信がある為です。

61-disabled-eth0-source-dest-check

次の画面で「Change Source/Dest. Check」をクリックします。

62-disabled-source-dest-check

「Disabled」にチェックを入れて保存します。

63-eni-source-dest-check-disabled

OS上でのNIC設定

DBサーバはENIが2つアタッチされていますが、2つ目のENI(eth1)がOS上で認識されていないので、手動で設定を追加します。

まず、eth1用の設定ファイルをifcfg-eth0からifcfg-eth1としてコピーします。

# cd /etc/sysconfig/network-scripts/
# sed 's/eth0/eth1/g' ifcfg-eth0>ifcfg-eth1

eth0をデフォルトルートに設定します。

# echo DEFROUTE=YES>>ifcfg-eth0
# echo DEFROUTE=NO>>ifcfg-eth1

設定を反映させます。

# systemctl restart network

ルーティングテーブルが下記のようになっていることを確認します。

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.3.1        0.0.0.0         UG    100    0        0 eth0
10.0.3.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
10.0.12.0       0.0.0.0         255.255.255.0   U     100    0        0 eth1
10.0.14.0       10.0.12.1       255.255.255.0   UG    100    0        0 eth1

次にプライマリのDBサーバ(db-01)でeth1用のゲートウェイ設定を追加設定します。下記の内容で/etc/sysconfig/network-scripts/route-eth1を作成して下さい。

10.0.14.0/24 via 10.0.12.1

設定を反映させます。

# systemctl restart network

同様にバックアップのDBサーバ(db-02)でもroute-eth1を作成します。

10.0.12.0/24 via 10.0.14.1

設定を反映させます。

# systemctl restart network

ルーティングテーブルが下記のようになっていることを確認します。

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.6.1        0.0.0.0         UG    100    0        0 eth0
10.0.6.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
10.0.12.0       10.0.14.1       255.255.255.0   UG    100    0        0 eth1
10.0.14.0       0.0.0.0         255.255.255.0   U     100    0        0 eth1

DBサーバ間で10.0.12.4、10.0.14.4に対してPingで疎通できることを確認します。
db-01からdb-02へ確認します。

# ping -c 4 10.0.14.4
PING 10.0.14.4 (10.0.14.4) 56(84) bytes of data.
64 bytes from 10.0.14.4: icmp_seq=1 ttl=64 time=3.87 ms
64 bytes from 10.0.14.4: icmp_seq=2 ttl=64 time=2.70 ms
64 bytes from 10.0.14.4: icmp_seq=3 ttl=64 time=2.63 ms
64 bytes from 10.0.14.4: icmp_seq=4 ttl=64 time=2.59 ms

--- 10.0.14.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 2.599/2.953/3.875/0.534 ms

db-02からdb-01へ確認します。

# ping -c 4 10.0.12.4
PING 10.0.12.4 (10.0.12.4) 56(84) bytes of data.
64 bytes from 10.0.12.4: icmp_seq=1 ttl=64 time=2.69 ms
64 bytes from 10.0.12.4: icmp_seq=2 ttl=64 time=2.82 ms
64 bytes from 10.0.12.4: icmp_seq=3 ttl=64 time=2.66 ms
64 bytes from 10.0.12.4: icmp_seq=4 ttl=64 time=2.62 ms

--- 10.0.12.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 2.621/2.699/2.821/0.075 ms

X11他の導入、OS設定

LifeKeeperのGUIアプリケーションを利用する為にX11をインストールします。

# yum -y groupinstall "x11"

"Server with GUI"でインストールしてしまうとカーネルバージョンが上がってしまうので、念のためカーネルバージョンが変わっていないことを確認しておきましょう。

# uname -r
3.10.0-327.el7.x86_64

完了したら下記を実行します。

# systemctl set-default graphical.target

次にredhat-lsbをインストールします。

# yum install redhat-lsb

クラスタ同士の名前解決の為に/etc/hostsを設定します。
プライマリ(db-01)側に下記2行を追記します。同じ内容でバックアップ(db-02)側にも追記して下さい。

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.3.4 ip-10-0-3-4.ap-northeast-1.compute.internal
10.0.6.4 ip-10-0-6-4.ap-northeast-1.compute.internal

次にドキュメントにある通りSELinuxを無効化します。

# sed -i -e 's/enforcing/disabled/g' /etc/selinux/config

設定を反映させる為、再起動します。

# reboot

再起動が完了したらSElinuxの状態を確認します。getenforceの結果がDisabledであることを確認します。

$ getenforce
Disabled

次にfirewalldが起動しているのでこれを停止します。

# systemctl status firewalld

自動起動設定も無効化します。

# systemctl disable firewalld

LifeKeeperのインストール時にrootパスワードが必要になるので、設定します。

# passwd

LifeKeeperとガルーンに必要なパッケージのインストール

ガルーンの動作に必要な各種パッケージをインストールします。プライマリ(db-01)、バックアップ(db-02)の両方で実施します。

yum -y install httpd libaio libjpeg-turbo libpng perl perl-Data-Dumper wget unzip

LifeKeeperのインストール

LifeKeeperのイメージファイルspsXXX.imgをDBサーバ上にscp等で保存します。保存できたらイメージファイルをマウントしてインストーラを起動します。イメージファイルの名前はspsXXX.imgになっていると思いますが、入手されたファイル名に合わせて下さい。

# mount spsXXX.img -t iso9660 -o loop /mnt
mount: /dev/loop0 is write-protected, mounting read-only

# cd /mnt
# ./setup

Enterキーでインストールを開始します。

40-install-lifekeeper-01

基本パッケージのインストールです。Enterキーを押してください。

40-install-lifekeeper-02

完了したらEnterキーで先に進みます。

40-install-lifekeeper-03

Javaパッケージのインストールです。Enterキーでインストールして下さい。

40-install-lifekeeper-04

完了したらEnterキーで先に進みます。

40-install-lifekeeper-05

DataKeeper用途のカーネルモジュールのインストールです。Enterキーでインストールして下さい。

40-install-lifekeeper-06

完了したらEnterキーで先に進みます。

40-install-lifekeeper-07

NFSユーティリティパッケージのインストールです。Enterキーでインストールして下さい。

40-install-lifekeeper-08

NFSサービスを再起動します。Enterキーで実行して下さい。

40-install-lifekeeper-09

Enterキーで先に進みます。

40-install-lifekeeper-10

必須パッケージのインストール。Enterキーでインストールして下さい。

40-install-lifekeeper-11

完了したらEnterキーで先に進みます。

40-install-lifekeeper-12

SPS coreパッケージのインストールです。Enterキーでインストールして下さい。

40-install-lifekeeper-13

完了したらEnterキーで先に進みます。

40-install-lifekeeper-14

グループとログインユーザの設定。Enterキーで実行して下さい。

40-install-lifekeeper-15

完了したらEnterキーで先に進みます。

40-install-lifekeeper-16

ライセンスキーインストールの確認です。ここではインストールしないのでEnterキーを押してください。

40-install-lifekeeper-17

オプションの Recovery Kit パッケージのインストールです。スペースキーでlkDRを選択します。選択完了したらEnterキーを押してください。

40-install-lifekeeper-18

インストールするパッケージの確認画面が表示されます。Enterキーを押してください。

40-install-lifekeeper-19

パッケージのインストールが成功すると以下のメッセージが表示されます。Enterキーで先に進みます。

40-install-lifekeeper-20

これでsetupスクリプトによるインストールが完了しました。Enter キーを押して完了させてください。

40-install-lifekeeper-21

次に「EC2専用ARK(Application Recovery Kit)」のインストールを行います。
EC2 関連のRecovery KitのRPMパッケージは、先程のイメージファイルに含まれていて、マウントしたディレクトリ直下の「amazon」ディレクトリ内にあります。

RPMファイル名のバージョン番号は適宜読み替えて下さい。

# cd /mnt/amazon/
# rpm -Uvh steeleye-lkECC-9.1.X-XXXX.noarch.rpm

EC2 ARKのインストールが完了したら、「ライセンスキー」をインストールします。

# /opt/LifeKeeper/bin/lkkeyins <ライセンスファイルのPATH>

ここまで出来たらブロードキャストpingを無効化します。(VPCはブロードキャストは利用不可の為)

# sed -i -e 's/NOBCASTPING=0/NOBCASTPING=1/g' /etc/default/LifeKeeper

インストール作業が完了したら、イメージファイルをアンマウントしておきましょう。

# cd
# umount /mnt

同じ作業がプライマリ(db-01)、バックアップ(db-02)の両方で完了すればLifeKeeperのインストールは完了です。

LifeKeeperの設定(起動とログイン)

LifeKeeperのインストールが完了したので、これからLifeKeeperの設定を行っていきます。

まず、Windows Serverの踏み台サーバにRDPでログオンして、Teratermを起動します。Teratermで各DBサーバにSSHログインします。
最初にec2-userユーザでログインしてからrootにスイッチして下さい。

DBサーバにログインできたら下記のコマンドでLifeKeeperを起動します。(両方のDBサーバで実行します)

# /opt/LifeKeeper/bin/lkstart

次にプライマリ側のDBサーバでLifeKeeper GUIを起動します。

# /opt/LifeKeeper/bin/lkGUIup

起動する時は、ログインしたユーザーの環境変数と認証情報、GUI画面を起動したユーザーの環境変数と認証情報を一致させておく必要があります。次のコマンドの結果が一致していることを確認して下さい。

$ echo $DISPLAY
# echo $DISPLAY
$ xauth list
# xauth list

一致していない場合、以下のコマンドでログインユーザー側の情報と一致させてください。

# export DISPLAY=[ログインユーザーの$DISPLAYの出力結果]
# xauth add [ログインユーザーのxauth listの出力結果]

永続的に環境変数を設定する場合は、ユーザーの環境変数(.bash_profile等)に適宜設定して下さい。

正常にGUIが起動できたら、rootアカウントのアカウント情報を入力して「OK」をクリックします。

70-lkconnect-01

ログインできたら下記の様な表示になっていることを確認します。

71-lk-login-ok

クラスターアイコンをクリックしてBackup ノードにログインします。

72-connect-backup

Server Name にバックアップ側DBの「Private DNS」である「ip-10-0-6-4.ap-northeast-1.compute.internal」、[login]に「root」、Password にrootのパスワードを入力して[OK]をクリックします。

73-connect-backup

プライマリ、バックアップ両方のDBにログインできると下記のような表示になります。

74-ok-connect-backup

LifeKeeperの設定(Communication Pathの作成)

次に「Communication Path 」を作成していきます。コミュニケーションパスとは、一般的にハートビートと呼ばれるクラスター間の監視用の通信経路のことです。

それでは「Create Comm Path」のアイコンをクリックしてウィザードを起動します。

75-create-compath

「Local Server」「ip-10-0-3-4.ap-northeast-1.compute.internal」を選択して「Next」をクリックします。

76-localserver

「Remote Server(s)」「ip-10-0-6-4.ap-northeast-1.compute.internal」を選択して、「Next」をクリックします。

77-remoteserver

「Device Type」「TCP」を選択します。

78-devicetype

「Local IP Address(es)」はプライマリDBサーバの「10.0.3.4」を選択します。

79-localip

「Remote IP Address」はバックアップDBサーバの「10.0.6.4」を選択します。

80-remoteip

「Priority」「1」を選択して下さい。

81-priority

「Next」をクリックして進めます。

82-create-compath-first

「Done」で完了させます。

83-done

ここまでの状態ではコミュニケーションパスがプライマリの1つだけなので、サーバのアイコンに警告マークが表示されています。セカンダリとして2つ目のコミュニケーションパスを設定することで正常な表示に変わります。

84-yellow

先程と同様に「Create Comm Path」のアイコンをクリックしてウィザードを起動します。

「Local Server」「Remote Server」「Device Type 」は先程と同じものを選択します。

「Local IP Address」eth1の「10.0.12.4」を選択して「Next」をクリックします。

85-second-localip

「Remote IP Address」ではバックアップDBサーバのeth1のIP「10.0.14.4」を選択して下さい。

86-second-remoteip

「Priority」は今回は「10」を指定して下さい。「Create」をクリックして完了です。

87-second-priority

これで両方のサーバのアイコンが「緑」になりました。

88-green

LifeKeeperの設定(IPリソースの作成)

次に「IPリソース」の作成を行います。

VPCはブロードキャストが利用できないので、ブロードキャストPingを無効にします。/etc/default/LifeKeeperのパラメー タNOBCASTPINGの値を0から1に変更します。(両方のサーバで変更して下さい。)

# sed -i -e 's/NOBCASTPING=0/NOBCASTPING=1/g' /etc/default/LifeKeeper

引き続きプライマリ側のLifeKeeperで設定を行います。「Create Resource Hierarchy」のアイコンをクリックします。

89-make-ipresource

「Recovery Kit」「IP」を選択して下さい。

90-select-recovery-kit

「Switchback Type」「intelligent」を選択します。

「Switchback Type」とは、フェイルオーバー発生後、元のサーバが復旧した場合に切り戻す方法の指定です。「intelligent」は手動、「automatic」は自動です。今回はデフォルトの「intelligent」を選択しています。

91-switchbacktype

「Server」は、プライマリDB(ip-10-0-3-4.ap-northeast-1.compute.internal)を選択します。

92-server

「IP Resource」仮想IP「10.1.0.10」を入力して下さい。

93-ipresource

「Netmask」「255.255.255.0」を指定します。

94-netmask

「Network Interface」は仮想IPが関連付く「eth0」を指定して下さい。

95-eth

「IP Resource Tag」は自動的に入力されたもので構いません。

96-ipresourcetag

「Successful」と表示されれば「Next」をクリックします。

97-create

このまま作業が続きます。次は「Pre-Extend Wizard」という画面になっています。

最初から「Target Server」バックアップ側のDBサーバ(ip-10-0-6-4.ap-northeast-1.compute.internal)が指定されているので、そのまま「Next」をクリックして下さい。
選択されていなければ正しいものを指定します。

98-preextend

「Switchback Type」「intelligent」を選択します。

99-switchback

「Template Priority」「1」を指定して下さい。

100-template-priority

「Target Priority」「10」を指定して下さい。

101-target-priority

「Pre Extend checks were successful」と表示されれば「Next」をクリックして次に進みます。

102-preextend-success

次は「Extend comm/ip Resource Hierarchy」ウィンドウに変わります。引き続き作業を行います。

「IP Resouce」は仮想IP「10.1.0.10」を指定して下さい。

103-extendcomm

「Netmask」「255.255.255.0」を指定します。

104-netmask

「Network Interface」「eth0」を指定して下さい。

105-eth

「IP Resource Tag」は自動的に入力されたもので構いません。

106-ipresource

「Hierarchy successful extended」と表示されれば「Finish」をクリックします。

107-finish

「Done」をクリックして完了です。

108-done

ここまでの作業でLifeKeeperの画面は以下のようになっています。

109-lifekeeper

EC2 API Toolsのインストールと設定

次に、LifeKeeperからAWSのリソースを操作する為に「EC2 API Tools」を各DBサーバにインストールします。今後のアップデートでIAM Roleへの対応が期待されますね。

尚、LifeKeeperはroot権限で動作するので、rootになり作業を行います。

まずは「EC2 API Tools」をダウンロードします。

# wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip

解凍します。

# unzip ec2-api-tools.zip

展開したファイル群を/opt/awsにリネームしてください。

# mv ec2-api-tools-1.7.5.1/ /opt/aws/

Java1.8.0をインストールします。

# yum install java-1.8.0-openjdk

次にAPI Toolsに設定する「AWSアクセスキー」と「AWS秘密鍵」を取得する為に「IAM User」を作成します。IAMのマネジメントコンソールで作成します。

200-add-iam-user

ユーザ名は「lifekeeper」として、「Access type」は「Programmatic access」にチェックを入れます。

201-user-datail

「Attach existing policies directly」をクリックして既存のポリシーをアタッチします。

202-attach-policy

今回は「AmazonEC2FullAccess」を付与しました。

203-ec2full

問題なければ「Create user」をクリックします。

204-create-user

次の画面で必ずCSVのcredentialファイルをダウンロードしてください。このファイルの中に「AWSアクセスキー」と「AWS秘密鍵」が記載されています。

205-download-csv

最後に、下記の内容をrootユーザの~/.bash_profileに追記します。AWS_ACCESS_KEYAWS_SECRET_KEYは先程ダウンロードしたcredentialファイル内のものを記載して下さい。JAVA_HOMEは実際にインストールされたバージョンに合わせてください。

# AWS EC2 API Tools
export AWS_ACCESS_KEY="XXXXXXXXXXXXXXXXXXXX"
export AWS_SECRET_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.XXX-X.bXX.el7_X.x86_64/jre
export EC2_AMITOOL_HOME=/opt/aws
export EC2_HOME=/opt/aws
export EC2_URL="https://ec2.ap-northeast-1.amazonaws.com"
export EC2_REGION="ap-northeast-1"

追記できたら設定を読み込みます。

# source ~/.bash_profile

適当なコマンドを実行して動作確認しておきましょう。

# /opt/aws/bin/ec2-describe-regions

REGION  ap-south-1  ec2.ap-south-1.amazonaws.com
REGION  eu-west-2   ec2.eu-west-2.amazonaws.com
REGION  eu-west-1   ec2.eu-west-1.amazonaws.com
(以下略)

この作業をプライマリ(db-01)とバックアップ(db-02)の両方のDBサーバで実施して下さい。これでEC2 API Toolsのインストールは完了です。

LifeKeeperの設定(EC2リソースの作成)

再びLifeKeeperの設定に戻ります。

これまでと同じように「Create Resource Hierarchy」のアイコンをクリックしてリソース作成を開始します。

300-create-ec2-resource

「Recovery Kit」は「Amazon EC2」を選択して下さい。

301-select-recovery-kit

「Switchback Type」「intelligent」を選択します。

302-switchback

「Server」プライマリのDBサーバ(ip-10-0-3-4.ap-northeast-1.compute.internal)を指定します。

303-server

「EC2 Home」「/opt/aws」を指定して下さい。

304-ec2home

「EC2 URL」「ec2.ap-northeast-1.amazonaws.com」を指定して下さい。

305-ec2url

「AWS Access key」は先程作成したIAM Userのものを入力します。

306-access-key

「AWS Secret key」も同様に入力します。

307-secretkey

「EC2 Resource type」では「Route Table (Backend cluster)」を選択して下さい。これによりフェイルオーバー時に仮想IPへのRoute Tableの情報が変更することが可能になります。

308-ec2-resource-type

「IP resource」は自動入力されたもので構いません。

309-ipresource

「EC2 Resource Tag」も自動入力されたものでOKです。

310-ec2-resource-tag

「End of successful Create of...」と表示されれば「Next」をクリックして先に進みましょう。もう少しです。

311-success

次は「Pre-Extend」のウィザードです。「Target Server」バックアップ側のDB(ip-10-0-6-4.ap-northeast-1.compute.internal)を指定して下さい。

312-target-server

「Switchback Type」「intelligent」を選択します。

313-switchback

「Template Priority」「1」を指定して下さい。

314-template-priority

「Target Priority」「10」を指定して下さい。

315-target-priority

「Pre Extend checks were successful」と表示されれば「Next」をクリックして下さい。

316-pre-extend-wizard

LifeKeeperの設定の最後として「Extend comm/ec2 Resource Hierarchy」ウィンドウに進みます。
「EC2 Resouce Tag」は自動入力されている「ec2-10.1.0.10」を指定して下さい。

317-extend-ec2-resource-tag

「Hierarchy successful extended」と表示されれば「Finish」をクリックします。

318-finish

最後に「Done」をクリックして完了させます。

319-done

追加EBSのパーティション設定

ここでは、インスタンス作成時に追加したガルーン用のEBSボリュームに対して、パーティション設定を行います。両方のDBサーバで実行して下さい。

ルートボリュームはxvda2で、追加したEBSはxvdbとして認識されています。

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  10G  0 part /
xvdb    202:16   0   8G  0 disk

xvdbはまだマウントされていませんが、LifeKeeperによってマウントされます。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda2       10G  1.5G  8.6G  15% /
devtmpfs        479M     0  479M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   13M  483M   3% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

ちなみに、LifeKeeperでマウントされている状態では下記のようになります。

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
nbd0     43:0    0   8G  0 disk
nbd2     43:2    0   8G  0 disk
nbd3     43:3    0   8G  0 disk
nbd4     43:4    0   8G  0 disk
nbd5     43:5    0   8G  0 disk
nbd6     43:6    0   8G  0 disk
nbd7     43:7    0   8G  0 disk
xvda    202:0    0  10G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  10G  0 part  /
xvdb    202:16   0   8G  0 disk
└─xvdb1 202:17   0   8G  0 part
  └─md0   9:0    0   8G  0 raid1 /mnt/DIR1
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda2       10G  2.7G  7.4G  27% /
devtmpfs        479M     0  479M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   51M  446M  11% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/md0        8.0G  894M  7.2G  11% /mnt/DIR1
tmpfs           100M     0  100M   0% /run/user/1000

それではfdiskでパーティション設定を行います。

# fdisk /dev/xvdb

Command (m for help): n
「n」を入力します。

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
「p」を入力します。

Partition number (1-4, default 1): 1
「1」を入力します。

First sector (2048-16777215, default 2048):
そのままEnterキーで進めます。

Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215):
そのままEnterキーで進めます。

Command (m for help): w
「w」で書き込みます。

確認します。

# fdisk -l /dev/xvdb

Disk /dev/xvdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xe577bade

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdb1            2048    16777215     8387584   83  Linux

今回は、ガルーンのデータ保存及びインストールを/mnt/DIR1に行うので、/mnt/DIR1を作成します。

この後、DataKeeperでデータのレプリケーションを行いますが、今回はプライマリ(db-01)、バックアップ(db-02)両サーバの/dev/xvdb1をレプリケーションの対象として、DataKeeperから/mnt/DIR1にマウントさせる形となります。

フェイルオーバーが発生した時は、バックアップ(db-02)のDBサーバ上で、DataKeeperによって/dev/xvdb1/mnt/DIR1にマウントされます。

# mkdir /mnt/DIR1

XFSでフォーマットします。

# mkfs -t xfs /dev/xvdb1

両方のDBサーバで実行できたら完了です。

DataKeeperの設定

ここからはデータレプリケーションを行う為に、DataKeeperの設定を行っていきます。

改めてここで整理すると、以下のようになります。

  • クラスターインスタンス(各DBサーバ)は、/dev/xvdb1を追加EBSとして保持
  • DataKeeperが、アクティブなインスタンス上で/dev/xvdb1/mnt/DIR1にマウント
  • /mnt/DIR1上にガルーンをインストール(データ保存先も/mnt/DIR1)
  • Appサーバは、DBサーバの/mnt/DIR1をNFSマウント
  • DBサーバのフェイルオーバー発生時
    • プライマリ側の/mnt/DIR1のマウントが外れる
    • セカンダリ側の/mnt/DIR1/dev/xvdb1にマウントされる。(それまではマウントされていない)

それでは設定してみます。

これまでと同じように「Create Resource Hierarchy」のアイコンをクリックしてリソース作成を開始して下さい。

400-datakeeper-01

「Ricovery Kit」「Data Replicatoin」を選択して下さい。

401-select-rk

「Switchback Type」「intelligent」を選択します。

402-switchback

「Server」プライマリのDBサーバ(ip-10-0-3-4.ap-northeast-1.compute.internal)を指定します。

403-server

「Hierarchy Type」「Replication New Filesystem」を選択して下さい。

404-create-data-replication-hierarchy

「Source Disk」「/dev/xvdb1 (8.0GB)」を選択して下さい。

405-mountpoint

そのまま「Continue」で先に進みます。

406-attention

「New Mount Point」「/mnt/DIR1」を選択します。

407-new-mountpoint

「New Filesystem Type」「xfs」を選択します。先程フォーマットした種類に合わせてください。

408-new-fs

「Data Replication Resouce Tag」は自動入力されている「datarep-DIR1」を指定して下さい。

409-resource-tag

「File System Resouce Tag」も自動入力されている「/mnt/DIR1」で構いません。

410-fs-resource-tag

「Bitmap File」も、自動入力されたもの(/opt/LifeKeeper/bitmap__mnt_DIR1)でOKです。

411-bitmap

「Enable Asynchronous Replication?」は他のLifeKeeperのドキュメントに合わせて「yes」にしました。適宜選択して下さい。

412-asyncronous

「Create」を押して作成します。

413-create-rep-hierarchy

作成できたら「Next」をクリックして、「Pre-Extend」のウィザードに進みます。

414-next

「Target Server」バックアップ側のDB(ip-10-0-6-4.ap-northeast-1.compute.internal)を指定して下さい。

415-target

「Switchback Type」「intelligent」を選択します。

416-switch-back

「Template Priority」「1」を指定して下さい。

417-template-pri

「Target Priority」「10」を指定して下さい。

418-target-pri

作成できたら「Next」をクリックして、「Extend Data Replication Resource Hierarchy」のウィザードに進みます。

419-next

「Target Disk」「/dev/xvdb1 (8.0GB)」を選択します。

420-ext-target-disk

[Data Replication Resource Tag]は自動入力されている「datarep-DIR1」のままで構いません。

421-ext-data-resource-tag

「Bitmap File」も、自動入力されたもの(/opt/LifeKeeper/bitmap__mnt_DIR1)でOKです。

422-ext-bitmap

「Replication Path」「10.0.12.4/10.0.14.4」を指定して下さい。

423-replication-path

「Replication Type」「asynchronous」を選択しました。適宜選択して下さい。

424-replication-type

「Mount point」「/mnt/DIR1」を選択します。

425-mount-point

「Root Tag」は自動入力されたもの(/mnt/DIR1)で構いません。

426-root-tag

作成が成功すれば「Finish」をクリックしてください。

427-finish

[Done]をクリックして完了させます。

428-done

ここまでの作業で、LifeKeeperの表示が下記のようになっていることを確認してください。

429-result

プライマリDBサーバにガルーンをインストール

LifeKeeperの設定が完了したので、ここでようやくガルーンをインストールします。ガルーンのドキュメントに従い作業は全てrootで行います。

サイボウズ ガルーン バージョン 4.2 インストールガイド

この作業はプライマリ(db-01)で実施します。
バックアップ(db-02)側の作業は別途行いますので、ここではプライマリ側だけの作業であることに注意して下さい。

また、ガルーンは下記の試用版を利用します。ここから「サイボウズ ガルーン 4.2」のLinux(64bit)版をダウンロードします。

試用する(パッケージ版) | サイボウズ ガルーン

今回はサーバから直接インストーラをダウンロードして実行します。インストーラのURLはタイミングによって変わる可能性があるので、上記サイトで確認してから実行して下さい。

# wget http://download.cybozu.co.jp/cbgrn/grn-4.2.0-linux-x64.bin
# sh /tmp/grn-4.2.0-linux-x64.bin

インストーラを実行すると最初に試用許諾契約が表示されます。

501-db-garoon-intall

スペースキーやEnterキーで一番下までスクロールして全体に目を通します。内容に同意する場合は「yes」を入力します。

502-db-garoon-intall-license-agree

インストール識別子を入力します。そのままEnterキーを押してデフォルトの「cbgrn」にします。

503-db-garoon-intall-installation-identifier

使用するMySQLを選択します。「1」はガルーンにバンドルされたMySQLです。こちらが推奨とのことなので「1」を選択して、Enter キーを押します。

504-db-garoon-intall-mysql

ガルーンのプログラムとデータのインストールディレクトリの指定です。DBサーバ上では/mnt/DIR1を指定します。

505-db-garoon-install-prgfile

次に各パスワードの設定です。設定するパスワードは下記の3種類です。
このパスワードはプライマリとバックアップの両方のサーバで同じものを設定して下さい。

  • MySQLの管理ユーザのパスワード
  • MySQLの接続ユーザのパスワード
  • ガルーンの管理者(Administrator)のパスワード

上の2つは「a-z, A-Z, 0-9, _」が使用できます。長さは全て「6文字以上、10文字以内」です。

506-db-garoon-intall-password

次に、WebサーバーのCGIディレクトリを指定します。
今、ガルーンをインストールしている対象はDBサーバなのでウェブサーバは使いませんが、最終的にWebサーバからNFSマウントして利用します。ここでは/mnt/DIR1/www/cgi-binを指定します。

507-db-garoon-install-cgi

Webサーバーのドキュメントルートの指定は、これまでの設定を元に予めセットされるようなので、そのままEnterキーで進めて構いません。

508-db-garoon-install-docroot

最後に、Webサーバーの実行ユーザー名の指定です。
起動しているプロセスから自動的に判断されたプロセス名がデフォルトになるようです。httpdが起動していなければnobodyと表示されます。今回はインストール時にApacheが起動していたので、そのままapacheとしました。

(DBサーバの場合は、Apacheは不要なので、この後httpdプロセスの停止と自動起動の無効化をしておきましょう)

509-01-db-garoon-install-apache-user

最後にこれまで設定した内容が表示されます。問題なければ「yes」を入力します。

509-02-db-garoon-install-sammary

インストールが完了すると、完了の表示やガルーンのログインURL等が表示されます。
このログインURLはインストーラで一意に表示されているようなので、適宜読み替えて下さい。

509-03-db-garoon-install-complete

ガルーンのインストールが完了したら、MySQLとガルーンのスケジューリングサービスを停止します。

# /etc/init.d/cyss_cbgrn stop
# /etc/init.d/cyde_5_0 stop

また、インストール時に自動起動の設定が有効化されるので、これも無効にしておきます。
ガルーンの関連プロセスの制御はLifeKeeperが行ってくれるので問題ありません。

# chkconfig cyde_5_0 off
# chkconfig cyss_cbgrn off

次にAppサーバからNFSマウントできるようにNFSサーバをセットアップします。

まず下記の内容で/etc/exportsを作成します。

/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata 10.0.2.0/24(rw) 10.0.5.0/24(rw)
/mnt/DIR1/cybozu/mysql-5.0/files 10.0.2.0/24(rw) 10.0.5.0/24(rw)

次にNFSサーバをセットアップします。

# yum -y install nfs-utils
# systemctl enable nfs-server
# systemctl start nfs-server

確認します。

# exportfs -v

/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata
        10.0.2.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata
        10.0.5.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/mnt/DIR1/cybozu/mysql-5.0/files
        10.0.2.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/mnt/DIR1/cybozu/mysql-5.0/files
        10.0.5.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)

バックアップDBサーバにガルーンをインストール

次にバックアップ側のDBサーバにガルーンをインストールします。

その為にまずは、LifeKeeper上でバックアップ側がアクティブになるように、手動でフェイルオーバーを実行してリソースを切り替えます。

下記の様にバックアップ側のリソース上で右クリックして「In Service」を選択して下さい。「/mnt/DIR1」と「ip-10.1.0.10」の両方を「In Service」にします。

ちなみに、左側のメニューの「Herarchies」の上位階層のリソースを切り替えると下位のリソースも自動的に切り替わります。今回の場合だと最上位階層に「/mnt/DIR1」と「ip-10.1.0.10」の2つが存在するので、どちらにも切替作業が必要でした。
最上位階層に1つだけしかリソースが無い場合は、そのリソースを切り替えることで全て変更する事ができます。(後で階層構造を整理します。)

430-change-backup

切替が完了したら下記のように、Active/Standbyが全て入れ替わります。

452-change-backup-03

それではバックアップ側(db-02)にガルーンをインストールしていきます。

先程の切替時にdb-02/dev/xvdb1/mnt/DIR1にマウントされてデータレプリケーションが走ります。その為、db-01側のガルーンのプログラム等のファイルがdb-02に存在するので、これを削除します。

# rm -fr /mnt/DIR1/cybozu /mnt/DIR1/www
# mkdir -p /mnt/DIR1/www/html /mnt/DIR1/www/cgi-bin

ガルーンをインストールします。インストール方法は先程プライマリのDBサーバにインストールした方法と全く同じです。
インストールが完了したらガルーンの関連サービスを停止して、自動起動も無効化します。

# /etc/init.d/cyss_cbgrn stop
# /etc/init.d/cyde_5_0 stop

# chkconfig cyde_5_0 off
# chkconfig cyss_cbgrn off

また、/etc/exportsに下記を設定します。プライマリ側の設定と同じです。

/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata 10.0.2.0/24(rw) 10.0.5.0/24(rw)
/mnt/DIR1/cybozu/mysql-5.0/files 10.0.2.0/24(rw) 10.0.5.0/24(rw)

最後にNFSサーバをセットアップしましょう。これもプライマリ側と全く同じ手順です。

# yum -y install nfs-utils
# systemctl enable nfs-server
# systemctl start nfs-server

確認します。

# exportfs -v

/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata
        10.0.2.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata
        10.0.5.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/mnt/DIR1/cybozu/mysql-5.0/files
        10.0.2.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/mnt/DIR1/cybozu/mysql-5.0/files
        10.0.5.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)

マスター側DBサーバのアクティブ化

バックアップ側にガルーンをインストールできたら再度、手動でフェイルオーバーを実行してプライマリ側をActiveに戻します。手順は先程と同じなので割愛します。

429-result

ガルーン用Generic ARKスクリプトのインストール

LifeKeeperには、標準で「Apache」や「Oracle」など色々なRecovery Kitが用意されていますが、ガルーン用のRecovery Kitも存在します。ただしこれは標準のパッケージには含まれていないので、今回はサイオステクノロジー様からご提供頂いたものを利用します。

ガルーン用Generic ARKスクリプトには、下記の2種類が存在します。今回は「サーバ分離構成」が該当するので「Garoon_single」をプライマリ側のDBサーバに保存します。

  • DB分割構成バージョン(Garoon_dbpart)
  • その他の構成バージョン(Garoon_single)
    • 単体構成
    • サーバ分離構成
    • 単体+全文検索サーバ構成

「Garoon_single」のファイル構成は下記のようになっており、mk_scripts.shがインストーラです。インストーラの実行には配下のファイル群が必要なので、頂いたディレクトリをそのままサーバに保存するようにしましょう。

/root/Garoon_single
|--Garoon-HAGuide_single.pdf
|--mk_scripts.sh
|--scripts
|  |--cyde_5_0
|  |  |--quickCheck
|  |  |--recover
|  |  |--remove
|  |  |--restore
|  |--cyss_cbgrn
|  |  |--quickCheck
|  |  |--recover
|  |  |--remove
|  |  |--restore
|--templates
|  |--quickCheck
|  |--recover
|  |--remove
|  |--restore

上記の「mk_scripts.sh」を実行してインストールします。

# cd /root/Garoon_single
# ./mk_scripts.sh

Cybozu Garoon Generic Application Scripts are created successfully!
Please use the scripts under 'scripts' directory.

mk_scripts.shを実行すると上記のように「Please use the scripts under 'scripts'directory.」と出力されます。メッセージ通りmk_scripts.shと同じ階層に「scripts」ディレクトリが生成され、その中にガルーン用Generic ARKリソース作成に使用するスクリプトが生成されます。

/root/Garoon_single/scripts
|--cyde_5_0
|  |--quickCheck
|  |--recover
|  |--remove
|  |--restore
|--cyss_cbgrn
|  |--quickCheck
|  |--recover
|  |--remove
|  |--restore

Cybozu Database Engineサービスのリソース作成

再びLifeKeeperでの作業になります。これまでと同じようにリソース作成ウィザードから行います。

700-garoon-resouce-01

「Recovery Kit」「Generic Application」を選択して下さい。

701-garoon-resouce-02

「Switchback Type」「intelligent」を選択します。

702-garoon-resouce-03

「Server」プライマリのDBサーバ(ip-10-0-3-4.ap-northeast-1.compute.internal)を指定します。

703-garoon-resouce-04

「Restore Script」/root/Garoon_single/scripts/cyde_5_0/restoreを指定します。
これは先程/root/Garoon_single/scriptsに生成したスクリプトの1つです。以後、順次これらのスクリプトを指定していきます。

704-garoon-resouce-restore

「Remove Script」/root/Garoon_single/scripts/cyde_5_0/removeを指定します。

705-garoon-resource-remove

「QuickCheck Script(optional)」/root/Garoon_single/scripts/cyde_5_0/quickCheckを指定します。

706-garoon-resource-quick

「Local Recovery Script(optional)」/root/Garoon_single/scripts/cyde_5_0/revoverを指定して下さい。

707-garoon-resouce-recovery

次の「Application Info(optional)」は空欄で構いません。

708-garoon-resouce-appinfo

「Bring Resource In Service」「Yes」を選択して下さい。

709-garoon-resource-bring-resource

「Resource Tag」は自動入力の「cyde_5_0」のままで構いません。このまま「Create Instance」をクリックします。

710-garoon-resource-create-instance

問題なく完了したら「Next」をクリックして「Pre-Extend」ウィザードに進んで下さい。

711-next

「Target Server」バックアップ側のDB(ip-10-0-6-4.ap-northeast-1.compute.internal)を指定して下さい。

712-target-server

「Switchback Type」「intelligent」を選択します。

713-switchback

「Template Priority」「1」を指定して下さい。

714-template-pri

「Target Priority」「10」を指定して下さい。

715-target-pri

成功したら「Next」をクリックして「Extend gen/app Resource Hierarchy」ウィンドウに進んで下さい。

716-next

「Resouce Tag」は自動入力の「cyde_5_0」のままで構いません。

717-resource-tag

次の「Application Info(optional)」は空欄で構いません。

718-appinfo

完了したら「Finish」をクリックします。

719-finish

「Done」をクリックして終了します。

720-done

ここまでで下記のように「cyde_5_0」のリソース表示が増えていることを確認します。

721-result

Cybozu Scheduling Serviceサービスのリソース作成

同様にLifeKeeperのウィザードから「Cybozu Scheduling Serviceサービスのリソース」を追加していきます。
後もう少しです。

730-sche-start

「Recovery Kit」「Generic Application」を選択します。

731-select-recovery-kit

「Switchback Type」「intelligent」を選択します。

732-switchback

「Server」プライマリのDBサーバ(ip-10-0-3-4.ap-northeast-1.compute.internal)を指定します。

733-server

「Restore Script」はスケジューリングサービス用のスクリプト/root/Garoon_single/scripts/cyss_cbgrn/restoreを指定します。

734-restore-script

「Remove Script」/root/Garoon_single/scripts/cyss_cbgrn/removeです。

735-remove-script

「QuickCheck Script(optional)」/root/Garoon_single/scripts/cyss_cbgrn/quickCheckを指定します。

736-quickcheck-script

「Local Recovery Script(optional)」/root/Garoon_single/scripts/cyss_cbgrn/revoverを指定して下さい。

737-recovery-script

次の「Application Info(optional)」は空欄で構いません。

738-app-info

「Bring Resource In Service」「Yes」を選択して下さい。

739-bring-resrouce

「Resource Tag」は自動入力の「cyss_cbgrn」のままで構いません。このまま「Create Instance」をクリックします。

740-resource-tag

問題なく完了したら「Next」をクリックして「Pre-Extend」ウィザードに進んで下さい。

741-next

「Target Server」バックアップ側のDB(ip-10-0-6-4.ap-northeast-1.compute.internal)を指定して下さい。

742-target

「Switchback Type」「intelligent」を選択します。

743-switch-back

「Template Priority」「1」を指定して下さい。

744-template-pri

「Target Priority」「10」を指定して下さい。

745-target-pri

成功したら「Next」をクリックして「Extend gen/app Resource Hierarchy」ウィンドウに進んで下さい。

746-next

「Resouce Tag」は自動入力の「cyss_cbgrn」のままで構いません。

747-ext-resource-tag

次の「Application Info(optional)」は空欄で構いません。

748-ext-app-info

完了したら「Finish」をクリックします。

749-ext-finish

「Done」をクリックして終了します。

750-ext-done

LifeKeeper上に「cyss_cgrn」のリソースが表示されていればOKです。

751-result

LifeKeeperのリソース階層の修正

最後にLifeKeeperのリソース階層を上から順に下記の様に修正します。

  1. IPリソース
  2. EC2リソース
  3. ガルーンスケジューリングサービス用Generic ARKリソース
  4. ガルーンデータベースエンジン用Generic ARKリソース
  5. ファイルシステムリソース

ファイルシステムリソースは「/mnt/DIR1リソース」と「datarep-DIR1リソース」を1つのリソースとして扱って下さい。

最終的に下記のような構成にします。

760-dependency

階層の変更方法は簡単です。変更したいリソースを選択して、直下に入れたいリソースを指定するだけです。
下記の例は「cyss_cbgrn」の下に「/mnt/DIR1」のリソースが配置されるように指定しています。

761-create-dependency

直下に入れたいリソースを選択します。

762-select

「Create Depedency」をクリックします。

763-create

これを繰り返して、階層を整えて下さい。

Appサーバの構築

次にAppサーバを構築します。全てのAppサーバで共通なので作業後にAMIを作成して展開するとよいでしょう。
内容の半分くらいはDBサーバと同じ作業をすることになります。

ガルーンに必要なパッケージのインストール

ガルーンの動作に必要な各種パッケージをインストールします。

yum -y install httpd libaio libjpeg-turbo libpng perl perl-Data-Dumper wget unzip

ガルーンではApacheの「KeepAlive」設定を無効にする必要がある為、/etc/httpd/conf/httpd.confに下記を追記します。

KeepAlive Off

Apacheの自動起動を設定しておきます。

# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

# systemctl is-enabled httpd
enabled

まだApacheは起動しないで下さい。

SELinuxとfirewalldの無効化

ガルーンのドキュメントに従い、SELinuxを無効化します。

# sed -i -e 's/enforcing/disabled/g' /etc/selinux/config

設定を反映させる為、再起動します。

# reboot

再起動が完了したらSElinuxの状態を確認します。getenforceの結果がDisabledであることを確認します。

$ getenforce
Disabled

次にfirewalldが起動しているのでこれを停止します。

# systemctl status firewalld

自動起動設定も無効化します。

# systemctl disable firewalld

ガルーンのインストール

次にガルーンのインストーラをダウンロードしてインストールします。

# wget http://download.cybozu.co.jp/cbgrn/grn-4.2.0-linux-x64.bin
# sh /tmp/grn-4.2.0-linux-x64.bin

全てデフォルトのままで問題ありません。

880-app-garoon-intall-summary-install-config

すべてのAppサーバーで、ガルーンのサービスを停止します。 最初にスケジューリングサービスを停止します。

# /etc/init.d/cyss_cbgrn stop

次にバンドルのMySQLを停止します。

# /etc/init.d/cyde_5_0 stop

Appサーバ上では、ガルーンを利用しないので自動起動も無効化にします。

# systemctl disable cyde_5_0
# systemctl disable cyss_cbgrn

ガルーンの設定変更

次にガルーンのDB設定を変更します。デフォルトではローカル上のMySQLを参照するので、これをDBサーバに変更します。
設定ファイルは/var/www/cgi-bin/cbgrn/lwc.iniです。ポイントは仮想IP「10.1.0.10」を指定する点です。

prop:_host = "val:127.0.0.1:3770"
↓
prop:_host = "val:10.1.0.10:3770"

データ保存領域の権限を修正します。

# chmod -R 000 /var/www/cgi-bin/cbgrn/sessiondata
# chmod -R 000 /usr/local/cybozu/mysql-5.0/files

NFSの設定

DBサーバに対して上記をNFSマウントするので、NFSユーティリティをインストールします。

# yum -y install nfs-utils
# systemctl start rpcbind.service
# systemctl start nfs-lock.service

自動起動を有効化しておきましょう。

# systemctl enable rpcbind
# systemctl enable nfs-lock

マウントします。IPは仮想IPを指定します。

mount -o intr,noac 10.1.0.10:/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata /var/www/cgi-bin/cbgrn/sessiondata
mount -o intr 10.1.0.10:/mnt/DIR1/cybozu/mysql-5.0/files /usr/local/cybozu/mysql-5.0/files

確認します。

# mount -l |grep "10.1.0.10"

10.1.0.10:/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata on /var/www/cgi-bin/cbgrn/sessiondata type nfs4 (rw,relatime,sync,vers=4.1,rsize=131072,wsize=131072,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,hard,noac,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.2.5,local_lock=none,addr=10.1.0.10)
10.1.0.10:/mnt/DIR1/cybozu/mysql-5.0/files on /usr/local/cybozu/mysql-5.0/files type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.2.5,local_lock=none,addr=10.1.0.10)

/etc/fstabに下記を追記しておきましょう。

10.1.0.10:/mnt/DIR1/www/cgi-bin/cbgrn/sessiondata /var/www/cgi-bin/cbgrn/sessiondata nfs intr,noac 0 0
10.1.0.10:/mnt/DIR1/cybozu/mysql-5.0/files /usr/local/cybozu/mysql -5.0/files nfs intr 0 0

Apacheを起動します。

# systemctl start httpd

動作確認

これで環境構築の全ての作業が完了しました。プライマリに異常が発生した際にフェイルオーバーできるかどうか確認してみたいと思います。

テスト内容

テスト内容は以下です。

  • ブラウザでガルーンにアクセスして変更を実施
    • テスト用のテキストファイルをメモに添付
  • プライマリ側で擬似的な障害を発生
    • プライマリ側のNICを停止
  • フェイルオーバー後にブラウザでガルーンにアクセスして確認
    • メモの添付ファイルが見れることを確認

それでは、オンプレ側からガルーンにアクセスします。アクセスするURLはプライベート用ドメインのhttp://elb.garoon-internal.local/cgi-bin/cbgrn/grn.cgiです。

ガルーンインストール時に設定したパスワードでログインします。

850-garonn-check

メニューにある「Memo」をクリックして「test.txt」というファイル添付します。

851-garoon-add-memo

ファイルの中身は単なるテキストファイルです。

852-garoon-memo

また、事前にVPCの「Route Table」の内容を確認しておきます。
下記の通り、仮想IP「10.1.0.10/32」宛のトラフィックがプライマリサーバ「db-01」の「eth0」のENIに向いています。これがフェイルオーバーによりセカンダリサーバ「db-02」の「eth0」に向きが変わればOKという訳です。

860-before-failover-routetable-01-kai

861-before-failover-routetable-02

疑似障害を起こす前に、バックアップ側のLifeKeeperのGUIを起動しておきます。疑似障害を起こすとプライマリ側のLifeKeeperにアクセスできなくなり、GUIが落ちる為です。

手順はプライマリ側のLifeKeeperのGUIにアクセスする方法と同じです。

Windows Serverの踏み台サーバにRDPでログオンして、Teratermでバックアップ側DBサーバ(db-02)にSSHログインします。ec2-userユーザでログイン後にrootにスイッチして下さい。

次に、LifeKeeper GUIを起動します。

# /opt/LifeKeeper/bin/lkGUIup

プライマリ側の時と同じですが、GUIを起動する時は、ログインしたユーザーの環境変数と認証情報、GUI画面を起動したユーザーの環境変数と認証情報を一致させておく必要があります。次のコマンドの結果が一致していることを確認して下さい。

$ echo $DISPLAY
# echo $DISPLAY
$ xauth list
# xauth list

一致していない場合、以下のコマンドでログインユーザー側の情報と一致させてください。

# export DISPLAY=[ログインユーザーの$DISPLAYの出力結果]
# xauth add [ログインユーザーのxauth listの出力結果]

セカンダリ側のLifeKeeper GUIの表示は以下のように、プライマリサーバとセカンダリサーバの表示が左右逆になっています。

862-before-primary-network-lk

それでは、プライマリのサーバ(db-01)で下記のコマンドを実行してNICを停止します。

# systemctl stop network

プライマリサーバとの疎通が取れなくなったので、画面が下記のように変わります。

863-failover-complete

VPCの「Route Table」を確認してみます。 下記の通り、仮想IP「10.1.0.10/32」宛のトラフィックがセカンダリサーバ「db-02」の「eth0」のENIに向くように変わっています。これでLifeKeeperによってルーティングが変更されたことが分かります。

864-after-failover-routable-01

865-after-failover-routetable-02

次にガルーンを確認してみます。先程と同じURLでガルーンにアクセスしてみます。プライマリ側のNICが止まっていますが、正常に「Memo」の添付ファイルtest.txtを確認することが出来ました。

866-after-failover-garoon-memo

元に戻す場合は、セカンダリDBサーバを再起動させてから、LifeKeeper上で手動で切替を実行して下さい。

870-failback-lk

「In Service」をクリックします。

871-failback-manual

切り替えが開始されます。

872-failback-start

徐々に切り替えが進みます。

873-failback-tochu

「Done」をクリックして完了です。

874-done-failback

元のActive/Standby状態に戻りました。

875-complete-failback

参考ドキュメント

今回の環境を構築するにあたり、下記のドキュメントをそれぞれ参考にさせて頂きました。

サイボウズガルーンのドキュメント

ガルーンのインストールや基本的な仕組みについては、下記のドキュメントを参考にしました。

サイボウズ ガルーン バージョン 4.2 インストールガイド

LifeKeeperのドキュメント

LifeKeeperの設定やAWS環境の構成については、「SIOS Protection Suite for Linux Step by Step Guide【AWS編】」というドキュメントを参考にしています。DataKeeperやガルーン冗長化の設定部分は異なりますが、LifeKeeperの設定までは概ね同じ手順になるかと思います。

このドキュメントは下記よりダウンロードが可能です。

サイオステクノロジー株式会社:資料のダウンロード

ガルーン環境でのLifeKeeper利用については、下記ドキュメントのP.23「第4章 サーバ分離構成における構築手順」を参考にしています。こちらの手順は共有ディスクを利用した構成になっているので、その点を考慮する必要があります。

LifeKeeper for Linux サイボウズ ガルーン 冗長化構成ガイド [単体構成 / サーバ分離構成 / 単体〒全文検索サーバ構成] 第3版

最後に

随分と長いエントリになりましたが、いかがだったでしょうか?
今回は触れていませんが、保護対象のプロセスを停止させただけではフェイルオーバーを実行せずに、LifeKeeperによるプロセス再起動で復旧させることも出来ました。

対象のアプリケーションによって、作業する順番などを注意する必要がありますが、設定がGUIでできるのは便利だと思います。

また、AWSにも標準で対応しているので、どうしてもActive/Standby環境をAWS上で用意する必要がある場合、強力な選択肢になるのではないかと思います。

以上です。