てぃーだブログ › オタクSEのブログ@別館

【PR】

  

Posted by TI-DA at

2010年05月04日

install::openvpn::server

This document is how to setup OpenVPN server on CentOS. OpenVPN is an application that Virtual Private Network solutions for creating secure Point-to-Point or Site-to-Site connections. It uses SSL/TLS security for encryption and is capable of traversing NAT and FW.

# Install repository for openvpn
$ wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

$ rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

$ rm -f rpmforge-release-0.3.6-1.el5.rf.i386.rpm

$ sed -i 's/enabled = 1/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo

$ yum -y --enablerepo=rpmforge install openvpn

# Configure OpenVPN server
$ cp -r /usr/share/doc/openvpn-2.0.9/easy-rsa/2.0/ /etc/openvpn/easy-rsa

# Move to the directory
$ cd /etc/openvpn/easy-rsa/

# Add scripts to exuction authority
$ > chmod +x *

# Edit certification file and configuration for environment file
$ vi vars
 export KEY_COUNTRY="JP"
 export KEY_PROVINCE="Okininawa"
 export KEY_CITY="Ginowan"
 export KEY_ORG="teamdqn.com"
 export KEY_EMAIL="master@teamdqn.com"

# Reflect this
$ source vars

# Initialize current dierectory
$ ./clean-all

