金曜日 6 12, 2009

OpenMQ/WebLogic MQ用 JMSメッセージ管理ツール「QBrowserV2」のバージョン2.4.0をリリースしました。

メッセージパネル(編集、詳細)を中心にリニューアルしました。

以下からQBrowserV2_2.4.0をダウンロードしてください。詳しい使い方はZIPを解凍して出てくる「ForOpenMQ起動方法ReadMe.txt」と「ForWebLogic起動方法ReadMe.txt」をご覧ください。

変更概要は以下の通りです。
・MapMessage対応(入力、表示)
・メッセージパネルを表ベースにリニューアル(JMSヘッダ、ユーザプロパティ、MapMessage)
・Stringプロパティ選択時のエディタ画面
・その他BugFix
(詳しくはリリースノートをご覧ください)

金曜日 5 08, 2009

こんにちは。
5月の連休の合間を利用して、Myはうすが提供しているメッセージキュー管理ツールを更新してみました。今回のリリース(2.3.0)でWebLogic MQに対応しました。

以下からQBrowserV2_2.3.0をダウンロードしてください。詳しい使い方はZIPを解凍して出てくる「ForOpenMQ起動方法ReadMe.txt」と「ForWebLogic起動方法ReadMe.txt」をご覧ください。

UIはJIDE Common Layer Open Source Projectを使用しリニューアルしました。OSSのパワーを実感した開発の日々(正味3日)でした。。。

変更概要は以下の通りです。

・WebLogic MQに対応 (付属のrun_wls_mq.bat/run_wls_mq_for_default_install_location.batを使用)
・JIDE Common Layer(OSS:https://jide-oss.dev.java.net/)を使用し、UIをリニューアル
・完全国際化(日本語、英語)

[UI部変更]
・宛先コンボボックスにTOPIC名も表示
・メッセージテーブルをタブ化し、複数宛先を並行表示
・アイコンメニュー追加

[追加機能]
・TOPICサブスクライブ(購読)メニュー/ボタン追加
・サブスクライブ(購読)一時停止/再開機能
・メッセージテーブルの行を右クリック→選択メッセージ転送
・メッセージテーブルの行を右クリック→選択メッセージ削除
・宛先リスト更新機能(QBrowser外で追加されたものを出す)
・ルックアンドフィール動的変更メニュー
・メッセージ送信時、永続化モードと圧縮モード選択

[仕様変更]
・起動時にJMSサーバに接続出来ない場合、エラーダイアログボックスとヒントを表示
・使用中にJMSサーバとの接続が切れた場合、別スレッドでバックグラウンドで接続試行
・宛先名を選択すると、選択された宛先タブが表示される(タブがない場合作成)
・削除最適化/スピードアップ
・テーブル全選択時、「全て選択」が「選択解除」へ
・(2.2.0から)宛先名を空欄にしてsearchすると、現在の全宛先を対象に検索

[WebLogic MQ]
・宛先自動検索機能(キュー、トピック、分散キュー/分散トピックなど)

GPLv2ライセンスですので、ソースコード含めご自由にお使いくださいませ。
バグレポートなどご協力いただけると幸いです・・・

土曜日 4 18, 2009

こんにちは。キューデータ管理ツールQBrowserV2に少しだけ機能追加してみました。
久々の更新ということでバージョンはV2.2.0としました。

以下からQBrowserV2_2.2.0をダウンロードしてください。

[追加機能]
Browseボタンの右に「Search」ボタンを追加し、メッセージの検索機能を追加しました。

Searchボタンを押すと、メッセージ検索ウィンドウがポップアップします。検索したい宛先名と必要があればメッセージセレクタ文字列を入力して、OKボタンを押せば検索結果がメインウインドウに表示されます。メッセージセレクタはJMS仕様のMessageSelector構文を使用します(少しSQLに似ています)。メッセージセレクタ文字列を入力しないと指定された宛先のメッセージを全件出力します。

メッセージセレクタにちょっと取っ付きにくいという方のために、だいたいの構文を集めたテンプレートを付けています。また、セレクタ文字列を入力して検索すると、文字列が履歴としてテンプレートに入るようになっています。

[オマケ]
各種情報照会ウィンドウの文字ずれが出ないようにしてみました。もう少しすっきり見えると思います。

水曜日 4 15, 2009

こんにちは。今回はオープンソースのメッセージキューであるOpen Message Queue(OpenMQ)のHAストアにMySQL Clusterを使う方法について書いてみたいと思います。(Connector/J設定の参考にもなるかと思います)

OpenMQはオープンソースアプリケーションサーバGlassFishのサブプロジェクトとして進められているMQを開発するプロジェクトです。エンタープライズシステム・コンポーネントであるOpenESBや、GlassFish Enterprise Serverなどのコアモジュールとして使用されている大変重要なソフトウエアとなっています。疎結合化システムを構築するためには無くてはならない存在で、システムによっては非常に高い可用性を求められる部分です。Myはうす(まい・はうす改め)ではOpenMQについての色々なトピックを書いて来ましたがいよいよ本命の登場です。

OpenMQのHAクラスタについてはこちらで説明していますのでよろしければご覧ください。

以下のトピックでは、OpenMQのクラスタでSunのHADBを使用する手順を書いています。
HADBを使用したHAクラスタ構成その1
HADBを使用したHAクラスタ構成その2

[4/17日Update]
奇しくも、4/16日にOpenMQクラスタについてのWebcastがリリースされました。brokerとproducer,consumer,永続ストレージとメッセージデリバリの関係がすごくわかりやすいです。Cluster構成にした場合の動きなどが特に参考になりますね(動画です!!)http://www.sun.com/offers/details/message_queue_ha_clusters.html

MySQL Clusterを使用した設定を行う場合も、HADBの時と流れは一緒ですので参考にしてください。
アーキテクチャ図を一枚引用します。

MQ4.1HAクラスタ・アーキテクチャとなっていますが、基本的にMQ4.3HAクラスタは4.1のものと同一のアーキテクチャとなっています。複数のMQのブローカがクラスタを構成し、同一のシェアドHAストアを利用します。少しおさらいしてみたいと思います。MySQL Clusterとの設定方法だけを見たい方は飛ばしてください。

[ホームブローカ]

MQのクライアント(JMSクライアントなど)が最初に通信を行ったブローカのことを「ホームブローカ」と呼びます。JMSクライアントのロードバランス機能などにより各クライアントのホームブローカはバラバラになります。OpenMQのHAクラスタでは従来の「コンベンショナルクラスタ」と同様に、どのブローカからもメッセージを取り出すことができる仕組みとなっています。(コンベンショナルでは、永続化メッセージは各ブローカがローカルに持っています)

例えばbroker1に対してsendしたメッセージはbroker2からも同様にreceiveすることが可能です。ただしOpenMQのHAクラスタでは単純に同一のデータ・セッション・コネクションを全brokerが共有する形にはなっていません。ホームブローカでないブローカ経由でメッセージがリクエストされた場合、ブローカがHAストアから他のブローカが管理しているメッセージを探して、クライアントに返す形となります。
#JMSのBrowserでキューの中を覗いた場合ホームブローカ以外にはメッセージがないように見えます。これは覗いた時点ではメッセージがそのブローカに所属していないためです。

[ホームブローカがダウンした場合]

ホームブローカがダウンした場合、上記のような構造となっているのでそのままでは他のブローカからのメッセージリクエストに応えられません。broker間では事前定義された間隔でお互いにハートビートを確認しています。ハートビートチェックがタイムアウトしそのブローカがダウンしていると判断された場合には、ブローカが管理している資源(セッション、トランザクション、メッセージ)のフェイルオーバが発生します。ダウンしたブローカが持っていた資源をHAストアから引継ぎ先にテイクオーバします。ブローカリストを持ったクライアント内でブローカへの接続も自動でフェイルオーバしますので、クライアントはMQのダウンを関知する必要がありません。

[全体としてHAにするための考慮点]

HAクラスタ・アーキテクチャ図の黄色枠内については、各モジュールがHA化されている必要があります。さもなければそこが単一障害点(Single Point of Failure)となってしまいます。冗長化するポイントは以下です。

・OpenMQブローカインスタンス
・HAストア

ブローカインスタンスについては、ブローカインスタンスを複数並行に並べることで解決可能です。ブローカインスタンスを複数並べ、全体として1つの仮想インスタンスとして取り扱うことをMQクラスタと呼んでいます。HAストアについてはMySQLを使用する場合、単体のインスタンスではMySQLサーバプロセスがダウンした場合そこが単一障害点になります。今回はMySQL Clusterを使用します。(単体のMySQLインスタンスも使用可能です)

[HAストアに使用するMySQL Clusterの考慮点]

・ 複数のデータノードを起動
・ 複数のSQLノードを起動
・ 各ブローカからSQLノードに分散/フェイルオーバするように設定

今回MySQL Clusterは説明のため最小構成で設定を行います。(本番適用時には要件に応じて適宜構成設計を行ってください)今回使用する環境のndb_mgmでの構成リストを以下に載せます。
使用するOpenMQのバージョンはここからダウンロードできる4.3を使用しました。

-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.70.128:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.70.128  (mysql-5.1.30 ndb-6.3.20, Nodegroup: 0, Master)
id=3    @192.168.70.128  (mysql-5.1.30 ndb-6.3.20, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.70.128  (mysql-5.1.30 ndb-6.3.20)

[mysqld(API)]   2 node(s)
id=4    @192.168.70.128  (mysql-5.1.30 ndb-6.3.20)
id=5    @192.168.70.128  (mysql-5.1.30 ndb-6.3.20)

[OpenMQ Cluster with MySQL Cluster設定方法]

1.MySQL Clusterを起動し、mysqlクライアントでSQLノードのどちらかに接続してopenmqデータベースを作成します。

Server version: 5.1.30-ndb-6.3.20-cluster-gpl MySQL Cluster Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database openmq character set utf8;
Query OK, 1 row affected (0.23 sec)

MQで大きなサイズのメッセージを扱う予定の場合、MySQLの以下のパラメータを設定しておきます。最大サイズによって値を調整してください。

config.ini
[tcp default]
SendBufferMemory=2M
ReceiveBufferMemory=1M

この値を設定しておかないと、JMSクライアントの仕様によってはNDB-APIエラー(SEND BUFFERS OVERLOADED IN NDB KERNEL)となり送信できないことがあります(ストリームバッファを多めに取っている場合など)。デフォルト値はそれぞれ256k,64kです。

my.cnf
[mysqld]
max_allowed_packet = 16M

なお、何も指定していないとデフォルト1Mとなります(最大指定可能は1GB,それ以上の数字を設定しても1GBになる)。それ以上大きなメッセージを保存しようとすると以下のようなエラーとなってしまいます。これより大きなサイズのメッセージを扱いたい場合はByteMessageを使って複数のメッセージに分割する方法もあります。

[15/4/2009:23:01:46 JST] エラー [B2011]: 16-192.168.11.9(f8:22:94:e5:d3:14)-3584-1239778905890 からの JMS メッセージの保存に失敗しました:
com.sun.messaging.jmq.jmsserver.util.BrokerException: [B4004]: メッセージ 16-192.168.11.9(f8:22:94:e5:d3:14)-3584-1239778905890 を維持できませんでした
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.MessageDAOImpl.insert(MessageDAOImpl.java:416)
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.MessageDAOImpl.insert(MessageDAOImpl.java:340)
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.JDBCStore.storeMessage(JDBCStore.java:239)
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.JDBCStore.storeMessage(JDBCStore.java:201)
        at com.sun.messaging.jmq.jmsserver.core.PacketReference.store(PacketReference.java:1177)
        at com.sun.messaging.jmq.jmsserver.core.Queue.routeNewMessage(Queue.java:542)
        at com.sun.messaging.jmq.jmsserver.data.handlers.DataHandler.routeMessage(DataHandler.java:462)
        at com.sun.messaging.jmq.jmsserver.data.handlers.DataHandler.handle(DataHandler.java:244)
        at com.sun.messaging.jmq.jmsserver.data.handlers.DataHandler.handle(DataHandler.java:97)
        at com.sun.messaging.jmq.jmsserver.data.PacketRouter.handleMessage(PacketRouter.java:181)
        at com.sun.messaging.jmq.jmsserver.service.imq.IMQIPConnection.readData(IMQIPConnection.java:1489)
        at com.sun.messaging.jmq.jmsserver.service.imq.IMQIPConnection.process(IMQIPConnection.java:644)
        at com.sun.messaging.jmq.jmsserver.service.imq.OperationRunnable.process(OperationRunnable.java:170)
        at com.sun.messaging.jmq.jmsserver.util.pool.BasicRunnable.run(BasicRunnable.java:493)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLException: [INSERT INTO MQMSG41Cmqhamysqlcluster ( ID, MESSAGE_SIZE, STORE_SESSION_ID, DESTINATION_ID, TRANSACTION_ID, CREATED_TS, MESSAGE) VALUES ( ?, ?, ?, ?, ?, ?, ? )]: Packet for query is too large (2713149 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.DBManager.wrapSQLException(DBManager.java:863)
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.MessageDAOImpl.insert(MessageDAOImpl.java:411)
        ... 14 more



また、OpenMQ自体にも取り扱えるメッセージの最大バイト数の設定がありますのでそれらの値も調整します。-1は無制限を意味します。OpenMQ側で制限をかけたい場合はこの値を正の数値に設定します。maxBytesPerMsgとmaxTotalMsgBytesのデフォルトは10MB、imq.message.max_sizeは70MBとなっています。
imq.autocreate.destination.maxBytesPerMsg=-1
imq.autocreate.destination.maxTotalMsgBytes=-1
imq.message.max_size=-1
※autocreate宛先の場合、一度作成されてしまうと上の値の設定を行っても反映しないので注意してください。その場合は一度宛先を再作成すると新しい値が反映します。

2.MySQL Connector/J(MySQL用JDBCドライバ)をここからダウンロードします。ダウンロードしたzipファイルを解凍すると、mysql-connector-java-5.0.8-bin.jarという名前のJARが出てきますので、これをMQ_HOME\lib\extフォルダにコピーしておきます。
※OpenMQではConnector/J 5.1ではなく、Connector/J 5.0を使用します。5.1をHAストアとして利用すると以下のようになってしまい、ブローカを起動することが出来ません。

com.sun.messaging.jmq.jmsserver.util.BrokerException: [B4221]: ストアからすべての HA クラスタ情報を読み込めませんでした
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.BrokerDAOImpl.getAllBrokerInfos(BrokerDAOImpl.java:1077)
        at com.sun.messaging.jmq.jmsserver.persist.jdbc.JDBCStore.getAllBrokerInfos(JDBCStore.java:2764)
        at com.sun.messaging.jmq.jmsserver.persist.Store.getAllBrokerInfos(Store.java:1212)
        at com.sun.messaging.jmq.jmsserver.cluster.ha.HAClusterManagerImpl$HAMap.updateHAMapForState(HAClusterManagerImpl.java:1498)
        at com.sun.messaging.jmq.jmsserver.cluster.ha.HAClusterManagerImpl$HAMap.updateHAMap(HAClusterManagerImpl.java:1485)
        at com.sun.messaging.jmq.jmsserver.cluster.ha.HAClusterManagerImpl.getKnownBrokers(HAClusterManagerImpl.java:486)
        at com.sun.messaging.jmq.jmsserver.cluster.ha.HAClusterManagerImpl.getConfigBrokers(HAClusterManagerImpl.java:511)
        at com.sun.messaging.jmq.jmsserver.service.HAMonitorService.<init>(HAMonitorService.java:437)
        at com.sun.messaging.jmq.jmsserver.Broker._start(Broker.java:869)

これは以下のConnector/Jの問題のためです。(これが解決すれば利用可能だと思います)
http://bugs.mysql.com/bug.php?id=41484

3.broker1とbroker2を以下のコマンドでスタートし、初期設定ファイルを生成させます。

imqbrokerd -name broker1 -port 7676

imqbrokerd -name broker2 -port 7677 

4. MQ_VARHOME/instances/以下のbroker1ディレクトリに、broker2ディレクトリが生成されています。その直下にpropsというディレクトリがありそこにインスタンス用コンフィグファイルが入っています。
これを以下のように編集します。

broker1のconfig.properties

imq.instanceconfig.version=300
imq.brokerid=broker1
imq.cluster.ha=true
imq.cluster.clusterid=mqhamysqlcluster
imq.persist.store=jdbc
imq.persist.jdbc.dbVendor=mysql
imq.persist.jdbc.mysql.property.url=jdbc:mysql://192.168.70.128:3308,192.168.70.128:3307/openmq
imq.persist.jdbc.mysql.user=root
imq.persist.jdbc.mysql.needpassword=false
imq.persist.jdbc.mysql.property.autoReconnect=true
imq.persist.jdbc.mysql.property.failOverReadOnly=false
imq.persist.jdbc.mysql.property.autoReconnectForPools=true
imq.persist.jdbc.mysql.property.maxReconnects=1
imq.persist.jdbc.mysql.property.roundRobinLoadBalance=true
imq.persist.jdbc.mysql.tableoption=ENGINE=NDBCLUSTER
imq.persist.jdbc.connection.limit=15
imq.autocreate.destination.maxBytesPerMsg=-1
imq.autocreate.destination.maxTotalMsgBytes=-1
imq.message.max_size=-1

broker2のconfig.properties

imq.instanceconfig.version=300
imq.brokerid=broker2
imq.cluster.ha=true
imq.cluster.clusterid=mqhamysqlcluster
imq.persist.store=jdbc
imq.persist.jdbc.dbVendor=mysql
imq.persist.jdbc.mysql.property.url=jdbc:mysql://192.168.70.128:3307,192.168.70.128:3308/openmq
imq.persist.jdbc.mysql.user=root
imq.persist.jdbc.mysql.needpassword=false
imq.persist.jdbc.mysql.property.autoReconnect=true
imq.persist.jdbc.mysql.property.failOverReadOnly=false
imq.persist.jdbc.mysql.property.autoReconnectForPools=true
imq.persist.jdbc.mysql.property.maxReconnects=1
imq.persist.jdbc.mysql.property.roundRobinLoadBalance=true
imq.persist.jdbc.mysql.tableoption=ENGINE=NDBCLUSTER
imq.persist.jdbc.connection.limit=15
imq.autocreate.destination.maxBytesPerMsg=-1
imq.autocreate.destination.maxTotalMsgBytes=-1
imq.message.max_size=-1

重要なプロパティについて補足説明したいと思います。

imq.brokerid=broker2
ブローカごとにユニークにする必要があります。
ブローカ名と同じに設定すると良いでしょう。

imq.cluster.ha=true
imq.cluster.clusterid=mqhamysqlcluster
OpenMQをHAクラスタで稼動させるために必須となります。同じクラスタ内に入るブローカは全て同じ値を指定する必要があります。

imq.persist.jdbc.mysql.property.url (Connector/J属性:url)
urlでは接続対象のホスト:ポート番号をカンマ区切りで書きます。
Connector/Jの仕様ではurlに?prop=value&prop=valueという書式が可能ですが、ブローカ設定では使用できないので注意してください(無視されます)。その代わりに、imq.persist.jdbc.mysql.property.+プロパティ名=値と書けばその値を反映することが出来ます。Connector/JをAPサーバなどから使う場合はプロパティ名=値のみを設定すればOKです。

imq.persist.jdbc.mysql.property.autoReconnect=true (Connector/J属性:autoReconnect)
imq.persist.jdbc.mysql.property.failOverReadOnly=false (Connector/J属性:failOverReadOnly)
フェイルオーバのための設定です。特にfailOverReadOnly=falseを忘れるとフェイルオーバ後のMySQLサーバに対して一切更新SQLが使えなくなりますので注意が必要です。

imq.persist.jdbc.mysql.property.autoReconnectForPools=true (Connector/J属性:autoReconnectForPools)
接続プールを使用している場合に追加すべきプロパティです。これがtrueとなっているとプールから取得した接続を使用しSQLを実行する時に、その接続が前回SQLクエリ実行に失敗している場合接続テスト(内部PING)が行われます。pingが返ってこない場合、接続が内部的に更新(リコネクト)されます。

imq.persist.jdbc.mysql.property.maxReconnects=1 (Connector/J属性:maxReconnects)
ホストリストの次のホストにFailOverする前に試行する再接続回数です。

imq.persist.jdbc.mysql.property.roundRobinLoadBalance=true (Connector/J属性:roundRobinLoadBalance)
ホストリストに対してラウンドロビン方式でアクセスを行います。

imq.persist.jdbc.mysql.tableoption=ENGINE=NDBCLUSTER
OpenMQのHAストアテーブルをNDBCLUSTERストレージエンジンでCREATEします。
MySQL ClusterをHAストアに設定する場合にMUSTな定義です。

imq.persist.jdbc.connection.limit=15
OpenMQでは、MySQLにアクセスを行うために内部的に次のクラスを使用しています。
・com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
ブローカ起動時にここで設定した数の接続が作成され、接続プールに保持されます。
デフォルトは5です。mysqlクライアントのshow processlistコマンドでブローカからいくつの接続が張られているかを確認可能です。

mysql> show processlist;
+-----+-------------+-------------------+--------+---------+------+-----------------------------------+------------------+
| Id  | User        | Host              | db     | Command | Time | State                             | Info             |
+-----+-------------+-------------------+--------+---------+------+-----------------------------------+------------------+
|   1 | system user |                   |        | Daemon  |    0 | Waiting for event from ndbcluster | NULL             |
| 243 | root        | localhost         | NULL   | Query   |    0 | NULL                              | show processlist |
| 412 | root        | 192.168.70.1:3255 | openmq | Sleep   |   54 |                                   | NULL             |
| 423 | root        | 192.168.70.1:3312 | openmq | Sleep   |   64 |                                   | NULL             |
| 424 | root        | 192.168.70.1:3316 | openmq | Sleep   |   59 |                                   | NULL             |
| 425 | root        | 192.168.70.1:3320 | openmq | Sleep   |   54 |                                   | NULL             |
| 426 | root        | 192.168.70.1:3324 | openmq | Sleep   |   48 |                                   | NULL             |
| 427 | root        | 192.168.70.1:3328 | openmq | Sleep   |   43 |                                   | NULL             |
| 428 | root        | 192.168.70.1:3334 | openmq | Sleep   |   38 |                                   | NULL             |
| 429 | root        | 192.168.70.1:3339 | openmq | Sleep   |   32 |                                   | NULL             |
| 430 | root        | 192.168.70.1:3343 | openmq | Sleep   |   27 |                                   | NULL             |
| 431 | root        | 192.168.70.1:3348 | openmq | Sleep   |   22 |                                   | NULL             |
| 432 | root        | 192.168.70.1:3352 | openmq | Sleep   |   16 |                                   | NULL             |
| 433 | root        | 192.168.70.1:3361 | openmq | Sleep   |   11 |                                   | NULL             |
| 434 | root        | 192.168.70.1:3366 | openmq | Sleep   |    6 |                                   | NULL             |
| 435 | root        | 192.168.70.1:3374 | openmq | Sleep   |    0 |                                   | NULL             |
+-----+-------------+-------------------+--------+---------+------+-----------------------------------+------------------+
limit - 1の数が用意されます。

5. broker1とbroker2を停止します。初期ユーザIDとパスワードはadmin/adminとなります。

C:\OpenMQ\mq\bin>imqcmd shutdown bkr -b localhost:7676
ユーザ名: admin
パスワード: admin
指定されたブローカの停止中:

---------------------
ホスト          プライマリポート
---------------------
localhost    7676

このブローカを停止してもよろしいですか ? (y/n)[n] y

localhost:7676 でのブローカの停止を待機しています...
ブローカの停止に成功しました。


C:\OpenMQ\mq\bin>imqcmd shutdown bkr -b localhost:7677
ユーザ名: admin
パスワード: admin
指定されたブローカの停止中:

---------------------
ホスト          プライマリポート
---------------------
localhost    7677

このブローカを停止してもよろしいですか ? (y/n)[n] y

localhost:7677 でのブローカの停止を待機しています...
ブローカの停止に成功しました。

6. broker1とbroker2を起動します。

C:\OpenMQ\mq\bin>imqbrokerd -name broker1 -port 7676
[14/4/2009:21:26:03 JST]
==================================================================
Open Message Queue 4.3
Sun Microsystems, Inc.
バージョン:  4.3  (Build 7-g)
コンパイル:  Fri 11/07/2008

Copyright (c) 2007 Sun Microsystems, Inc.  All rights reserved.  Use is
subject to license terms.
==================================================================
Java ランタイム: 1.6.0_12 Sun Microsystems Inc. C:\jdk1.6.0_12\jre
[14/4/2009:21:26:03 JST]    IMQ_HOME=C:\OpenMQ\mq
[14/4/2009:21:26:03 JST] IMQ_VARHOME=C:\OpenMQ\var\mq
[14/4/2009:21:26:03 JST] Windows XP 5.1 x86 PSQ96040 (2 cpu) takemura
[14/4/2009:21:26:03 JST] Java ヒープサイズ: 最大=189376k、現在=18176k
[14/4/2009:21:26:03 JST] 引数: -name broker1 -port 7676
[14/4/2009:21:26:03 JST] [B1060]: 持続データの読み込み中...
[14/4/2009:21:26:05 JST] プラグイン持続ストアの使用:
        version=410
        brokerid=broker1
        database connection url=jdbc:mysql://192.168.70.128:3307,192.168.70.128:3308/openmq
        database user=root
[14/4/2009:21:26:05 JST] 警告 [B4239]: データベーステーブル MQVER41Cmqhamysqlcluster から持続ストアバージョンを読み込めませんでした:
java.sql.SQLException: [SELECT STORE_VERSION FROM MQVER41Cmqhamysqlcluster]: Table 'openmq.MQVER41Cmqhamysqlcluster' doesn't exist
[14/4/2009:21:26:05 JST] [B1114]: 持続的ストアが新規に作成されます...
[14/4/2009:21:26:05 JST] データベーステーブル MQVER41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:06 JST] データベーステーブル MQBKR41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:07 JST] データベーステーブル MQSES41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:08 JST] データベーステーブル MQPROP41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:10 JST] データベーステーブル MQCREC41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:11 JST] データベーステーブル MQCON41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:13 JST] データベーステーブル MQCONSTATE41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:14 JST] データベーステーブルのインデックス MQCONSTATE41CmqhamysqlclusterIDX1 を作成しています...
[14/4/2009:21:26:16 JST] データベーステーブル MQDST41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:18 JST] データベーステーブルのインデックス MQDST41CmqhamysqlclusterIDX1 を作成しています...
[14/4/2009:21:26:19 JST] データベーステーブル MQMSG41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:21 JST] データベーステーブルのインデックス MQMSG41CmqhamysqlclusterIDX1 を作成しています...
[14/4/2009:21:26:22 JST] データベーステーブル MQTXN41Cmqhamysqlcluster を作成しています...
[14/4/2009:21:26:25 JST] データベーステーブルのインデックス MQTXN41CmqhamysqlclusterIDX1 を作成しています...
[14/4/2009:21:26:29 JST] [B1039]: ブローカ "broker1@PSQ96040:7676" の準備ができました。
(broker2の起動ログは省略します)
初回起動時に関連するテーブルが存在しなければ自動的に作成されます。

