タグ別アーカイブ: MySQL

[Docker] MySQLコンテナと連携したTomcatコンテナのデータソース設定を動的に行うメモ

| コメントをどうぞ

Dockerにはコンテナ同士をリンクする機能があり、IPアドレスやポート番号などの情報をリンク先コンテナに渡すことができます。

この機能を使って、MySQLコンテナから渡される接続情報をTomcatコンテナのデータソース設定として動的に定義する方法を調査してみました。

以下はTomcatコンテナ “tomcat_test” を作成し、MySQLコンテナ “some-mysql” をリンクするコマンドです。

docker run --link some-mysql:mysql -it -p 8888:8080 --name tomcat_test tomcat:7.0 /bin/bash

Dockerイメージはオフィシャルで提供されているものを利用しています。

printenv で確認すると、以下のような環境変数が追加されていることが確認できます。

MYSQL_ENV_MYSQL_MAJOR=5.6
MYSQL_ENV_MYSQL_VERSION=5.6.22
MYSQL_ENV_MYSQL_ROOT_PASSWORD=mysecretpassword
MYSQL_PORT_3306_TCP=tcp://172.17.0.9:3306
MYSQL_PORT_3306_TCP_ADDR=172.17.0.9
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT=tcp://172.17.0.9:3306
MYSQL_NAME=/tomcat_test/mysql

続きを読む

EC2上のTomcatからRDSにSSL接続する方法

| コメントをどうぞ

今回はAWSのEC2にインストールしたTomcatから、RDS(MySQL)にSSLで接続する方法を紹介します。

準備

  • EC2インスタンス(Linux) *1
  • RDSインスタンス *1
  • EC2インスタンスにTomcatをインストールしておく
  • RDSインスタンスのセキュリティグループで、EC2インスタンスからのアクセスを許可しておく

以下のサイトを参考にして設定を行ったところ、SSL接続に成功しました。

Amazon RDS に SSL 接続する (JDBC編)
http://blog.cles.jp/item/5349


以下手順です。

まずはMySQLのクライアントからRDSに接続します。
以下のコマンドを実行して、任意のユーザからはSSL接続のみ許可します。

# mysql -u root -p -h ***.***.ap-northeast-1.rds.amazonaws.com
mysql> GRANT ALL PRIVILEGES ON dbuser.* TO dbuser@"%" IDENTIFIED BY 'mysqlpassword' REQUIRE SSL;


次にAmazonから証明書を取得します。
Amazonから配布される証明書はPEM形式であるため、JKS形式に変換する必要があるようです。

# wget https://rds.amazonaws.com/doc/mysql-ssl-ca-cert.pem
# /usr/java/default/bin/keytool -keystore amazon.jks -importcert -file mysql-ssl-ca-cert.pem
パスワードを2回入力(ここでは jkspassword とします)
・
・
・
Trust this certificate? [no]:  yes(yesと入力してEnter)
Certificate was added to keystore
#


作成したJKSファイルを任意のフォルダに移動します。

# mkdir /opt/jks
# mv amazon.jks /opt/jks


最後にTomcatのサーバーのserver.xmlまたはコンテキストファイルでDBとの接続設定をします。

<Resource name="jdbc/testDB" auth="Container"
           type="javax.sql.DataSource"
           username="dbuser"
           password="mysqlpassword"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://***.***.ap-northeast-1.rds.amazonaws.com:3306/dbName?useUnicode=true&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///opt/jks/amazon.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=jkspassword"
/>


SSLに関係しているURLのパラメータは以下です。

useSSL=true
requireSSL=true
verifyServerCertificate=true
trustCertificateKeyStoreUrl=file:///opt/jks/amazon.jks  #作成したJKSファイルのパス
trustCertificateKeyStoreType=JKS  #JKS形式を指定
trustCertificateKeyStorePassword=jkspassword  #JKS作成時に設定したパスワード

Amazon Elastic Beanstalkで複数のwarファイルをアップロードする方法

| コメントをどうぞ

Amazon Elastic Beanstalk (以下 Beanstalk)では、javaアプリケーションを動かす時、warファイルをアップロードしてそのwarファイルをBeanstalkが自動的に展開してtomcatにデプロイしてくれます。 ただし、現在のBeanstalkではwarファイルは1つしかアップロードできません。 複数warファイルがあるアプリケーションをBeanstalk上で動かすのは無理なのかなーと思って色々調べたら、どうにか複数warファイルでもアプリケーションが動作する環境ができたので、その方法をまとめてみます。

ただし、公式の方法ではないので実際に試す時は注意して行なって下さい。

1.Beanstalkで利用可能なEC2インスタンスをAMIから作成する。

まずは、Beanstalkで使用するためのAMI(Amazon Machine Image)のベースになるインスタンスを作成します。

