MongoDB インストール on Ubuntu 12.04 メモ

MongoDBのインストールは、公式ドキュメント Install MongoDB にくわしい説明があります。
Ubuntuへのインストールも Install MongoDB on Ubuntu に載っています。

実行したコマンドをメモっておきます。

10genのリポジトリを追加
[bash]
$ sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10
$ echo ‘deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen’ | sudo tee /etc/apt/sources.list.d/mongodb.list
$ sudo apt-get update
[/bash]

mongodb-10gen を指定してインストール
[bash]
$ sudo apt-get install mongodb-10gen
[/bash]
=に続けてインストールバージョンを指定することもできます。
[bash]
$ sudo apt-get install mongodb-10gen=2.4.3
[/bash]

データベースを作成するディレクトリを作成
データベースを保存するディレクトリは /etc/mongodb.confdbpath で指定します。
[text]
dbpath=/var/lib/mongodb
[/text]

データベース用のディレクトリの作成して設定を変更
[bash]
$ sudo mkdir -p /data/mongodb
$ sudo chown mongodb:mongodb /data/mongodb/
$ sudo vi /etc/mongodb.conf
dbpath=/data/mongodb
$ sudo service mongodb restart
[/bash]

上記の手順は、Cloudnで確認しました。
Cloudnで追加ディスクを利用する場合は以下の手順で用意します。
[bash]
$ sudo mkfs -t ext3 /dev/vdb
$ sudo mount /dev/vdb /data/mongodb/
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/localhost-root 13123096 4622208 7834264 38% /
udev 242104 4 242100 1% /dev
tmpfs 100648 272 100376 1% /run
none 5120 0 5120 0% /run/lock
none 251616 0 251616 0% /run/shm
none 102400 0 102400 0% /run/user
/dev/vda1 233191 29081 191669 14% /boot
<strong>/dev/vdb 103212320 192248 97777192 1% /data/mongodb</strong>
$ sudo vi /etc/fstab

/dev/vdb /data/mongodb ext3 defaults 0 2
[/bash]

動作の確認
[bash]
$ mongo
MongoDB shell version: 2.4.3
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> db.test.save( { a: 1 } )
> db.test.find()
{ "_id" : ObjectId("5250e2491a1f3c8880326237"), "a" : 1 }
[/bash]

UbuntuでJavaアプリケーションをstart-stop-daemonを利用してデーモンにするには

Javaアプリをstart-stop-daemonを利用してデーモン化する際のメモです。

Ubuntuの起動スクリプトの書き方は Linux Standard Base Core Specification 4.1 の VIII. System Initialization に則って記述されます。

[bash]
#!/bin/sh

# path is `/etc/init.d/java-app’

### BEGIN INIT INFO
# Provides: java-app
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Start java-app daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

appdir=/home/hrendoh/
java=/usr
prog=java-app
pidfile=/var/run/${prog}.pid
logfile=/var/log/${prog}.log

daemon="${java}/bin/java"
args="-jar java-app.jar"

. /lib/lsb/init-functions

RETVAL=0

# System configuration
unset TMPDIR

