I ♥ WordPress

サーバの構築を簡単にするためのステップ (その3)
2007/08/02 08:00 posted by kunkichi

前のエントリの続き。

はてなと一般IT企業との乖離については前回で終わり。だってめんどくさいんだもん(爆)。まあどこの会社にもいろいろ政治的な問題があって難しいということを単に愚痴ってみただけです(笑)

今日はこれ。

まっさらなサーバを30分で本番投入できるようにする

サーバをバックエンドの本番に投入するまでには、おおまかに以下のことが必要です。

〜略〜

  • OSのインストール

〜略〜

はてなダイアリー - とあるはてな社員の日記

2. OSのインストール

はてなが現在メインで使っているのは確かCentOSが多いらしい。CentOS は Red Hat EL のクローンであり、自動インストールの仕組みは Red Hat 標準の仕組みである「キックスタート」がそのまま使える。

昔、Red Hat 7〜9 を仕事で使っていた頃は検証環境を作ったりするのにFDからキックスタートして環境作り直しとかよくやってたんだけど、ここ数年は 商用UNIXばっかりで Linux から離れていたので、ちょっと復習をかねて、キックスタートを使ったOSのインストール手法を整理してみる。ちなみにOSはCentOS5を使います。

  1. CD/DVDからインストール。キックスタートファイルはFDに置く。

    一番ベタなやり方。でもこれだけでインストール時の対話形式をスキップできる。

    昔は、インストールFDの中にキックスタート設定ファイル(ks.cfg)を入れてたのだけど、RHEL ではもうFDからの起動は出来なくて必ず CD/DVD から起動する必要があるらしい。ただし、キックスタートだけでFDを使うことはできる。

    とりあえず普通に1回インストールすると/root/anaconda-ks.cfgというファイルが作成される。これがインストール時の設定内容に基づいて作成されたキックスタート設定ファイルなんだけど、これをベースにしてカスタマイズしてみる。
    # Kickstart file automatically generated by anaconda.
     
    install
    cdrom
    lang ja_JP.UTF-8
    keyboard jp106
    network
      --device eth0 ¥
      --bootproto static ¥
      --ip 192.168.0.101 ¥
      --netmask 255.255.255.0 ¥
      --gateway 192.168.0.1 ¥
      --nameserver 192.168.0.1 ¥
      --hostname test.example.com
    rootpw --iscrypted *****************************
    firewall --disabled
    authconfig --enableshadow --enablemd5
    selinux --disabled
    timezone Asia/Tokyo
    bootloader --location=mbr --driveorder=hda
    # The following is the partition information you requested
    # Note that any partitions you deleted are not expressed
    # here so unless you clear all partitions first, this is
    # not guaranteed to work
    clearpart --linux --drives=hda
    part /boot --fstype ext3 --size=100 --asprimary
    part swap --size=1000
    part / --fstype ext3 --size=100 --grow
     
    %packages
    @base
    @core
    @development-libs
    @development-tools
    @japanese-support
    kernel-devel
    lm_sensors
    net-snmp-libs
    net-snmp
    ntp

    オリジナルのanaconda-ks.cfgからカスタマイズしたところは以下。

    • デフォだとファイアウォール と SELinux が有効になっているので disable。
    • デフォだとディスクのパーティション構成を設定する箇所がコメントアウトされてるのだけどこれを有効にする。ちなみに上のパーティション構成はテストなのでとても安易w。
    • 最後の方のインストールするパッケージグループ・パッケージ名にいくつか追加(lm_sensors、net-snmp-libs、net-snmp、ntp)。

    あと、便宜上ネットワーク設定の箇所はバックスラッシュ入れて複数行に分けてるけど、実際には1行で書く必要あり。バックスラッシュも使えません。

    でこのファイルを FD に ks.cfg というファイル名でコピーする。
    # mkdir /mnt/floppy
    # mount /dev/fd0 /mnt/floppy
    # cp -pi ks.cfg /mnt/floppy
    # umount /mnt/floppy
    これができたら準備完了。いよいよサーバのインストールを行う。

    CD/DVDで起動。インストーラ起動画面が表示されたら以下のように入力。
    boot: linux ks=floppyあとは終わるまでのんびりとコーヒーでも。

  2. CD/DVDからインストール。キックスタートファイルはネットワーク上に置く。

    1. でかなり時間は短縮できるようになったけど、今時FDってのもねー。FDDがないサーバも多いし。ということで、次はネットワーク上からキックスタート設定を拾ってくるようにする。ということで、必要なのは BOOTP/DHCP と NFS の設定。

    まず、適当なサーバにks.cfgを移動して NFS で公開。ここでは /export/nfs/ks を公開ディレクトリする。このときファイル名は”割り当てたいIPアドレス-kickstart”にしておくこと。例では192.168.0.101で割り当てます。
    # mkdir -p /export/nfs/ks
    # cp -pi /tmp/ks.cfg /export/nfs/ks/192.168.0.101-kickstart
    # vi /etc/exports
    ---–
    /export/nfs/ks *(ro,no_root_squash)
    ---–
    # service nfs start

    次にBOOTP/DHCPの設定。BOOTP は使ったことないので、DHCPでやります。
    yum で dhcp をインストールして、設定ファイルをちょこっと書き換え。
    # yum install dhcp
    # cp -pi  /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
    # vi /etc/dhcpd.conf

    とりあえずこんな感じで書き換え。割り当て範囲は192.168.0.101だけにしてます。最後の方でNFSの公開ディレクトリとサーバのIPを設定してます。
    ddns-update-style interim;
    ignore client-updates;
     
    # 割り当てたいネットワークの範囲
    subnet 192.168.0.0 netmask 255.255.255.0 {
     
    # --- default gateway
            option routers                  192.168.0.1;
            option subnet-mask              255.255.255.0;
            option domain-name-servers      192.168.0.1;
     
            # 割り当てたいIPアドレスの範囲
            range dynamic-bootp 192.168.0.101;
            default-lease-time 86400;
            max-lease-time 172800;
     
            # NFSサーバでキックスタートファイルをおいているパス
            filename "/export/nfs/ks/";
            # NFSサーバのIPアドレス
            next-server 192.168.0.254;
    }

    ではDHCPを起動。
    # service dhcpd start

    ではCD/DVDで起動してインストールしてみる。インストーラ起動画面が表示されたら以下のように入力。
    boot: linux ksあとは終わるまでのんびりとお菓子でも。

    ちなみにちょっと注意として、dhcpd.conf でリースするIPをある範囲で指定する場合、つまり192.168.0.10〜100とかで指定する場合は、どれが割り当てられるかわからないので、キックスタートファイル名のIPが予測できない(上の例で割り当てられるIPを一つだけにしたのはそのため。)予め、NIC の MACアドレスを調べておいて、このMACにはこのIPを割り当てるとかした方がいいかも。

  3. CD/DVDで起動。キックスタートファイルとインストールデータはネットワーク上に置く。

    せっかくキックスタートはリモートでおけるようになったのだから、インストールするデータもネットワーク上においてしまおう。CentOS5はCDだと6枚組だし最小構成でも全部必要なので入れ替えるの面倒。DVDだと1枚で済むけどたくさんメディアを使うのはコスト的によろしくない。ということでインストーラをブートするだけCDを使うことにする。

    まずインストールするデータをネットワーク上におく。本家サイトからダウンロードしたインストールDVDのISOイメージを公開するディレクトリにマウント。その後NFSで公開。
    # mkdir /export/nfs/iso
    # mount -o loop /tmp/CentOS-5.0-i386-bin-DVD.iso /export/nfs/iso
    # vi /etc/exports
    ---–
    /export/nfs/ks *(ro,no_root_squash)
    /export/nfs/iso *(ro,no_root_squash)
    ---–
    # service nfs reload

    次にキックスタート設定ファイルの中身を書き換える。今の設定ファイルだとCDROMからインストールするようになっているのでこれをNFSを使うようにする。
    # vi /export/nfs/ks/192.168.0.101-kickstart
    ---–
    cdrom
    ---–

    となっている箇所を、
    -----
    nfs --server=192.168.0.254 --dir=/export/nfs/iso
    ---–

    に変更する。

    後はこれまでと同じく
    CD/DVDで起動してインストーラ起動画面で以下のように入力。
    boot: linux ksあとは終わるまでのんびりと昼寝でも。