# Generate CA certification and private key
$ ./build-ca
# Following items are all default value
 Country Name (2 letter code) [JP]:
 State or Province Name (full name) [Okinawa]:
 Locality Name (eg, city) [Ginowan]:
 Organization Name (eg, company) [teamdqn.com]:
 Organizational Unit Name (eg, section) []:
 Common Name (eg, your name or your server's hostname) [teamdqn.com CA]:
 Email Address [master@teamdqn.com]:

# Copy CA certification to directory stored OpenVPN configuration files
$ cp keys/ca.crt /etc/openvpn

# Generate server certification and private key
$ ./build-key-server server
# Following items are all default value
 Country Name (2 letter code) [JP]:
 State or Province Name (full name) [Okinawa]:
 Locality Name (eg, city) [Ginowan]:
 Organization Name (eg, company) [teamdqn.com]:
 Organizational Unit Name (eg, section) []:
 Common Name (eg, your name or your server's hostname) [teamdqn.com CA]:
 Email Address [master@teamdqn.com]:

# Following item are all "y"
 Sign the certificate? [y/n]:y
 1 out of 1 certificate requests certified, commit? [y/n]y

# Copy server certification to directory stored OpenVPN configuration files
$ cp keys/server.crt /etc/openvpn

# Copy private key to directory stored OpenVPN configuration files
$ cp keys/server.key /etc/openvpn

# Make parameter of DH(Diffie Hellman)
$ ./build-dh

# Copy parameter of DH to directory stored OpenVPN configuration files
$ cp /keys/dh1024.pem /etc/openvpn/

# Make doing away with certification list
$ ./build-key dmy
# Following items are all default value
 Country Name (2 letter code) [JP]:
 State or Province Name (full name) [Okinawa]:
 Locality Name (eg, city) [Ginowan]:
 Organization Name (eg, company) [teamdqn.com]:
 Organizational Unit Name (eg, section) []:
 Common Name (eg, your name or your server's hostname) [teamdqn.com CA]:
 Email Address [master@teamdqn.com]:

# Following item are all "y"
 Sign the certificate? [y/n]:y
 1 out of 1 certificate requests certified, commit? [y/n]y

$ vi openssl.cnf
# Following directives are disable
 #[ pkcs11_section ]
 #engine_id = pkcs11
 #dynamic_path = /usr/lib/engines/engine_pkcs11.so
 #MODULE_PATH = $ENV::PKCS11_MODULE_PATH
 #PIN = $ENV::PKCS11_PIN
 #init = 0

# Do away with dummy of client certification
$ ./revoke-full dmy

# Copy list for doing away with certification to directory stored OpenVPN configuration files
$ cp keys/crl.pem /etc/openvpn/

$ cd

# Configure OpenVPN
$ openvpn --genkey --secret /etc/openvpn/ta.key

$ cp /usr/share/doc/openvpn-2.0.9/sample-config-files/server.conf /etc/openvpn/

$ vi /etc/openvpn/server.conf
# Designate tun for default interface of vpn
 dev tun

# Designate range of ip address for clients
 server 10.8.0.0 255.255.255.0

# Via vpn server for network number 192.168.1.0/24
 push "route 192.168.1.0 255.255.255.0"

# Activate TLS authentication
 tls-auth ta.key 0

# Downgrading authorization of execution
 user nobody
 group nobody

# Record vpn log
 log-append /var/log/openvpn.log

# Activate management interface
 management localhost 7505

# Activate doing away with certification list
 crl-verify crl.pem

# Configure firewall for vpn interface
$ vi /etc/openvpn/openvpn-startup
 #!/bin/bash

 /etc/openvpn/openvpn-shutdown

 iptables -I OUTPUT -o tun+ -j ACCEPT
 iptables -I FORWARD -o tun+ -j ACCEPT

 iptables -I INPUT -i tun+ -j ACCEPT

 iptables -I FORWARD -i tun+ -d 192.168.1.0/24 -j ACCEPT

 iptables -I FORWARD -i tun+ -d 192.168.1.3 -j ACCEPT

$ chmod +x /etc/openvpn/openvpn-startup

# Cancel auto configuration of firewall for vpn interface
$ vi /etc/openvpn/openvpn-shutdown
 #!/bin/bash

 delete() {
  rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
  for num in $rule_number
  do
   iptables -D $target $num
  done
 }

 target='INPUT'
 delete

 target='FORWARD'
 delete

 target='OUTPUT'
 delete

# Make script of a rotation of vpn log

$ vi /etc/logrotate.d/openvpn
/var/log/openvpn.log {
  missingok
  notifempty
  sharedscripts
  postrotate
    /etc/rc.d/init.d/openvpn restart 2>&1 > /dev/null || true
  endscript
}

# Boot up vpn server
$ vi /etc/rc.d/init.d/openvpn
# Activate forwarding packet
 echo 1 > /proc/sys/net/ipv4/ip_forward

$ /etc/rc.d/init.d/openvpn start

$ chkconfig openvpn on

That install process is finished. Next theme will be installation and configuration for client. In this case cleint os is used by Windows. But MAC os is enable to be vpn client. is win os used. Because I have only windows client...  


Posted by オタクSE at 22:51Comments(0)

2010年05月01日

install::smbldap-tools

I haven't written for long time. But the reason isn't work. I've not just had any topics...

Today I have one topic. I think it's usefull for linux, or unix user.

If you construct pdc (Primary Domain Controller) by using linux or unix, you have to use smbldap-tools.

Because you must add user to ldap for samba.

So smbldap-tools have to be install in your server by using yum, yast and so on.

In many case its importtant tools aren't found out.

Now I can find out how to get it.

It access to below url, named freshmeat.net.

freshmeat.net

Current version is 0.9.5.

Let's get by using wget.

Have fun!!  


Posted by オタクSE at 10:37Comments(0)

2010年03月19日

recruit

お問い合わせ頂き、誠にありがとうございました

インフラ構築要員を募集します

要件は下記のようになります
1.OS:Unix(HP-UX)
2.Unixインフラ構築・運用経験者
3.インフラ設計に関する知識
 ■ビジネスアーキテクチャー
 ■プロセス/データアーキテクチャー
 ■テクノロジーアーキテクチャー(必須)
4.ネットワークの基本知識
 ■サブネット設計
5.クラスタリングに関する知識
 ■ミドルウェアーは問いません
6.プロジェクト経験者
 ■コミュニケーション能力の重要性が認識されている必要があります
7.その他
 ■/etcの知識
 ■レジストリベースの管理とファイルベースの管理の違い
 ■案件を最後までやり抜く根性
  ※他のメンバーに迷惑がかかりますので、ある意味必須です

勤務地は東京、開始は6月予定となっています

参画希望な方は、履歴書ならびに職務経歴書を、メールに添付して送信して下さい

職務経歴書は、これまで経験した業務、プロジェクトの詳細を記載して下さい

書類選考後、スキルマッチした方には、後日連絡致します

よろしくお願い致します
  


Posted by オタクSE at 23:01Comments(0)

2010年02月12日

performance::mysql

MySQLのベンチマークを取得

Dom0で動作しているMySQLが、どれくらいのパフォーマンスを持っているかを調べてみたいと思います

まずは、サーバのスペックから確認します

CPU情報
一部省略
$ > cat /proc/cpuinfo
model name  : Intel(R) Xeon(R) CPU 5150 @ 2.66GHz
cpu MHz : 2660.000
cache size : 4096 KB

メモリ情報
一部省略
$ > cat /proc/meminfo
MemTotal: 1048752 kB
MemFree: 424000 kB

使用するベンチマークユーティリティをmakeします

今回はSuper Smackを使用します
# makeに必要なデベロップメントツールをインストール
$ > yum -y install mysql-devel

# Super Smackのターボールを取得
$ > wget http://vegan.net/tony/supersmack/super-smack-1.2.tar.gz

# make開始
$ > ./configure --with-mysql \
> --prefix=$HOME \
> --with-smacks-dir=/var/share \
> --with-datadir=/var/share/data \
> && make && make install

# ベンチマークに必要なデータを作成
# 9万レコードを作成
$ > gen-data -n 90000 -f %12-12s%n,%25-25s,%n,%d > /var/share/data/perf.dat

# テーブルの作成
$ > mysql -uroot -p*******

mysql > use test;

mysql > create table http_auth(
> username char(255) not null primary key,
> pass char(25),
> uid int,
> gid int);

# 設定ファイルの編集
$ > vi /var/share/select-key.smack

# user, host, db, passを変更
# 環境に依存
client "admin"
{
 user "root";
 host "localhost";
 db "test";
 pass "*****";
 socket "/var/lib/mysql/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
}

# user, host, db, passを変更
# 環境に依存
client "smacker1"
{
 user "root"; // connect as this user
 pass "*****"; // use this password
 host "localhost"; // connect to this host
 db "test"; // switch to this database
 socket "/var/lib/mysql/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
 query_barrel "2 select_by_username"; // on each round,
// run select_by_username query 2 times
}

ベンチマーク用のシェルを作成します

スレッドとスレッド当たりのクエリーで、パフォーマンスを評価します
$ > vi perf_mysql
#!/bin/sh

smack=/bin/super-smack

log=/var/log/perf_mysql.log

conf=/var/share/select-key.smack

st=`date "+%Y/%m/%d %H:%M:%S"`

echo "Start MySQL Stress Test" > ${log}

echo ${st} >> ${log}

echo >> ${log}

# Parameter for sleds
for sled in 10 20 30 40 50 60 70 80 90 100
do
 # Parameter for query per sled
 for que in 10 20 30 40 50 60 70 80 90 100
 do
  ${smack} ${conf} ${sled} ${que} >> ${log}

  echo "" >> ${log}
 done
done

fn=`date "+%Y/%m/%d %H:%M:%S"`

echo >> ${log}

echo "Finish MySQL Stress Test" >> ${log}

echo ${fn} >> ${log}

exit 0;

$ > chmod 700 perf_mysql

シェルを実行します
$ > sh perf_mysql

スレッドが10パターン、スレッド当たりのクエリー数を10パターンで、合計100回の評価なので、最後の結果だけを記載します
Query Barrel Report for client smacker1
connect: max=940ms min=0ms avg= 228ms from 100 clients
Query_type num_queries max_time min_time q_per_s
select_index 20000 1 0 11144.06

毎秒11144のクエリーを処理していることが確認できます

一見良さそうに思えますが、ある程度アクセスがあるポータルサイト、オンラインショップでは、全く要件を満たすことができません

とりあえず、評価は現場を想定して、非機能要件的に実行しないといけませんからね

100スレッド、100クエリー/スレッド時点でのサーバの負荷を確認します

1.53という数値から、本番環境での運用に不適切であることが分かります
単一テーブルへのselectの発行を考慮
$ > top
top - 20:24:32 up 21:03, 3 users, load average: 17.02, 4.55, 1.53

ちなみに、9万件のレコードを追加した時のレプリカの状態を確認してみます

Slave1
mysql> select count(*) from http_auth;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)

Slave2
mysql> select count(*) from http_auth;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)

Slave3
mysql> select count(*) from http_auth;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)

意外に安定しています  


Posted by オタクSE at 23:30Comments(0)

2010年02月04日

php::namespace

PHP5.3 > でのnamespaceの利用

PHP5.3移行でnamespaceの利用が可能になっています

ある一定以上の規模の開発になるとclassだけでは、命名し難くなる場合があるので、namespaceが利用できることでclassの名前を短縮することが可能となります

それ以上にCakePHPやZend Frameworkなどを構造的な観点から理解するのに役立ちます
特にZendは命名に厳しい

セパレータは"\"(バックスラッシュ)です

namespace ns1の作成
<?php
namespace ns1\hoge;

class hogeClass {

    private $nl = '<br /&g;';

    // ns1のコンストラクタ
    public function __construct(){
        echo 'ns1のコンストラクタ'.$this->nl;
    }

    // ns1のhoge
    public function hoge(){
        echo 'ns1のhoge'.$this->nl;
        //echo __NAMESPACE__.$this->nl;
    }

    // ns1のデストラクタ
    public function __destruct(){
        echo 'ns1のデストラクタ'.$this->nl;
    }
}

namespace ns2の作成
namespace ns2\hoge;

class hogeClass {

    private $nl = '<br />';

    // ns2のコンストラクタ
    public function __construct(){
        echo 'ns2のコンストラクタ'.$this->nl;
    }

    // ns2のhoge
    public function hoge(){
        echo 'ns2のhoge'.$this->nl;

        //echo __NAMESPACE__.$this->nl;
    }

    // ns2のデストラクタ
    public function __destruct(){
        echo 'ns2のデストラクタ'.$this->nl;
    }
}

インスタンス化と実行
// ns1のhogeClassのインスタンス化
$obj = new \ns1\hoge\hogeClass;

// ns1のhogeの呼び出し
$obj->hoge();

// ns2のhogeClassのインスタンス化
$obj = new \ns2\hoge\hogeClass;

// ns2のhogeの呼び出し
$obj->hoge();

?>

結果
ns1のコンストラクタ
ns1のhoge
// ns1\hoge __NAMESPACE__ より参照されます
ns2のコンストラクタ
ns1のデストラクタ
ns2のhoge
// ns2\hoge __NAMESPACE__ より参照されます
ns2のデストラクタ

namespace単位でクラスが管理されています

また、ns2のコンストラクタが呼び出された後に、ns1のデストラクタが呼び出されていることも確認できます

ちなみに、同一namespace内でクラスを作成した場合でも、各クラスのコンストラクタ、デストラクタの呼び出し順に変化はありませんでした

C++の場合は、最初にコンストラクタ①が呼び出され、次にコンストラクタ②およびデストラクタ②が呼び出され、最後にデストラクタ①が呼び出されます

namespace ns1の作成
<?php
namespace ns1\hoge;

// hogeClass1に変更
class hogeClass1 {
 ...
}

// hogeClass2に変更
class hogeClass2 {
 ...
}

// 実行結果は先のものと同一になります

?>

実装よりも詳細設計の段階で気を、オブジェクトの破棄を考慮して設計する必要がありますね

補足
Eclipseでnamespaceを使用すると"syntax error(文法エラー)"になります  


Posted by オタクSE at 21:07Comments(0)

2010年02月02日

management::risk

ソフトウェアー開発におけるリスクマネージメント

開発費用の見積もりをするためには、単純に人/月換算では上手くいかない場合多々あります

なぜでしょうか?

人/月は、要員に対して属人性を排除した形での換算だからです

つまり人/月換算は、要員のスキルはもちろんですが、その周辺(角度を変えれば中心にもなり得る)の要因は考慮されていないということです

これが、ソフトウェアーを開発するうえでのリスクとなる確率が非常に高いですね

では、そのリスク要因と、一体どのようなものがあるでしょうか?

・プロジェクトが中々開始されない
・開発期間が足りない
・青果物以外の報告書が多い
・意思の疎通がスムースに進まない
・仕様変更が多々ある
・納期の変更
・担当者の変更
・要員のスキル不足
・要員の体調不良
などなど...

実際に開発を受注する際には、上記のことを考慮に入れて、その費用を見積もらないといけないと思います

そうでもしないと、潜在的にデスマーチが発生する要員のあるSWの開発を、責任を持って受注するのは厳しいのではないでしょうか?

お客様からすれば、なるだけ安くが理想ですが、開発する我々からすれば、なるべく確実に、しかも迅速にが理想です

お客様の要求と、我々の要望との間に、いかに折り合いをつけるかが、より良いお客様へのサービス提供と、良いSWの開発の実現だと思います

SEだから顧客満足度なんて関係ないとは言えない時代ですからね  


Posted by オタクSE at 22:55Comments(0)

2010年01月24日

linux::tuning

Linuxのチューニング

Linuxをチューニングします

