事象/ユースケース
このページでは、LIFERAY PORTALをクラスタ構成にするための設定方法をご紹介します。CE版には対応していませんのでご注意ください。ページの最後には「よくある質問」がありますので、そちらも是非ご覧ください。
クラスタリングとは
複数台のサーバーを統合し、あたかも一台のサーバーシステムのように動作させるための技術です。クラスタリングの目的は、大きく分けて次の2つに分類できます。
- 一部のサーバーに障害が生じても、他にその影響を及ぼさないといった信頼性の担保
- トラフィックの負荷分散
システムの停止が重大な損失をもたらす大規模システムやミッションクリティカルなシステムでは、信頼性や安定性の担保が極めて重要な要件となります。クラスタリングは、こうした要件に対して採用されることの多い運用手法の一つです。
解決策/提案
上の図のような構成を想定した設定手順を紹介します。このページではLIFERAY PORTALの設定方法のみを扱い、Webサーバー、DBサーバー、ロードバランサ、OS等の設定方法については触れませんので、あらかじめご了承ください。
クラスタリングにおける7つの設定ポイント
- すべてのクラスタノードで同一のデータベースを使用する
- すべてのクラスタノードで同一のデータストアを使用する
- クラスタノード間で検索のインデックスを同期する
- クラスタノード間でキャッシュを同期する
- クラスタノード間でジョブスケジュールを同期する
- すべてのクラスタノードで共通のクラスタ用アクティベーションキーを使用する
- デプロイフォルダ、パッチレベル、およびportal-ext.propertiesファイルを同じ状態に保つ
事前準備
- 外部からの接続が可能なMySQLデータベースとその接続情報
- LIFERAY PORTALを動作させるサーバー x 2
- ホスト名はそれぞれ「node1」、「node2」とする
- 各ノードにはJDK 7u79をインストールしておく
※説明の便宜上、各サーバーのファイヤーウォール及びSELinux等のセキュアOSを停止・無効化しておいてください。
手順
1) LIFERAY PORTALを準備
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以外の検索エンジンを使用する場合は不要
|
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" 」を追加します。
4) 一台ずつ起動
node1, node2で以下のコマンドを実行してLiferayを起動します。このとき、1台が完全に起動してから次を起動するようにします。起動完了前に別のノードのLiferayを起動してしまうと、レプリケーションが正しく行われない場合があります。
cd /{directory}/liferay-{version}/tomcat-{version}/bin |
ブラウザからnode1にアクセスすると、「web.server.display.node=true」の設定により画面下部にホスト名「node1」が表示されることが確認できます。開発時にはロードバランサやWebサーバ経由で検証する際にどのノードへアクセスしているの把握するのに便利ですが、実運用時には無効にします。
5) Ehcache Cluster EEのダウンロードとデプロイ
マーケットプレイスよりEhcache Cluster EEプラグインをダウンロード後、ダウンロードしたパッケージを「deploy」フォルダ(無ければ作成)へコピーしてデプロイします。
6) 検索インデックスを再構築
1台目は起動時に自動的に検索インデックスが構築されますが、2台目以降は起動後に手動で行う必要があります。コントロールパネル>サーバ管理>リソースより、「検索で利用するインデックスを再構築する。」を実行します。
以上でクラスタリングは完了です。
7) レプリケーションの動作確認
検索インデックスのレプリケーションの動作確認
- node1で「コントロールパネル>ユーザ」にてtestUserというユーザを新規作成します
- node2で「コントロールパネル>ユーザ」にアクセスします
- node1で作成したユーザが正常に表示されます
キャッシュのレプリケーションの動作確認
- node1でログインポートレット移動します
- node2で同じページにアクセスします
- ポートレットの移動が反映されます
備考
- Lucene以外の検索エンジンを使用する場合「the lucene.replicate.write=true」は必要ありません。
- Liferayはデフォルトで検索エンジンにLuceneを使用します。portal-ext.propertiesにはLuceneに関する多くの高度な項目があります。portal.propertiesの「## Lucene Search」セクションとLuceneのドキュメントを参考に、運用環境に応じて調整してください。(繰り返しになりますが、本番環境でのLuceneの使用は推奨されません)
追加情報
Q) キャッシュのレプリケーションが正しく行われません
Ehcache Cluster EEプラグインがインストールされていない可能性があります。「コントロールパネル>アプリケーションマネージャ」よりインストール済みかどうかご確認ください。インストールされている場合、以下のように表示されます。
Q) cluster.link.autodetect.addressには何を指定すれば良いですか?
全ノードがアクセス可能なサーバーとポート(例えば、データベース)を記入してください。デフォルトはwww.google.com:80となっています。
Q) 検索インデックスが正しく同期されません
各ノード間で検索インデックスの同期中にデータベースに何かしらの変更が加わった可能性があります。その場合それらの変更は次の同期まで反映されず、ノード間に不整合が生じます。Luceneはインデックスファイルをノード毎に保有するためです。そのため、実運用環境ではSolrの使用を強く推奨いたします。
参考ページ
- LIFERAY CLUSTERING(英語)
https://dev.liferay.com/discover/deployment/-/knowledge_base/6-2/liferay-clustering - Luceneのパフォーマンスドキュメント
http://wiki.apache.org/lucene-java/BasicsOfPerformance