てな感じで。まだ工夫の余地はたくさんあるんだけど、これだけでも結構効率が上がるはず。

ほんとは、PXEブートを使って、インストールCD/DVDもなし、完全な無人インストールをやりたかったのだけど、PXEブートに対応してるNICがないのでそれはまた今度。

サーバの構築を簡単にするためのステップ (その2)
2007/07/30 21:58 posted by kunkichi

前回のエントリではてなのサーバインフラの構築プロセスについて引用したのだけど、プロセス毎に勝手な推測を並べてみようと思う。ポイントとしては以下。

  • 各プロセスごとの作業で、はてなの手法は一般的なIT企業でもできるのか?
  • 引用元ではあまり具体的に書かれていないので実際にやってみる。(個人的な興味として)

まず引用元の本番環境へのサーバ投入のおおまかなプロセス。

まっさらなサーバを30分で本番投入できるようにする

サーバをバックエンドの本番に投入するまでには、おおまかに以下のことが必要です。

  • ハードの組み立て・設置
  • OSのインストール
  • アプリケーションの動作に必要なライブラリ等のインストール・設定
  • 監視などインフラの一部として動作するための設定
  • アプリケーションのデプロイ
  • ロードバランサの設定への追加

はてなダイアリー - とあるはてな社員の日記