ポイントは、次のようになります
・カーネル
・サービス
・ハードウェア―

今回は100%ハードウェア―レベルのチューニングではないですが、ハードウェアーをより良く利用するTipsです

それは、とても単純でハードディスクをマウントする際に、次のフラグを指定することです
noatime

これを指定することで、ファイルに対するアクセス時タイムスタンプを無効にすることができます

では、これをfstabで指定します
$ > vi /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1

再起動する前に、現状のハードディスクのパフォーマンスを測定します
[root@sv2 ~]# hdparm -tT /dev/mapper/VolGroup00-LogVol00

/dev/mapper/VolGroup00-LogVol00:
Timing cached reads: 13508 MB in 2.00 seconds = 6769.17 MB/sec
Timing buffered disk reads: 486 MB in 3.00 seconds = 161.86 MB/sec

では再起動します

ハードディスクのパフォーマンスを測定します
[root@sv2 ~]# hdparm -tT /dev/mapper/VolGroup00-LogVol00

/dev/mapper/VolGroup00-LogVol00:
Timing cached reads: 17980 MB in 1.99 seconds = 9012.93 MB/sec
Timing buffered disk reads: 424 MB in 3.00 seconds = 141.22 MB/sec

私の管理しているサーバの最大のパフォーマンスは、次のようになりました
[root@backup ~]# hdparm -tT /dev/mapper/VolGroup00-LogVol00

/dev/mapper/VolGroup00-LogVol00:
Timing cached reads: 25452 MB in 1.99 seconds = 12770.78 MB/sec
Timing buffered disk reads: 56 MB in 3.08 seconds = 18.17 MB/sec
すべてDom0になります
すべて仮想HDDとなります  


Posted by オタクSE at 22:47Comments(0)

2010年01月23日

php::zendframework

ZendFrameworkのインストール

ZendFrameworkをwgetします
$ > cd /usr/local

$ > wget http://framework.zend.com/releases/ZendFramework-1.9.7/ZendFramework-1.9.7.tar.gz

$ > tar zxvf ZendFramework-1.9.7.tar.gz

$ > mv ZendFramework-1.9.7 ZendFramework

$ > rm -f ZendFramework-1.9.7.tar.gz

# libraryへのパスを追加
$ > vi /etc/php.ini

; UNIX: "/path1:/path2"
include_path = ".:/php/includes
:/usr/local/ZendFramework/library"

$ > /etc/rc.d/init.d/httpd reload

ZendFrameworkが使用できる環境を作成してあげます
$ > mkdri -p /var/www/application/{controllers, views}

$ > mkdir /var/www/application/views/scripts


テストスクリプトを作成します
# .htaccessの作成
$ > vi /var/www/html/.htaccess

RewriteEngine On
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php


# index.phpの作成
$ > vi /var/www/html/index.php

<?php
require_once 'Zend/Controller/Front.php';

Zend_Controller_Front::run('../application/controllers');
?>


# Controllerの作成
$ > vi /var/www/application/controllers/IndexController.php

<?php
require_once 'Zend/Controller/Action.php';
class
IndexController extends Zend_Controller_Action {
 public function indexAction() {
  echo "Hello World!";
 }
}?>


# Viewの作成
$ > mkdir /var/www/application/views/scripts/index

# 空ファイルでも問題ないが、ファイルが存在しない場合
# または、拡張子が異なる場合はエラーが発生

$ > touch /var/www/application/views/scripts/index/index.phtml


http://localhost/へアクセスするとHello World!が表示されます

Controllerに使用するファイル名と、その中で使用されるClassの名前は合致するようにします

例えば、TestController.phpの場合は、その中で使われるClassをTestControllerにします

また、Viewを格納するディレクトリもControllerの名前に合わせるようにします

例えば、TestController.phpの場合は、/var/www/application/views/scripts/testにします

ControllerのからViewを制御することもできます

一昔のphpの仕様みたいな感じになります
# IndexController.phpの編集
<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action {
 public function indexAction() {
  $view = new Zend_View();

  $view->setScriptPath('../application/views/scripts/index');

  $view->test = "Hello Wordl!";

  echo $view->render('index.phtml');
?>

# index.phtmlの編集<html>
<head>
<title>Hello World!<title>
</head>
<body>
<!--
 $thisで変数を参照します
-->

 <?php echo $this->test; ?>
</body>
</html>

個人的には、htm(l)ファイルにphpスクリプトを書き込むとか、phpファイル内にhtmlを書き込むというのは、ソースがスパゲティになるので、あまり好きではありません

MVCでのデザインパターンで開発を行うならhtml、php、javascript、cssはすべて独立したファイルであった方が、所在が明白になるので開発し易いと思います  


Posted by オタクSE at 19:55Comments(2)

2010年01月23日

xen::kickstart

XenでDomUのインストール自動化

DomUのインストールを自動化します

install_xenの作成
$ > vi install_xen
#!/bin/sh

# DomUのイメージを作成する場所
dir=/var/lib/xen/images

# DomUのホスト名
nm=test

# DomUのイメージファイル
img=${nm}.img

#
# OSの格納場所
# ※OSイメージをWebからダウンロードし、それをマウントします
#  参考:マウント方法
#
  $ > mount -t iso9660 \
#  -o loop \
#  /storage/sw/centos/CentOS-5.4-i386-bin-DVD.iso \

#  /var/www/html/Linux/centos/5/os/i386
#
loc=http://192.168.1.19/Linux/centos/5/os/i386/

# kickstartファイルの保存場所
ks=http://192.168.1.21/xen/kickstart.cfg

#
# DomUのための領域を事前に作成
# ※dd で作成しない方法もありますが、DomUのパフォーマンスは
#  こちらの方が圧倒的に良いです
#

dd if=/dev/zero of=${dir}/${img} oflag=direct bs=1M count=5120

# virt-installの実行
virt-install \

# ホスト名
--name=${nm} \

# メモリ容量
--ram=512 \

# CPUの数
--vcpus=1 \

# イメージファイル名
--file=${dir}/${img} \

# cuiでのインストール
--nographics --paravirt \

# OSイメージの場所
--location="${loc}" \

# kickstartファイルの場所
--extra-args="ks=${ks}"

# 実行件の付与
$ > chmod rwx+u install_xen

kickstart.cfgを作成します
install

# ISOイメージの保存場所
url --url http://192.168.1.19/Linux/centos/5/os/i386/

# キーボード設定
keyboard us

# 言語設定
lang ja_JP.UTF-8

# NIC設定
network --device eth0 \
--bootproto static \
--ip 10.1.1.1 \
--netmask 255.255.255.224 \
--hostname test.teamdqn.com

# 暗号化されてrootのパスワード
# 暗号化パスワード確認コマンド
#
 $ > openssl passwd -1
#  Password:
#  Verifying - Password:
rootpw --lscrypted $1$lmp3JUtG$yngNEyf1EnLaEBfHsHt39/

# Firewallの設定
firewall --disabled

# selinuxの設定
selinux --disabled

# タイムゾーンの設定
timezone --utc Asia/Tokyo
bootloader --location=mbr --driveorder=xvda --append="console=xvc0"

# パーティション設定
clearpart --all --initlabel --drives=xvda
part /boot --fstype ext3 --size=100 --ondisk=xvda
part pv.2 --size=0 --grow --ondisk=xvda
volgroup VolGroup00 --pesize=32768 pv.2
logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=1024
logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
reboot

# インストールするパッケージの指定
%package
@development-tools
@base
device-mapper-multipath

# リゾルバの作成
cat << EOF > /etc/resolv.conf
domain teamdqn.com
search teamdqn.com
nameserver 192.168.1.23
nameserver 192.168.1.24
EOF

これで、install_xenを実行することで、一発インストールができます  


Posted by オタクSE at 12:28Comments(0)

2010年01月21日

centos::ipvsadm

ロードバランサーの構築

CentOSにipvsadmを導入し、ロードバランサーを構築します

用意した環境は、次のようになります

まずはハードウェアー構成からです
www
 |
 lb
 |
 +--------+
 |       |
 sv1    sv2

WANからきたパケットは、一度ロードバランサーを経由して、sv1、sv2に振り分けられます

ネットワーク構成は、次のようになります
 lb
 WAN側
  eth0
   IP:192.168.1.11(物理IP)
  eth0:12
   IP:192.168.1.12(仮想IP)
   ゲートウェイ:192.168.1.1
 ローカル側
  eth1
   IP:10.1.1.10

 sv1
  eth0
   IP:10.1.1.11
   ゲートウェイ:10.1.1.10
 sv2
  eth0
   IP;10.1.1.12
   ゲートウェイ:10.1.1.10

WANとローカル側で、異なるアドレスクラスまたは異なるサブネットを指定します

lbには仮想IPを割り当て、そちらでパケットを取得するようにします

また、パケットの転送先であるsv1、sv2のゲートウェイですが、こちらはlbのローカルIPを指定します

なお、今回はポート80で検証するので、sv1、sv2にはapacheをインストールし、そのドキュメントルートのindex.htmlを異なるものにして、区別できるようにして置きます

とりあえず、sv1、sv2へのapacheのインストールを行います

sv1へのインストール
$ > yum -y install httpd

$ echo `hostname` > /var/www/html/index.html

sv2へのインストール
$ > yum -y install httpd

$ echo `hostname` > /var/www/html/index.html

では、ipvsadmをインストールします
$ > yum -y install ipvsadm

次にlbのeth0に仮想IPを割り当てます
$ > ip addr add 192.168.1.12 label eth0:12 dev eth0

仮想IPを確認します
$ > ip addr show eth0 label eth0:12
  inet 192.168.1.12/32 scope global eth0:19

ipvsadmの設定を行います
# 初期化
$ > ipvsadm -C

# 次にパケットの入り口を指定# 負荷分散アルゴリズムにラウンドロビンを使用$ > ipvsadm -A -t 192.168.1.12:80 -s rr

# sv1、sv2をバランシングの対象に設定
$ > ipvsadm -a -t 192.168.1.12:80 -r 10.1.1.11:80 -m
$ > ipvsadm -a -t 192.168.1.12:80 -r 10.1.1.12:80 -m

# 設定の確認
$ > ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress Port Forward Weight ActiveConn InActConn
TCP 192.168.1.12:80 rr
 -> 10.1.1.11:80   Masq 1  0 0
 -> 10.1.1.12:80   Masq 1  0 0

lbでパケット転送が有効になるように設定します
$ > echo '1' > /proc/sys/net/ipv4/ip_forward

# 起動時に有効になるように設定
$ > vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

$ > sysctl -p

バランシングを確認する方法です

lbでのtcpdump
$ > tcpdump -n -i eth0:12 host 192.168.1.12 and port 80

sv1でのtcpdump
$ > tcpdump -n -i eth0 host 10.1.1.11 and port 80

sv2でのtcpdump
$ > tcpdump -n -i eth0 host 10.1.1.12 and port 80

異なるホストからのアクセス
$ > curl 'http://192.168.1.12/'

curlを実行した結果が、sv1またはsv2であれば成功です

curlの結果ホスト名が見つからない時は、lbからsv1(sv2)への転送は上手くいくが、sv1(sv2)からlbへの転送が上手くいっていないので、lb、sv1(sv2)間のネットワークを確認した方が良いです

なお、ロードバランスアルゴリズムとパケット転送方法には、次のようなものがあります

アルゴリズム
 rr ラウンドロビン
 wrr 重み付けラウンドロビン
 lc 最小コネクション
 wlc 重み付け最小コネクション
 lblc クライアントに応じた最小コネクション数

パケット転送方法
 -g --gatewaying ダイレクトルーティング
 -i --ipip トンネリング
 -m --masquerading NAT
  


Posted by オタクSE at 21:58Comments(0)

2010年01月17日

xen::livemigration::reliability

ライブマイグレーション MySQLで評価

ライブマイグレーションのメリットの1つが、ユーザにダウンタイムを感じさせないというのがあります

本当ですか?

現場でのユーザセッションとトランザクションの数を考えると、少々疑わしいところがありますよね

システムは正常に稼働しているように感じるけど、更新データがメチャクチャでは本末転倒です

趣味と実益がリンクすることが、ノンポリなOtakuSEの唯一のポリシーなので調べました

テストスクリプト
$nm = 10000; // 1万桁を挿入
$host = '192.168.1.18:3306';
$user = 'teamdqn';
$pass = '*****';

// MySQLへのセッションを張る
$link = mysql_connect($host, $user, $pass);

// DBを選択
$db = mysql_select_db('test', $link);

// とりあえず開始時間を取得
$start = date("H:i:s");

// では、DBをいじめちゃいましょう
for($i=1; $i<=$nm; $i++){
  // 現状の最大値を取得
  $que = 'select max(num) from test';

  $res = mysql_query($que, $link);

  while($max = mysql_fetch_array($res))
    // データが既にある場合
    if($val['max(num)'] > 0)
      // インクリメントしちゃいましょう
      $num += $val['max(num)'];
    // 空っぽの場合
    else
      $num = 1;

    $que = sprintf('insert into test(num) values(%d)', $num);

    // データを挿入します
    $res = mysql_query($que, $link);

    // 毎回トランザクションを発生させます
    mysql_query('commit', $link);
}

// お疲れ様でした
mysql_close($link);

// で、終了時間
$end = date("H:i:s");

echo "Start time: ".$start;
echo "End time: ".$end;

実行する前に、テーブルの初期状態を確認します

Before

mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)

もちろんレコードはありません

では、スクリプトを実行しながら、マイグレートします

もちろんスクリプトは、v1、v2、マイグレートするmgrとは異なる別のホストから実行します

v1からv2と、その逆で全部で2回実行します

v1からv2を実行したときの結果
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
1 row in set (0.00 sec)

データはすべて挿入されています

では、逆を実行してみます

v2からv1を実行したときの結果
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 20000 |
+----------+
1 row in set (0.00 sec)

キレイに倍になっています

セッション・トランザクション共に保持されていることは確認できました

今回は1セッションだけでしたが、本番環境では複数のn個のテーブルに対して、mセッション発生しますので、それに耐えきれるかどうかというのも検証する必要があります

実際にやるとしたら、複数のテストテーブルと、それぞれのテーブルに対する参照・更新系のスクリプトを用意して、複数のブラウザを立ち上げ一斉攻撃するといった感じです  


Posted by オタクSE at 21:04Comments(0)

2010年01月17日

xen::livemigration

Xenライブマイグレーション

一方のDom0から、もう一方のDom0へ、無停止でDomUを移動させることです

理想的にはDom0間でのハードウェア―レベルでの差異がなく、Xenのコンフィギュレーションも同一の環境で行った方が、より安定的にマイグレートできます

今回は、次のような環境を用意しました
Server1
 ホスト名:v1
 CPU:Xeon 5300 Clock:2.66GHz FSB:1066MHz or 1333MHz Cache:2x4MB
 メモリ:16GB
 NIC:4枚
 HDD:1TB
Server2
 ホスト名:v2
 CPU:Core2Duo E8400 Clock:3.0GHz FSB:1333MHz Cache:2x3MB
 メモリ:4GB
 NIC:1枚
 HDD:250GB

この2つのサーバをストレージに接続し、そこにDomUを設置します
| Server1 |--------
              |
              |--------- | Storage |
              |
| Server2 |--------

サーバ・ストレージ間の接続は、両方ともGigabit Ehternetです

なお、今回はストレージとしてメールサーバの共有バックアップ領域を使用します

また、ストレージへはNFSでマウントします
両サーバで実施
v1 > mount -t nfs mail:/home2/work/storage /storage

df -kしておきます

v1


v2


環境が定義できたところで、次にxend-config.sxpを修正です
両サーバで実施
v1 > vi /etc/xen/xend-config.sxp
# 追加またはコメントアウトします
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-hosts-allow '')

