Liferayでクラスタリング

事象/ユースケース

このページでは、LIFERAY PORTALをクラスタ構成にするための設定方法をご紹介します。CE版には対応していませんのでご注意ください。ページの最後には「よくある質問」がありますので、そちらも是非ご覧ください。

クラスタリングとは

複数台のサーバーを統合し、あたかも一台のサーバーシステムのように動作させるための技術です。クラスタリングの目的は、大きく分けて次の2つに分類できます。

  1. 一部のサーバーに障害が生じても、他にその影響を及ぼさないといった信頼性の担保
  2. トラフィックの負荷分散 

システムの停止が重大な損失をもたらす大規模システムやミッションクリティカルなシステムでは、信頼性や安定性の担保が極めて重要な要件となります。クラスタリングは、こうした要件に対して採用されることの多い運用手法の一つです。

解決策/提案

cluster-001.png

上の図のような構成を想定した設定手順を紹介します。このページではLIFERAY PORTALの設定方法のみを扱い、Webサーバー、DBサーバー、ロードバランサ、OS等の設定方法については触れませんので、あらかじめご了承ください。

クラスタリングにおける7つの設定ポイント

  1. すべてのクラスタノードで同一のデータベースを使用する
  2. すべてのクラスタノードで同一のデータストアを使用する
  3. クラスタノード間で検索のインデックスを同期する
  4. クラスタノード間でキャッシュを同期する
  5. クラスタノード間でジョブスケジュールを同期する
  6. すべてのクラスタノードで共通のクラスタ用アクティベーションキーを使用する
  7. デプロイフォルダ、パッチレベル、およびportal-ext.propertiesファイルを同じ状態に保つ

事前準備

  1. 外部からの接続が可能なMySQLデータベースとその接続情報
  2. LIFERAY PORTALを動作させるサーバー x 2
    • ホスト名はそれぞれ「node1」、「node2」とする
    • 各ノードにはJDK 7u79をインストールしておく

 

※説明の便宜上、各サーバーのファイヤーウォール及びSELinux等のセキュアOSを停止・無効化しておいてください。

手順

1) LIFERAY PORTALを準備

cluster-002.png

TomcatバンドルをCustomer Portalからダウンロードし、各ノードで任意のディレクトリに展開します。このガイドでは、執筆時点で最新のSP14の「Bundled with Tomcat 7.0」を使用しています。

 

2) portal-ext.propertiesを各ノードに配置

/{directory}/liferay-{version}/にportal-ext.propertiesという名前のファイルを以下の内容で作成します。

 

jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://<DB_HOST>:3306/<DB_NAME>?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=<DB_USER>
jdbc.default.password=<DB_PASS>

cluster.link.enabled=true

org.quartz.jobStore.isClustered=true

dl.store.impl=com.liferay.portlet.documentlibrary.store.DBStore

lucene.replicate.write=true

ehcache.cluster.link.replication.enabled=true

web.server.display.node=true

cluster.link.autodetect.address=www.google.com:80

各プロパティの説明

jdbc.default.driverClassName

使用するJDBC ドライバクラス名

jdbc.default.url

JDBCのURL

jdbc.default.username

データベースのユーザー名

jdbc.default.password

データベースのパスワード

cluster.link.enabled

Liferayのクラスタ機能を有効にします(これを有効にしないとクラスタが機能しません)

org.quartz.jobStore.isClustered

ジョブの同期

dl.store.impl

データストアの種類

 

※このガイドでは説明の便宜上「dl.store.impl=com.liferay.portlet.documentlibrary.store.DBStore」を指定していますが、一般的にバイナリをDBに保存することは推奨されません。環境構成に応じてデータストアをご検討ください。

lucene.replicate.write

検索のインデックスを同期

Lucene以外の検索エンジンを使用する場合は不要


※このガイドでは説明の便宜上Luceneを使用していますが、Luceneのクラスタ環境での使用は推奨されません。詳しくはページ下部の「よくあるご質問」をご覧ください

ehcache.cluster.link.replication.enabled

キャッシュの同期(Ehcache Cluster EEプラグインのプロパティ)

web.server.display.node

画面下部にホスト名を表示(クラスタノードの識別に使用します)

cluster.link.autodetect.address

JGroupによるグループ通信において、全アプリケーションサーバーからアクセス可能なサーバーを指定

3) context.xmlの調整

「$TOMCAT_HOME/conf/context.xml」を編集し、以下のようにContextノードに「distributable="true" 」を追加します。

cluster-003.png

4) 一台ずつ起動

node1, node2で以下のコマンドを実行してLiferayを起動します。このとき、1台が完全に起動してから次を起動するようにします。起動完了前に別のノードのLiferayを起動してしまうと、レプリケーションが正しく行われない場合があります。

 

cd /{directory}/liferay-{version}/tomcat-{version}/bin

./catalina.sh run

 

ブラウザからnode1にアクセスすると、「web.server.display.node=true」の設定により画面下部にホスト名「node1」が表示されることが確認できます。開発時にはロードバランサやWebサーバ経由で検証する際にどのノードへアクセスしているの把握するのに便利ですが、実運用時には無効にします。

cluster-004.png

5) Ehcache Cluster EEのダウンロードとデプロイ

マーケットプレイスよりEhcache Cluster EEプラグインをダウンロード後、ダウンロードしたパッケージを「deploy」フォルダ(無ければ作成)へコピーしてデプロイします。

6) 検索インデックスを再構築

1台目は起動時に自動的に検索インデックスが構築されますが、2台目以降は起動後に手動で行う必要があります。コントロールパネル>サーバ管理>リソースより、「検索で利用するインデックスを再構築する。」を実行します。

cluster-005.png

以上でクラスタリングは完了です。

7) レプリケーションの動作確認

検索インデックスのレプリケーションの動作確認

  1. node1で「コントロールパネル>ユーザ」にてtestUserというユーザを新規作成します
  2. node2で「コントロールパネル>ユーザ」にアクセスします
  3. node1で作成したユーザが正常に表示されます

cluster-006.png 

キャッシュのレプリケーションの動作確認

  1. node1でログインポートレット移動します

cluster-007.png 

  1. node2で同じページにアクセスします
  2. ポートレットの移動が反映されます
    cluster-008.png

 

備考

  • Lucene以外の検索エンジンを使用する場合「the lucene.replicate.write=true」は必要ありません。
  • Liferayはデフォルトで検索エンジンにLuceneを使用します。portal-ext.propertiesにはLuceneに関する多くの高度な項目があります。portal.propertiesの「## Lucene Search」セクションとLuceneのドキュメントを参考に、運用環境に応じて調整してください。(繰り返しになりますが、本番環境でのLuceneの使用は推奨されません)

追加情報

Q) キャッシュのレプリケーションが正しく行われません

Ehcache Cluster EEプラグインがインストールされていない可能性があります。「コントロールパネル>アプリケーションマネージャ」よりインストール済みかどうかご確認ください。インストールされている場合、以下のように表示されます。

 cluster-009.png

Q) cluster.link.autodetect.addressには何を指定すれば良いですか?

全ノードがアクセス可能なサーバーとポート(例えば、データベース)を記入してください。デフォルトはwww.google.com:80となっています。

 

Q) 検索インデックスが正しく同期されません

各ノード間で検索インデックスの同期中にデータベースに何かしらの変更が加わった可能性があります。その場合それらの変更は次の同期まで反映されず、ノード間に不整合が生じます。Luceneはインデックスファイルをノード毎に保有するためです。そのため、実運用環境ではSolrの使用を強く推奨いたします。

参考ページ

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています