2009年10月12日月曜日

IPnutsでKVM

ここの続き
http://groups.google.co.jp/group/simple_index/web/090926-index21


x86dではなくて v86dの誤り。

パッケージを作った。

# lrp_load -ab v86d

# mkdir /disk
# mount /dev/sdb1 /disk
# cd /disk/kvm
# kvm -k ja -hda winxp.img -boot c -m 512

fbsetでframebufferの解像度も変えられる。

# lrp_load -ab fbset
# fbset -xres 1024 -yres 768 -depth 24

いつもどおり設定変更
# save_conf

windowsは、起動してから解像度を変更できた。

2009年7月1日水曜日

シェルのスクリプトに--dry-runのオプションを追加

ロングオプションをシェルに追加するときのメモ

--dry-runのオプションだけつけたかったのだが、getoptに' -o ""'がないとちゃんと動作しなかった。


#!/bin/sh

args=`getopt -o "" -l dry-run -- $@`
DRYRUN=

eval set -- "$args"

until test $1 = "--"
do
case $1 in
--dry-run)
DRYRUN="--dry-run"
;;
esac
shift
done

if test "$DRYRUN" ;then
echo "starting XXXXX(y/N):"
else
echo "dry-run XXXXX(y/N):"
fi

read a
if [ "x$a" = xy -o "x$a" = xY ] ;then
:
else
exit
fi

...(実際の動作)

2009年6月30日火曜日

スナップショット使用してMySQLの動作している仮想サーバをバックアップ

以前、IPnutsでvserverを使った仮想サーバのバックアップについて、ディスクの構成を中心にして紹介しました。
仮想サーバのバックアップ(その1)
仮想サーバのバックアップ(その2)
仮想サーバのバックアップ(その3)

この時は、まだLVMを使ってなかったので、スナップショットは使わずにバックアップをとっていました。

その後、ディスクが故障したためミラーリングしたディスク上でLVMを作成し、使用するように変更しました。

ミラー上にLVMを作る

また、他のサーバも移行してきました。

Pylonsの仮想環境を仮想マシンに移行する
Pylonsの仮想環境を仮想マシンに移行する(2)

しばらく、バックアップは以前のままでしたが、これだと、バックアップのときのダウンタイムが長くなります。そこで、せっかくLVMにしているのでスナップショットを利用して、ダウンタイムがほとんどなくなるようにスクリプトを書き直しました。

vserverの仮想サーバが2台分動作しています。非効率ですが、他のサーバから単純に移行したものなのでMySQLのデータベースもそれぞれの仮想サーバで稼働しています。

以下はバックアップのスクリプトです。

#!/bin/sh
MNTSNAP=/mnt/var_snap
VARSNAP=lvvar_snap
VARSNAPDEV=/dev/vg/$VARSNAP
VARDEV=/dev/vg/lvvar

vsqllock(){
vserver $1 exec mysql $2 -e "flush tables with read lock;"
}

vsqlunlock(){
vserver $1 exec mysql $2 -e "unlock tables;"
}

if [ -d $MNTSNAP ] ;then
mountpoint $MNTSNAP && umount $MOUNTSNAP
else
mkdir $MNTSNAP
fi

lvremove -f $VARSNAPDEV
vsqllock vserver1 database1
vsqllock vserver2 database2
sync
sync
lvcreate -s -L 1g -n $VARSNAP $VARDEV
vsqlunlock vserver1 database1
vsqlunlock vserver2 database2

if mount -o ro $VARSNAPDEV $MNTSNAP ;then
nice rsync -av --delete $MNTSNAP/lib/vservers/vserver1 /var2/lib/vservers/
nice rsync -av --delete $MNTSNAP/lib/vservers/vserver2 /var2/lib/vservers/
umount $MNTSNAP
else
echo "### mount failed ###"
echo "### mount -o ro,nouuid $VARSNAPDEV $MNTSNAP"
echo "### ------------ ###"
fi

lvremove -f $VARSNAPDEV


ネットワークから更新されるデータはデータベースのテーブルだけなので、仮想サーバを落とさずにMySQLのコマンドでテーブルが更新されないようにして、スナップショットをとります。これだと、ダウンタイムはほとんど起こりません。

mysqlのコマンドは、スクリプトの中ではvsqllock,vsqlunlockのなかで行っていますが、1行だけなので、vserverのexecコマンドでホスト側から直接仮想サーバーのmysqlコマンドを実行しています。

参考
http://labs.unoh.net/2006/09/lvm_xfs_mysql.html
http://dev.mysql.com/doc/refman/5.1/ja/flush.html

スナップショットは仮想サーバー側からとれないので、.sql文のなかでsystemコマンドを使ってスナップショットをとることはできません。

LVMでスナップショットをとったあと、すぐにロックをはずし、正常稼働状態にすることができます。その後スナップショットをマウントしてゆっくりバックアップをとることができます。

2009年6月15日月曜日

Pylonsの仮想環境を仮想マシンに移行する(2)

前回の続き

mysqlの移行
データベースはファイルをコピー
/etc/mysql/debian.cnf のパスワードもコピー

apacheの移行
/# apt-get install libapache2-mod-wsgi
wsgiの設定ファイルをコピー
環境に合わせてディレクトリの作成や設定ファイルを変更


なぜか、wsgiファイルにアプリケーションへのpythonのパスを足さないとエラーになった。
同じ環境のはずなのだが、何か違うのだろう

-- 動作するようになった
データのあまり無いサービスなので仮想マシンの環境は800MB程度。サーバのディスクが7GBあるので環境を作り直してかなり節約になった。

pound より nginx がよさそうなのでIPnutsのnginxのパッケージを作って、リバースプロクシの設定をした。



従来のからある仮想マシンのサービスはSNATで動作させていたが、これもnginx経由になった。

2009年6月13日土曜日

Pylonsの仮想環境を仮想マシンに移行する

Pylonsで動作しているサービスがあり、これのPythonの仮想環境をvserverの仮想マシンに移行する。

仮想マシンを新規作成
インターフェースはdummy0
# modprobe dummy
でできる。
仮想マシン名は vm1とすると

# vserver vm1 build --hostname vm1 -m debootstrap --interface dummy0:192.168.xx.yy/24 -- -d lenny -- --arch i386


時間が少しだけかかるのでコーヒーを買いにお買い物...
-----
これで仮想マシンは出来上がり

仮想マシンの環境整備

仮想マシンを起動して仮想環境に入る。

# vserver vm1 start
Starting enhanced syslogd: rsyslogd.
simplegw.sesame.local# vserver vm1 enter

sshサーバをいれて、/etc/ssh/sshd.config のListenAddress を入れておく

パッケージをインストールしてpythonの仮想環境を作る
vm1:/#apt-get install locales python apache2 mysql-server python-setuptools

vm1:/#easy_install virtualenv
...
vm1:/#mkdir -p /usr/local/python/BASELINE
vm1:/# virtualenv --no-site-packages /usr/local/python/BASELINE
New python executable in /usr/local/python/BASELINE/bin/python
Installing setuptools............done.

ユーザーを作ってから、ユーザで環境をつくる

$ mkdir pythonenv
$ virtualenv --no-site-packages pythonenv/MYAPP
New python executable in pythonenv/MYAPP/bin/python
Installing setuptools............done.

アクティベートしてpylonsをインストール
$ . pythonenv/MYAPP/bin/activate
(MYAPP)$ easy_install pytlons

これから下はアプリケーションが依存しているのでインストール

(MYAPP)$ easy_install authkit
(MYAPP)$ easy_install easy_install -U sqlalchemy

sqlのマイグレード関係
(MYAPP)$ easy_install sqlalchemy_migrate
(MYAPP)$ easy_install mysql-python

htmlを解析するツールも使っていたようなので、コンパイルする環境をインストールする
# apt-get install gcc
# apt-get install python-dev libxml2-dev libxslt1-devzlib1g-dev
# apt-get install libxml2 libxslt1 zlib1g

ユーザーで仮想環境をアクティベートして
(MYAPP)$ easy_install lxml

アプリケーションの移行
#gitのマスターが廃止予定のサーバにあるのでサーバの仮想マシンに移す。
#作業はファイルのコピーだけ。


gitをインストール

# apt-get install git-core

(MYAPP)$ mkdir pylons-public
ディレクトリを作って、gitのリモートサイトを登録してpull
(MYAPP)$ mkdir pylons-public/XXX
(MYAPP)$ cd pylons-public/XXX
(MYAPP)$ git init
(MYAPP)$ git remote add shared user@server:path_to_git
(MYAPP)$ git pull shared master
これを必要なディレクトリで行う

普通にコピーして持ってきてもOK
---つづく

2009年6月12日金曜日

サーバを復旧したディスク上で動かす

しばらく、バックアップ先のディスクの仮想マシンを動かしていたのを、新しく準備してバックアップになっていたミラーディスク上の仮想マシンで起動し直した。

4.3a3で現在稼働中。

仮想マシン以外の、openvpn(ユーザデータベース),ssl(openvpnの証明書関係),dnsmasq(tftpデータ)は再起動のシャットダウン時に、USBに保存されているはずなので、

# lrp_data-load -f

でデータを復旧。確認のため、/var2(バックアップ元)とdiffをかけてOK

マシンはサーバ入れ替えでパワーアップさせているので、他のサーバで動作している仮想マシンを移行予定

2009年6月11日木曜日

DRBD7からDRBD8.3.1への移行テスト(4)

XML差分ファイルの設定

セカンダリ側を立ち上げるが、その前にマスターとセカンダリの設定が同期がとれていないといけない。

IPnuts4.1ベータ版から、設定ファイルの差分を指定して立ち上げることが出きるようになっている。

/system/sysdiff.conf.sample と /system/sysdiff.conf.lvs_sampleのサンプルがある

/system/sysdiff.conf.lvs_sampleは lvsのセカンダリを作るときのサンプル。今回はこれに当たる。