# ホストに制限をかけたい場合
# (xend-relocation-hosts-allow '^localhost$ ip_address')

DomUのコンフィギュレーションファイルを、移動先サーバへコピーし、環境に合わせて修正します
# v1からv2へのコピー
v1 > scp /etc/xen/mgr v2:/etc/xen/.

# v2での編集
v2 > vi /etc/xen/mgr
# vif = [ "mac=00:16:36:37:17:ad,bridge=xenbr0,script=vif-bridge" ]
vif = [ "mac=00:16:36:37:17:ad,bridge=xenbr1,script=vif-bridge" ]

Xendを再起動します
両サーバで実施
$ > /etc/rc.d/init.d/xend restart

マイグレーションを実施する前に、両サーバのDomUの現状を確認します

v1


v2


今回は青枠のホスト:mgrをマイグレートします

実施する前にApacheのベンチマークを取得しときます
同時接続数:1000 リクエスト数1000で測定


結果
 平均接続時間:2008
 精勤処理時間:5353

# v1からv2へのマイグレート
v1 > xm migrage --live mgr v2

別のホストからのネットワーク疎通確認を実施します


一旦疎通が途切れますが、すぐに復旧します

マイグレートしている時のApacheのベンチマークを測定します


結果
 平均接続時間:25
 精勤処理時間:1509

