myfinderの技術や周辺的活動のblog

2009年1月29日木曜日

今日から使える実践的Tokyo Tyrantのrpm講座

タイトルはまたもホッテントリメーカーから。

先日Tokyo Tyrantについていろいろ誤解して書いてしまったので罪滅ぼし的に、
「CentOS5.2でTokyo Tyrantのrpmを作ってインストールして運用できる状態にするまで」を書いてみる。
「rpmがないと使えない〜」というrpm厨の方もこれで安心。

今回は1サーバ1インスタンスでセットアップする想定です。
レプリケーションなどはまた別の機会に。

一応自分のとこでは動きましたが、エントリの内容は無保証です。自己責任でお願いします。

手順は大まかに言うと↓のような感じ。
  1. Tokyo CabinetとTokyo Tyrantのソースアーカイブを手に入れる
  2. rpmを作る
  3. Tokyo Tyrantが依存している別のパッケージをインストールする
  4. Tokyo Tyrantをインストールする
  5. Tokyo Tyrantをchkconfigに登録する
  6. logrotateに登録してログの肥大化を防ぐ

1.Tokyo CabinetとTokyo Tyrantのソースアーカイブを手に入れる

何はともあれTokyo Cabinetの公式サイトから
  • tokyocabinet-{version}.tar.gz
  • tokyotyrant-{version}.tar.gz
を手に入れてきます。
今回のエントリでは、Tokyo Cabinetは1.4.3、Tokyo Tyrantは1.1.11の両方とも最新版を利用しました。

2. rpmを作る

rpmを作るにはいくつか方法がありますが、今回はrpmbuildコマンドを使いますので事前にインストールしておいてください。
rpmを作るときは、できれば一般ユーザのhomeに領域を作った方がよいです。
なので、まずは一般ユーザで下記のようにrpmを作るための環境を準備します。


$ mkdir -p ~/rpm/{BUILD,SOURCES,SPECS,RPMS,SRPMS}
$ vi ~/.rpmmacros

%_topdir /home/hoge/rpm

ここまでできたら、次はrpmを作成するのに必要なSPECファイルを作ります。
おいらが作るときに使ったSPECファイルを公開しておきます、適当に参考にしてください。
まずはTokyo CabinetのSPECを書きます。


$ vi ~/rpm/SPECS/tokyocabinet.spec

Summary: A modern implementation of a DBM
Name: tokyocabinet
Version: 1.4.3
Release: 1
License: LGPLv2+
Group: Development/Libraries
URL: http://tokyocabinet.sourceforge.net/
Source: http://tokyocabinet.sourceforge.net/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: pkgconfig zlib-devel autoconf
BuildRequires: lua-devel

%description
Tokyo Cabinet is a library of routines for managing a database. It is the
successor of QDBM. Tokyo Cabinet runs very fast. For example, the time required
to store 1 million records is 1.5 seconds for a hash database and 2.2 seconds
for a B+ tree database. Moreover, the database size is very small and can be up
to 8EB. Furthermore, the scalability of Tokyo Cabinet is great.

%package devel
Summary: Headers for developing programs that will use %{name}
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: pkgconfig

%description devel
This package contains the libraries and header files needed for
developing with %{name}.

%prep
%setup -q

%build
autoconf
%configure CFLAGS="$CFLAGS" --enable-lua
make %{?_smp_mflags}

%install
rm -rf %{buildroot}
make DESTDIR=%{buildroot} install

rm -rf %{buildroot}%{_datadir}/%{name}
rm -rf %{buildroot}%{_libdir}/lib%{name}.a

#%check
#make check

%clean
rm -rf %{buildroot}

%post -p /sbin/ldconfig

%postun -p /sbin/ldconfig

%files
%defattr(-, root, root, -)
%doc ChangeLog COPYING README
%{_bindir}/tc*
%{_libdir}/libtokyocabinet.so.*
%{_mandir}/man1/tc*.gz
%{_libexecdir}/tcawmgr.cgi

