2012年6月30日土曜日

自動中指迎撃システムについて

自動で中指に反応してリプライを飛ばします。(Twitbotでやれよというのは無しで…)


自宅のサーバーでDaemon化して動かしてます。
python-twitterを使ってTwitterクライアント支援プログラムを作ってます。現状ではリプライのテキストの中から「)☝」を検出してあったらそのツイートにリプライを飛ばすだけのbotです。APIの消費量を減らすために30秒ごとのMention欄の更新にしていますので自動のリプライを飛ばすまで平均15秒かかる計算になりますが…。
この機能のコードを本体のコードから分離してプラグイン化出来たら公開しようと思ってます。ちなみにですがbotが目的ではないです。






---------------------------7月15日 追記----------------------------




UserStreamに対応させたので迎撃までのロスが秒単位までに減りました。

2012年5月26日土曜日

RAIDZを用いた冗長性のあるストレージサーバーの構築

新しいデスクトップPCを組んだ時にHDDの増設を出来なかったのと、折角工学部に入ったのでそれらしいことをしてみようというのもありストレージサーバーを組むことにしました。
RAID5は書き込みホール問題があるので選択肢から外した結果ですが

とりあえず検証環境を…


メインのデスクトップ


  • CPU:Core i5 2500K(検証時定格動作)
  • メモリー:8GB PC3-12800
  • データ用HDD:3年ほど使ってるWDの2TB(64MBキャッシュ)
  • MB:ASUS P8Z68 V-LE
サーバー用マシン


  • CPU:Celeron G530
  • メモリー:PC3-10600
  • HDD:Seagate製、3TBのHDD  ST3000DM001 ×3
  • キャッシュ用SSD:シリコンパワー製、64GBのSSD  SP064GBSSDE25S25
  • MB: GIGABYTE GA-H61M-DS2 REV2.X
スイッチングハブ
  • BSL-WS-G2108M

これでPC間の転送速度が実測80MB/s程度は出ますが、サーバー内部での実測値が200MB/sを超えていて、1000BASE-Tでは足りないのでお金に余裕ができたらリンクアグリゲーションも試してみようと思います。

さて、本題ですがFreeBSD(on ZFS)は初めてなのでこちらのページを参考にしました。一部僕とは違うところがありますが大まかには先ほどのページと同じです。ただ、zrootの部分は3台のHDDにミラーリングし、残った部分をRAIDZ構成のデータ用ストレージプールとしてます。
以下、手順のメモです。
  1. FreeBSD(amd64)のインストールディスクから起動して、指示に従って"Partitioning"で"Shell"を選択する所まで進んでください。
  2. zpool.cacheを書き換えるための書き換え可能な場所(tmp)を用意します。
    # umount -f /dev/md1
    # mdmfs -s 512M md1 /tmp
  3. デバイス名を確認。
    # dmesg | fgrep MB
    ここで容量などからインストールするHDDのデバイス名を確認してください。僕の場合はHDDがada0、ada1、ada2、トランザクション処理用のログに使用する(つまりzil用)SSDはada3でしたのでこれを前提として話を進めます。
  4. GPT形式で、パーティションを切ります。8GBをzroot、8GBをSWAP、残りをデータ用とします。
    先にHDDのパーティションを切ります。
    # gpart create -s gpt ada0 (残り2台にも同じ事を行う)
    # gpart add -b 40 -s 64k -t freebsd-boot ada0 (残り2台にも同じ事を行う)

    # gpart add -s 8G -t freebsd-swap -l swap0 ada0 (残り2台にも同じ事を行う)

    # gpart add -s 8G -t freebsd-zfs -l disk0 ada0
    # gpart add -s 8G -t freebsd-zfs -l disk1 ada1
    # gpart add -s 8G -t freebsd-zfs -l disk2 ada2

    # gpart add -t freebsd-zfs -l data0 ada0
    # gpart add -t freebsd-zfs -l data1 ada1
    # gpart add -t freebsd-zfs -l data2 ada2

    # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
    # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
    # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2

    # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 (残り2台にも同じ事を行う)

    SSDのパーティションを切ります。僕は64GB割り当てましたが8GBも有れば十分な気がします。 # gpart create -s gpt ada3
    # gpart add -t freebsd-zfs -l ssd-zil ada3
  5. zpoolを作成します。エラーが出ますがマウントできないだけで作成はできているのでスルーします。
    # zpool create -f zroot mirror /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2
    # zpool set bootfs=zroot zroot
    # zfs set checksum=fletcher4 zroot
    # zfs set mountpoint=/mnt zroot
    # zfs create zroot/usr
    # zfs create zroot/usr/home
    # zfs create zroot/var
    # zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
    # zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
    # zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
    # zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
    # zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
    # zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
    # zfs create -o exec=off -o setuid=off zroot/var/db
    # zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
    # zfs create -o exec=off -o setuid=off zroot/var/empty
    # zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
    # zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
    # zfs create -o exec=off -o setuid=off zroot/var/run
    # zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp

  6. データ用のプールも作成します。
    # zpool create -f data raidz data0 data1 data2 log ssd-zil
    # zfs set mountpoint=/home data


  7. あとはインストール作業です。先ほどの参考ページの手順(11)~と同じです。
    poolをexportしたのちimportします。キャッシュファイルは、先ほど作った/tmp上に作成します。
    # zpool export zroot
    # zpool import -o cachefile=/tmp/zpool.cache zroot
  8. symlink/sticky bitをたてます。
    # chmod 1777 /mnt/tmp
    # cd /mnt ; ln -s usr/home home
    # chmod 1777 /mnt/var/tmp
  9. FreeBSDのKernel/バイナリ等を展開します。
    # sh
    # cd /usr/freebsd-dist
    # export DESTDIR=/mnt
    # for file in base.txz lib32.txz kernel.txz doc.txz ports.txz src.txz;
    # do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done

  10. zpool.cacheをコピーします。
    # cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache
  11. ZFSで起動する設定を加えます。
    # echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
    # echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf
    # cat << EOF > /mnt/etc/fstab
    # Device Mountpoint FStype Options Dump Pass#
    /dev/gpt/swap0 none swap sw 0 0
    EOF
    # echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf

  12. すべての領域をアンマウントします。
    # zfs set readonly=on zroot/var/empty
    # zfs umount -a
    アンマウントが失敗した場合は強制アンマウントします。
    # umount -f /mnt
  13. マウントポイントをセットします。
    # zfs set mountpoint=legacy zroot
    # zfs set mountpoint=/tmp zroot/tmp
    # zfs set mountpoint=/usr zroot/usr
    # zfs set mountpoint=/var zroot/var
  14. 再起動します。
    # sync;sync;sync
    # reboot
  15. OS再起動後、キーマップ・インタフェースを設定します。
    # vi /etc/rc.conf
    hostname="host1.example.com"
    ifconfig_re0="DHCP"
    keymap="jp.106"
  16. rootアカウントのパスワード設定・タイムゾーン設定を行う。
    # passwd
    # tzsetup
  17. 再起動します。
    # sync;sync;sync
    # reboot
以上でZFSの構築は終わりです。長くなったのでSSHとSambaは次の記事に書こうと思います。