プロセスの流れ自体は至極当たり前のことで、普通にIT企業でも普通に行うようなことで特に変わったことはないので、個々に見ていく。

1. ハードの組み立て・設置

はてなでは、サーバ自体を自作しているらしい。詳細は以下で垣間みれる。

自作のメリットは

  • 必要なときにすぐ追加することができる
  • 用途に合わせてカスタマイズできる
  • コストが安い

ということのようだけど、まずこれが一般のIT企業では一番難しいかもしれない。なんでか?

すごく簡単なことで、上記のような構成では

「保守(契約)」がない

もうコレに尽きる。保守契約がない場合、何かしら問題が発生したとした場合は自分たちで解決しないといけない。そんなの当たり前ではあるのだけど、実はここがポイントだと思う。確かに始める前から起こってもいない先のことを懸念している後ろ向きな理由だし、はてなのようにこの構成のメリットを見ていないのは百も承知。でもこれが問題となるケースが二つ存在すると思ってる。

  1. よくわからない異常や不具合が起こったとき

    最近のソフトウェアにはオープンソースというものがあり、何か問題が発生したとしてもソースが公開されているので(追っかけようと思えば and ソースを読めるスキルがあれば)追っかけることができる。これに対して、ハードウェアは基本的に製造元ベンダーしか情報を知らないブラックボックス度が高い。(もちろんソフトウェアでも商用の場合は同じパターンが当てはまる。)もちろんいろんなツールを駆使すればある程度は調査出来ないわけではないだろうけど、それでも限界がある。つまりソフトに比べるとハードの方が専門性がより高い、すなわち保守が必要。

  2. 異動が発生したとき

    会社の規模が大きくなると、社内での異動とか転勤というのは結構普通に行われる。5〜6年程度でチームの担当がゴロッと入れ替わって導入当初の人間が一人もいないというのはよくある話。もちろん、ちゃんと情報共有できているかとかスキルの統一が出来ているかとかそんなのは考慮されるわけがない。逆に全く別分野の人が平気で配属されたりすることもあるだろう。こうなった場合、どんだけ整理していたとしても理解が行き届いているわけではないし、ドキュメント用意しておいたとしてもいきなり理解しろってのも無茶。であれば、ある程度はベンダーに依存しておいたほうが無難だったりする。