%files devel
%defattr(-, root, root, -)
%{_includedir}/tc*.h
%{_libdir}/*.so
%{_libdir}/pkgconfig/%{name}.pc
%{_mandir}/man3/t*.gz
%doc doc/*

%changelog
* Thu Jan 29 2009 myfinder
- New Build

次にTokyo TyrantのSPECを作成します。


$ vi ~/rpm/SPECS/tokyotyrant.spec

Summary: Network Interface for TokyoCabinet
Name: tokyotyrant
Version: 1.1.11
Release: 1
License: LGPLv2+
Group: Development/Libraries
URL: http://tokyocabinet.sourceforge.net/tyrantdoc/
Source: http://tokyocabinet.sourceforge.net/tyrantpkg/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: pkgconfig zlib-devel autoconf
BuildRequires: lua-devel

%description
Tokyo Tyrant is a package of network interface to the DBM called Tokyo Cabinet.
Though the DBM has high performance, you might bother in case that multiple processes share the same database, or remote processes access the database.
Thus, Tokyo Tyrant is provided for concurrent and remote connections to Tokyo Cabinet.
It is composed of the server process managing a database and its access library for client applications.
The server can embed Lua, a lightweight script language so that you can define arbitrary operations of the database.

%package devel
Summary: Headers for developing programs that will use %{name}
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: pkgconfig

%description devel
This package contains the libraries and header files needed for
developing with %{name}.

%prep
%setup -q

%build
autoconf
%configure CFLAGS="$CFLAGS" --enable-lua
make %{?_smp_mflags}

%install
rm -rf %{buildroot}
make DESTDIR=%{buildroot} install

rm -rf %{buildroot}%{_datadir}/%{name}
rm -rf %{buildroot}%{_libdir}/lib%{name}.a

#%check
#make check

%clean
rm -rf %{buildroot}

%post -p /sbin/ldconfig

%postun -p /sbin/ldconfig

%files
%defattr(-, root, root, -)
%doc ChangeLog COPYING README
%{_bindir}/t*
%{_sbindir}/t*
%{_libdir}/libtokyotyrant.so.*
%{_mandir}/man1/t*.gz
%{_mandir}/man8/t*.gz

%files devel
%defattr(-, root, root, -)
%{_includedir}/*.h
%{_libdir}/*.so
%{_libdir}/pkgconfig/%{name}.pc
%{_mandir}/man3/t*.gz
%doc doc/*

%changelog
* Thu Jan 29 2009 myfinder
- New Build

ここまでできたら、入手したソースアーカイブを、~/rpm/SOURCES/に放り込みます。
放り込んだらrpmbuildコマンドでrpmを作りましょう。


$ rpmbuild -ba ~/rpm/SPECS/tokyocabinet.spec
$ rpmbuild -ba ~/rpm/SPECS/tokyotyrant.spec

RPMファイルは、" ~/rpm/RPMS/{architecture}/"以下に作成されます。

3. Tokyo Cabinet&Tokyo Tyrantが依存しているパッケージをインストールする

luaサポートをonにしたいので、lua-develをyumかなにかで導入しておきましょう。


$ sudo yum install lua-devel


4. Tokyo Tyrantをインストールする

~/rpm/RPMS/{architecture}/以下に出来上がっているrpmをインストールします。


$ sudo rpm -ivh ~/rpm/RPMS/{architecture}/tokyo*

インストールがウマいこといけば↓のファイルがインストールされます。
(manの表示はカットしました)


$ rpm -ql tokyotyrant
/usr/bin/tcrmgr
/usr/bin/tcrmttest
/usr/bin/tcrtest
/usr/bin/ttserver
/usr/bin/ttulmgr
/usr/bin/ttultest
/usr/lib/libtokyotyrant.so.2
/usr/lib/libtokyotyrant.so.2.3.0
/usr/sbin/ttservctl
/usr/share/doc/tokyotyrant-1.1.11
/usr/share/doc/tokyotyrant-1.1.11/COPYING
/usr/share/doc/tokyotyrant-1.1.11/ChangeLog
/usr/share/doc/tokyotyrant-1.1.11/README
$ rpm -ql tokyocabinet
/usr/bin/tcamgr
/usr/bin/tcatest
/usr/bin/tcbmgr
/usr/bin/tcbmttest
/usr/bin/tcbtest
/usr/bin/tcfmgr
/usr/bin/tcfmttest
/usr/bin/tcftest
/usr/bin/tchmgr
/usr/bin/tchmttest
/usr/bin/tchtest
/usr/bin/tctmgr
/usr/bin/tctmttest
/usr/bin/tcttest
/usr/bin/tcucodec
/usr/bin/tcumttest
/usr/bin/tcutest
/usr/lib/libtokyocabinet.so.7
/usr/lib/libtokyocabinet.so.7.6.0
/usr/libexec/tcawmgr.cgi
/usr/share/doc/tokyocabinet-1.4.3
/usr/share/doc/tokyocabinet-1.4.3/COPYING
/usr/share/doc/tokyocabinet-1.4.3/ChangeLog
/usr/share/doc/tokyocabinet-1.4.3/README

ここまでくればほぼ大丈夫ですが、動作確認はしときましょう。


# ttserver
2009-01-27T14:48:56+09:00 --------- logging started [23008] --------
2009-01-27T14:48:56+09:00 server configuration: host=(any) port=1978
2009-01-27T14:48:56+09:00 database configuration: name=*
2009-01-27T14:48:56+09:00 service started: 23008
2009-01-27T14:48:56+09:00 timer thread started
2009-01-27T14:48:56+09:00 worker thread 1 started
2009-01-27T14:48:56+09:00 worker thread 2 started
2009-01-27T14:48:56+09:00 worker thread 3 started
2009-01-27T14:48:56+09:00 worker thread 4 started
2009-01-27T14:48:56+09:00 worker thread 5 started
2009-01-27T14:48:56+09:00 worker thread 6 started
2009-01-27T14:48:56+09:00 worker thread 7 started
2009-01-27T14:48:56+09:00 worker thread 8 started
2009-01-27T14:48:56+09:00 listening started

こうなればOK、とりあえず「Ctrl+C」で切ってしまいましょう。

5. Tokyo Tyrantをchkconfigに登録する

Tokyo Tyrantをchkconfigに登録するのは簡単で、/usr/sbin/ttservctlに↓の数行追加するだけ。


# vi /usr/sbin/ttservctl

# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant
# processname: tokyotyrant

追記できたら/etc/init.dにリンクを作ってchkconfigに登録します。


# ln -s /usr/sbin/ttservctl /etc/init.d/
# chkconfig --add ttservctl
# chkconfig --list ttservctl
ttservctl 0:off 1:off 2:off 3:on 4:on 5:on 6:off

起動して確認しましょう


# /etc/init.d/ttservctl start
Starting the server of Tokyo Tyrant
Done

さらにtelnetでつないで確認します


# telnet localhost 1978
Trying 127.0.0.1...
Connected to hostname.localdomain (127.0.0.1).
Escape character is '^]'.
stats
STAT pid 23121
STAT uptime 18
STAT time 1233035968
STAT version 1.1.11
STAT rusage_user 0.000000
STAT rusage_system 0.018997
STAT curr_items 0
STAT bytes 4198720
END
quit

ここまで確認できれば、もうインストールは完了です。
が、運用を楽にするためにもうひと手間掛けましょう。

6. logrotateに登録する

/var/ttserver/logにTokyo Tyrantのログが書き出されるのですが、これを放置しておくと勝手に肥大化していって大変です。
こういうのはログをローテーションする仕組みに任せてしまうのが楽です。


# vi /etc/logrotate.d/tokyotyrant

/var/ttserver/log {
compress
missingok
notifempty
sharedscripts
postrotate
/sbin/service ttservctl hup > /dev/null 2>/dev/null || true
endscript
}


Tokyo Tyrantの起動停止スクリプトがHUPをフォローしてくれているので、これだけでOKというのが何とも楽でいい感じです。

ここまでやっておけば、永続化機能のついた、OSごと再起動が掛かっても勝手に復活するmemcachedサーバ的な使い方が出来るようになります。

今日はこんなもんで。

0 件のコメント: