2010年07月26日
PHPからcurlを使うと何が良いのかは不明
要望があったので設定。
▼検証環境
- Ubuntu-8.04 LTS
- Linux 2.6.24-6-xen
▼環境構築
$ sudo apt-get install php5-curl $ sudo /etc/init.d/apache2 restart
▼テストコード
<?php
if ($ch = curl_init('http://www.google.com/')) {
echo curl_exec($ch);
curl_close($ch);
}
この場合、Googleのトップページが表示されれば良い。
珍しくスピーカーとして勉強会に参加
いつも参加しているhbstudy(インフラエンジニア勉強会)。
半年に一度のペースで開催されているLT大会に、スピーカーとして参戦して来た。
技術ネタではなく、笑いを誘うネタ。
次回は技術ネタに…するか、身体UPDATEとするか。
2010年07月18日
普段使わないがゆえに知らない事の1つ
NFSマウントしてるのが、どのタイミングなのかが分からなかった。
netfsである事が分かったので、起動スクリプトを追いかけてみた。
▼検証環境
- CentOS-5.4
▼/etc/init.d/netfs
23 NFSFSTAB=`LC_ALL=C awk '!/^#/ && $3 ~ /^nfs/ && $3 != "nfsd" && $4 !~ /noauto/ { print $2 }' /etc/fstab`
40 [ -n "$NFSFSTAB" ] &&
41 {
42 [ ! -f /var/lock/subsys/portmap ] && service portmap start
43 action $"Mounting NFS filesystems: " mount -a -t nfs,nfs4
44 }
- 23行目: /etc/fstabからnfsのエントリを取得し、変数NFSFSTABへ代入
- 40行目: $NFSFSTABが空でない場合
- 42行目: /var/lock/subsys/portmapが無ければ、portmapを起動
- 43行目: 種類がnfs,nfs4のエントリをマウント
なるほど
後は、netfsが起動対象サービスであれば、システム起動時にNFSマウントされる。
# chkconfig --list netfs
2010年05月28日
先駆者達の記録
負荷をかけている原因を研究、追求。
年明けの改善後、この一ヶ月、しばらく続いている。
自分には、この手の作業が本業でもある。
対応するccTLD数を増やすよりも、興味がある。
カラムとインデックスをじっくり観察。
約3年前、システム開発時は必要と思っていたカラムのいくつかは、今となっては不要だった。
同様に、無駄に張っていたインデックスも不要だ。
いつ、『ルビコンの決断』をするのか?
不必要なカラムとインデックスが存在すると、少なからずともシステムに影響がある。
不要データを放置しておくのも無駄だ。
いつ、どのタイミングで、設計変更を決断するのか、しないのか。
個人サービスであるがゆえ、自由気ままに判断・決断が可能だ。
何度かメンテナンスを、こっそり行って来た。
3000万パワーの破壊力
5/27未明、alter tableを決断。検証環境にてテストを行った。
プログラムレベルでは問題なし。
実行に踏み切る…行くぞ!
数時間、処理は終わらない…
仲間の存在
『FriendFeed では MySQL を使いどのようにスキーマレスのデータを保存しているのか』を発見。
大分似た状況が書き記されていた。
意図せず、その対応策が似ている。
この先のデータ増加に対する不安が、明るい光へ向いた瞬間。
誰かに対し、技術的安心感を与える存在になりたい。そう思った。
負荷対策の前後グラフを、後日後悔する予定。
空きリソースを有効活用
2010年に入ってからシステムの体質改善に注力していた。
前回のエントリ3000万レコードとの戦いに勝利の後、何をするべきかを考えていた。
実装したくても過負荷により実装を断念していたタスクを掘り起こしてみた。
『各種統計情報を出す』
こんなタスクがあった。
統計対象データは?
- ステータス情報(ok, pendingDeletion)
- 登録年月日の傾向
これらを出す為にクローラーに実装を追加したのが、今月中旬。
3000万エントリのクロールが終わると、何か面白いデータが出て来るはずだ。
夏が終わる頃、結果をまとめ、公開予定。
2010年05月27日
ジョブ処理しないので、Hinemos Agent不必要
『Hinemos』を監視システムとして利用したい。
この場合、Hinemos Agentを利用したジョブ処理は不用。
Hinemos Agentはインストール不用で、snmpdの設定さえあれば良い。
「果たして、Hinemosを使う意味があるのか…?」と言う事は、今回の議論の対象外とする。
▼動作実績環境
- Amazon EC2
- Ubuntu 8.04 LTS(x86_64)
- Linux 2.6.24-6-xen
- Hinemos 3.1.4
- snmp 5.4.1~dfsg-4ubuntu4.3
作業内容
監視対象ノード
▼snmpdインストール
$ sudo apt-get -y install snmpd
▼使用IPアドレスを変更
$ sudo cp -pi /etc/default/snmpd /etc/default/snmpd.0 $ sudo vi /etc/default/snmpd $ diff /etc/default/snmpd.0 /etc/default/snmpd 11c11,12 < SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1' --- > #SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1' > SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 0.0.0.0'
▼managerからシステム情報を取得可能に設定変更
$ sudo cp -pi /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.0 $ sudo vi /etc/snmp/snmpd.conf $ diff /etc/snmp/snmpd.conf.0 /etc/snmp/snmpd.conf 61,62c61,62 < com2sec paranoid default public < #com2sec readonly default public --- > #com2sec paranoid default public > com2sec readonly default public
▼snmpd再起動
$ sudo /etc/init.d/snmpd restart
Hinemos Manager
▼システム情報取得可能かどうかを確認
$ snmpwalk -v 1 -c public [ 監視対象IPアドレス ] .1.3.6.1
※HOST情報を取得出来れば良い
あと書き
今回は、Amazon EC2のセキュリティグループ設定があるのでsnmp接続許可設定を無視している。
その他環境では、snmp接続の許可・拒否を考慮すべき。
2010年05月21日
Amazon EC2特有仕様により、環境構築に苦戦した
忘れないうちに手順をまとめておく。
苦戦要因は、IPアドレスだ。
Amazon EC2には、ローカルIPアドレスと、グローバルIPアドレスが存在する。
インスタンス内ではローカルIPアドレスを使用。
通常、Hinemosマネージャーに指定するのはIPアドレス。
果たして、Hinemosマネージャーに指定するIPアドレスは…?
▼動作実績環境
- CentOS-5.5(x86_64)
- Linux 2.6.21.7-2.fc8xen
- Hinemos 3.1.4
事前作業
▼Security Groupに新グループ追加
- tcp
- 1098
- 1099
- 3873
- 4444
- 4445
- 4446
- 4457
- 8009
- 8080
- 8083
- 24457
- udp
- 514
追加したグループを指定し、インスタンス起動する
作業内容
▼必要に応じてインストール
# yum -y update # yum -y install wget
▼Hinemosマネージャをダウンロード、伸張
# cd /tmp/ # wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fhinemos%2F45345%2Fhinemos_manager-3.1.4_rhel5_32.tar.gz' # tar zxvf hinemos_manager-3.1.4_rhel5_32.tar.gz # cd Hinemos_Manager-3.1.4_rhel5_32/
▼syslog-ngインストール時にエラーになるので、syslog-ng.confのテンプレートを修正
# cp -pi syslog-ng_setup.conf syslog-ng_setup.conf.0
# vi syslog-ng_setup.conf
# diff syslog-ng_setup.conf.0 syslog-ng_setup.conf
21c21
< source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
---
> source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); udp(ip(0.0.0.0) port(514)); };
※EC2のLinuxカーネルがIPv6を使えない為、IPv6アドレスにportをbindする際、起動に失敗する。失敗させないための策。
▼インストールスクリプトを実行
# export LANG=C # ./manager_installer_EN.sh Hinemos installation will be started, is that OK?(Y/N default:Y) >>enter<< The installation user and the installation directory are created. User hinemos is created. Creating mailbox file: File exists Changing password for user hinemos. New UNIX password:******** BAD PASSWORD: it is based on a dictionary word Retype new UNIX password:>>hinemos<< passwd: all authentication tokens updated successfully. User hinemos was created. Installation directory /opt/hinemos was created. Manager's IP address is set. Please input IP address of the server which installed Hinemos manager. [[ Public DNS Name ]]※ここでIPアドレスではなく、Public DNS Nameを指定する Is it [[ Public DNS Name ]]? (Y/N default:Y) Please input JBoss boot user name.(hinemos/root default:hinemos) >>enter<< hinemos is correct? (Y/N default:Y) >>enter<< Start copying required files into the installation directory. Please input ftp server's IP address needed by corrective run (default:127.0.0.1) >>enter<< JRE Do you agree to the above license terms? [yes or no] yes Starting system logger: [ OK ] /etc/hosts is changed. May I change /etc/hosts? (Y/N) Y /etc/hosts was changed. Please confirm it after the end of the installation. The database is initialized. waiting for postgres to start... done postgres started ALTER ROLE waiting for server to shut down.... done server stopped LDAP is initialized. The initialization of LDAP was completed. Hinemos manager installation was completed.
▼初回起動テスト
# su - hinemos -c /opt/hinemos/bin/hinemos_start.sh Hinemos starting waiting for postgres to start... done postgres started waiting for slapd to start... done slapd started waiting for jboss to start... ......................done jboss started Hinemos started
▼システム起動時にHinemosが起動するように設定
# cp -pi /etc/rc.local /tmp/rc.local.0 # vi /etc/rc.local # diff /tmp/rc.local.0 /etc/rc.local 9a10,11 > > /usr/bin/id hinemos && su - hinemos -c /opt/hinemos/bin/hinemos_start.sh
▼/etc/hostsを修正
# cp -pi /etc/hosts /tmp/hosts.0 # diff /tmp/hosts.0 /etc/hosts 2c2,3 < [[ Public DNS Name ]] domU-12-34-56-78-AB-90 --- > [[ Internal IPv4 ]] domU-12-34-56-78-AB-90 > [[ Internal IPv4 ]] [[ Public DNS Name ]]
インストールスクリプトは、IPアドレス指定を想定しているので、/etc/hostsが不正内容となる。その対応修正。
▼システム再起動
# reboot
▼この後、Hinemosクライアントを利用
- user: hinemos
- pass: ********
- host: jnp://[[ Public DNS Name ]]:1099
ログインに成功したら環境構築成功。
あと書き
Amazon EC2では「Public DNS Name」を上手に利用するべきだと分かった。
- 内部で名前解決するとローカルIPアドレス
- 外部で名前解決すると、グローバルIPアドレス
- ルーティングの関係?で、インスタンス内からグローバルIPアドレスへは通信出来ない
- 唯一、内外共通で利用出来るのが「Public DNS Name」と言う訳だ
これは別エントリで改めてまとめる予定。
自分でシンプル環境を構築しよう
前回は、Xen domU用イメージ作成スクリプトを作った。
今回はAmazon EC2用イメージ作成スクリプトだ。
▼動作実績環境
- CentOS-5.4(x86_64)
- Linux 2.6.18-164.15.1.el5xen
- yum 3.2.22
使用例
▼CentOS-5.5(2010/05/21現在最新)のツリーを作る
$ git clone git://github.com/hansode/vmbuilder.git $ cd vmbuilder/ec2/redhat/ $ sudo make-domu-tree.sh --dist=centos --ver=5.5 --arch=i386
※ --dist=fedora とすると、fedoraのツリーが構築される。
誰かが作るであろう最新版CentOSのAMIを、もう、待つ必要がない。
次はDebian系のイメージに着手予定。
【結果】問題解決に成功した
『Hinemos』をインストール。
インストール検証環境にてインストールを行い、動作確認を終えた。
その後、別環境への環境構築を行ったら問題にぶち当たった。
▼対象環境
- Amazon EC2
- CentOS-5.5 (i386)
- Linux 2.6.21.7-2.fc8xen
- Hinemos hinemos_manager-3.1.4_rhel5_32.tar.gz
▼syslog-ng起動失敗
# /etc/init.d/syslog-ng restart
Shutting down system logger: [ OK ]
Starting system logger: Error creating socket; error='Bad file descriptor (9)'
Error initializing source driver; source='s_net'
[FAILED]
同じ現象に遭遇した人を発見。
Re: Hinemosマネージャのインストール中にsyslog-ng起動失敗どなたか解決の方法をお知りでしたら、助けていただければ幸いです。
・・・?未解決のまま終わっている。
未解決は宜しく無い
こう言った原因解明にはstraceコマンドが便利だ。
困った時のstraceコマンド。
# strace /sbin/syslog-ng -d -f /etc/syslog-ng/syslog-ng.conf
...(省略)...
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(514), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 255) = 0
setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [0], 4) = 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = -1 EAFNOSUPPORT (Address family not supported by protocol)
fcntl64(4294967295, F_GETFL) = -1 EBADF (Bad file descriptor)
fcntl64(4294967295, F_GETFD) = -1 EBADF (Bad file descriptor)
time(NULL) = 1274413588
write(2, "Error creating socket; error='Ba"..., 55Error creating socket; error='Bad file descriptor (9)'
) = 55
time(NULL) = 1274413588
write(2, "Error initializing source driver"..., 49Error initializing source driver; source='s_net'
) = 49
exit_group(2) = ?
PF_INET6…?
▼/etc/syslog-ng/syslog-ng.confを調査
source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
なるほど。
▼/etc/syslog-ng/syslog-ng.confを修正
# cp -pi /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.0
# vi /etc/syslog-ng/syslog-ng.conf
# diff /etc/syslog-ng/syslog-ng.conf.0 /etc/syslog-ng/syslog-ng.conf
92c92
< source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
---
> source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); udp(ip(0.0.0.0) port(514)); };
# /etc/init.d/syslog-ng restart
Shutting down system logger: [FAILED]
Starting system logger: [ OK ]
tcp6とudp6の設置を削除。
無事にsyslog-ngが起動した。
あと書き
- IPv6未対応環境だったのが原因
- 今回はIPv6を必要としないので問題ない
- 問題は解決しよう。
問題解決した時の達成感がタマラナイ。
2010年05月14日
sshdとnetworkだけあれば、それでいい
検証環境で良く実行している
# chkconfig --list | egrep -v 'ssh|network' | while read svc dummy; do chkconfig --del $svc; done
必要に応じてegrepに削除除外サービスを追加すればいい。
