Cassandra: Cassanra のセットアップ

The Apache Cassandra Project

openSUSE 11.3 に Cassandra 0.6.4 をセットアップしてみたのでメモ。
Debian は既にパッケージングされていて、apt-get で入れる事ができるみたい。

自分はまだ、sun の java を使う人なので、sun に入れ替えて環境構築。
openSUSE 11.3 だと、デフォルトでは、OpenJDK にPATHが通っているので、/usr/lib64/jvm 以下のシンボリックリンクを自分で調節するか、アンインストールして、sun の jdk を入れればいいかな。
もっとスマートな設定ファイルがどっかにありそうだけれど・・・su -

yast --remove java-1_6_0-openjdk
yast -i java-1_6_0-sun

最初に、binary を公式からダウンロード。

wget ftp://ftp.kddilabs.jp/infosystems/apache/cassandra/0.6.4/apache-cassandra-0.6.4-bin.tar.gz
tar zxf apache-cassandra-0.6.4-bin.tar.gz
su -
mv apache-cassandra-0.6.4-bin.tar.gz /usr/local/
ln -s /usr/local/apache-cassandra-0.6.4-bin.tar.gz /usr/local/cassandra

# 起動
/usr/local/cassandra/bin/cassandra -p /var/run/cassandra.pid

# 停止
kill -KILL `cat /var/run/cassandra.pid`

デフォルトでは、bin/cassandra.in.sh を読み込む設定になっているので、独自の設定を読み込ませたい場合には、このファイルをコピーして、そちらを読むように指定するのも可能。

cp bin/cassandra.in.sh /tmp/new.in.sh
vim /tmp/new.in.sh
$CASSANDRA_INCLUDE=/tmp/new.in.sh bin/cassandra -p [pid_file]

終了するとき、killコマンドを使うしか無いようだ。まあ、いいんだけれど。pidファイルがあると、cat

でプロセスIDを表示して、kill コマンドを発行できるので、そこは楽だね。

デフォルトでは 8080 port で起動するようになっているので、これが嫌な人は、bin/cassandra.in.sh を編集すればいい。
-Dcom.sun.management.jmxremote.port=8080
が、portを指定している部分。

JVM_OPTS=" \
        -ea \
        -Xms256M \
        -Xmx1G \
        -XX:+UseParNewGC \
        -XX:+UseConcMarkSweepGC \
        -XX:+CMSParallelRemarkEnabled \
        -XX:SurvivorRatio=8 \
        -XX:MaxTenuringThreshold=1 \
        -XX:+HeapDumpOnOutOfMemoryError \
        -Dcom.sun.management.jmxremote.port=8080 \
        -Dcom.sun.management.jmxremote.ssl=false \
        -Dcom.sun.management.jmxremote.authenticate=false"

Java なだけあって、単純に起動するだけなら簡単。

log : /var/log/cassandra
data : /var/lib/cassandra/data

起動時にログを吐き出すので、それで構成を確認すればいいかな。

後は、ちょっと接続テスト。

/usr/local/cassandra/bin/cassandra-cli

# サーバに接続
cassandra> connect localhost/9160
# Keyspaceを確認
cassandra> show keyspaces
# Keyspaceの構成を確認
cassandra> describe keyspace Keyspace1

# データセット
cassandra> set Keyspace1.Standard2['jsmith']['first'] = 'John'
Value inserted.
cassandra> set Keyspace1.Standard2['jsmith']['last'] = 'Smith'
Value inserted.
cassandra> set Keyspace1.Standard2['jsmith']['age'] = '42'
Value inserted.

# データ取得
cassandra> get Keyspace1.Standard2['jsmith']
=> (column=last, value=Smith, timestamp=1271921526614000)
=> (column=first, value=John, timestamp=1271921521923000)
=> (column=age, value=42, timestamp=1271921532713000)
Returned 3 results.

1つの Key に対して、複数の Column を関連付けていくので、RDBMS に慣れていると最初戸惑いが・・・まあ、カラムを動的に追加していく。ってことだね。住所が必要なら、 set keyspace1.Standard2['jsmith']['address'] = ‘New York City’ とでも入れればいいし。

Python: Cassandra: Python で Cassandra に接続する