ということで必然的に商用ベンダーで機器を購入して保守契約を結ぶほうがコストはかかっても無難ということになるわわけ。

もちろん、はてなでもこういったケースはありうる訳だけど、それに対応するだけのノウハウ(パーツの選定・試験・評価)・準備(パーツ在庫の保持)・スキル(問題発生時にどうするか?)を蓄積しているようなので、それで食べれているのではないかと。そしてその蓄積は、はてなの「技術を大事にする」」社風に引かれて集まってきた優秀なエンジニア・それを尊重する経営陣によってこれまでの長い間(といっても老舗に比べたらそんなに長くはないけど。)に積み重ねられたものであり、単にノウハウだけを一般のIT企業が真似できるかといっても出来るものではないと思う。

ただ、最近では商用サーバもコストが下がってきたこともあって、はてなでもDELLやSunのサーバを入れているようなので、この辺は違いがなくなりつつあるので今後はあんまり障壁にはならないかな。いずれにせよここまでいろんなノウハウを蓄積して工夫してきたことはほんとに素晴らしいと思います。

続きはまた今度。

サーバの構築を簡単にするためのステップ (その1)
2007/07/29 23:02 posted by kunkichi

はてなダイアリーにこんなエントリが載っていました。

まっさらなサーバを30分で本番投入できるようにする