MySQLテーブルは以下のようになります。

mysql> show table status;
+-------------------------------+------------+---------
| Name                          | Engine     | Version
+-------------------------------+------------+---------
| MQBKR41Cmqhamysqlcluster      | ndbcluster |      10
| MQCON41Cmqhamysqlcluster      | ndbcluster |      10
| MQCONSTATE41Cmqhamysqlcluster | ndbcluster |      10
| MQCREC41Cmqhamysqlcluster     | ndbcluster |      10
| MQDST41Cmqhamysqlcluster      | ndbcluster |      10
| MQMSG41Cmqhamysqlcluster      | ndbcluster |      10
| MQPROP41Cmqhamysqlcluster     | ndbcluster |      10
| MQSES41Cmqhamysqlcluster      | ndbcluster |      10
| MQTXN41Cmqhamysqlcluster      | ndbcluster |      10
| MQVER41Cmqhamysqlcluster      | ndbcluster |      10
+-------------------------------+------------+---------

7. Broker起動状態の確認 (imqcmd list bkr)

C:\OpenMQ\mq\bin>imqcmd list bkr
ユーザ名: admin
パスワード: admin
次のブローカが所属するクラスタ内のすべてのブローカをリストします:

---------------------
ホスト          プライマリポート
---------------------
localhost    7676

クラスタ ID       mqhamysqlcluster
クラスタは高可用性です   true

--------------------------------------------------------------------------
                                                    ブローカの ID     前回からの時間
ブローカ ID       アドレス           状態       ストア内のメッセージ   継承を実行しています   状態のタイムスタンプ
--------------------------------------------------------------------------
broker2   PSQ96040:7677   OPERATING   0                         5 minutes
broker1   PSQ96040:7676   OPERATING   0                         5 minutes

クラスタ内のブローカのリストに成功しました。

8.送受信のテスト
QK2もしくはQBrowserV2などでメッセージの送受信テストを行います。
Myはうすオリジナルツールの使い方は以下をご覧ください。
送受信のテスト
QBrowserV2(QK2の後継ツール)

QBrowserV2を使ってテストしてみます。接続先のポート番号を変更する場合は.batファイルの最後の部分を変更してください。
新規メッセージ→新規メッセージ作成を選択します。

宛先名をTESTにし、Message bodyに「broker1へ送ったメッセージ」と入力し送信ボタンを押します。

broker1(localhost:7676)にメッセージが入っていることが確認できます。