Cassandra へのアクセスでベースになっているプロトコルが Thrift のようだ。
Cassandra用のPythonライブラリが、python-cassandra の模様。これが、Thrift に依存している。

Python 開発環境を作るのも久しぶりだったので、こちらのサイトを参考に構築。
2009年版Python開発環境を整えよう
環境は OpenSUSE 11.3 Cassandra 0.6.4

su -
yast -i python python-devel gcc python-setuptools
easy_install virtualenv
easy_install virtualenvwrapper
exit
vim ~/.bashrc

# 以下を .bashrc に追加
# Import virtualenvwrapper
if [ -f /usr/local/binvirtualenvwrapper.sh ]; then
  source /usr/local/bin/virtualenvwrapper.sh
fi

mkdir ~/.virtualenvs

source ~/.bashrc

mkvirtualenv --python=/usr/bin/python2.6 cassandra

# bashの表示が変わる。
(cassandra)user@domain:>

pip install thrift
pip install python-cassandra

これで完了。特につまるところはないかなぁ C言語で書かれているモジュールっぽいので、gcc は必要みたいだね。で、その為に、Python.h が必要だから、python-devel を入れておく必要性がある。

ちなみに、virtualenv はローカル環境構築用なので、pipでインストールしたライブラリは ~/.virtualenvs/cassandra/lib/python2.6/site-packages 以下に入る。

サンプルはこちら拝借。
ThriftExamples – Cassandra Wiki

#!/usr/bin/env python # encoding: utf-8
"""Sample Cassandra Client

Created by Chris Goffinet on 2009-08-26."""

from thrift import Thrift
from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated
from cassandra import Cassandra
from cassandra.ttypes import *
import time
import pprint

def main():

    socket = TSocket.TSocket("localhost", 9160)
    transport = TTransport.TBufferedTransport(socket)
    protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
    client = Cassandra.Client(protocol)
    pp = pprint.PrettyPrinter(indent=2)
    keyspace = "Keyspace1"
    column_path = ColumnPath(column_family="Standard1", column="email")
    key = "1"
    value = "foobar@example.com "
    timestamp = time.time()
    try:
        transport.open()
        #Insert the data into Keyspace 1
        client.insert(keyspace,
                      key,
                      column_path,
                      value,
                      timestamp,
                      ConsistencyLevel.ZERO)
        #Query for data
        column_parent = ColumnParent(column_family="Standard1")
        slice_range = SliceRange(start="", finish="")
        predicate = SlicePredicate(slice_range=slice_range)
        result = client.get_slice(keyspace,
                                  key,
                                  column_parent,
                                  predicate,
                                  ConsistencyLevel.ONE)
        pp.pprint(result)
    except Thrift.TException, tx:
        print 'Thrift: %s' % tx.message
    finally:
        transport.close()

if __name__ == '__main__':
    main()

pycassa というのもあるみたいだけれど、これ以上ラッピングしても意味あるのかなぁ~ DjangoみたいなWebフレームワークに組み込まれるくらいかな?

Linux: logrotate で log 圧縮設定

Apache の VirtualHost とかの設定をして、ついつい忘れてしまうのがログの圧縮設定。
Linux の場合 logrotate を使ってログを圧縮しているので、こちらの設定を変更しよう。

/etc/logrotate.conf

上記ファイルを見ると、以下のディレクトリのファイルを include しているのが分かる。

/etc/logrotate.d

という訳で、独自の設定をする場合には新しくファイルを作成して、Apache の場合には、apache とか apache2 で既にファイルがあると思うので、そちらを編集。

/var/log/apache2/blog.redhawk.jp-access.log {
    compress
    dateext
    maxage 365
    rotate 99
    size+=4096k
    notifempty
    missingok
    create 644 root root
    postrotate
     /etc/init.d/apache2 reload
    endscript
}

ログファイルに対して、コマンドを設定していく。
compress : ログを圧縮する
nocompress : ログを圧縮しない
compresscmd : 圧縮コマンドを指定
uncompresscmd : 解凍コマンドを指定
daily : 毎日
weakly : 毎週
dateext : 日付を拡張子にする
missingok : ファイルが無い場合でもエラーを出力しない
nomissingok : ファイルが無い場合エラーを出力する
rotate : ログファイルのローテート回数。指定ファイル数に達すると古いものから削除される
size : 指定したサイズ以上の場合は、ログをローテートする
prerotate : endscript までのコマンドをローテート実行前に実行する
postrotate : endscript までのコマンドをローテート実行後に実行する