Failed requestsが0ですので、セッションは維持されたままということになります

その他、次のような評価もしましたが、セッションが切れることはありませんでした
・SSHでの接続
・MySQLへの接続

v1、v2のDomUの確認をします

v1


v2


上手くマイグレーションができています

どんな時に使う?
ハードウェア―のメンテナンス
サーバリプレース
etc...

長期にわったて運用することで実績を積んでいけば、いろんな用途が発生してくると思います  


Posted by オタクSE at 16:17Comments(0)

2010年01月15日

xen::dom0::memory

Xenカーネルのメモリ管理
XenでDomUを追加し過ぎるとエラーが発生し、追加したDomUが起動できない状態になります

その際、XenからのメッセージがMemory squeeze in netback driverです

この時は、どうトラブルシューティングすれば良いのか?

Dom0のメモリ使用量を指定
$ > vi /boot/grub/grub.conf
title CentOS (2.6.18-164.10.1.el5xen)
   root (hd0,0)
#   kernel /xen.gz-2.6.18-164.10.1.el5
   kernel /xen.gz-2.6.18-164.10.1.el5_dom0 mem=1024M
   module /vmlinuz-2.6.18-164.10.1.el5xen ro root=/dev/VolGroup00/LogVol00
   module /initrd-2.6.18-164.10.1.el5xen.img
Xenカーネルのバージョンは環境に依存

xend-config.sxpの修正
$ > vi /etc/xen/xend-config.sxp
#(dom0-min-mem 256)
(dom0-min-mem 1024)

再起動
$ > shutdown -r now

再起動後、Dom0のメモリ使用量の確認
$ > cat /proc/meminfo
MemTotal:  1048576 kB
MemFree:  450112 kB
  


Posted by オタクSE at 23:30Comments(0)

2010年01月14日

mysql::replication::diff

MySQLレプリカでアンマッチデータ発生した場合

1.Masterでの作業
# FileとPositionの確認
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000002 | 2549 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

2.Slaveでの作業
# Slaveの機能を停止
mysql> stop slave

# Master情報の更新
mysql> change master to
   -> master_log_file = mysqld-bin.000002,
   -> master_log_pos = 2549;

# Slaveの機能を開始
mysql> start slave


アンマッチとレプリカが少ない場合は、手動でデータを更新

多岐にわたる場合は、一旦Slaveのデータを全部削除し、再度レプリカを作成  


Posted by オタクSE at 19:48Comments(0)

2010年01月14日

mysql::replication

MySQLでのレプリケーションの構築

Master
 Host name:repl1
 IP Address:192.168.1.27

Slave
 Host name:repl2
 IP Address:192.168.1.28

レプリケーション構築作業
1.Master DBでの作業
# my.cnfの編集
$ > vi /etc/my.cnf
[mysqld]
log-bin
server-id=1

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.77-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

# Slaveがアクセスできるようにユーザを作成
mysql> create user repl2;
Query OK, 0 rows affected (0.00 sec)

# 権限を付与
mysql> grant replication slave on *.* to repl2@192.168.1.28 identified by '******';

# トランザクションが発生しないようにLock
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

# Masterのステータスを確認
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 | 98 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

# 別ターミナルでの作業@repl1
# ターボールで丸ごとデータを取得
$ > cd /var/lib/mysql
$ > tar cvf ~/data.tar *

# Lockの解除
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

2.Slave DBでの作業

# my.cnfの編集
$ > vi /etc/my.cnf
[mysqld]
# レプリカが複数ある場合は重複しないように注意
server-id=2

# Masterで取得したデータを格納
$ > scp repl1:~/data.tar /var/lib/mysql/.
$ > cd /var/lib/mysql
$ > tar xvf data.tar

$ > mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

# Masterの情報を更新
mysql> change master to
  -> master_host='192.168.1.27',
  -> master_user='repl2',
  -> master_password='************',
   # show master statusで確認したFile
  -> master_log_file='mysqld-bin.000001',
   # show master statusで確認したPosition
  -> master_log_pos=98;
Query OK, 0 rows affected (0.01 sec)

# スレーブとしての機能開始
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

■動作確認作業
3.Master DBでの作業
# テストテーブルの作成
mysql> use test;
Database changed
mysql> create table repl_test(test_data TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)

# データの挿入
mysql> insert into repl_test values (null);
Query OK, 1 row affected (0.00 sec)

# データの確認
mysql> select * from repl_test;
+---------------------+
| test_data |
+---------------------+
| 2010-01-14 01:41:48 |
+---------------------+
1 row in set (0.00 sec)

# アップデート
mysql> update repl_test set test_data = null;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

# データの確認
mysql> select * from repl_test;
+---------------------+
| test_data |
+---------------------+
| 2010-01-14 01:42:47 |
+---------------------+
1 row in set (0.00 sec)

4.Slave DBでの作業
# テーブルの確認
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

#テーブルの確認
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| repl_test |
+----------------+
1 row in set (0.00 sec)

# データの確認
mysql> select * from repl_test;
+---------------------+
| test_data |
+---------------------+
| 2010-01-14 01:42:47 |
+---------------------+
1 row in set (0.00 sec)
  


Posted by オタクSE at 16:55Comments(0)

2010年01月12日

installmaniax::nopcommerce

インストールマニアックス

nopCommerceのインストール

ソース
http://www.nopcommerce.com/

IISドキュメントルートにnopcommerceディレクトリを作成し、IUSRに書き込み権限を付与

DLしたzipを解凍後、Webフォルダ内にあるファイル&フォルダをnopcommerceディレクトリへコピー

インターネットインフォメーションサービス(IIS)マネージャーにてnopcommerceディレクトリをアプリケーションに変換し、規定のドキュメントでdefault.aspxを最上位に移動

SQL Serverにてdb、userを作成し、dbに対してuserを特権ユーザに設定
Microsoft SQL Server Management Studioを起動
データベースの作成
データベースを右クリックし、新しいデータベースを選択
データベース名:nopcommerce
OK → Click


セキュリティ → ログインを右クリックし、新しいログインを選択
全般
SQL Server認証 → Check
ログイン名:nopcommerce
パスワード:********
パスワード(確認入力):********
パスワードポリシーを適用する → Check out


サーバロール
全てチェック


ユーザーマッピング
nopcommerce → Check
nopcommerceのデータベースロールメンバシップは全てチェック
OK → Click


Access to nopcommerce/install/install.aspx
Continue → Click


Next → Click


SQL Server name or IP address:localhost\SQLEpress
Use SQL Server account → Check
Username:nopcommerce
Password:nopcommerce
Next → Click


Use an existing empty database → Check
Existing database name:nopcommerce
Next → Click


Wow!! Congratulations
Go to site → Click


HOME PAGE


NEW PRODUCTS


SEARCH


MY ACCOUNT


BLOG


CONTACT US


Dashboard


Catalog


Sales


Customers


Promotions


Content Management


Configuration


Sytem


My nopCommerce

Supported by INSTALL MANIAX 3 Hyper-V 祭り最終日  


Posted by オタクSE at 20:24Comments(0)

2010年01月12日

installmaniax::graffiti

インストールマニアックス

Graffitiのインストール

ソース
http://graffiticms.com/

IISドキュメントルートにgraffitiディレクトリを作成し、IUSRに書き込み権限を付与

DLしたzipを解凍後、Webフォルダ内にあるファイル&フォルダをgraffitiディレクトリへコピー

インターネットインフォメーションサービス(IIS)マネージャーにて規定のドキュメントの変更
default.aspxをトップへ移動


graffitiディレクトリをアプリケーションに変換


Access to graffiti
Home


Sample Content


Blog


About This Site


Contact Us


Login
Input User Name & Password
Login → Click


Dashboard


Write


Posts


Categories


Comments


Site Options


Presentation


User Management


The Admin


Change Password
Input Current & New
Update Password → Click


My Graffiti

Supported by INSTALL MANIAX 3 Hyper-V 祭り最終日  


Posted by オタクSE at 18:55Comments(0)

2010年01月12日

installmaniax::statusnet

インストールマニアックス

StatuNetのインストール

ソース
http://status.net/

IISドキュメントルートにstatusnetディレクトリを作成し、IUSRに書き込み権限を付与

DLしたzipを解凍後、ファイル&フォルダをstatusnetディレクトリへコピー

MySQLにてdb、userを作成し、userに対してdbへのall privilegesを付与
c:\ > mysql -uroot -p
Enter password:*********
mysql > create user statusnet;
mysql > create database statusnet;
mysql > grant all privileges on statusnet.* to statusnet@localhost identified by '*********';

Access to statusnet/install.php
Hostname:localhost
Type:MySQL
Name:statusnet
Username:statusnet
Password:statusnet

Submit → Click


Finish!!


Access to statusnet
Public


Groups


Recent tags


Popular


My StatusNet

Supported by INSTALL MANIAX 3 Hyper-V 祭り最終日  


Posted by オタクSE at 18:05Comments(0)

2010年01月12日

installmaniax::chyrp

インストールマニアックス

Chyrpのインストール

ソース
http://chyrp.net/download/

IISドキュメントルートにchyrpディレクトリを作成し、IUSRに書き込み権限を付与

DLしたzipを解凍後、ファイル&フォルダをchyrpディレクトリへコピー

MySQLにてdb、userを作成し、userに対してdbへのall privilegesを付与
c:\ > mysql -uroot -p
Enter password:*********
mysql > create user chyrp;
mysql > create database chyrp;
mysql > grant all privileges on chyrp.* to chyrp@localhost identified by '*********';

Access to chyrp/install.php
Host:localhost
Uername:chyrp
Password:*****
Database:chyrp
Table Prefix:c_




Username:Admin
Password:*******
Password(again):*******
E-Mail Address:admin@teamdqn.com

Install → Click


Done!
Take me to my site! → Click


OtakuSE'Site


My Chyrp

Supported by INSTALL MANIAX 3 Hyper-V 祭り最終日  


Posted by オタクSE at 17:19Comments(0)

2010年01月12日

installmaniax::freeway

インストールマニアックス

Freewayのインストール

ソース
http://www.openfreeway.org/

IISドキュメントルートにfreewayディレクトリを作成し、IUSRに対して書き込み権限を付与

DLしたzipを解凍後、ファイル&フォルダをfreewayディレクトリへコピー

MySQLにてdb、userを作成し、userに対してdbへのall privilegesを付与
c:\ > mysql -uroot -p
Enter password:*********
mysql > create user freeway;
mysql > create database freeway;
mysql > grant all privileges on freeway.* to freeway@localhost identified by '*********';

Access to freeway/install
Continue → Click






Test Mysql Server → Click


Continue → Click


Continue → Click


Input required information
Continue → Click


Contiune → Click


Continue → Click


Continue → Click


Database Server:localhost
Username:freeway
Password:******
Database Name:freeway
Session Storage:Database → Check in

Continue → Click


Continue → Click


Continue → Click


不要なinstallフォルダを削除
IUSRからfreeway/includes/configure.php、freeway/admin/includes/configure.phpへの書き込み権限を奪取
Continue → Click


Input Email Address & Password, confirm
Continue → Click


Complete!!


Admin
Input E-mail & Password
Login → Click


Customers


Events


Services


Products


Subscriptions


CMS


Marketing


Sales


Payment


Reports


Shop Settings


My Account


Front Page


My Freeway

Supported by INSTALL MANIAX 3 Hyper-V 祭り最終日  


Posted by オタクSE at 16:00Comments(0)