start() {
echo -n "Starting ${prog} services: "
# cheking already run?
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile
then
pid=`cat ${pidfile}`
log_warning_msg "daemon is already running? (pid=${pid})"
exit 1
fi
start-stop-daemon –start –background –quiet –oknodo –pidfile $pidfile –make-pidfile –chdir ${appdir} –startas ${daemon} — ${args} >> ${logfile}
status=$?
log_end_msg $status
}
stop() {
log_daemon_msg -n $"Stopping ${prog} service: "
# cheking already run?
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile ; then
start-stop-daemon –stop –pidfile $pidfile
status=$?
rm -f $pidfile
log_end_msg $status
else
log_warning_msg "daemon not running? (check ${pidfile})."
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: ${prog} {start|stop|restart}: "
RETVAL=2
esac

exit $RETVAL
[/bash]

コメント

スクリプトの頭のコメントは、Ubuntuの場合は以下項目を記述します。

[bash]
# Provides: java-app
[/bash]

デーモンの名前を記述します。デーモンを「service java-app start」とやって起動するときに指定する名前を記述します。

[bash]
# Default-Start: 2 3 4 5
# Default-Stop: 1
[/bash]

システム起動時のランレベルを記述します。

[bash]
# Short-Description: Start java-app daemon
[/bash]

スクリプトの説明を記述します。

他の項目については以下のドキュメントを参照ください。
https://wiki.debian.org/LSBInitScripts

start

既に起動しているかチェック

[bash]
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile
[/bash]

–signal はkillのシグナルを指定します。
0を指定する場合はプロセスチェックのみを行うので、それをプロセスが既に起動しているかどうかのチェックに利用しています。
–quiet はコマンド実行メッセージを非表示にします。オプションなしの場合ここでは「No process in pidfile ‘/var/run/java-app.pid running; none killed.」というメッセージが表示されます。

起動

[bash]
start-stop-daemon –start –background –quiet –oknodo –pidfile $pidfile –make-pidfile –chdir ${appdir} –startas ${daemon} — ${args} >> ${logfile}
[/bash]

–background は、フォアグラウンドでしか起動できないプログラムに指定すると、バックグラウンドプロセスとして起動することができます。
–oknodo は、処理が何も行われなかった場合に、返り値に1ではなく0を返すようにするオプションです。
–pidfile 起動したプロセスのIDを保存します。
–make-pidfile –pidfileで指定したパスにまだファイルが無かった場合に新しく作成します。
–chdir に指定してディレクトリに移動してdaemonに指定したスクリプトを実行します。
–startas には実行するjavaを指定し、に続けてJavaの実行引数を指定しています。
標準出力は、logfileに指定したパスのファイルに出力します。

stop

停止を実行する必要があるかどうか、startの場合と同様のコマンドでチェック、返り値が0出ない場合は何もしない。

[bash]
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile

else
log_warning_msg "daemon not running? (check ${pidfile})."
fi
[/bash]

停止

[bash]
start-stop-daemon –stop –pidfile $pidfile
rm -f $pidfile
[/bash]

pidfileで指定されるプロセスを停止します。
start-stop-daemonコマンドはpidfileは停止後消さないので、正常終了した場合はpidfileを消します。

参考リンク

start-stop-daemon Manpage

起動スクリプトいろいろ
How to make a jar file run on startup & and when you log out?
One Java init script to rule them all
Running Java applications as daemon on Debian Linux
start-stop-daemon の簡単な使い方

http://upstart.ubuntu.com/cookbook/#run-a-java-application

monitで簡単サーバー監視

Monitは、プロセス監視やログ監視をしてくれる軽量なツールです。

リソースはNewRelic使ってるから、Zabbixとかは入れるほどでも無いしという場合などに便利です。

Ubuntu 10.10にMonitをインストール

[bash]
$ sudo apt-get install monit
$ sudo dpkg -l | grep monit
ii monit 1:5.0.3-3 A utility for monitoring and managing daemon
$ sudo service monit start
Starting daemon monitor: monit won’t be started/stopped
unless it it’s configured
please configure monit and then edit /etc/default/monit
and set the &quot;startup&quot; variable to 1 in order to allow
monit to start
[/bash]

起動するには、指示の通り/etc/default/monitのstartupに1を設定

[text]
startup=1
[/text]

起動

[bash]
$ sudo service monit start
Starting daemon monitor: empty config, please edit /etc/monit/monitrc.
[/bash]

まずはミニマムな設定をしてみます。
/etc/monit/monitrcの以下の箇所のコメントを外して、適当な値を設定します。
[text]
set daemon 120
set logfile syslog facility log_daemon
set mailserver smtp.gmail.com port 587 username &quot;xxxxx@co-meeting.com&quot; password &quot;mypassword&quot; using tlsv1
set alert sysadm@foo.bar
set httpd port 2812 and
allow localhost
allow admin:monit
include /etc/monit/conf.d/*
[/text]
set daemon 120は120秒間隔でチェックが実行されるということです。
set mailserver …の設定はGmailのSMTPサーバーの例です。
また、各種監視設定はmonitrcにも続けて記述できますが、include /etc/monit/conf.d/*を指定して、conf.dに監視対象ごとにファイルを分けて設定します。
set httpd port 2828 and …は管理用のWeb画面を使わなくてもmonitコマンドからもアクセスされるため設定は必須です。

設定が終わったら再起動します。
[bash]
$ sudo service monit restart
[/bash]
起動を確認するためにWebインターフェースを表示してみます。
http://xxx.xxx.xxx.xxx:2812/にアクセスし、基本認証にadmin/monitを入れると以下の画面が表示されます。
monit-web-interface

幾つか監視設定を追加してみます。
監視設定のサンプルは公式サイトのConfiguration Examplesに充実しているので参考にしてください。

Nginx

/etc/monit.d/conf.d/nginx.conf
を作成し以下を記述
[text]
# Nginx
check process nginx with pidfile /var/run/nginx.pid
start program = &quot;/etc/init.d/nginx start&quot;
stop program = &quot;/etc/init.d/nginx stop&quot;
[/text]

MongoDB

おおよそのデーモンのpidは/var/runにありますが、MongoDBはpidfilepathを指定していない場合は/mondod.lockになります。
dbpath=/data/mondodb/の場合、/etc/monit.d/conf.d/mongodb.confを以下のように記述します
[text]
# MongoDB
check process mongodb
with pidfile &quot;/data/mongodb/mongod.lock&quot;
start program = &quot;/sbin/start mongodb&quot;
stop program = &quot;/sbin/stop mongodb&quot;
if failed port 28017 protocol http
and request &quot;/&quot; with timeout 10 seconds then restart
if 5 restarts within 5 cycles then timeout
[/text]

Redis
[text]
check process redis-server with pidfile &quot;/var/run/redis.pid&quot;
start program = &quot;/etc/init.d/redis-server start&quot;
stop program = &quot;/etc/init.d/redis-server stop&quot;
if failed host 127.0.0.1 port 6379 then restart
if 5 restarts within 5 cycles then timeout
[/text]

以下の内容を

参考になるリンク:
Installing Monit in Ubuntu 12.04 Servers
Linux resource monitoring and some tuning tips
monitrcの設定項目
被制御デーモンの登録 (monitrc)
monit と少し仲良くなったお話 – monitでApache2, MySQLを監視

OCFS2でクラスタしてみる

以下のアドレスの2台のノードでクラスタを構成します。

1.2.3.1
1.2.3.2

FireWallの設定
クラスタに参加するノードはそれぞれ7777をお互いに受け入れるように設定する必要があります。

UFWなら
1.2.3.1

ufw allow from 1.2.3.2 to any port 3260

1.2.3.2

ufw allow from 1.2.3.1 to any port 3260

1台目(1.2.3.1)

$ hostname
iscsi-client-01
$ sudo vi /etc/ocfs2/cluster.conf
node:
	name = iscsi-client-01
	cluster = ocfs2
	number = 0
	ip_address = 1.2.3.1
	ip_port = 7777
node:
	name = iscsi-client-02
	cluster = ocfs2
	number = 1
	ip_address = 1.2.3.2
	ip_port = 7777
cluster:
	name = ocfs2
	node_count = 2
$ sudo service o2cb restart
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/

2台目(1.2.3.2)

$hostname
iscsi-client-02
$sudo vi /etc/ocfs2/cluster.conf
node:
	name = iscsi-client-01
	cluster = ocfs2
	number = 0
	ip_address = 1.2.3.1
	ip_port = 7777
node:
	name = iscsi-client-02
	cluster = ocfs2
	number = 1
	ip_address = 1.2.3.2
	ip_port = 7777
cluster:
	name = ocfs2
	node_count = 2
$ sudo service o2cb restart
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/

トラブルシューティング

2台目のマウントに以下のエラーで失敗した場合

mount.ocfs2: Transport endpoint is not connected while mounting /dev/sda on /mnt/ocfs2/. Check 'dmesg' for more information on this error.

/var/log/syslog エラー1

Aug 16 18:58:09 localhost kernel: [ 4520.624131] o2net: Connect attempt to node iscsi-client-01 (num 0) at 1.2.3.1:7777 failed with errno -22

以下を確認してください

  • ポート7777が開いているか?
  • 各nodeのip_addressは正しく設定されているか?
    各ノードは自分のノードに指定してあるIPアドレスでバインドされるため、127.0.0.1などでなく実際にアクセスされるアドレスを指定します。

/var/log/syslog エラー2

Jun 22 00:14:51 isci-client-02 kernel: [17472.209613] Please double check your configuration values for 'O2CB_HEARTBEAT_THRESHOLD'
Jun 22 00:14:51 isci-client-02 kernel: [17472.345474] (20121,0):o2net_check_handshake:1264 node ubuntu21 (num 0) at 1.2.3.1:7777 uses a heartbeat timeout of 238000 ms, but we use 60000 ms locally.  disconnecting

ログに出ている通りO2CB_HEARTBEAT_THRESHOLDの長さが足りないので設定する

$ sudo /etc/init.d/o2cb offline
$ sudo dpkg-reconfigure ocfs2-tools

O2CB heartbeat thresholdを設定
ocfs2-tools
反映を確認後、起動

$ cat /sys/kernel/config/cluster/ocfs2/heartbeat/dead_threshold
61
$ sudo service o2cb start
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/

OCFS2をUbuntu 12.04にセットアップ

OCFS2はOracle Cluster File Systemの名前の通りOracleのRACなどで使用されているファイルシステムのOpenSourceです。

OCFS2公式サイト

以下は、最小限のセットアップ手順として1ノードで確認するものです。
[bash]
$ sudo apt-get install ocfs2-tools
$ dpkg -l ocfs2-tools
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii ocfs2-tools 1.6.4-1ubunt amd64 tools for managing OCFS2 cluster
$ sudo vi /etc/default/o2cb
O2CB_ENABLED=true
$ hostname
iscsi-client-01
$ sudo vi /etc/ocfs2/cluster.conf
node:
name = iscsi-client-01
cluster = ocfs2
number = 0
ip_address = 127.0.0.1
ip_port = 7777
cluster:
name = ocfs2
node_count = 1
$ sudo service o2cb restart
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading stack plugin "o2cb": OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Setting cluster stack "o2cb": OK
Starting O2CB cluster ocfs2: Failed
Cluster ocfs2 created
o2cb_ctl: Internal logic failure while adding node iSCSI-Client
Stopping O2CB cluster ocfs2: OK
$ sudo mkdir /mnt/ocfs2
$ sudo mkfs.ocfs2 /dev/sda
$ sudo mount -t ocfs2 /dev/sda /mnt/ocfs2/
$ df
Filesystem                 1K-blocks    Used Available Use% Mounted on
/dev/mapper/localhost-root  13123096 1095308  11361164   9% /
udev                          242108       4    242104   1% /dev
tmpfs                         100648     276    100372   1% /run
none                            5120       0      5120   0% /run/lock
none                          251620       0    251620   0% /run/shm
none                          102400       0    102400   0% /run/user
/dev/vda1                     233191   29081    191669  14% /boot
/dev/sda                   104857600 2237704 102619896   3% /mnt/ocfs2
[/bash]

iSCSIイニシエータをUbuntu 12.04にセットアップ

$ sudo apt-get update
$ sudo apt-get install open-iscsi
$ dpkg -l open-iscsi
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  open-iscsi     2.0.873-3ubu amd64        High performance, transport indep
$ sudo iscsiadm -m discovery -t sendtargets -p 1.2.3.4
1.2.3.4:3260,1 iqn.2013-08.me.hrendoh:test.disk
$ sudo iscsiadm -m node --targetname iqn.2013-08.me.hrendoh:test.disk --login
Logging in to [iface: default, target: iqn.2013-08.me.hrendoh:test.disk, portal: 1.2.3.4,3260] (multiple)
Login to [iface: default, target: iqn.2013-08.me.hrendoh:test.disk, portal: 1.2.3.4,3260] successful.
$ sudo iscsiadm -m session
tcp: [1] 1.2.3.4:3260,1 iqn.2013-08.me.hrendoh:test.disk
$ sudo fdisk -l

Disk /dev/vda: 16.1 GB, 16106127360 bytes
16 heads, 63 sectors/track, 31207 cylinders, total 31457280 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e1e29

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      499711      248832   83  Linux
/dev/vda2          501758    31455231    15476737    5  Extended
/dev/vda5          501760    31455231    15476736   8e  Linux LVM

Disk /dev/mapper/localhost-root: 13.7 GB, 13652459520 bytes
255 heads, 63 sectors/track, 1659 cylinders, total 26664960 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/localhost-root doesn't contain a valid partition table

Disk /dev/mapper/localhost-swap_1: 2143 MB, 2143289344 bytes
255 heads, 63 sectors/track, 260 cylinders, total 4186112 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/localhost-swap_1 doesn't contain a valid partition table

Disk /dev/sda: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders, total 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sda doesn't contain a valid partition table

iSCSI TargetをUbuntu 12.04にセットアップ

[bash]
$ sudo apt-get update
$ sudo apt-get install iscsitarget
$ dpkg -l iscsitarget
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii iscsitarget 1.4.20.2-10u amd64 iSCSI Enterprise Target userland
$ sudo vi /etc/default/iscsitarget 
ISCSITARGET_ENABLE=true
$ dd if=/dev/zero of=iscsi.img count=0 bs=1 seek=1G
$ sudo vi /etc/iet/ietd.conf
(末尾に追記)
Target iqn.2013-08.me.hrendoh:test.disk
Lun 0 Path=/home/cloudn/iscsi.img,Type=fileio
$ sudo service iscsitarget restart
* Removing iSCSI enterprise target devices: [ OK ]
* Starting iSCSI enterprise target service FATAL: Module iscsi_trgt not found.
[fail]</pre>
起動しようとするとエラー「FATAL: Module iscsi_trgt not found.」
iscsitarget-dkmsをインストールすると解消する(参考:<a href="http://www.heath-bar.com/blog/?p=203">Setup an Ubuntu iSCSI target (server)</a>)
<pre>$ sudo apt-get install iscsitarget-dkms
$ sudo service iscsitarget restart
* Removing iSCSI enterprise target devices: [ OK ]
* Starting iSCSI enterprise target service [ OK ]
[ OK ]
[/bash]
Firewallを設定

1.2.3.xのアクセスをCIDRで指定(Cloudnを利用)

iSCSIターゲット用Firewall設定 Cloudn
iSCSIターゲット用Firewall設定 Cloudn

Ufwなら
[bash]
$ ufw allow from 111.222.333.0/24 to any port 3260
[/bash]

追加ディスクを利用する場合

[bash]
$ sudo fdisk -l

Disk /dev/vda: 16.1 GB, 16106127360 bytes
16 heads, 63 sectors/track, 31207 cylinders, total 31457280 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e1e29

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 499711 248832 83 Linux
/dev/vda2 501758 31455231 15476737 5 Extended
/dev/vda5 501760 31455231 15476736 8e Linux LVM

Disk /dev/vdb: 107.4 GB, 107374182400 bytes
16 heads, 63 sectors/track, 208050 cylinders, total 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/vdb doesn’t contain a valid partition table

Disk /dev/mapper/localhost-root: 13.7 GB, 13652459520 bytes
255 heads, 63 sectors/track, 1659 cylinders, total 26664960 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/localhost-root doesn’t contain a valid partition table

Disk /dev/mapper/localhost-swap_1: 2143 MB, 2143289344 bytes
255 heads, 63 sectors/track, 260 cylinders, total 4186112 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/localhost-swap_1 doesn’t contain a valid partition table
$ sudo vi /etc/iet/ietd.conf
Target iqn.2013-08.me.hrendoh:test.disk
Lun 0 Path=/dev/vdb,Type=blockio
$ sudo service iscsitarget restart
[/bash]