こんなところかな。
圧縮さえしておけば、HDDがパンクする可能性が低くなるし。ログ消えて困るんだったら、HDDパンクしない程度にsizeとかrotate調節して、後はバックアップを取りつづけることかな。ログファイルがいつまでも可動サーバー上に安全な状態で残るとは限らないからね。

Linux: openSUSE: openSUSE 11.3をインストールしてみた

リリースされて、一ヶ月が経った訳だけれど、やっとこインストールしてみようかな。という状況になったので、開発環境の一つを11.2から11.3に再インストールすることに。
この作業に手間が掛かるから、まとまった時間がないと厳しいんだよね。

GNOMEを選択してインストール。
起動してびっくりしたのが、いきなりX over OpenGL(xgl)が動いている。

これから、Eclipse IDE for C/C++ Developers を入れたりと、開発環境を整えていこうかな。

後は、Cassandraもいい加減テストしてみるかな。
CassandraはJavaだから、正直ディストリビューションは関係ないけれどね・・・w
実際のサーバ運営の時なんかは、データベースだけ単一サーバ上に構築するだろうし、慣れているやつでいいだろうねぇ。

プログラマーからすると、開発環境をいかに楽して構築できるかがポイントだなぁ
Pythonのバージョンが・・・とか、そういうので躓くCentOSは厳しい。

まあ、近頃はubuntuユーザーが圧倒的に多い気がする。
あくまでも主観的意見だけれど。

Google Trends: openSUSE, ubuntu, debian, centos, fedora

Google Trendsでもubuntuの盛り上がりっぷりが凄いなw
大勢のユーザーに使われているということは、圧倒的に情報量がWeb上に存在するということで、トラブルに見舞われたときに、ぐぐれば解決策が出てくる可能性が高いと思っている。
そんな訳で、サーバ運営にubuntuが使われるのは自然な流れだよなぁと。

これからは、仕事で使うならubuntuかな。
趣味なら、openSUSEでいいけれど・・・ってか、ubuntu一度も触ったことないなぁ~

Subversion: ViewVC: openSUSE: openSUSE で ViewVC の設定

まあ、言い訳としては仕事が忙しかった!!って事にして、とりあえず、viewvcも設定されていなくて、リンク切れが激しかったので、設定しました。
またサンプルとかは、viewvc経由で拾えるようにしようかな。

とりあえず、設定メモ。
OpenSUSEなので、他の環境の人は余りあてにならないかもね・・・

viewvc と enscript のインストール。enscriptはシンタックスハイライト用。

yast -i viewvc enscript

apache の設定ファイルを開いて編集。