新しいサーバをまっさらな状態から、だいたい30分程度で本番投入することができていました。これを、どのように実現したのかを軽く紹介したいと思います。(はてなダイアリー - とあるはてな社員の日記

30分かー、早いなー、さすがはてな。

僕のこれまでの職場では、全サーバ数は多くても数十台程度しかなかったし、一回のサーバ新規追加・増設作業で構築するサーバの数も2〜3程度だったので、このレベルだと新規追加なら1台構築してあとはテープでコピーして複製・設定変更、既存サーバの増設だと構築時のテープから複製、って感じ。作業コストとしてはせいぜい1日程度。これが早いか遅いかは仕事の量にもよるのだろうけど、これまでの職場ではこれが遅いという風な話にはならなかったんだよね。この辺、意識の時点でかなりの差をつけられてるな(苦笑)。

ただし、このレベルまで整理するのは結構な作業コストもかかっていると思う。もちろん1回作ってしまえばおしまいなので(もちろん運用コストはかかるけどそれは別の話)、こっちのほうが正しいとは思うんだけど、ただ世の中の企業がすべてこれを踏襲できるとは思えなくて、技術者をかこっておくコストがないとか、技術者が他の業務で余裕がないとか、そういう理由諸々で、この整理する作業コストを捻出すること自体が難しい場合は多々あるんじゃないかと。まあこの辺にちゃんとコストをかけるというところが、はてなのよさであり、競争の中でのコアコンピタンスでもあるのだろうけど、一般的に「IT企業」と呼ばれてるようなところと比較しても乖離している気がする。

ただ、こういった情報の公開自体はとても参考になるし、上記のような企業であっても整理するきっかけにはなると思うので、どんどん公開して頂きたい。

そうそう、上記のエントリはあまり具体的に書いている訳ではないので、ちょっとはてなと世の中一般との乖離具合を踏まえた上で、はてなの導入プロセスをこれから何回かに分けて具体的に試してみるつもりです。

『今夜わかるTCP/IP』
2007/07/27 23:53 posted by kunkichi

読書強化週間。今更ながらこんなものを読んだりしてます。

サーバ運用とかやってたくせに、実はネットワークには自信がなかったり。というのはちゃんと勉強したことがないんだよね。大学で Computer Science の Introduction 的な授業を取っていた時に、使ってた教科書がMCPの「Networking Essentials」でほんとその程度。仕事でもサーバとネットワークで担当が違ったりしてたからお任せだったし。これもまたやっぱりもっと知っておかないと行けない分野(単に僕が知らなさすぎなだけ)ということで。

このシリーズは『今夜わかるHTTP』がとてもまとまっていてよい内容だったので期待していたのだけど、これも構成がよくまとまっていてよかった。Amazon のレビューにもあるようにタイトルやイラストから初心者向けっぽく見せつつも実はある程度はわかってる人向けな気がするので、ほんとの初心者には難しいかなという気はするんだけど、僕のように多少はわかってるんだけど、、ていう人にうってつけな感じ。

ふと思ったのだけど、専門分野外の技術ってそんなパターンが多い気がするね、ある程度は知ってるけど詳しくは知らないとかちゃんと勉強したことないみたいな。本買ったりしても積読とかあとはリファレンスにしか使ってないとか多いし。こうやってちゃんとまとめられた内容で読むと整理が出来てスッキリする。

改めてやっぱり基礎は重要。

NTP は tcp で通信可能?
2007/07/24 20:22 posted by kunkichi

不意に/etc/servicesを見てて気になったんですが、

$ grep -i "^ntp" /etc/services
ntp             123/udp     # Network Time Protocol
ntp             123/tcp     # Network Time Protocol

NTP は 一般的に 123/udp が当然だと思っていたのですが、123/tcp って使えるのでしょうか?ちなみに、Mac OS X 10.4 でも CentOS5 でも同じ。

“FireWall NTP tcp 123″で ググってみると firewall の設定で ntp の穴開ける時に tcp も併せて通す人多いし、、、

なんで?

RFC1305にはtcpっていう文字すら出てこない。

printf/sprintf で 2進数で出力する
2007/07/24 11:33 posted by kunkichi

メモ。printf/sprintf の 型指定で b を使うと 2進数 で出力できる。Perl 5.6以降っぽい。
$ perl -e 'printf("%3d:%08b\n",$_,$_)for(0..255)'
  0:00000000
  1:00000001
・・・
254:11111110
255:11111111

Solaris8 標準の Perl は 5.003だから自分で書かないと無理かな。

参考:
↓まるまる載ってた。
2進10進数変換

yumで最も早いミラーサイトを探す
2007/07/13 23:52 posted by kunkichi

知らなんだのでメモ。

# yum install yum-fastestmirror

消費電力改善を追求するLinux開発者たち
2007/07/05 18:39 posted by kunkichi

CNET Japanにこんな記事が載っていました。

消費電力改善を追求するLinux開発者たち

Linuxの新バージョンに搭載されている「ティックレスカール」について、プログラマーたちは、同オープンソースOSの効率改善につながると期待している。これは、プロセッサの消費電力を節約することを目的とした技術だ。(CNET Japan

最近は、高処理性能なマルチコアCPUが大流行りですが、併せて低消費電力を宣伝してることも多いです。まあ個人のレベルでもノートPCのバッテリ駆動時間なんかで恩恵を受けるんだろうけど、個人的には、

また、一般的に24時間稼働するサーバでは、増加する一方の電気料金を節約できる。

というところがかなり恩恵を受ける、というか受けたいところ(笑)。

データセンターのラック収容効率ってのは、結局のところ、ラックサイズとか熱量とかではなくて、ラックの電源容量に対してサーバの消費電力が頭打ちになるパターンがほとんどだしね。

これまでの消費電力改善に対しては、ハードウェア側からのアプローチが(宣伝もあって)大きいと思うのだけど、今度はOS側からもこういうアプローチが行われることはとても素晴らしい。また、ソフトウェアという意味では、OSだけでなくその上に乗っかってるアプリケーションのレベルでもこういった対応は求められる訳で、消費電力改善を妨げるような挙動をするものを探すツールが併せて提供されるというのも素晴らしい。

データセンターでのラック収容に悩んでる人は多いと思うので、期待したいです。

名前ベースのバーチャルホストでそれぞれの証明書を使う
2007/07/05 01:12 posted by kunkichi

『セキュリティホールMEMO』にこんな記事が載ってました。

■ 2007.07.04

・名前ベースのVirtualHostでそれぞれのSSLサーバ証明書を使う (Web Security Memo, 7/4)。

RFC 3546 - Transport Layer Security (TLS) Extensionsというものがあるのですか。

ということで元記事の『Web Security Memo』。

Web Security Memo : 名前ベースのVirtualHostでそれぞれのSSLサーバ証明書を使う

Name-based SSL virtual hosts』 より、

名前ベースのVirtualHostでSSLを使う場合、以下の方法をとれば、それぞれのVirtualHostごとの証明書を使うことができます。

これは結構驚き。名前ベースのバーチャルホストではSSLが使えないというのが当然だと思ってました。固定概念って怖いね。

(※ 厳密に言うと”SSL”の部分はできなくはないけど、”証明書”があんまり意味をなさなくなる。個人の自宅サーバならともかく、商用サイトではそんなんありえないすね。)

まだちょっと experimental な感じもするし対応しているブラウザも少ないみたいだけど、IPアドレスが節約できるのはいいな、管理も楽になるし。

時間があるうちに試してみようっと。

dig の出力に色をつける dig-color(perl版)
2007/07/04 02:09 posted by kunkichi

せっかく『あわせて読みたい』の画像をはっつけたので、どんなサイトが「あわせて」読まれてるのかな?ということで、リンクをたどってみたら、こういうのを見つけました。

cl.pocari.org - dig の出力に色をつける dig-color

dig の出力に色をつける dig-color というのを作ってみました.
リソースレコードタイプは A/NS/CNAME/SOA/MX のみにしか対応していませんので,そのほかのタイプが必要であれば追加してください.

こちらはRubyで書かれているようで、Rubyが入ってない環境は結構あるかなと思ったので、Perlで書き換えてみました。

#!/usr/bin/perl -w
 
use strict;
use warnings;
 
my %colors = (
    "section" => "02;01",
    "comment" => "37",
    "normal"  => "00",
    "A"       => "32",
    "NS"      => "34",
    "CNAME"   => "36",
    "SOA"     => "33",
    "MX"      => "31",
);
 
my @return = readpipe( "dig " . join( " ", @ARGV ));
foreach my $line ( @return ){
    my $color = $colors{"normal"};
    if( $line =~ /^;;.+SECTION:$/ ){
        $color = $colors{"section"};
    }elsif( $line =~ /^;/ ){
        $color = $colors{"comment"};
    }elsif( $line =~ /^(.+\s)(SOA|NS|A|MX|CNAME)(\s.+)$/ ){
        $color = $colors{"$2"};
        # レコードタイプのみに色を付ける場合
        #$line = sprintf "%s\e[%sm%s\e[00m%s\n", $1, $colors{"$2"} ,$2, $3;
    }
    printf "\e[%sm%s\e[00m", $color, $line;
}

ま、単にPerlの書き方に変えただけなんだけど。変数とか配列とかの書き方とか、あとpopen使ったことないのでreadpipeに置き換えただけみたいな、本当にその程度。

むしろ、出力に色を付けるのは詳しく知らなかったので、その辺はいじらないでそのまま動かしたら、サラッと動いちゃったので本人がびっくり、みたいな(爆)

結果はこんな感じ。

dig の出力に色をつける dig-color(perl版)

色がつくだけで何気に見やすくなるんですね。オリジナルの作者の方のアイデアに感謝。

このページの先頭へ