もう1つQBrowserV2を起動してbroker2(localhost:7677)に接続します。QUEUE名にTESTと入力してBrowseボタンを押しても何も出てこないことを確認します。[宛先コマンド]→[全宛先情報リスト]またはimqcmd list dst -b localhost:7677 -t q -n TESTコマンドを実行してキューの中を見てみます。

0になっていることが確認できます。ここで、broker1を強制シャットダウンし情報をbroker2に引き継がせてみたいと思います。broker1をシャットダウンするとすぐにbroker2がダウンを検知します。

[15/4/2009:22:23:56 JST] [B1214]: ブローカ broker1 が応答しません。継承を試みています
[15/4/2009:22:23:56 JST] brokerStatusChanged broker1:
        BrokerStatus[LINK_DOWN:IN_DOUBT:UP]
        BrokerStatus[LINK_DOWN:NOT_INDOUBT:DOWN]
        null
[15/4/2009:22:23:56 JST] [B1183]: Unsuspect broker1
[15/4/2009:22:23:56 JST] [B1184]: Unsuspected /192.168.11.9:7676 [brokerID=broker1, brokerSession=8722663960158640128] (seq#=0, ts=1239774656921, i
[15/4/2009:22:23:56 JST] [B1186]: broker1 へのハートビートを停止します
[15/4/2009:22:23:56 JST] [B1182]: ハートビートエンドポイント /192.168.11.9:7676 [brokerID=broker1, brokerSession=8722663960158640128] (seq#=0, ts=1
[15/4/2009:22:23:56 JST] [B1216]: ブローカ broker1 のストアの継承を試みています
[15/4/2009:22:23:56 JST] [B1175]: このブローカはブローカ [brokerID=broker1, storeSession=8722663960158640128] を継承しようとしています
[15/4/2009:22:23:56 JST] [B1168]: 障害の発生したブローカ broker1 の継承ロックが取得されました (タイムスタンプ: 1239774656921)
[15/4/2009:22:23:56 JST] state = FAILOVER_PENDING broker1
[15/4/2009:22:23:56 JST] state = FAILOVER_STARTED broker1
[15/4/2009:22:23:57 JST] ブローカ broker1 から 0 個のローカル送信先を継承中です: []
[15/4/2009:22:23:57 JST] ブローカ broker1 から 1 個のメッセージを継承中です
[15/4/2009:22:23:57 JST] ブローカ broker1 から 0 個のトランザクションを継承中です
[15/4/2009:22:23:57 JST] ブローカ broker1 から 0 個のリモートトランザクションを継承中です
[15/4/2009:22:23:57 JST] ブローカ broker1 から 3 個のストアセッションを継承中です: [7125574942207197952, 8722663960158640128, 2586509467726251264]
[15/4/2009:22:23:57 JST] state = FAILOVER_COMPLETE broker1
[15/4/2009:22:23:57 JST] [B1217]: ブローカ broker1 の継承が成功しました。そのブローカが所有するデータと状態情報を処理しています
[15/4/2009:22:23:57 JST] [B1218]: ブローカ broker1 からの 0 トランザクションを処理しています
[15/4/2009:22:23:57 JST] [B1297]: ブローカ broker1 から 0 個のリモートトランザクションを処理しています
[15/4/2009:22:23:57 JST] monitoring 0 transactions
[15/4/2009:22:23:57 JST] [B1283]: 継承後に 0 のトランザクションを処理しています
[15/4/2009:22:23:57 JST] [B1221]: ブローカ broker1 からの 1 メッセージを処理しています
[15/4/2009:22:23:57 JST] Loading message 23-192.168.11.9(ff:e4:53:af:d7:4f)-2513-1239774044828 on Q:TEST
[15/4/2009:22:23:57 JST] attempting to set Message Bytes Limit to 10485760K for destination TEST [キュー]
[15/4/2009:22:23:57 JST] attempting to set Message Count Limit to 100000 for destination TEST [キュー]
[15/4/2009:22:23:57 JST] attempting to set Message Size Limit to 10240K for destination TEST [キュー]
[15/4/2009:22:23:57 JST] Loading Stored destination TEST [キュー] connectionUID=null
[15/4/2009:22:23:57 JST] [B1151]: 1 メッセージとともに送信先 TEST [キュー] を読み込み
[15/4/2009:22:23:57 JST] [B1152]: 送信先 TEST [キュー] の読み込み完了
[15/4/2009:22:23:57 JST] [B1196]: 送信先 TEST [キュー] で 1 メッセージを処理します
[15/4/2009:22:23:57 JST]  Message 23-192.168.11.9(ff:e4:53:af:d7:4f)-2513-1239774044828 has 1 consumers
[15/4/2009:22:23:57 JST] loadTakeoverMsgs: lookup 23-192.168.11.9(ff:e4:53:af:d7:4f)-2513-1239774044828:[consumer:0, type=NONE] found tid=null
[15/4/2009:22:23:57 JST] non-transacted: Routing Message 23-192.168.11.9(ff:e4:53:af:d7:4f)-2513-1239774044828 to 1 consumers:[consumer:0, type=NON
[15/4/2009:22:23:57 JST] [B1223]: broker1 の継承処理が完了しました
[15/4/2009:22:23:57 JST] [B1177]: ブローカ [brokerID=broker1, storeSession=8722663960158640128] のブロードキャスト継承が完了しました...
[15/4/2009:22:23:57 JST] Processing G_TAKEOVER_COMPLETE(41)

broker2のTESTキューを見てみるときちんとメッセージが継承されて来ているのがわかります。

上記はあくまでメッセージの継承動作の説明のためのものです。broker1をわざわざdownさせてbroker2へ継承させずともJMSクライアントは普通にbroker1のメッセージをbroker2からレシーブすることが可能です。以下のようなプログラムを作成して試してみます。プログラムを実行する前にbroker1(localhost:7676)に対してメッセージを送っておきます。(broker1,broker2共に生きている状態です)

com.sun.messaging.ConnectionFactory conFactory = new com.sun.messaging.ConnectionFactory();
conFactory.setProperty(ConnectionConfiguration.imqAddressList, "localhost:7677");

javax.jms.QueueConnection tcon = conFactory.createQueueConnection("admin","admin");
tsession = tcon.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
tcon.start();

javax.jms.Queue queue = tsession.createQueue("TEST");
MessageConsumer receiver = tsession.createConsumer(queue);
TextMessage tmessage = (TextMessage)receiver.receive();

receiver.close();
tsession.close();
tcon.close();

[結果]
broker2へ接続してもbroker1のメッセージが取得できました。

broker1に送ったメッセージですよ。

9. MySQL ClusterのSQLノードがダウンした場合
SQLノードは2重化してありますので、MQの稼動に問題は生じません。(Connector/Jのフェイルオーバ機能で活動中のSQLノードに自動でコネクトされます。フェイルオーバ中にアクセスしてきたJMSクライアントには例外が返されます。これはアプリ側で処理する必要があります。設定によってフェイルオーバ完了までに時間の差が生じますので必要に応じて調整を行ってください。以下のメッセージがブローカログに出てくればSQLノードのフェイルオーバが完了しています。

jdbc:mysql://192.168.70.128:3308,192.168.70.128:3307/openmq へのデータベース接続が再確立されました。

MySQL ClusterやOpen MQに関するご相談はSUN-PSまでお寄せください。設計、構築、アプリ開発、技術支援などに既に多数のお客様よりご好評いただいております。MySQLメニューについてはこちらをご覧ください。

日曜日 11 09, 2008

以前ご紹介したキューデータ管理ツールQK2の後継ソフトウエアQBrowserV2をアップしました。
これまでのメッセージデータ操作機能に加えて、OpenMQ自体の管理・監視、任意のコマンド入力などが出来るようになりました。

対応するOpen MQ/SJS MQのバージョンは以下の通りです。

Open MQのバージョンサポートOK?
MQ3.7
MQ4.0
MQ4.1
MQ4.2
MQ4.3

※AS9.1V2(GlassFish V2)→MQ4.1がバンドルされています

[2009/04/18更新]
V2.2.0をリリースしました。変更点等についてはこちらをご覧ください。

まずは以下からダウンロードしてください。

ダウンロードしたQBrowserV2_43.zipを適当なフォルダに展開します。中から出てきたrun.batをダブルクリックするとQBrowserV2が起動します。

#QBrowserV2はまい・はうすが開発/提供する管理・テスト支援ツールのサンプルです。AS-ISでの提供となりますのでご了承願います。
#QBrowserV2 is a sample tool for queue data and broker administration/testing, not a Sun official tool. Please make sure that no warranty would be provided with the tool.

MQが起動しているかどうかを確認して(ログまたは、プロセスにて)から解凍した直下に出てくる、run.batをダブルクリックします(Windows環境の場合。UNIX環境ではrun.shを使用してください。)するとMQが正常に稼動していれば下のようなツールの画面が起動します。#javaがpathに入っているか確認してください

[リモートで稼動するMQへの接続方法]
・ローカルホスト/ポート番号7676以外で稼動するMQに接続したい場合は、run.batをnotepadなどで編集して、IPアドレスの部分をつなげたいMQの存在するマシンのIPアドレス、7676の部分を使用しているポート名に変更してください。例:java -Xms256m -Xmx512m -cp .\QBrowserV2_MQ43.jar;.\imq.jar;.\jms.jar QBrowserV2 -b 129.158.34.188 -p 7679


このツールの主な機能は以下になります。

・現在ブローカが管理している全てのキューをリストボックス中に表示
・特定のキューに入っているメッセージ一覧を表示
・メッセージ詳細表示&ダウンロード
・1件または複数選択しメッセージ削除
・新規メッセージ送信(送信回数指定可能、JMSプロパティ・ユーザプロパティも指定可能)


上記のQK2機能に追加して以下の機能が追加されました。

・照会コマンドメニューの追加
・宛先コマンドメニューの追加
・トランザクションメニューの追加
・コマンドメニューの追加



では、ご照会をば。
[新機能について]

・照会コマンドメニュー

- コネクションリスト
 現在のブローカ上に接続されている全てのコネクションを一覧表示します。
 どのくらい接続が張られているかを確認できます。

- サービスリスト
 現在のブローカ上の全てのサービスを一覧表示します。
 サービスが稼動しているかを確認できます。

- サービス詳細照会
 jmsサービスの詳細情報を表示します。

- ブローカ詳細照会
 ブローカの詳細プロパティ情報を表示します。

- ConfigPrinter
現在ブローカ中で有効になっているプロパティを全て表示します。
設定の詳細確認や反映確認に便利です。

・宛先コマンドメニュー

- 全宛先情報リスト
 現在のブローカが保持している、全ての宛先(キュー、トピック)の情報を表示します。メッセージ数やUnAck数などを確認できます。

- 現在表示されている宛先詳細情報
現在、宛先窓に表示されている宛先の詳細情報を表示します。宛先の設定情報、メッセージの送信数などを確認できます。

- 現在表示されている宛先のパージ
現在、宛先窓に表示されている宛先中にある全メッセージをパージ(消去)します。
本当にパージするか聞いてくるのでパージしたい場合はOKボタンを押してください。
宛先の定義自体は破棄されません。

・トランザクションメニュー

- フィルタTxnリスト
 ブローカが管理しているトランザクションのうち、指定したステータスのものだけを抽出して表示します。
たとえば、全てを表示すると非常にたくさんのトランザクションが表示されてしまう場合、しかかり中のINCOMPLETE状態のトランザクションのみ表示可能です。更新ボタンを押せば、同一コマンドを再実行してくれます。特定の状態のトランザクションを監視する場合更新ボタンを使えば、フィルタの再選択は必要ありません。

- 全トランザクションリスト
  ブローカが管理している全てのトランザクションを表示します。

・コマンドメニュー

- コマンド入力ウインドウ
 imqcmdをこのツールから入力可能です。次のような便利機能を実装しています。
1. 現在接続しているブローカを自動的にターゲットに設定
2. ユーザ名とパスワードを指定する必要なし(自動的にツールが補完します)
3. ドロップダウンリストで、現在宛先窓に表示されている宛先に対する様々なテンプレートを表示。テンプレートを選択するとコマンド入力フィールドに自動入力されます。


特定の宛先を消去(定義とデータ内容両方)したい場合は、このウインドウのテンプレートからdestroy dst...を選択すればOKです。

  4. パフォーマンスメトリックコマンドを入力すると、結果を自動更新する(更新ボタンを押す必要なし)

自分が使っていてなんとなく欲しいなという機能を追加してみました。
(HermesJMSとはまた違った趣ですが・・・)

金曜日 10 10, 2008

日々進化を遂げているOpen MQですが、その最新版となるOpen MQ 4.3のプレリリース版が公開されています。以下のリンクよりダウンロード可能です。

https://mq.dev.java.net/4.3.html#download

使用感はOpen MQ4.1の頃とあまり変わってはいないのですが、大きな機能追加点は以下となります。

・Universal Message Service(UMS)機能の追加
・サポート対象の拡充 (AIX v6.1以上、Oracle 11g、Windows Vista、Windows Server 2008)
・HermesJMS統合 (汎用JMS管理GUIコンソール)
・STOMP(Streaming Text Oriented Messaging Protocol)プロトコル対応

興味深いのはUMS機能の追加ですね。モジュールを見てみたところブローカにhttpサーバ機能を持たせて、httpプロトコルが使えるならばどんなクライアントからもメッセージのやりとりが出来るようになる技術のようです。(間にアプリケーションサーバのインスタンスを立ち上げるような形ではない)

httpさえ扱えれば良いので、Cとか.Netはもちろんのこと、html-AJAXとかその他の技術から簡単にOpen MQにメッセージを投げたり/受け取ったりが出来るようになります。なお、httpリクエスト形式はRESTです。

こちらにサンプルがありますので、試してみると面白いと思います。大まかな説明はこちらを参照してください。

あと、こちらのブログで開発しておりますOpen MQ用管理ツールQK2なのですがその後結構アップデートしていますのでそのうち紹介できればと思っております。連休中に準備します・・・

火曜日 11 13, 2007

前回は設定済のHADBデータベースをMQ4.1の永続ストアとして使用する方法を説明しました。
今回は、1つのマシンだけではなく他のマシンにもHADBのノードを追加して可用性をアップしたいと思います。

前回までは1つのマシンにHADBのデータ冗長ユニット(DRU)を作成しました。こちらの構成ですと、ハードウエア障害が発生してマシンごとダウンしてしまった場合にHADBはデータベースとしてサービスを継続することができなくなります。このような状況になってもHADBのサービスを継続できるように以下の手順で他のマシンにHADBのノードを追加します。

1.他マシンにHADBをインストールする。(インストール手順は第11回で説明しています
2.新しくHADBをインストールしたマシン上にHADBのノードを追加する
以下のコマンドを発行します。

-bash-3.00#cd /opt/SUNWappserver/appserver/hadb/4.5/bin

-bash-3.00# ./hadbm addnodes --spares=2 --hosts 129.158.34.187,129.158.34.187 hastore
Please enter the password for the database system user:***********
WARNING: The --dbpassword option is deprecated since it is insecure.
Using this option can compromise your password. Please use either the
Please enter the password for the admin system user:***********
Nodes 129.158.34.187,129.158.34.187 successfully added to database hastore.

※--spares=2の部分
スペアに指定できるノードの数は、全ノード数未満の数でかつ、偶数
(今回はhost1に2ノード、host2に2ノード、合計4ノードあるので、
2こまでのスペアを作成可能

3.HADBのステータスを確認してみる

-bash-3.00#cd /opt/SUNWappserver/appserver/hadb/4.5/bin

-bash-3.00# ./hadbm status hastore
Please enter the password for the admin system user:***********
Database Status
hastore  HAFaultTolerant

これで、HADBのデータベースに新しくHADBノードが追加されました。

/hadbm get --all hastore

コマンドで、JDBC URLの部分に新しく追加されたノードがあるか確認してください。

さあ、これであなたのHADBデータベースは複数のマシンに分散され、障害への耐久性が飛躍的に向上しました!

以下のテストシナリオで、今回の構成がDBサーバの電源オフにも耐えられることを確認してみてください。
1.MQへデータの送受信を行う
2.DBサーバのうちどちらか1つの電源を切る/OSをシャットダウンするなどする
3.MQのキュー中にあるデータがきちんと残っていることを確認

なお、片方のDBサーバをシャットダウンするとHADBのステータスはFaultTolerantへ降格します。
(スペアを使い切った場合。スペアの数が十分にあればHAFaultTolerantのまま)

次回はCAPS(Sun Seebeyond)で、Sun Java System MQを使う方法を説明したいと思います。

金曜日 10 26, 2007

前回はHADB自体の設定を行いました。
今回はMQ側をHADBを使うように設定してみたいと思います。

MQ側のコンフィグ設定

1.HADBのJDBCURLを取得する

-bash-3.00# ./hadbm get --all hastore
Please enter the password for the admin system user:***********
2007-10-04 06:52:48.394 INFO    hadbm get --all=true --quiet=false --version=false --yes=false --force=false --echo=false
Attribute             Value
ConnectionTrace       false
CoreFile              false
DataBufferPoolSize    200
DataDeviceSize        1024
DevicePath            /opt/SUNWappserver/hadb/4.4.3-6/device
EagerSessionThreshold 50
EagerSessionTimeout   120
EventBufferSize       0
HistoryPath           /opt/SUNWappserver/hadb/4.4.3-6/history
InternalLogBufferSize 12
JdbcUrl               jdbc:sun:hadb:129.158.34.188:15005,129.158.34.187:15045,129.158.34.188:15025,129.158.34.187:15065
LogBufferSize         48
MaxTables             1100
NumberOfDataDevices   1
NumberOfLocks         50000
NumberOfSessions      100
PackageName           V4.4.3.6
PortBase              15000
RelAlgDeviceSize      128
SessionTimeout        1800
SQLTraceMode          none
StartRepairDelay      20
StatInterval          600
SysLogFacility        local0
SysLogLevel           WARNING

2.これの以下の部分をNotepadなどにメモしておく
JdbcUrl               jdbc:sun:hadb:129.158.34.188:15005,129.158.34.187:15045,129.158.34.188:15025,129.158.34.187:15065

3.config.propertiesに以下を設定
config.propertiesは、

<<MQインストールフォルダ>>\mq\var\instances\<<ブローカ名>>\\props

フォルダにあります。もし<<ブローカ名>>フォルダがまだ存在しない場合には以下のコマンドで
ブローカ定義を作ってください
#UNIXは
/var/imq/instances/ブローカ名/props

にあります。

コマンドの例

cd C:\software\MQ4.1\mq\bin
imqbrokerd -name broker1 -port 7676

config.properties中の最後の部分に以下を設定

imq.instanceconfig.version=300
imq.brokerid=broker1
imq.persist.store=jdbc
imq.persist.jdbc.dbVendor=hadb
# Replace 'server list' with your comma-separated list of servers.
imq.persist.jdbc.hadb.property.serverList=129.158.34.188:15005,129.158.34.187:15045,129.158.34.188:15025,129.158.34.187:15065
# Replace username.
imq.persist.jdbc.hadb.user=system
imq.persist.jdbc.hadb.needpassword=true
imq.persist.jdbc.hadb.password=adminadmin

・imq.persist.jdbc.hadb.property.serverListにはさきほどメモしておいたJDBCURLを「jdbc:sun:hadb:」を抜いた形で指定します。

broker2用

imq.instanceconfig.version=300
imq.brokerid=broker2
imq.persist.store=jdbc
imq.persist.jdbc.dbVendor=hadb
# Replace 'server list' with your comma-separated list of servers.
imq.persist.jdbc.hadb.property.serverList=129.158.34.188:15005,129.158.34.187:15045,129.158.34.188:15025,129.158.34.187:15065
# Replace username.
imq.persist.jdbc.hadb.user=system
imq.persist.jdbc.hadb.needpassword=true
imq.persist.jdbc.hadb.password=adminadmin

broker3用

imq.instanceconfig.version=300
imq.brokerid=broker3
imq.persist.store=jdbc
imq.persist.jdbc.dbVendor=hadb
# Replace 'server list' with your comma-separated list of servers.
imq.persist.jdbc.hadb.property.serverList=129.158.34.188:15005,129.158.34.187:15045,129.158.34.188:15025,129.158.34.187:15065
# Replace username.
imq.persist.jdbc.hadb.user=system
imq.persist.jdbc.hadb.needpassword=true
imq.persist.jdbc.hadb.password=adminadmin

4.<<MQインストールフォルダ>>\mq\lib\extにhadbjdbc4.jarをコピーする

コピー先例:C:\software\MQ4.1\mq\lib\ext

#Unixでは/usr/share/lib/imq/ext

hadbjdbc4.jarの格納場所は9.1withHADBの<<インストールディレクトリ>>\hadb\4.4.3-6\lib

例:
C:\Sun\AppServer91withHADB\hadb\4.4.3-6\lib
#UNIXでは
/opt/SUNWappserver/hadb/4.4.3-6/lib

5.Q4.1を起動します

C:\Sun\MQ4.1\mq\bin>imqbrokerd -name broker1 -port 7676 -tty
[22/9/2007:23:56:59 JST]
==================================================================
Sun Java(tm) System Message Queue 4.1
Sun Microsystems, Inc.
バージョン:  4.1  (Build 36-e)
コンパイル:  Thu 07/26/2007

Copyright (c) 2007 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
==================================================================
Java ランタイム: 1.5.0_12 Sun Microsystems Inc. D:\jdk1.5.0_12\jre
[22/9/2007:23:56:59 JST] ライセンス: Sun Java(tm) System Message Queue 4.1 Enterprise Edition
[22/9/2007:23:56:59 JST]    IMQ_HOME=C:\Sun\MQ4.1\mq
[22/9/2007:23:56:59 JST] IMQ_VARHOME=C:\Sun\MQ4.1\mq\var
[22/9/2007:23:56:59 JST] Windows XP 5.1 x86 psq96026.Japan.Sun.COM (1 cpu) Administrator
[22/9/2007:23:56:59 JST] Java ヒープサイズ: 最大=194432k、現在=16256k
[22/9/2007:23:56:59 JST] 引数: -tty
[22/9/2007:23:56:59 JST] [B1203]: broker1 のブローカ ID から開始します
[22/9/2007:23:56:59 JST] [B1004]: 最小スレッド 1 および最大スレッド 1 と tcp [ 7676, 50, * ] を使用して portmapper サービスを開始します
[22/9/2007:23:56:59 JST] [B1060]: 持続データの読み込み中...
[22/9/2007:23:57:01 JST] プラグイン持続ストアの使用:
        version=410
        brokerid=broker1
        database connection url=129.158.34.188:15005,129.158.34.188:15025
        database user=system
[22/9/2007:23:57:01 JST] [B1170]: プラグイン持続ストアの自動作成が有効です
[22/9/2007:23:57:01 JST] 警告 [B4239]: データベーステーブル MQVER41Sbroker1 から持続ストアバージョンを読み込めませんでした:
java.sql.SQLException: [SELECT STORE_VERSION FROM MQVER41Sbroker1]: HADB-E-11701: Table mqver41sbroker1 not found
[22/9/2007:23:57:01 JST] [B1114]: 持続的ストアが新規に作成されます...
[22/9/2007:23:57:01 JST] データベーステーブル MQVER41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQBKR41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQSES41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQPROP41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQCREC41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQCON41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQCONSTATE41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQDST41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQMSG41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] データベーステーブル MQTXN41Sbroker1 を作成しています...
[22/9/2007:23:57:02 JST] [B1041]: クラスタの初期化に成功しました。
[22/9/2007:23:57:02 JST] [B1004]: 最小スレッド 1 および最大スレッド 1 と tcp [ 0, 100 ] を使用して cluster_discovery サービスを開始します
[22/9/2007:23:57:02 JST] [B1136]: ストアードトランザクションの処理中
[22/9/2007:23:57:02 JST] [B1284]: 0 のクラスタトランザクションが PREPARED 状態のままですが、0 は COMMITTED 状態にあり、リモートブローカが完了するのを待っています
[22/9/2007:23:57:02 JST] 0 のリモートトランザクションのうち、0 が PREPARED 状態、0 が COMMITTED 状態にあります
[22/9/2007:23:57:02 JST] [B1013]: キューの自動作成が有効です
[22/9/2007:23:57:02 JST] [B1144]: デッドメッセージキューの作成中
[22/9/2007:23:57:02 JST] [B1158]: 管理者が送信先 mq.sys.dmq [キュー] を作成しました
[22/9/2007:23:57:03 JST] [B1239]: プラットフォーム MBean サーバーを使用します
[22/9/2007:23:57:03 JST] JESMF classes not present - JESMF support will not be enabled.
[22/9/2007:23:57:03 JST] JMX コネクタサーバー jmxrmi は URL service:jmx:rmi://psq96026/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjEyOS4xNTAuMTU0LjI5AAAHJQAAAAAAAAAACB+VdgAAARUtuL/XgAAAeA== で正常に起動しました
[22/9/2007:23:57:04 JST] [B1004]: 最小スレッド 4 および最大スレッド 10 と tcp(host = *, port=0, mode=dedicated) を使用して admin サービスを開始します
[22/9/2007:23:57:04 JST] [B1227]: admin サービス接続認証に file ユーザーリポジトリを使用します
[22/9/2007:23:57:04 JST] [B1004]: 最小スレッド 10 および最大スレッド 1000 と tcp(host = *, port=0, mode=dedicated) を使用して jms サービスを開始します
[22/9/2007:23:57:04 JST] [B1227]: jms サービス接続認証に file ユーザーリポジトリを使用します
[22/9/2007:23:57:04 JST] [B1004]: 最小スレッド 1 および最大スレッド 1 と tcp [ 0.0.0.0/0.0.0.0:1832 ] を使用して cluster サービスを開始します
[22/9/2007:23:57:04 JST] [B1228]: クラスタの ping 間隔は 60 秒です
[22/9/2007:23:57:04 JST] [B1039]: ブローカ "imqbroker@psq96026.Japan.Sun.COM:7676" の準備ができました。

同様にbroker2とbroker3のインスタンスも起動します。

C:\Sun\MQ4.1\mq\bin>imqbrokerd -name broker2 -port 7677 -tty
C:\Sun\MQ4.1\mq\bin>imqbrokerd -name broker3 -port 7678 -tty

6.QK2などのツールにてテストします。

MQ稼動中に、HADBの片方のノードをストップさせるなど
可用性をテストしてみてください。

次回は、HADBのノードを別の物理マシンに追加してOSレベルまたはハードウエアでの障害に対応できるように
HADBを設定してみたいと思います。

月曜日 10 22, 2007

前回はHADBをマシンにインストールしてみました。今回はインストールしたHADB上にドメインとDBを作成して
HADBをFaultTorelant状態に持っていくまでを説明します。
(まだ、1つのマシンにしかノードは作成しません)

[参考:HADBの対障害ステータスについて]
以下の6つのステータスのどれかになります。
・HAfaultTolerant
・FaultTolerant
・Operational
・Non Operational
・Stopped
・Unknown

[各ステータスの説明]
・HAfaultTolerant
DBはフォールトトレラント(対障害状態)にあり、スペアノードがDRU(冗長ユニット)1つにつき最低1つあります。
スペアノードがあると、ノードのペアのうちどちらかが破壊されてもOperational状態に落ちずに
破壊されたノードの代わりにスペアノードが本ノードに「昇格」してサービスを続けます。
スペアを全て使ってしまった場合はHADBのステータスはFaultTolerantになります。

・FaultTolerant
DRUの全てのミラーノードのペアが正常に稼動している状態です。FaultTolerant状態ではどこかのノードに障害が発生するとペアを維持できなくなりますが、サービス自体には影響はありません。FaultTolerant状態で片方のノードに障害が起きた場合はHADBのステータスはOperationalとなります。

・Operational
ミラーノードのどちらか一方だけ稼動している状態です。この状態のまま稼動中のノード(既に相方を失っている)がクラッシュするとサービスが停止してしまいます。早急にFaultTolerantより上の状態に戻す必要があります。

・Non Operational
DRU間でノードのペアが丸ごとダウンしている状態です。この状態ではDBはサービスを行うことができません。

・Stopped
DB中で稼動しているノードが1つも存在しない状態です。DB起動前または、hadbm stopコマンドが完了するとこの状態になります。

・Unknown
状態が不明の場合です。

#今回の設定ですと同じマシンにDRUを2つインストールしてしまうので、HADBをインストールしたマシンがクラッシュするとHADBのサービスを継続することができなくなります。
マシンのクラッシュではなく、片方のノードのプロセス障害の場合はHADBは何ら問題なくサービスを提供することができます。
次回、他の物理マシンにもノードを追加して片方のマシンクラッシュに対応できる構成を説明します。

[設定概要]
0.マネージメントエージェントの起動
1.HADBドメインを作成
2.DBをドメイン中に作成
3.SQLでのテスト

0.MAがインストール・起動していなければインストールと起動
windows

cd C:\Sun\HADB\hadb\4.4.3-6\bin
ma -i ma.cfg
net start HADBMgmtAgent

solaris

cd /opt/SUNWappserver/hadb/4/bin
./ma-initd start

マネージメントエージェントとは、HADBの各ノードの管理と監視を行うプロセスです。hadbmコマンドを発行する場合はMAを起動しておく必要があります。

1.マネージメントドメインの作成
windows

hadbm createdomain --adminpassword=adminadmin localhost

solaris

./hadbm createdomain --adminpassword=adminadmin 129.158.34.188

マネージメントドメインはどのホストにDBノードを載せることができるかを管理しています。ノードを作成したい全てのホスト名/IPアドレスがマネージメントドメインに含まれている必要があります。(作成後にhadbm extenddomainコマンドでホストを増やすこともできます)

2.DBの作成

windows

hadbm create --devicesize 1024 --hosts testhost1,testhost1

solaris

./hadbm create --devicesize 1024 --hosts 129.158.34.188,129.158.34.188

--hostsには、HADBのノードをどのホスト(マシン)に作成するかを指定します。
今回は最初の設定ですので、同一マシンに2つのDRUを載せるように設定してみます。この場合は同じホスト名を2回、カンマで区切って指定します。(4つ指定したい場合は4つホスト名をカンマで区切って指定します)。ノードはかならず2以上の偶数で指定する必要があります。

-bash-3.00# ./hadbm create --devicesize 1024 --hosts 129.158.34.188,129.158.34.188
Please enter the password for the database system user:***********
Please retype the password for database system user:***********
WARNING: The --dbpassword option is deprecated since it is insecure. Using this option can compromise your password. Please use either the command prompt or the --dbpasswordfile option.
Please enter the password for the admin system user:***********
2007-09-22 15:59:48.145 INFO    hadbm create --devicesize=1024 --hosts=129.158.34.188,129.158.34.188 --datadevices=1 --no-cleanup=false --no-clear=false --quiet=false --version=false --yes=false --force=false --echo=false --dbpassword=******
2007-09-22 16:00:03.322 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.data-0.1 for node hadb:1
2007-09-22 16:00:03.323 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.noman.1 for node hadb:1
2007-09-22 16:00:03.323 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.relalg.1 for node hadb:1
2007-09-22 16:00:03.324 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.nilog.1 for node hadb:1
2007-09-22 16:00:03.331 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.noman.0 for node hadb:0
2007-09-22 16:00:03.383 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.data-0.0 for node hadb:0
2007-09-22 16:00:03.425 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.nilog.0 for node hadb:0
2007-09-22 16:00:03.450 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hadb.relalg.0 for node hadb:0
2007-09-22 16:00:39.767 INFO    Starting node hadb:1 at level firststart, config version 1, in order to start database
2007-09-22 16:00:39.796 INFO    n:1 NSUP   INF 2007-09-22 16:00:39.795 p:4417 Legal realtime priorities are 0 (lowest) to 59 (highest) set it to:29
2007-09-22 16:00:42.431 INFO    Starting node hadb:0 at level firststart, config version 1, in order to start database
2007-09-22 16:00:42.492 INFO    n:0 NSUP   INF 2007-09-22 16:00:42.491 p:4420 Legal realtime priorities are 0 (lowest) to 59 (highest) set it to:29
Database hadb successfully created and started.

db名をhadbで作成する場合

./hadbm create --devicesize 1024 --hosts 129.158.34.188,129.158.34.188

db名をhastoreで作成する場合

-bash-3.00# ./hadbm create --devicesize 1024 --hosts 129.158.34.188,129.158.34.188 hastore
Please enter the password for the database system user:***********
Please retype the password for database system user:***********
WARNING: The --dbpassword option is deprecated since it is insecure. Using this option can compromise your password. Please use either the command prompt or the --dbpasswordfile option.
Please enter the password for the admin system user:***********
2007-09-22 16:11:13.303 INFO    hadbm create --devicesize=1024 --hosts=129.158.34.188,129.158.34.188 --datadevices=1 --no-cleanup=false --no-clear=false --quiet=false --version=false --yes=false --force=false --echo=false --dbpassword=****** hastore
2007-09-22 16:11:28.130 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.nilog.0 for node hastore:0
2007-09-22 16:11:28.130 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.relalg.0 for node hastore:0
2007-09-22 16:11:28.131 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.noman.0 for node hastore:0
2007-09-22 16:11:28.131 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.data-0.0 for node hastore:0
2007-09-22 16:11:28.155 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.noman.1 for node hastore:1
2007-09-22 16:11:28.156 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.relalg.1 for node hastore:1
2007-09-22 16:11:28.198 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.nilog.1 for node hastore:1
2007-09-22 16:11:28.250 INFO    Initializing device /opt/SUNWappserver/hadb/4.4.3-6/device/hastore.data-0.1 for node hastore:1
2007-09-22 16:12:04.795 INFO    Starting node hastore:0 at level firststart, config version 1, in order to start database
2007-09-22 16:12:04.833 INFO    n:0 NSUP   INF 2007-09-22 16:12:04.833 p:5055 Legal realtime priorities are 0 (lowest) to 59 (highest) set it to:29
2007-09-22 16:12:07.033 INFO    Starting node hastore:1 at level firststart, config version 1, in order to start database
2007-09-22 16:12:07.060 INFO    n:1 NSUP   INF 2007-09-22 16:12:07.060 p:5060 Legal realtime priorities are 0 (lowest) to 59 (highest) set it to:29
Database hastore successfully created and started.

DBの作成が完了したら、HADBデータベースを起動します。
hadbm start データベース名
./hadbm start hastore

HADBデータベースを停止する必要がある場合は停止コマンドを入力します。
hadbm stop データベース名

./hadbm stop hastore

以下のコマンドでHADBの各種設定を照会することができます。

-bash-3.00# ./hadbm get --all hastore
Please enter the password for the admin system user:***********
2007-09-22 16:15:32.138 INFO    hadbm get --all=true --quiet=false --version=false --yes=false --force=false --echo=false hastore
Attribute             Value
ConnectionTrace       false
CoreFile              false
DataBufferPoolSize    200
DataDeviceSize        1024
DevicePath            /opt/SUNWappserver/hadb/4.4.3-6/device
EagerSessionThreshold 50
EagerSessionTimeout   120
EventBufferSize       0
HistoryPath           /opt/SUNWappserver/hadb/4.4.3-6/history
InternalLogBufferSize 12
JdbcUrl               jdbc:sun:hadb:129.158.34.188:15005,129.158.34.188:15025
LogBufferSize         48
MaxTables             1100
NumberOfDataDevices   1
NumberOfLocks         50000
NumberOfSessions      100
PackageName           V4.4.3.6
PortBase              15000
RelAlgDeviceSize      128
SessionTimeout        1800
SQLTraceMode          none
StartRepairDelay      20
StatInterval          600
SysLogFacility        local0
SysLogLevel           WARNING
SysLogPrefix          hadb-hastore
TakeoverTime          10000

HADB内に定義されているドメインを照会してみましょう。

-bash-3.00# ./hadbm listdomain
Please enter the password for the admin system user:***********
2007-09-22 16:19:01.400 INFO    hadbm listdomain --quiet=false --version=false --yes=false --force=false --echo=false
Hostname                         Enabled? Running? Release  Interfaces
testhost1.japan.sun.com Yes      Yes      V4-4-3-6 129.158.34.188

hadbm statusコマンドにて、hadbのサービスの状態を照会することができます。

-bash-3.00# ./hadbm status hastore
Please enter the password for the admin system user:***********
2007-09-22 16:20:30.024 INFO    hadbm status --nodes=false --quiet=false --version=false --yes=false --force=false --echo=false hastore
Database Status
hastore  FaultTolerant

./hadbm get --all hastoreの結果から、JDBCURLを取得する
以下の部分にノードのホスト名/IP:ポート番号が出力されています。
後ほど、MQ側でHADBに接続するときに必要になる文字列です。

JdbcUrl               jdbc:sun:hadb:129.158.34.188:15005,129.158.34.188:15025

[HADBのテスト]

HADBが正常に設定され、DBが作成されてアクセス可能かをテストしてみます。
clusqlユーティリティを使用します。

[clusqlについて]
hadbmには、SQLコマンドインターフェイスとして、clusqlユーティリティが添付されています。
#Oracleで言うところのSQLPlus、Java DBで言うところのIJに相当するものです(詳細機能は違いますが)

hadbmユーティリティがあるのと同じディレクトリへ移動して以下のコマンドを発行します。

./clusql ホスト名:ポート番号(hadbm get --all hastoreで表示されたJDBCURL)

ユーザ名:system
パスワード(デフォルトを変更していない場合):adminadmin

-bash-3.00# ./clusql 129.158.34.188:15025
User name : system
Password  :
SQL: select * from sysroot.alltables;

   schemaid     tableid schemaname                       tablename

          0         302 sysroot                          systbldsc
          0         303 sysroot                          systbldef
          0         304 sysroot                          systbt
          0         308 sysroot                          syslnk
          0         309 sysroot                          syshgh
          0         310 sysroot                          sysacc
          0         104 sysroot                          krnprocedures
          0         105 sysroot                          krnnodes
          0         109 sysroot                          krnnodegroupnodes
          0         301 sysroot                          systbl
          0         305 sysroot                          systbtatt
          0         306 sysroot                          systbtdef
          0         307 sysroot                          sysusr
          0         311 sysroot                          sysnix
          0         312 sysroot                          sysviw
          0         313 sysroot                          sysviwcol
          0         101 sysroot                          krntables
          0         102 sysroot                          krnfragments
          0         103 sysroot                          krnreplicas
          0         106 sysroot                          krnredundancyunits
          0         107 sysroot                          krnsites
          0         108 sysroot                          krnnodegroups

HADB-I-11930: Selected 22 row(s)

これでHADBの設定は完了です。
管理ドメインが作成され、hastoreというDBがMQの永続ストア用に用意されました。
次回はMQ4.1をこのHADBを永続ストアに利用するように設定してみます。

金曜日 10 19, 2007

前回は永続ストアとしてJavaDBを利用してHAクラスタを構成しました。
今回はいよいよ本命のHADBを使って、DB部分の単一障害点(Single Point of Failure)をなくした構成をご紹介します。

[HADBについて]
HADBは元来Clustra Systems社が持っていた高可用性を実現するための技術で以下の特徴があります。
・データベースノードを複数マシン間に分散
・DRU(冗長ユニット)ごとにデータをレプリケートし、ノードのダウン時も全体としてのデータ保持とサービス提供を継続
・99.999%の高可用性を実現できることが実証されている
Oracle RAC同様、DBが分散しているマシンのうち1つが壊れてもDBとしての機能を維持し続ける仕様となります。
最新のSun Java System Application Server 9.1も高可用性バージョンがありApplication Server9.1 with HADBという名前でリリースされています。
これはセッションオブジェクトをHADBに保持し、障害時にセッション情報をロストしない機能を持っています。
さらにメモリを活用したデータ管理により純粋なインメモリレプリケーションと比較しても遜色の無いパフォーマンスを発揮することが実証されています。

詳細については、AppServer8.2高可用性ガイドをご覧ください。
http://docs-pdf.sun.com/820-0854/820-0854.pdf
http://jp.sun.com/products/software/javasystem/applicationserver/の特長②圧倒的な高可用性の実現

[HADBのダウンロード]
http://www.sun.com/download/products.xml?id=46df3223
のページからSun Java System Application Server 9.1 with HADBをダウンロードしてください。ダウンロードの手順はMQ本体のダウンロードと同じです。

今回はサンプルの構成として、ノードをSolaris10(Pentium)とSolaris10(AMD64)のマシンに分散して構成してみたいと思います。
今回はWindows版もダウンロードすることにします。

Solaris 9/10, x86 Platform - Sun Java System Application Server 9.1 with HADB
Sun Java System Application Server 9.1 with HADB - File based, English

Windows 2000 Server and Advanced Server SP4/Windows 2003 Server/Windows Vista (Business Edition)/Windows XP Professional SP1 Platform
- Sun Java System Application Server 9.1 with HADB
Sun Java System Application Server 9.1 with HADB, English

SolarisとRed Hatのインストーラには、File basedとPackge basedと2種類ありますがインストール方法が違うだけで基本的に同じモジュールがインストールされます(ディレクトリ構成がちょっと違います)。インストール時にOSのネイティブなパッケージインストール機能を使うのがPackage basedとなります。

#Solaris等のOSにHADBをインストールするためにはOSのパラメータ(共有メモリとセマフォの設定など)を多少変更する必要があります。
http://docs-pdf.sun.com/820-0854/820-0854.pdfのP35
HADBの設定の準備-前提条件と制限をご覧ください

それぞれsjsas_ee-9_1-solaris-i586.binと、sjsas_ee-9_1-windows.exeがダウンロードされますのでSolaris10ではインストーラが存在するディレクトリまで移動して

./sjsas_ee-9_1-solaris-i586.bin

Windowsではエクスプローラを開いてインストーラが存在するディレクトリまで移動して
sjsas_ee-9_1-windows.exeをダブルクリックしてください

Windows版もSolaris版も流れは一緒です。今回はWindows版でインストールの流れを説明します。

1.Welcome画面が表示されます。

2.ライセンス画面が表示されるので、Yesのラジオボタンにチェックを入れてNext>ボタンをおします。

3.インストール場所を聞いてくるので、適当な場所を入力後、Next>ボタンを押します。

4.コンポーネント選択画面になります。
図のように
Server Tier:
High Availability Database Server
Administration:
No Administration Tools
にチェックをつけて、Next>ボタンを押します。

5.どのJDKを 使用するのかを聞かれますので、Install Java 2 SDKのラジオボタンにチェックを入れます。
その後Next>ボタンを押します。

6.インストールオプションは今回は全部外しておきます。

7.インストールの準備が整いました。Install Now>ボタンを押してください。

8.インストールの進捗が表示されます。

9.インストールが完了すると完了画面が表示されるので、Finishボタンを押してください。

HADBのインストールは成功しましたか?
次回はHADBの構成方法(ドメイン、ノードの作成)を説明します。

月曜日 10 15, 2007

本編とはちょっと話がそれてしまいますが、今回は番外編ということで
Java DBに同梱されているDBテーブル定義を確認するためのdblookユーティリティの紹介をしたいと思います。

そのデータベースの中にどのようなテーブルが定義されているのか、カラムの属性は何なのかをお手軽に
チェックするにはもってこいのツールです。(これを使わなくてもシステムカタログを照会すれば情報は収集できます)

以下のコマンドを実行します。
#今回はOpen MQ4.1によってどんなテーブルが作成されているのかをチェックしてみます

C:\software\JavaDB\bin>dblook -d jdbc:derby://localhost:1527/hastore
localhost:1527/hastoreの部分は適宜変更してください
<<ホスト名/IPアドレス>>:<<ポート番号>>/<<データベース名>>

-- タイム・スタンプ: 2007-10-04 12:17:39.431
-- ソース・データベース: hastore
-- 接続 URL: jdbc:derby://localhost:1527/hastore
-- appendLogs: false

-- ----------------------------------------------
-- 表用の DDL ステートメント
-- ----------------------------------------------

CREATE TABLE "APP"."MQPROP41CMMDEMOHACLUSTER" ("PROPNAME" VARCHAR(100) NOT NULL, "PROPVALUE" VARCHAR (4096) FOR BIT DATA);

CREATE TABLE "APP"."MQCONSTATE41CMMDEMOHACLUSTER" ("MESSAGE_ID" VARCHAR(100) NOT NULL, "CONSUMER_ID" BIGINT NOT NULL, "STATE" INTEGER, "TRANS

CREATE TABLE "APP"."MQCON41CMMDEMOHACLUSTER" ("ID" BIGINT NOT NULL, "CLIENT_ID" VARCHAR(1024), "DURABLE_NAME" VARCHAR(1024), "CONSUMER" VARCH

CREATE TABLE "APP"."MQCREC41CMMDEMOHACLUSTER" ("RECORD" VARCHAR (4096) FOR BIT DATA NOT NULL, "CREATED_TS" BIGINT NOT NULL);

CREATE TABLE "APP"."MQSES41CMMDEMOHACLUSTER" ("ID" BIGINT NOT NULL, "BROKER_ID" VARCHAR(100) NOT NULL, "IS_CURRENT" INTEGER NOT NULL, "CREATE

CREATE TABLE "APP"."MQMSG41CMMDEMOHACLUSTER" ("ID" VARCHAR(100) NOT NULL, "MESSAGE" BLOB(1048576) NOT NULL, "MESSAGE_SIZE" INTEGER, "STORE_SE

CREATE TABLE "APP"."MQDST41CMMDEMOHACLUSTER" ("ID" VARCHAR(100) NOT NULL, "DESTINATION" VARCHAR (2048) FOR BIT DATA NOT NULL, "IS_LOCAL" INTE

CREATE TABLE "APP"."MQBKR41CMMDEMOHACLUSTER" ("ID" VARCHAR(100) NOT NULL, "URL" VARCHAR(100) NOT NULL, "VERSION" INTEGER NOT NULL, "STATE" IN

CREATE TABLE "APP"."MQTXN41CMMDEMOHACLUSTER" ("ID" BIGINT NOT NULL, "TYPE" INTEGER NOT NULL, "STATE" INTEGER, "AUTO_ROLLBACK" INTEGER NOT NUL

CREATE TABLE "APP"."MQVER41CMMDEMOHACLUSTER" ("STORE_VERSION" INTEGER NOT NULL, "LOCK_ID" VARCHAR(100));

-- ----------------------------------------------
-- 索引用の DDL ステートメント
-- ----------------------------------------------

CREATE INDEX "APP"."MQTXN41CMMDEMOHACLUSTERIDX1" ON "APP"."MQTXN41CMMDEMOHACLUSTER" ("STORE_SESSION_ID");

CREATE INDEX "APP"."MQMSG41CMMDEMOHACLUSTERIDX1" ON "APP"."MQMSG41CMMDEMOHACLUSTER" ("STORE_SESSION_ID", "DESTINATION_ID");

CREATE INDEX "APP"."MQDST41CMMDEMOHACLUSTERIDX1" ON "APP"."MQDST41CMMDEMOHACLUSTER" ("STORE_SESSION_ID");

CREATE INDEX "APP"."MQCONSTATE41CMMDEMOHACLUSTERIDX1" ON "APP"."MQCONSTATE41CMMDEMOHACLUSTER" ("TRANSACTION_ID");

-- ----------------------------------------------
-- キー用の DDL ステートメント
-- ----------------------------------------------

-- primary/unique
ALTER TABLE "APP"."MQTXN41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123210480" PRIMARY KEY ("ID");

ALTER TABLE "APP"."MQSES41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123209310" PRIMARY KEY ("ID");

ALTER TABLE "APP"."MQMSG41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123210260" PRIMARY KEY ("ID");

ALTER TABLE "APP"."MQDST41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123209950" PRIMARY KEY ("ID");

ALTER TABLE "APP"."MQCON41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123209610" PRIMARY KEY ("ID");

ALTER TABLE "APP"."MQBKR41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123209070" PRIMARY KEY ("ID");

ALTER TABLE "APP"."MQCONSTATE41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123209750" PRIMARY KEY ("MESSAGE_ID", "CONSUMER_ID");

ALTER TABLE "APP"."MQPROP41CMMDEMOHACLUSTER" ADD CONSTRAINT "SQL071002123209450" PRIMARY KEY ("PROPNAME");

水曜日 10 10, 2007

前回はHAクラスタの永続ストア用にJavaDBをインストールして稼動を確認するところまで行いました。
今回はJavaDBに必要なデータベースを作成してMQ側でJavaDBを永続ストアに使用するように設定してみましょう。

まずは、JavaDBに永続ストア用のデータベースを作成します。
ijツールを起動します。

・binディレクトリへ移動します。

cd <<Java DBインストールディレクトリ>>\bin

例:cd C:\software\JavaDB\bin

以下のコマンドを入力します。

ij

するとijが起動して、インタラクティブモードになります
C:\software\JavaDB\bin>ij
ij バージョン 10.3
ij>

ij>の次に以下を入力します。

connect 'jdbc:derby://localhost:1527/hastore;create=true';

#「;create=true」を忘れないでください

するとJavaDBにhastoreというデータベースが作成されます。
以後、hastoreというデータベースに接続することができるようになります。

次に、MQ側の設定を行いましょう。
まずはインスタンスの作成です。今回はHAクラスタ環境として、配下に3つのブローカインスタンスが稼動するように
設定してみたいと思います。

[MQBrokerインスタンスの作成]
以下のコマンドを使って、3つのインスタンスを作成/起動します。
#存在しないインスタンス名で起動すると新規でインスタンス定義が作成されます

imqbrokerd -name broker1 -port 7676
imqbrokerd -name broker2 -port 7677
imqbrokerd -name broker3 -port 7678

作成されたインスタンス定義はMQ_VAR_HOME以下に作成されます。
#デフォルトではWindowsは<<インストールディレクトリ>>\mq\var\instances
#Unixでは/var/imq/instancesです。

まずは、C:\software\MQ4.1\mq\var\instances\broker1\props\config.properties
を編集します。ファイルの一番最後の部分に以下を追加します。
#Unixでは/var/imq/instances/broker1/props/config.properties

imq.brokerid=broker1
imq.persist.jdbc.derby.createdburl=
imq.cluster.ha=true
imq.persist.jdbc.dbVendor=derby
imq.persist.jdbc.derby.driver=org.apache.derby.jdbc.ClientConnectionPoolDataSource
imq.cluster.clusterid=mmdemohacluster
imq.persist.jdbc.derby.closedburl=
imq.persist.store=jdbc
imq.persist.jdbc.derby.opendburl='jdbc\:derby\://localhost\:1527/hastore'
imq.persist.jdbc.derby.property.databaseName=hastore

以下の部分は、MQがJavaDBを探しに行くURLになります。
MQとJavaDBが違うマシン上に存在する場合はlocalhostの部分をipアドレスなどに書き換えてください。

imq.persist.jdbc.derby.opendburl='jdbc:derby://localhost:1527/hastore'

同様に、C:\software\MQ4.1\mq\var\instances\broker2\props\config.properties
を編集します。ファイルの一番最後の部分に以下を追加します。
#Unixでは/var/imq/instances/broker2/config.properties

imq.brokerid=broker2
imq.persist.jdbc.derby.createdburl=
imq.cluster.ha=true
imq.persist.jdbc.dbVendor=derby
imq.persist.jdbc.derby.driver=org.apache.derby.jdbc.ClientConnectionPoolDataSource
imq.cluster.clusterid=mmdemohacluster
imq.persist.jdbc.derby.closedburl=
imq.persist.store=jdbc
imq.persist.jdbc.derby.opendburl='jdbc:derby://localhost:1527/hastore'
imq.persist.jdbc.derby.property.databaseName=hastore

broker3用
C:\software\MQ4.1\mq\var\instances\broker3\props\config.properties
を編集します。ファイルの一番最後の部分に以下を追加します。
#Unixでは/var/imq/instances/broker3/config.properties

imq.brokerid=broker3
imq.persist.jdbc.derby.createdburl=
imq.cluster.ha=true
imq.persist.jdbc.dbVendor=derby
imq.persist.jdbc.derby.driver=org.apache.derby.jdbc.ClientConnectionPoolDataSource
imq.cluster.clusterid=mmdemohacluster
imq.persist.jdbc.derby.closedburl=
imq.persist.store=jdbc
imq.persist.jdbc.derby.opendburl='jdbc:derby://localhost:1527/hastore'
imq.persist.jdbc.derby.property.databaseName=hastore

次に、MQが使用するJDBCドライバのライブラリをMQに追加します。
JDBCドライバなどの外部ライブラリを追加するフォルダが決まっています。

<<MQインストールフォルダ>>\mq\lib\ext

例:C:\software\MQ4.1\mq\lib\ext
#Unixでは/usr/share/lib/imq/ext
このフォルダに以下の3つのJARファイルをコピーしておいてください
・derby.jar
・derbyclient.jar
・derbytools.jar
#これらのjarファイルは<<JavaDBインストールディレクトリ>>\libにあります

一旦imqbrokerをシャットダウンしてください。

imqcmd shutdown bkr -b localhost:7676
imqcmd shutdown bkr -b localhost:7678
imqcmd shutdown bkr -b localhost:7679
管理者ID:admin
管理者パスワード:admin

シャットダウンが完了したら、全てのブローカを起動します。

imqbrokerd -name broker1 -port 7676 -tty
C:\software\MQ4.1\mq\bin>imqbrokerd -name broker1 -port 7676
[02/10/2007:12:32:08 JST]
==================================================================
Sun Java(tm) System Message Queue 4.1
Sun Microsystems, Inc.
バージョン:  4.1  (Build 36-e)
コンパイル:  Thu 07/26/2007

Copyright (c) 2007 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
==================================================================
Java ランタイム: 1.5.0_12 Sun Microsystems Inc. D:\jdk1.5.0_12\jre
[02/10/2007:12:32:08 JST]    IMQ_HOME=C:\software\MQ4.1\mq
[02/10/2007:12:32:08 JST] IMQ_VARHOME=C:\software\MQ4.1\mq\var
[02/10/2007:12:32:08 JST] Windows XP 5.1 x86 psq96026.Japan.Sun.COM (1 cpu) Administrator
[02/10/2007:12:32:08 JST] Java ヒープサイズ: 最大=194432k、現在=16256k
[02/10/2007:12:32:08 JST] 引数: -name broker1 -port 7676
[02/10/2007:12:32:08 JST] [B1060]: 持続データの読み込み中...
[02/10/2007:12:32:08 JST] プラグイン持続ストアの使用:
        version=410
        brokerid=broker1
        database connection url='jdbc:derby://localhost:1527/hastore'
        database user=not specified
[02/10/2007:12:32:08 JST] 警告 [B4239]: データベーステーブル MQVER41Cmmdemohacluster から持続ストアバージョンを読み込めませんでした:
java.sql.SQLException: [SELECT STORE_VERSION FROM MQVER41Cmmdemohacluster]: 表またはビュー 'MQVER41CMMDEMOHACLUSTER' は存在しません。
[02/10/2007:12:32:08 JST] [B1114]: 持続的ストアが新規に作成されます...
[02/10/2007:12:32:08 JST] データベーステーブル MQVER41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQBKR41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQSES41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQPROP41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQCREC41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQCON41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQCONSTATE41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブルのインデックス MQCONSTATE41CmmdemohaclusterIDX1 を作成しています...
[02/10/2007:12:32:09 JST] データベーステーブル MQDST41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:10 JST] データベーステーブルのインデックス MQDST41CmmdemohaclusterIDX1 を作成しています...
[02/10/2007:12:32:10 JST] データベーステーブル MQMSG41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:10 JST] データベーステーブルのインデックス MQMSG41CmmdemohaclusterIDX1 を作成しています...
[02/10/2007:12:32:10 JST] データベーステーブル MQTXN41Cmmdemohacluster を作成しています...
[02/10/2007:12:32:10 JST] データベーステーブルのインデックス MQTXN41CmmdemohaclusterIDX1 を作成しています...
[02/10/2007:12:32:12 JST] [B1039]: ブローカ "broker1@psq96026.Japan.Sun.COM:7676" の準備ができました。

#JavaDBに永続ストア用のスキーマ定義が存在しない場合は一回目の起動で作成してくれます。

imqbrokerd -name broker2 -port 7677 -tty
C:\software\MQ4.1\mq\bin>imqbrokerd -name broker2 -port 7677
[02/10/2007:12:33:08 JST]
==================================================================
Sun Java(tm) System Message Queue 4.1
Sun Microsystems, Inc.
バージョン:  4.1  (Build 36-e)
コンパイル:  Thu 07/26/2007

Copyright (c) 2007 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
==================================================================
Java ランタイム: 1.5.0_12 Sun Microsystems Inc. D:\jdk1.5.0_12\jre
[02/10/2007:12:33:08 JST]    IMQ_HOME=C:\software\MQ4.1\mq
[02/10/2007:12:33:08 JST] IMQ_VARHOME=C:\software\MQ4.1\mq\var
[02/10/2007:12:33:08 JST] Windows XP 5.1 x86 psq96026.Japan.Sun.COM (1 cpu) Administrator
[02/10/2007:12:33:08 JST] Java ヒープサイズ: 最大=194432k、現在=16256k
[02/10/2007:12:33:08 JST] 引数: -name broker2 -port 7677
[02/10/2007:12:33:08 JST] [B1060]: 持続データの読み込み中...
[02/10/2007:12:33:08 JST] プラグイン持続ストアの使用:
        version=410
        brokerid=broker2
        database connection url='jdbc:derby://localhost:1527/hastore'
        database user=not specified
[02/10/2007:12:33:10 JST] [B1039]: ブローカ "broker2@psq96026.Japan.Sun.COM:7677" の準備ができました。
[02/10/2007:12:33:10 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7676/?instName=bro

imqbrokerd -name broker3 -port 7678 -tty
C:\software\MQ4.1\mq\bin>imqbrokerd -name broker3 -port 7678
[02/10/2007:12:34:07 JST]
==================================================================
Sun Java(tm) System Message Queue 4.1
Sun Microsystems, Inc.
バージョン:  4.1  (Build 36-e)
コンパイル:  Thu 07/26/2007

Copyright (c) 2007 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
==================================================================
Java ランタイム: 1.5.0_12 Sun Microsystems Inc. D:\jdk1.5.0_12\jre
[02/10/2007:12:34:07 JST]    IMQ_HOME=C:\software\MQ4.1\mq
[02/10/2007:12:34:07 JST] IMQ_VARHOME=C:\software\MQ4.1\mq\var
[02/10/2007:12:34:07 JST] Windows XP 5.1 x86 psq96026.Japan.Sun.COM (1 cpu) Administrator
[02/10/2007:12:34:07 JST] Java ヒープサイズ: 最大=194432k、現在=16256k
[02/10/2007:12:34:07 JST] 引数: -name broker3 -port 7678
[02/10/2007:12:34:07 JST] [B1060]: 持続データの読み込み中...
[02/10/2007:12:34:08 JST] プラグイン持続ストアの使用:
        version=410
        brokerid=broker3
        database connection url='jdbc:derby://localhost:1527/hastore'
        database user=not specified
[02/10/2007:12:34:09 JST] [B1039]: ブローカ "broker3@psq96026.Japan.Sun.COM:7678" の準備ができました。
[02/10/2007:12:34:10 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7677/?instName=bro
[02/10/2007:12:34:10 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7676/?instName=bro

ここでQK2を使って、HAのテストをしてみましょう。

テストシナリオ:
1.QK2からbroker1,broker2,broker3のクラスタリストへメッセージデータを送信し、コミットする。(宛先:キュー:testQ)
2.ブローカのログからどのブローカに自動作成宛先testQが作成されたかをチェックする
3.宛先が作成されたブローカをシャットダウン
4.QK2にてtestQを照会。データが失われていないかをチェック

1.QK2からbroker1,broker2,broker3のクラスタリストへメッセージデータを送信し、コミットする。(宛先:キュー:testQ)

その後、無事メッセージがストアされたかどうかをQK2の照会機能でチェックします。
メッセージが1つストアされているのがわかります。

2.ブローカのログからどのブローカに自動作成宛先testQが作成されたかをチェックする

今回はbroker1に作成されていました。

3.宛先が作成されたブローカをシャットダウン
broker1をシャットダウンします。

C:\software\MQ4.1\mq\bin>[02/10/2007:12:53:17 JST] [B1077]: すべてのコネクションに対して good-bye をブロードキャスト ...
[02/10/2007:12:53:17 JST] [B1078]: good-bye メッセージをフラッシュ中 ...
[02/10/2007:12:53:17 JST] [B1007]: プロトコル tcp(host = *, port=0, mode=dedicated) でサービス admin を停止
[02/10/2007:12:53:17 JST] [B1007]: プロトコル tcp(host = *, port=0, mode=dedicated) でサービス jms を停止
[02/10/2007:12:53:17 JST] JMX コネクタサーバー jmxrmi は正常に停止しました
[02/10/2007:12:53:17 JST] [B1048]: ブローカの停止が完了しました。

4.QK2にてtestQを照会。データが失われていないかをチェック
この状態で、testQを照会してみます。
数秒後に無事データが表示されました
#最初の接続先(=現在死亡)に接続を試みてタイムアウトしてからリコネクトする仕様。タイムアウト時間は
クライアント側のプロパティで変更可能)

ちなみに、broker2とbroker3のログを見てみると以下のように出ています。

broker2のログ

[02/10/2007:12:53:22 JST] [B1288]: ブローカ broker1 が indoubt です。監視を開始します
[02/10/2007:12:53:23 JST] [B1210]: HAMonitor は 1 indoubt ブローカを監視しています
[02/10/2007:12:53:23 JST] [B1214]: ブローカ broker1 が応答しません。継承を試みています
[02/10/2007:12:53:23 JST] [B1183]: Unsuspect broker1
[02/10/2007:12:53:23 JST] [B1184]: Unsuspected /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=0, ts=11
[02/10/2007:12:53:23 JST] [B1186]: broker1 へのハートビートを停止します
[02/10/2007:12:53:23 JST] [B1182]: ハートビートエンドポイント /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064]
[02/10/2007:12:53:23 JST] [B1216]: ブローカ broker1 のストアの継承を試みています
[02/10/2007:12:53:23 JST] [B1175]: このブローカはブローカ [brokerID=broker1, storeSession=5033077555344810240] を継承しようとしています
[02/10/2007:12:53:23 JST] [B1168]: 障害の発生したブローカ broker1 の継承ロックが取得されました (タイムスタンプ: 1191297203605)
[02/10/2007:12:53:23 JST] Taking over 0 local destinations from broker broker1: []
[02/10/2007:12:53:23 JST] Taking over 2 messages from broker broker1
[02/10/2007:12:53:23 JST] Taking over 0 transactions from broker broker1
[02/10/2007:12:53:23 JST] Taking over 0 remote transactions from broker broker1
[02/10/2007:12:53:23 JST] Taking over 1 store sessions from broker broker1: [5033077555344810240]
[02/10/2007:12:53:23 JST] [B1217]: ブローカ broker1 の継承が成功しました。そのブローカが所有するデータと状態情報を処理しています
[02/10/2007:12:53:23 JST] [B1218]: ブローカ broker1 からの 0 トランザクションを処理しています
[02/10/2007:12:53:23 JST] [B1297]: Processing 0 remote transactions from broker broker1
[02/10/2007:12:53:23 JST] [B1283]: 継承後に 0 のトランザクションを処理しています
[02/10/2007:12:53:23 JST] [B1221]: ブローカ broker1 からの 2 メッセージを処理しています
[02/10/2007:12:53:23 JST] [B1151]: 1 メッセージとともに送信先 ABC [キュー] を読み込み
[02/10/2007:12:53:23 JST] [B1152]: 送信先 ABC [キュー] の読み込み完了
[02/10/2007:12:53:23 JST] [B1196]: 送信先 ABC [キュー] で 1 メッセージを処理します
[02/10/2007:12:53:23 JST] [B1151]: 1 メッセージとともに送信先 testQ [キュー] を読み込み
[02/10/2007:12:53:23 JST] [B1152]: 送信先 testQ [キュー] の読み込み完了
[02/10/2007:12:53:23 JST] [B1196]: 送信先 testQ [キュー] で 1 メッセージを処理します
[02/10/2007:12:53:23 JST] [B1223]: broker1 の継承処理が完了しました
[02/10/2007:12:53:23 JST] [B1177]: ブローカ [brokerID=broker1, storeSession=5033077555344810240] のブロードキャスト継承が完了しました...

broker3のログ

[02/10/2007:12:53:17 JST] [B1072]: 終了したクラスタコネクション: mq://129.158.34.120:7676/?instName=broker1&brokerID=broker1&brokerSessionUID=300364297347266
[02/10/2007:12:53:17 JST] [B1180]: ブローカ
        Address = mq://129.158.34.120:7676/?instName=broker1&brokerID=broker1&brokerSessionUID=3003642973472664064&ha=true&storeSessionUID=503307755534481024
        StartTime = 1191296757814
        ProtocolVersion = 410
        HeartbeatHost = 129.158.34.120
        HeartbeatPort = 7676 を非アクティブにしました
[02/10/2007:12:53:22 JST] 警告 [B2122]: /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=219, ts=1191297195593, interval=2, l
[02/10/2007:12:53:22 JST] [B1288]: ブローカ broker1 が indoubt です。監視を開始します
[02/10/2007:12:53:23 JST] [B1178]: mq://129.158.34.120:7677/?instName=broker2&brokerID=broker2&brokerSessionUID=8923624683650101760&ha=true&storeSessionUID=7
[02/10/2007:12:53:23 JST] [B1178]: mq://129.158.34.120:7677/?instName=broker2&brokerID=broker2&brokerSessionUID=8923624683650101760&ha=true&storeSessionUID=7
[02/10/2007:12:53:28 JST] 警告 [B2122]: /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=219, ts=1191297195593, interval=2, l
[02/10/2007:12:53:34 JST] 警告 [B2122]: /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=219, ts=1191297195593, interval=2, l
[02/10/2007:12:53:40 JST] 警告 [B2122]: /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=219, ts=1191297195593, interval=2, l
[02/10/2007:12:53:44 JST] [B1210]: HAMonitor は 1 indoubt ブローカを監視しています
[02/10/2007:12:53:44 JST] [B1212]: ブローカ broker1 は、別のブローカが継承したので、監視されなくなります
[02/10/2007:12:53:44 JST] [B1183]: Unsuspect broker1
[02/10/2007:12:53:44 JST] [B1184]: Unsuspected /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=0, ts=1191297224555, interval
[02/10/2007:12:53:44 JST] [B1186]: broker1 へのハートビートを停止します
[02/10/2007:12:53:44 JST] [B1182]: ハートビートエンドポイント /129.158.34.120:7676 [brokerID=broker1, brokerSession=3003642973472664064] (seq#=0, ts=11912972

これらのログから、broker1のデータはbroker2が引き継いだことがわかります。
broker3はbroker1へのハートビートを一時的に停止します。

ここで、broker1を再立ち上げしてみましょう。
broker1のログ

[02/10/2007:13:00:54 JST] [B1039]: ブローカ "broker1@psq96026.Japan.Sun.COM:7676" の準備ができました。
[02/10/2007:13:00:54 JST] [B1185]: broker2 へのハートビートを開始します
[02/10/2007:13:00:54 JST] [B1181]: ハートビートエンドポイント /129.158.34.120:7677 [brokerID=broker2, brokerSession=892
[02/10/2007:13:00:54 JST] [B1179]: ブローカ
        Address = mq://129.158.34.120:7677/?instName=broker2&brokerID=broker2&brokerSessionUID=8923624683650101760&ha=t
        StartTime = 1191296753598
        ProtocolVersion = 410
        HeartbeatHost = 129.158.34.120
        HeartbeatPort = 7677 をアクティブにしました
[02/10/2007:13:00:54 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7677/?instName=broker2&brokerID
[02/10/2007:13:00:54 JST] [B1185]: broker3 へのハートビートを開始します
[02/10/2007:13:00:54 JST] [B1181]: ハートビートエンドポイント /129.158.34.120:7678 [brokerID=broker3, brokerSession=475
[02/10/2007:13:00:54 JST] [B1179]: ブローカ
        Address = mq://129.158.34.120:7678/?instName=broker3&brokerID=broker3&brokerSessionUID=4756669128423250688&ha=t
        StartTime = 1191296744615
        ProtocolVersion = 410
        HeartbeatHost = 129.158.34.120
        HeartbeatPort = 7678 をアクティブにしました
[02/10/2007:13:00:54 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7678/?instName=broker3&brokerID
[02/10/2007:13:00:54 JST] [B1178]: mq://129.158.34.120:7677/?instName=broker2&brokerID=broker2&brokerSessionUID=8923624
[02/10/2007:13:00:54 JST] [B1178]: mq://129.158.34.120:7678/?instName=broker3&brokerID=broker3&brokerSessionUID=4756669

broker2のログ

[02/10/2007:13:00:54 JST] [B1185]: broker1 へのハートビートを開始します
[02/10/2007:13:00:54 JST] [B1181]: ハートビートエンドポイント /129.158.34.120:7676 [brokerID=broker1, brokerSession=6431445240084190464] (seq
[02/10/2007:13:00:54 JST] [B1179]: ブローカ
        Address = mq://129.158.34.120:7676/?instName=broker1&brokerID=broker1&brokerSessionUID=6431445240084190464&ha=true&storeSessionUID=64
        StartTime = 1191297653011
        ProtocolVersion = 410
        HeartbeatHost = 129.158.34.120
        HeartbeatPort = 7676 をアクティブにしました
[02/10/2007:13:00:54 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7676/?instName=broker1&brokerID=broker1&brokerSession

broker3のログ

[02/10/2007:13:00:54 JST] [B1185]: broker1 へのハートビートを開始します
[02/10/2007:13:00:54 JST] [B1181]: ハートビートエンドポイント /129.158.34.120:7676 [brokerID=broker1, brokerSession=64314452400
[02/10/2007:13:00:54 JST] [B1179]: ブローカ
        Address = mq://129.158.34.120:7676/?instName=broker1&brokerID=broker1&brokerSessionUID=6431445240084190464&ha=true&stor
        StartTime = 1191297653011
        ProtocolVersion = 410
        HeartbeatHost = 129.158.34.120
        HeartbeatPort = 7676 をアクティブにしました
[02/10/2007:13:00:54 JST] [B1071]: 確立されたクラスタコネクション : mq://129.158.34.120:7676/?instName=broker1&brokerID=broker1

broker1の再起動をトリガにbroker2とbroker3からbroker1へのハートビートチェックと接続が再開されたことがわかります。

次回は、永続ストアにSun Java System Application Server9.1with HADBに付属しているHADB(High Availability Database)をつかってDBの単一障害点を克服した構成を構築してみたいと思います。(まずはHADBのインストールからやってみます)

金曜日 10 05, 2007

さて今回は、MQ4.1から新たに導入された新機能であるHAクラスタ機能の使い方(構成方法)について説明したいと思います。

HAクラスタはHigh Availabilityクラスタの略で、高可用性クラスタのことです。
前回説明したコンベンショナル(=従来型)クラスタとどう違うかというと、以下の点で大きく異なっています

・あるブローカに障害が発生しても、MQブローカクラスタ側で内部的にフェイルオーバを行う。
送受信中に接続先ブローカがダウンする場合以外は、クライアントはブローカの障害を関知しない。

・サービスの継続性が得られるのみならず、コミット済のデータに関してはロストしない

以下の図を見てください。

コンベンショナルクラスタとは違って、全てのメンバブローカが同一の永続ストアを参照していることがわかります。
例えばクライアントがメッセージをbroker1に送付しコミットした後にbroker1に障害が発生した場合は、broker2またはbroker3にステートが移行されクライアントからは障害を検知しません。

今回は、JDKにも含まれるようになった噂のJava DBを使ってHAクラスタ構成を組んでみたいと思います。
#HAクラスタ構成は、JDBC永続化のみサポートしています。ファイル永続化はサポートしないので注意してください。
#Java DBにはOracle RACのようなクラスタ機能はありませんので、単一障害点になる可能性があります。高い可用性が要求される環境で利用される場合は、次回説明するHADBを永続ストアに使うか、Oracle RACなどの高可用性製品を使用してください。

[Java DBについて]
今回MQの永続ストアに使うJavaDBについて少し解説をしてみたいと思います。Java DBは元々IBMのCouldscapeという製品をオープンソースとしてApache DBプロジェクトにIBMが寄贈したものになります(製品としてのCloudscapeも存在しています)

Apache DBプロジェクトのサブプロジェクトとしてApache Derbyの名前で開発が進められています。
このDerby成果物のSunのサポートディストリビューションがJava DBという名前になります(中身はderbyです)。最近はJDK6などにもバンドルされており、Javaとセットで手軽に使えるRDBMSとなっています。
Java DB、結構機能が豊富で、ロールバック、バックアップリカバリ、XA完全対応はもちろんのこと、内部でトランザクションログもしっかりとっているのでロールフォワードリカバリまで出来る優れものです。もちろん本番環境での使用にも十分耐えます。(Sunは有償でこの製品のサポートも行っています)

[Java DBのインストール]
まずは永続ストアに使用するJavaDBをインストールしてみましょう。
現在JavaDBは色々なプロダクトにバンドルされているので、すでに皆様の環境にもインストールされているかもしれません。
Java Enterprise System
JDK6
GlassFish
Java Studio Creater2
これらをインストールしたことがある方はもしかしたら既にJavaDBが入っているかもしれません。

今回はSunのサイトからダウンロードするところから始めてみたいと思います。

こちらのページのオレンジ色のGet Itボタンを押します。
すると、MQのダウンロードの時のようにユーザ名とパスワードを聞いてきますので入力後、Loginボタンを押します。
Acceptラジオボタンにチェックを入れてから、ダウンロードしたい環境のモジュールの左側のチェックボックスにチェックを入れてオレンジ色の「Download Selected with Sun Download Manager」ボタンを押します。以後の流れはMQのダウンロードと同じです。

ダウンロードしたモジュールをダブルクリックします。

するとインストーラが起動します。

Nextボタンを押します。

インストール場所を聞いてくるのでインストールしたいフォルダを指定します。

以上で準備完了です。Installボタンを押してください。

インストールが完了するとFinish画面が出ますので、Finishボタンを押してください。

[Java DBの起動]
JavaDBには起動タイプが2通りあります。
・EMBEDDED
・NetworkServer
EMBEDDEDはローカル専用で、同一マシンからのアクセス専用になります。
NetworkServerはJava DBを外部マシン(DBサーバなど)に配置して、クライアントとネットワーク通信で接続できるタイプになります。

今回はNetworkServerモードで起動してみます。
コマンドプロンプトを起動して、インストールしたフォルダのbinディレクトリまで移動します。

cd <<Java DBインストールディレクトリ>>\bin

例:cd C:\software\JavaDB\bin

[お手軽な起動方法]
以下の起動コマンドを実行します

startNetworkServer

実行結果

C:\software\JavaDB\bin>startNetworkServer
DRDA_SecurityInstalled.I
Apache Derby Network Server - 2007-10-02 01:40:16.981 GMT に 10.3.1.4 - (561794) が開始され、ポート 1527 で接続を受け入れる準備ができました

今回はサンプルDBを使ってみたいので、ちょっと環境変数スクリプトを変更します。
<<インストールディレクトリ>>\bin\derby_common.batをnotepadなどで開きます。
set _USE_CLASSPATH=yesの下あたりに、以下の一行を追加します。

set DERBY_OPTS=-Dderby.system.home=C:\software\JavaDB\demo\databases

#c:\software\JavaDBは私の環境でのJavaDBインストール先です。ご使用の環境にしたがって適宜変更してください

derby_common.batへの変更を保存したら次のコマンドでJava DBを起動します。

C:\software\JavaDB\bin>startNetworkServer

[サンプルDBへの接続テスト]
Java DBにはSQLコマンドラインインターフェイスツールIJが付属しています。
#Oracleで言うところのSQLPlusみたいなもの
このIJを使って、Java DBが正常に稼動しているかどうかを見てみましょう。

・binディレクトリへ移動します。

cd <<Java DBインストールディレクトリ>>\bin

例:cd C:\software\JavaDB\bin

以下のコマンドを入力します。

ij

するとijが起動して、インタラクティブモードになります
C:\software\JavaDB\bin>ij
ij バージョン 10.3
ij>

ij>の次に以下を入力します。

connect 'jdbc:derby://localhost:1527/toursdb';

#「;」を忘れないでください

C:\software\JavaDB\bin>ij
ij バージョン 10.3
ij> connect 'jdbc:derby://localhost:1527/toursdb';
ij>

のように、ij>が返ってくれば接続成功です。

試しにSQLを入力してみましょう。

ij> select * from airlines;
A&|AIRLINE_FULL            |BASIC_RATE            |DISTANCE_DISCOUNT     |BUSINESS_LEVEL_FACTOR |
-------------------------------------------------------------------------------------------------
AA|Amazonian Airways       |0.18                  |0.03                  |0.5                   |
US|Union Standard Airlines |0.19                  |0.05                  |0.4                   |


2 行が選択されました
ij>

データがきちんと照会されました。
これで、Java DBがネットワークモードで稼動し、正しく稼動していることが確認できました。
ちょっと長くなってしまったので、次回にMQのHAクラスタの構成方法(続き)を説明したいと思います。

木曜日 10 04, 2007

Open MQとSun Java System Message QueueのEnterprise Editionではブローカをクラスタ構成にすることができます。クラスタ構成にする利点は以下です。

・複数のブローカが起動するので、特定のブローカが停止しても全体としてのサービスは停止しない
・クライアントが接続している先のブローカが異常終了した場合は、他の健全なブローカへ接続がフェイルオーバされる(サービスの継続)
・各ブローカの作業量の最適化。クラスタ全体としてスループットを向上させることができる(ベンチマークでは対シングルスレッド+40%スループット向上)
今回は、MQ3.7EEとMQ4.1EEが共通で持つ、「コンベンショナルクラスタ」の構成方法について説明します。

#なぜコンベンショナルかと言いますと、MQ4.1EEでは「HAクラスタ」というクライアント側が接続先ブローカの障害を意識せずに透過的にフェイルオーバできる仕組みが導入されたためです。HAクラスタ機能が追加されたので、それまでのクラスタの機能を「コンベンショナルクラスタ」と呼んでいます。

以下の図を見てください。

この図では3つのブローカがクラスタ構成をとっています。クライアントから接続ファクトリを作成するときに、クラスタ中のブローカアドレスをリストにして呼び出す形になります。呼び出し先のブローカはデフォルトではランダムに選択される仕様です。クライアントから最初に要求が着信したブローカのことを「ホームブローカ」と呼んでいます。以後、そのクライアントからの送受信リクエストはそのホームブローカを通じて行われます。クラスタ中のブローカはお互いにメッセージの処理を協調して行う仕組みになっています。ホームブローカが他クライアントからの処理を処理していてビジー状態の場合は手すきのブローカへ内部的に送受信リクエストがルーティングされます。

尚、無駄なブローカ間の通信をなるべく減らすアルゴリズムが装備されており、いくつかのメッセージをまとめて送信するというような最適化が内部で行われます。送信クライアントと受信クライアントが別々のホームブローカに接続してしまった場合は、受信側がつないだホームブローカのデータストアには目的の宛先がないことがあります。
#コンベンショナルクラスタでは各ブローカがデータストアを持っているためです

この場合のみクラスタ中の目的の宛先を持っているブローカと通信を行って目的の宛先データを自分のところにコピーします。(自動作成宛先の場合)このような最適化が、クラスタ構成だからといってそんなに大きなオーバヘッドがかからない理由です。
#クラスタVSシングルのベンチマークでは、クラスタ処理オーバヘッド1リクエスト平均15ミリ秒、スループット40%向上という結果が出ています。

MQ3.7/MQ4.1をブローカとして構成するための手順は以下になります。

1.ブローカをクラスタ(コンベンショナルクラスタ)メンバとして起動する(メンバの数だけ)
binディレクトリに移動します。

cd C:\software\MQ4.1\mq\bin

1番目のブローカの起動

imqbrokerd -tty -name broker1 -port 7676 -cluster localhost:7677,localhost:7678

2番目のブローカの起動

imqbrokerd -tty -name broker2 -port 7677 -cluster localhost:7676,localhost:7678

3番目のブローカの起動

imqbrokerd -tty -name broker3 -port 7678 -cluster localhost:7676,localhost:7677

ブローカの名前とポート番号はユニークになるようにしてください。
-clusterオプションには、自分以外のクラスタ中のブローカホスト名:ポート番号を指定します。

一番目のブローカログ

二番目のブローカログ

三番目のブローカログ

お互いにクラスタコネクションを張っているのがわかります。

2.クライアント中の接続ファクトリのオプションでブローカアドレスリストを指定する

InitialContext ctx = new InitialContext();
com.sun.messaging.ConnectionFactory conFactory
           = new com.sun.messaging.ConnectionFactory();
conFactory.setProperty(ConnectionConfiguration.imqAddressList,
          "localhost:7676,localhost:7677,localhost:7678");

この後、通常のJMSプログラミングで接続の作成→セッションの作成→宛先の作成→プロデューサまたはコンシュマの作成でOKです。

コンベンショナルクラスタを使用する上で注意すべき点
・クライアントの接続先として選択されたブローカと通信中に問題が発生した場合は「自動再配信」がONになっている場合のみクライアント側から自動的に再配信が行われる。
・再配信した先のブローカがダウンしている場合はクラスタ中の別ブローカへ接続がフェイルオーバーされる
・セッションがTransactedまたは、テンポラリキューを使用している場合には自動再配信がONになっていても自動では再配信されない。この場合は例外が送出されるので例外処理中にて手動で再接続・再配信を行う必要がある
・ブローカに障害が発生した場合、そのブローカが持っているキューやトピックに蓄積されている未消費のメッセージはロストする可能性がある
・MQ4.1のHAクラスタでは永続ストアを全ブローカが共有するので、データのロストがない

次回はMQ4.1のHAクラスタ構成方法について説明します。

水曜日 10 03, 2007

MQ4.1から完全にJMX仕様に準拠され、MQソフトウエア中の状態監視/操作が全てJMX経由で
できるようになりました。

今回はJavaに標準で付属するJConsole-JMXクライアントを使ってMQ4.1の監視/管理をしてみたいと思います。

まずは、MQ4.1ブローカをVerboseモードで起動します。

cd C:\software\MQ4.1\mq\bin

imqbrokerd -tty

起動ログ中に、以下の文字列が書かれています。

JMX コネクタサーバー jmxrmi は URL service:jmx:rmi://testhost/stub/rO0A<<中略>>AAeA== で正常に起動しました

このserviceから==までの部分がJMXリモート接続するためのURLとなります。

補足:Verboseモードで起動していない場合のJMXコネクタURLの確認方法
以下のコマンドでJMXのURLを照会します。

C:\software\MQ4.1\mq\bin>imqcmd list jmx
ユーザ名: admin
パスワード: admin

このコマンドを実行するとJMXのURLが表示されます。これをmemo帳などに書き留めておきます。
次にJConsoleを起動します。
JConsoleは、<<JDKのインストール場所>>\bin\jconsole.exeになります。
#私の環境ではD:\jdk1.5.0_12\bin\jconsoleです。

注意:JREのみしかインストールしていないとjconsole.exeがない場合があります。
その場合は、http://java.sun.comからJDKをダウンロードしてインストールしてください。

jconsole.exeをクリックするとJConsoleアプリケーションが起動します。
起動と共に、接続ダイアログボックスが表示されます。

詳細タブをクリックします。するとJMX URLを入力する入力フィールドが表示されるので
先ほど調べておいたservice:jmx:rmi://testhost/stub/rO0A...(注:環境によって変わります)
を入力します。

JMX URL: service:jmx:rmi://testhost/stub.....
ユーザ名:admin
パスワード:admin

全ての値を入力したら、接続ボタンを押します。

接続が成功すると、MQが登録しているJMXサーバとJConsoleの通信が行われ、様々なMQの内部値を監視することができます。

メニューの下にあるタブをクリックすることで様々な状況を確認することができます。

・MQブローカのメモリ使用状況

・MQブローカが稼動するJVMのスレッド状況とスタックトレース

・MQブローカが稼動するJVMでロードされたクラスの状況

一番強力で便利なのが、MBeanタブです。
MQ4.1では実行時の内部値をMBeanとして管理しています。今現在の詳しいMQの内部の値(例:現在の接続数など)を確認することができます。

・MQ4.1中のキュー「ABC」の詳細設定を確認

上の図で青色で表示されている数字などは「その場で上書き可能」を意味しています。
例えば、上の設定ではキュー「ABC」の同時に持てるプロデューサ数(MaxNumProducers)は100ですが、これを無制限(-1)に変更してみたいと思います。

直接100の値を-1に書き換えてから、ツール下にある「更新」ボタンを押します。

これで、無制限に変更されました。念のため、imqcmdにて値がきちんと変更されたかを確認してみましょう。

C:\software\MQ4.1\mq\bin>imqcmd query dst -t q -n ABC
ユーザ名: admin
パスワード: admin
送信先を照会中:

--------------
送信先名    送信先タイプ
--------------
ABC     キュー

次で指定されたブローカ上で:

---------------------
ホスト          プライマリポート
---------------------
localhost    7676

送信先名                        ABC
送信先タイプ                      キュー
送信先の状態                      RUNNING
管理用に作成                      false

現在のメッセージ数
    Actual                  100
    トランザクションに保持されました        0
現在のメッセージサイズ (バイト単位)
    Actual                  211600
    トランザクションに保持されました        0
現在のプロデューサ数                  0
現在のアクティブなコンシューマ��           0
現在のバックアップコンシ���ーマ数           0

メッセージの最大数                   100000
メッセージの最大合計サイズ (バイト単位)       10737418240
1 メッセージ当たりの最大サイズ (バイト単位)    10485760
プロデューサの最大数                  無制限 (-1)
アクティブなコンシューマの最大数            無制限 (-1)
バックアップコンシューマの最大数            0

制限の動作                       REJECT_NEWEST
コンシューマフローの制限                1000
ローカルの送信先                    false
ローカル配信優先                    false
デッドメッセージキューを使用              true

送信先の照会に成功しました。

 

プロデューサの最大数 無制限 (-1)
となっていますね。

同様に、Config系の値の即時変更、Runtime系の値の監視などを行うことができます。

次に、値を監視/更新するだけではなく、MBeanが持つ特定の「オペレーション」を呼び出してみましょう。

JConsole左側のツリーからcom.sun.messaging.jms.server.Service.Config.jmsをクリックします。クリックしたら、右ペインの「操作」タブをクリックしてこのMBeanの持つ操作をリストします。

このMBeanはMQ4.1ブローカのJMSサービスを表現しています。操作にはpauseとresumeがあるのがわかります。pauseボタンを押してください。
「Method successfully invoked」と表示されればOKです。

imqcmdにて、JMSサービスがどうなっているのかを確認してみましょう。

C:\software\MQ4.1\mq\bin>imqcmd list svc
ユーザ名: admin
パスワード: admin
指定されたブローカ上のすべてのサービスのリスト:

---------------------
ホスト          プライマリポート
---------------------
localhost    7676

--------------------------------
サービス名       ポート番号        サービス状態
--------------------------------
admin       1497 (動的)    RUNNING
httpjms     -            UNKNOWN
httpsjms    -            UNKNOWN
jms         0 (動的)       PAUSED
ssladmin    動的           UNKNOWN
ssljms      動的           UNKNOWN

サービスのリストに成功しました。

jms 0 (動的) PAUSED
となっているのがわかります。
#imqcmd pause bkrと同じ効果です

それでは一時停止を解除してみましょう。JConsoleのresumeボタンを押してください。
「Method successfully invoked」と表示されればOKです。

imqcmdにてサービスの状態を確かめてみます。

C:\software\MQ4.1\mq\bin>imqcmd list svc
ユーザ名: admin
パスワード: admin
指定されたブローカ上のすべてのサービスのリスト:

---------------------
ホスト          プライマリポート
---------------------
localhost    7676

--------------------------------
サービス名       ポート番号        サービス状態
--------------------------------
admin       1497 (動的)    RUNNING
httpjms     -            UNKNOWN
httpsjms    -            UNKNOWN
jms         1527 (動的)    RUNNING
ssladmin    動的           UNKNOWN
ssljms      動的           UNKNOWN

サービスのリストに成功しました。

jms 1527 (動的) RUNNING
となっているのが確認できます。

今回はたまたまJConsoleからMBean値の監視をしていますが、JMX-APIを使っても同様のことが可��です。プログラムからJMXの特定の値の監視または、MBeanオペレーションを使って様々な管理操作ができます。��視ソフトからJMXの値を取得してアラートをあげるなんていう使い方もできますね。また、EclipseなどでリリースされているJMXプラグインも使うことができます。

次回はMQクラスタの構成方法について書きたいと思います。

This blog copyright 2009 by naokitakemura