vim /etc/sysconfig/apache2

  • CGI
  • APACHE_SERVER_FLAGS=”SVN_VIEWCVS”

  • mod_python
  • APACHE_SERVER_FLAGS=”SVN_VIEWCVS_MODPYTHON”

    viewvc の設定ファイルを開いて編集。

    vim /srv/viewvc/viewvc.conf

    svn_roots:
    my_project : /srv/svn/repos/my_project

    default_root : my_project

    use_enscript = 1

    といった感じで設定後、Apache再起動。

    URLとか変更したいのであれば、apacheの設定ファイルを編集かな。
    /etc/apache2/conf.d/viewvc.conf

    で、復活した、viewvc.
    http://redhawk.jp/viewvc/

    Oracle: アンインストール

    Oracle をLinux にインストールして、あれ、オプション間違った。ってことで、アンインストールしようとしたんだけれど
    日本語マニュアル探しても、インストーラーでアンインストール項目をぽちっとね。
    ってしか書いてない。
    見つからないし・・・

    って事で、最新バージョンの英語マニュアルを見たら、deinstall を使うらしい
    /home/user/app/home/production/deinstall/deinstall
    を実行するみたい。
    後は、デフォルト設定のままだったので、削除する時に y を選択して終わり。
    うーん、やっぱり、英語マニュアルを最初に見るのが一番いいね。
    でも、uninstallで探しても出てこなくて、deinstallって・・・w

    ssh: Linux: sshの秘密鍵のパーミッション設定ミス

    Linuxサーバで、sshの秘密鍵を設定していた時に、始めて見るエラーログが出た。

    Authentication refused: bad ownership or modes for file
    /home/username/.ssh/authorized_keys

    なんじゃこりゃ?
    って思って調べてみたら、
    chmod 600 .ssh/authorized_kes
    を実行していなかったのが原因らしい。

    確かに!!
    設定し忘れていたよー

    エラー内容としては、このファイルは、本人以外読めちゃいけないという事で、適切なパーミッションをしていない場合に起きるのだとか。

    PHP: symfonyのセットアップ

    CentOS5.2 でPHPなフレームワークsymfonyを使う機会があったのでメモ。

    必要なパッケージをインストール
    yum install php php-xml

    php-xml を入れないと、後で「symfony/symfony requires PHP extension “dom”」というエラーが出る。

    次に、PEARにsymfonyして、PEARからインストール。

    pear channel-discover pear.symfony-project.com
    pear install symfony/symfony-1.1.7

    # CentOS5.2だとPHPのバージョンが古くて1.7系しか入れられない。

    ちなみに、Debian/Ubuntuでは、 apt-getで入れられるらしい。

    deb http://www.symfony-project.org/get debian/
    apt-get update
    apt-get install php5-symfony

    後は、プロジェクトを作って、アプリケーションを組み込んでいく感じ。
    Djangoに微妙に似ているんだよねぇ
    まあ、似ているから選んだんだけれどw

    openSUSE 10.3 で mod_rewrite を使う

    yastでインストールしようと思ったんだけれど、見つからない。

    あれれ?

    って事で調べてみたら、なんと・・・最初から入っているっぽw

    って事で

    /etc/sysconfig/apache2

    を編集。

    APACHE_MODULES=”rewrite”

    という感じ。実際は、もっと沢山の Apache module を使っているだろうから、大量にある中に追加してやる感じ。

    そろそろサーバマシンの事を考えないといけないかも

    自宅のサーバマシンでここ運用してるんだけれど、どうにもこうにも、MovableTypeはコメント投稿した時に重過ぎる!!
    何でかっていうと、一々毎回静的なページを生成しているからだ。生成後はアクセスが早いんだけれど、いまどきPHPで動的に生成していてもそれ程遅くはないだろう。
    ってか、一度 WordPress に移行したんだけれど、リンクが全部消えちゃうから、諦めたんだよね。
    mod_rewriteで条件で飛ばせるほど、URLパターンがはまるわけじゃないし・・・う~ん、リンク切れ覚悟で移行するか、サーバマシンのスペックを上げるかだね。
    Athron64の1.8GHzくらいしかなかった気がする。一応、デュアルコアだったかもしれないけれど。
    タグ検索とかも凄い重いから、使いづらいんだよねー
    サーバマシンのスペックを上げても、それ程期待は出来なさそうな気がするし、またどうせ直ぐに限界点が見えてくると思う。
    CGIで動かしているのも原因の一つなんだろうなぁ
    PHPはApache Moduleで動かすし、WordPressが早いのもそこにある。
    mod_perlで動かす手もあるのかもしれないが、mod_perlは余り使いたくないな。
    分かっているんだよ!! WordPressの方が良いっていうのは!!
    っち、休日中にやるか。まだ土曜日だ。がんばれば、一時間以内に作業は終わる。
    タグとかカテゴリの整理とか、リダイレクト処理とかは・・・もう、後でやるよ!!
    そして、そう・・・日曜朝は首都高をバイクで走りたいんだ!!
    だから、徹夜でサーバのメンテしていて、そのまま首都高走るとか避けたいんだよ!!
    ちなみに、なんか、WordPressはコメントとトラックバックの区別が初期状態ではなかった気がする。
    なんか、色々入れないといけなかったような。
    っけ めんどくせー だるいよー 誰かやってよー

     

    # 追記
    結局 WordPress に移行。
    前のページへのリンクはとりあえず残してあるけれど、落ち着いたら消そうかな。
    しかし、MovableTypeに比べて、格段に軽いお!!