EC2のインスタンス作成時に下記画像のようにCommunity AMIsから「beanstalk」を検索し、beanstalk用のAMIからインスタンスを作成します。

2.Beanstalkで利用しているEC2インスタンスのRubyファイルを編集する。

インスタンスが作成されたら、ssh等でサーバーへログインします。

sshでログイン後に、下記コマンドでrubyファイルを編集します。このrubyファイルが、beanstalkでインスタンスを作成時に実行されて、インスタンス内のtomcatにアプリケーションをデプロイしています。

vi /opt/elasticbeanstalk/srv/hostmanager/lib/elasticbeanstalk/hostmanager/applications/tomcatapplication.rb

編集箇所1

/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/ROOT


/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/

編集箇所2

/usr/bin/sudo /bin/chown -R tomcat:elasticbeanstalk #{TomcatApplication.tomcat_webapps_dir}/ROOT

/usr/bin/sudo /bin/chown -R tomcat:elasticbeanstalk #{TomcatApplication.tomcat_webapps_dir}/*

編集箇所3

/usr/bin/sudo mv #{TomcatApplication.tomcat_deploy_dir}/application.war #{TomcatApplication.tomcat_webapps_dir}/ROOT.war

/usr/bin/sudo /usr/bin/unzip -o -qq #{TomcatApplication.tomcat_deploy_dir}/application.war -d #{TomcatApplication.tomcat_webapps_dir}/

編集後に、インスタンスをAMIとして保存します。

3.Warファイルを作成しBeanstalkでアプリケーションを作成する。

Beanstalkに複数のwarファイルをアップロードして複数のアプリケーションを立てる場合は、次のようなwarファイルを用意します。

application.war
├─appA.war
├─appB.war
└─appC.war

また、application.warに含まれている各warファイルのMETA-INFフォルダには、context.xmlを含めるようにして下さい。

次に、Beanstalkでアプリケーションを作成し、用意したwarファイルをbeanstalkのアプリケーションにアップロードします。

Beanstalkでのアプリケーション作成方法は下記URLなどを参考にして下さい。

http://www.atmarkit.co.jp/fjava/rensai4/devtool23/devtool23_1.html

アプリケーションを作成後しばらくすると、EC2のインスタンスが立ち上がりますが、この時点ではアップロードしたwarファイルは正常にデプロイされません。

Beanstalkでアプリケーションを作成する際、一番初めのデプロイではAMIを指定できずにデフォルトとインスタンスでアプリケーションを作成してしまうためです。

複数のwarを含んだアプリケーションをデプロイする場合は、一旦デフォルトのインスタンスで作成された後に、Beanstalk上の設定でAMIを指定する必要があります。

4.BeanstalkでAMIを指定する。

最後に、Beanstalkの「Edit Configuration」をクリックして設定画面を開き、

2で作成したAMIのIDを「Custom AMI ID」の欄に入力して「Apply Changes」で保存します。

しばらくすると3の最後で作成されたインスタンスが破棄され、設定したAMIで新しいインスタンスが起動します。

インスタンス起動後に

http://アプリケーション名.elasticbeanstalk.com/コンテキスト名

のコンテキスト名を変えると、各コンテキストへアクセスできます。

参考:https://forums.aws.amazon.com/thread.jspa?messageID=229121

Tomcatのクラスタ環境でSession Replicationする方法

| コメントをどうぞ

Tomcatを複数台立てて、各Tomcat上に上がっている同じアプリケーションのセッションを共有する方法です。

この設定をしておくと、Tomcatが1台落ちた時でも他のTomcatが落ちたTomcatで持っているセッションを引き継いでくれるため、
アプリケーションのユーザーは落ちたTomcatを使っていたとしても、セッションが切れずに他のTomcatでアプリケーションを引き続き利用することができます。

上記のような図の構成で、ユーザーのセッションがTomcat Bにあり、Tomcat B が落ちてしまった場合、Tomcat Aが生きていてもユーザーのセッションは切れてしまいユーザーは再度ログインなどをしてセッションを作成しなければならなくなります。

Session Replicationを設定していると、このような状況になってもTomcat B にあるセッションをTomcat Aに複製してくれるので、ユーザーのセッションは切れずにそのままアプリケーションを利用することが可能です。

今回はinfoScoop OSS 3.1.0 quick startでバンドルされているTomcatで設定してみます。

infoScoop OSS 3.1.0 quick startは下記URLからダウンロードできます。
http://www.infoscoop.org/index.php/ja/download/file/65-infoscoop-3.1.0-quickstart.zip.html

infoScoop OSS 3.1.0 quick startのインストール方法は下記のURLをご参照下さい。
http://www.infoscoop.org/index.php/document-310/installation-guide/quickstart-setup.html