## sysdiff.conf sample for lvs
##
## Change IP Address of port 2
#set item = { \
"xpath":"/SYSTEM/NETWORK/IP_LIST/IP[@port='2']/@ip", \
"value":"192.168.0.11" \
}
#silent $sysdiff_update.append($item)
##
## HOSTNAME
##
#set item = { \
"xpath":"/SYSTEM/HOST/HOSTNAME", \
"value":"gw2" \
}
#silent $sysdiff_update.append($item)
## VRRP setting
## -- CAUTION:
## -- Change vrid for your system.
##
## VRRP bigger prio has high priority.
##
#set item = { \
"xpath":"/SYSTEM/NETWORK/VRRP_INSTANCE_LIST/VRRP_INSTANCE[@vrid='50']/@
priority", \
"value":"50" \
}
#silent $sysdiff_update.append($item)
##
## VRRP initial state MATER|BACKUP
##
#set item = { \
"xpath":"/SYSTEM/NETWORK/VRRP_INSTANCE_LIST/VRRP_INSTANCE[@vrid='50']/@
state", \
"value":"BACKUP" \
}
#silent $sysdiff_update.append($item)



以下だけ説明する

## Change IP Address of port 2
#set item = { \
"xpath":"/SYSTEM/NETWORK/IP_LIST/IP[@port='2']/@ip", \
"value":"192.168.0.11" \
}
#silent $sysdiff_update.append($item)

PythonのテンプレートユーティティであるCheetahのテンプレートファイルの書式になっている
## #* *#はコメントになる
#はCheetahのコマンド 
それで 上記の例は xupdateに渡すサンプルで IPnutsの設定ファイルは/etc/config/sysconfig.xmlにあるXMLファイルで、それをxpathを指定して該当する値を変更する。
これだとport 2番のIPアドレスを変更する。

設定に変更がある時は、セカンダリ側では同じように設定を変更するのではなく、マスターのconfig.lrpをブートディスクにコピーしてセカンダリ側を作ることができる。
ただし、起動パッケージのリストの/system/lrp.lstを変更した時はこれもコピーする必要がある。

今回はマスター側のブートディスクからconfig.lrpと/system/lrp.lstをコピーしてセカンダリ側を立ち上げる。sysdiff.confのカスタマイズは環境によるが、IPアドレスとホストを設定すればよいと思われる。

セカンダリの起動とDRBDの同期

起動はできて、差分の設定もされているが。DRBDのディスクの同期が始まらない

error receiving ReportState, l: 4!
とか
Split-Brain detected, dropping connection!
のエラーが出る

これには次のようなコマンドを実行する。
r0はリソース名
セカンダリ側で

drbdadm secondary r0
drbdadm -- --discard-my-data connect

プライマリ側で

drbdadm connect

が..... .... プライマリ側のディスクが壊れている ???


めげずにそのままスレーブを再起動

スレーブ側は、何事もなく、drbd,keepalivedともに起動し

drbdadm role all にで Secondary/Primaryになった。

プライマリ側は、ディスクが壊れているようなので、同期を再開しようとしたときにエラーだしまくり。

ご参考まで

Jun 11 13:45:57 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406864
Jun 11 13:45:57 db1 kernel: ide: failed opcode was: unknown
Jun 11 13:45:57 db1 kernel: end_request: I/O error, dev hdb, sector 65406864
Jun 11 13:45:57 db1 kernel: drbd0: Local IO failed. Passing error on...
Jun 11 13:45:58 db1 kernel: hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jun 11 13:45:58 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406872
Jun 11 13:45:58 db1 kernel: ide: failed opcode was: unknown
Jun 11 13:45:58 db1 kernel: end_request: I/O error, dev hdb, sector 65406872
Jun 11 13:45:58 db1 kernel: drbd0: Local IO failed. Passing error on...
Jun 11 13:46:00 db1 kernel: hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jun 11 13:46:00 db1 kernel: hdb: dma_intr: error=0x40 <3>{ UncorrectableError }, LBAsect=65406887, sector=65406880
Jun 11 13:46:00 db1 kernel: ide: failed opcode was: unknown
Jun 11 13:46:00 db1 kernel: end_request: I/O error, dev hdb, sector 65406880
Jun 11 13:46:00 db1 kernel: drbd0: Local IO failed. Passing error on...
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394072s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394080s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394088s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394096s.
Jun 11 13:46:00 db1 kernel: drbd0: Sending NegRSDReply. sector 394104s.
Jun 11 13:49:00 db1 kernel: drbd0: Resync done (total 257 sec; paused 0 sec; 7140 K/sec)
Jun 11 13:49:00 db1 kernel: drbd0: 57 failed blocks
Jun 11 13:49:00 db1 kernel: drbd0: conn( SyncSource -> Connected )
Jun 11 13:49:00 db1 kernel: drbd0: cs:Connected rs_left=57 > rs_total=0 (rs_failed 0)



データは修復する必要はないし、ディスクもない、モチベーションもないから以上で移行テスト終了。