セッションレプリケーションにはいくつか方法があるようですが、今回はJDBCを使ってデータベースにセッション情報を保存する方法を試しました。

設定手順は大きく分けると下記のような手順になります。

  1. データベースにセッション情報保存用のテーブルを作成する
  2. コンテキストファイルにデータベース情報を記述する
  3. tomcatのシステムプロパティに宣言を記述する
  4. データベースのドライバーを<TOMCAT_HOME>/libに追加する

これらの手順はinfoScoop OSS quick startをインストール後に行なって下さい。

各手順の詳細を説明します。

1.データベースにセッション情報保存用のテーブルを作成する

今回はquickstartで利用する「iscoop」というデータベースにセッション情報保存ようのテーブルを作成します。

下記sqlを対象のデータベースに対して実行します。

create table tomcat_sessions (
session_id varchar(100) not null primary key,
valid_session char(1) not null,
max_inactive int not null,
last_access bigint not null,
app_name varchar(255),
session_data mediumblob,
KEY kapp_name(app_name)
);

2.コンテキストファイルにデータベース情報を記述する

quick startのtomcat内にあるinfoscoop.xmlにデータベース情報を記述します。

apache-tomcat-6.0.28/conf/Catalina/localhost/infoscoop.xml

上記ファイルのcontext要素内に下記の情報を追記します。

<Manager className='org.apache.catalina.session.PersistentManager'
 saveOnRestart='false' minIdelSwap='0' maxIdleSwap='0' maxIdleBackup='1'>
<Store className="org.apache.catalina.session.JDBCStore"
driverName="com.mysql.jdbc.Driver"
checkInterval="1"
connectionURL="jdbc:mysql://DBサーバー名:3306/iscoop?useUnicode=true&amp;characterEncoding=UTF-8&amp;user=DB接続ユーザー名&amp;password=DB接続ユーザーパスワード"
sessionTable="tomcat_sessions"
sessionIdCol="session_id"
sessionDataCol="session_data"
sessionValidCol="valid_session"
sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="last_access"
sessionAppCol='app_name' />
 </Manager>

connectionURLに記述するDBへの接続情報はお使いの環境に合わせて編集して下さい。

3.tomcatのシステムプロパティに宣言を記述する

tomcatのシステムプロパティファイルは下記の場所にあります。

apache-tomcat-6.0.28/conf/catalina.properties

上記ファイルの一番下に下記の内容を追記します。

org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true

4.データベースのドライバーを<TOMCAT_HOME>/libに追加する

quick start内のtomcatにはすでに追加されているので、特に作業は必要ありません。

quick startを利用しない場合は、データベースのドライバーを追加して下さい。

以上でセッションレプリケーションの設定ができます。

参考:http://d.hatena.ne.jp/sato-shi/20110122/p3

CentOS5.6にMySQL5.5をインストールする

| コメントをどうぞ

CentOS 5.6 に MySQL 5.5 をインストールしようとして、2箇所詰まったところがあったのでインストール手順を書いておきます。

rpmでEPELリポジトリを追加

いつも通りのURLを指定するとエラーが出ます。

# rpm -ivh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-5.noarch.rpm
http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-5.noarch.rpm を取得中
エラー: http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-5.noarch.rpm をスキップします - 転送に失敗 - 不明または予期せぬエラー

http://download.fedora.redhat.com がないらしい。

下記サイトによるとリポジトリのダウンロード先が変更されたようです。
助かります。
http://colo-ri.jp/develop/2012/02/downloadfedoraredhatcom_notfound_solution.html

http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm なら大丈夫。

再度リポジトリの追加。

# rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

MySQLのインストールと起動

MySQLのインストール

# yum --enablerepo=remi install mysql-server

MySQLの起動

# /etc/rc.d/init.d/mysqld start

なぜか起動に失敗するので、下記のようにログの出力先を指定して、再度起動。

# vi /etc/my.cnf
log-error=/var/log/mysqld.log

ログを見ると mysql.host がないらしい。

[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

エラー内容を調べたら、下記サイトにとてもわかりやすい説明がありました。
助かります。
http://takahitokikuchi.poitan.net/2011/08/02/fatal-error-cant-open-and-lock-privilege-tables-table-mysql-host-doesnt-exist/
インストール時にmysql_install_db が実行されるが、datadir の場所がわからないことが原因で、起動時にエラーが起きているらしいです。

まずは、mysql_install_db をオプション付きで実行します。オプションは、datadirとuser。
どちらも /etc/my.cnf の設定と同じものを指定して実行しました。

# mysql_install_db --datadir=/var/lib/mysql --user=mysql

その後、MySQLを起動します。

# /etc/rc.d/init.d/mysqld start

無事成功。めでたしめでたし。