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
# Reflect this
$ source vars
# Initialize current dierectory
$ ./clean-all
# Generate CA certification and private key
$ ./build-ca
# 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
# 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
$ vi openssl.cnf
# 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
# Configure firewall for vpn interface
$ vi /etc/openvpn/openvpn-startup
$ chmod +x /etc/openvpn/openvpn-startup
# Cancel auto configuration of firewall for vpn interface
$ vi /etc/openvpn/openvpn-shutdown
# Make script of a rotation of vpn log
$ vi /etc/logrotate.d/openvpn
# Boot up vpn server
$ vi /etc/rc.d/init.d/openvpn
$ /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...
# 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"
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]:
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
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
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
#[ 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
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
/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
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
}
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
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:51
│Comments(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!!
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:37
│Comments(0)
2010年03月19日
recruit
お問い合わせ頂き、誠にありがとうございました
インフラ構築要員を募集します
要件は下記のようになります
1.OS:Unix(HP-UX)
2.Unixインフラ構築・運用経験者
3.インフラ設計に関する知識
■ビジネスアーキテクチャー
■プロセス/データアーキテクチャー
■テクノロジーアーキテクチャー(必須)
4.ネットワークの基本知識
■サブネット設計
5.クラスタリングに関する知識
■ミドルウェアーは問いません
6.プロジェクト経験者
■コミュニケーション能力の重要性が認識されている必要があります
7.その他
■/etcの知識
■レジストリベースの管理とファイルベースの管理の違い
■案件を最後までやり抜く根性
※他のメンバーに迷惑がかかりますので、ある意味必須です
勤務地は東京、開始は6月予定となっています
参画希望な方は、履歴書ならびに職務経歴書を、メールに添付して送信して下さい
職務経歴書は、これまで経験した業務、プロジェクトの詳細を記載して下さい
書類選考後、スキルマッチした方には、後日連絡致します
よろしくお願い致します
インフラ構築要員を募集します
要件は下記のようになります
1.OS:Unix(HP-UX)
2.Unixインフラ構築・運用経験者
3.インフラ設計に関する知識
■ビジネスアーキテクチャー
■プロセス/データアーキテクチャー
■テクノロジーアーキテクチャー(必須)
4.ネットワークの基本知識
■サブネット設計
5.クラスタリングに関する知識
■ミドルウェアーは問いません
6.プロジェクト経験者
■コミュニケーション能力の重要性が認識されている必要があります
7.その他
■/etcの知識
■レジストリベースの管理とファイルベースの管理の違い
■案件を最後までやり抜く根性
※他のメンバーに迷惑がかかりますので、ある意味必須です
勤務地は東京、開始は6月予定となっています
参画希望な方は、履歴書ならびに職務経歴書を、メールに添付して送信して下さい
職務経歴書は、これまで経験した業務、プロジェクトの詳細を記載して下さい
書類選考後、スキルマッチした方には、後日連絡致します
よろしくお願い致します
Posted by オタクSE at
23:01
│Comments(0)
2010年02月12日
performance::mysql
MySQLのベンチマークを取得
Dom0で動作しているMySQLが、どれくらいのパフォーマンスを持っているかを調べてみたいと思います
まずは、サーバのスペックから確認します
CPU情報
※一部省略
メモリ情報
※一部省略
使用するベンチマークユーティリティをmakeします
今回はSuper Smackを使用します
ベンチマーク用のシェルを作成します
スレッドとスレッド当たりのクエリーで、パフォーマンスを評価します
シェルを実行します
スレッドが10パターン、スレッド当たりのクエリー数を10パターンで、合計100回の評価なので、最後の結果だけを記載します
毎秒11144のクエリーを処理していることが確認できます
一見良さそうに思えますが、ある程度アクセスがあるポータルサイト、オンラインショップでは、全く要件を満たすことができません
とりあえず、評価は現場を想定して、非機能要件的に実行しないといけませんからね
100スレッド、100クエリー/スレッド時点でのサーバの負荷を確認します
1.53という数値から、本番環境での運用に不適切であることが分かります
※単一テーブルへのselectの発行を考慮
ちなみに、9万件のレコードを追加した時のレプリカの状態を確認してみます
Slave1
Slave2
Slave3
意外に安定しています
Dom0で動作しているMySQLが、どれくらいのパフォーマンスを持っているかを調べてみたいと思います
まずは、サーバのスペックから確認します
CPU情報
※一部省略
$ > cat /proc/cpuinfo
model name : Intel(R) Xeon(R) CPU 5150 @ 2.66GHz
cpu MHz : 2660.000
cache size : 4096 KB
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
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
}
$ > 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
#!/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
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
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)
+----------+
| 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)
+----------+
| 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)
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (0.00 sec)
意外に安定しています
Posted by オタクSE at
23:30
│Comments(0)
2010年02月04日
php::namespace
PHP5.3 > でのnamespaceの利用
PHP5.3移行でnamespaceの利用が可能になっています
ある一定以上の規模の開発になるとclassだけでは、命名し難くなる場合があるので、namespaceが利用できることでclassの名前を短縮することが可能となります
それ以上にCakePHPやZend Frameworkなどを構造的な観点から理解するのに役立ちます
※特にZendは命名に厳しい
セパレータは"\"(バックスラッシュ)です
namespace ns1の作成
namespace ns2の作成
インスタンス化と実行
結果
namespace単位でクラスが管理されています
また、ns2のコンストラクタが呼び出された後に、ns1のデストラクタが呼び出されていることも確認できます
ちなみに、同一namespace内でクラスを作成した場合でも、各クラスのコンストラクタ、デストラクタの呼び出し順に変化はありませんでした
C++の場合は、最初にコンストラクタ①が呼び出され、次にコンストラクタ②およびデストラクタ②が呼び出され、最後にデストラクタ①が呼び出されます
namespace ns1の作成
実装よりも詳細設計の段階で気を、オブジェクトの破棄を考慮して設計する必要がありますね
※補足
Eclipseでnamespaceを使用すると"syntax error(文法エラー)"になります
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 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;
}
}
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();
?>
$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のデストラクタ
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 {
...
}
// 実行結果は先のものと同一になります
?>
namespace ns1\hoge;
// hogeClass1に変更
class hogeClass1 {
...
}
// hogeClass2に変更
class hogeClass2 {
...
}
// 実行結果は先のものと同一になります
?>
実装よりも詳細設計の段階で気を、オブジェクトの破棄を考慮して設計する必要がありますね
※補足
Eclipseでnamespaceを使用すると"syntax error(文法エラー)"になります
Posted by オタクSE at
21:07
│Comments(0)
2010年02月02日
management::risk
ソフトウェアー開発におけるリスクマネージメント
開発費用の見積もりをするためには、単純に人/月換算では上手くいかない場合多々あります
なぜでしょうか?
人/月は、要員に対して属人性を排除した形での換算だからです
つまり人/月換算は、要員のスキルはもちろんですが、その周辺(角度を変えれば中心にもなり得る)の要因は考慮されていないということです
これが、ソフトウェアーを開発するうえでのリスクとなる確率が非常に高いですね
では、そのリスク要因と、一体どのようなものがあるでしょうか?
実際に開発を受注する際には、上記のことを考慮に入れて、その費用を見積もらないといけないと思います
そうでもしないと、潜在的にデスマーチが発生する要員のあるSWの開発を、責任を持って受注するのは厳しいのではないでしょうか?
お客様からすれば、なるだけ安くが理想ですが、開発する我々からすれば、なるべく確実に、しかも迅速にが理想です
お客様の要求と、我々の要望との間に、いかに折り合いをつけるかが、より良いお客様へのサービス提供と、良いSWの開発の実現だと思います
SEだから顧客満足度なんて関係ないとは言えない時代ですからね
開発費用の見積もりをするためには、単純に人/月換算では上手くいかない場合多々あります
なぜでしょうか?
人/月は、要員に対して属人性を排除した形での換算だからです
つまり人/月換算は、要員のスキルはもちろんですが、その周辺(角度を変えれば中心にもなり得る)の要因は考慮されていないということです
これが、ソフトウェアーを開発するうえでのリスクとなる確率が非常に高いですね
では、そのリスク要因と、一体どのようなものがあるでしょうか?
・プロジェクトが中々開始されない
・開発期間が足りない
・青果物以外の報告書が多い
・意思の疎通がスムースに進まない
・仕様変更が多々ある
・納期の変更
・担当者の変更
・要員のスキル不足
・要員の体調不良
などなど...
・開発期間が足りない
・青果物以外の報告書が多い
・意思の疎通がスムースに進まない
・仕様変更が多々ある
・納期の変更
・担当者の変更
・要員のスキル不足
・要員の体調不良
などなど...
実際に開発を受注する際には、上記のことを考慮に入れて、その費用を見積もらないといけないと思います
そうでもしないと、潜在的にデスマーチが発生する要員のあるSWの開発を、責任を持って受注するのは厳しいのではないでしょうか?
お客様からすれば、なるだけ安くが理想ですが、開発する我々からすれば、なるべく確実に、しかも迅速にが理想です
お客様の要求と、我々の要望との間に、いかに折り合いをつけるかが、より良いお客様へのサービス提供と、良いSWの開発の実現だと思います
SEだから顧客満足度なんて関係ないとは言えない時代ですからね
Posted by オタクSE at
22:55
│Comments(0)
2010年01月24日
linux::tuning
Linuxのチューニング
Linuxをチューニングします
ポイントは、次のようになります
今回は100%ハードウェア―レベルのチューニングではないですが、ハードウェアーをより良く利用するTipsです
それは、とても単純でハードディスクをマウントする際に、次のフラグを指定することです
これを指定することで、ファイルに対するアクセス時タイムスタンプを無効にすることができます
では、これをfstabで指定します
再起動する前に、現状のハードディスクのパフォーマンスを測定します
では再起動します
ハードディスクのパフォーマンスを測定します
私の管理しているサーバの最大のパフォーマンスは、次のようになりました
※すべて仮想HDDとなります
Linuxをチューニングします
ポイントは、次のようになります
・カーネル
・サービス
・ハードウェア―
・サービス
・ハードウェア―
今回は100%ハードウェア―レベルのチューニングではないですが、ハードウェアーをより良く利用するTipsです
それは、とても単純でハードディスクをマウントする際に、次のフラグを指定することです
noatime
これを指定することで、ファイルに対するアクセス時タイムスタンプを無効にすることができます
では、これをfstabで指定します
$ > vi /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
/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
/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
/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になります/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
※すべて仮想HDDとなります
Posted by オタクSE at
22:47
│Comments(0)
2010年01月23日
php::zendframework
ZendFrameworkのインストール
ZendFrameworkをwgetします
ZendFrameworkが使用できる環境を作成してあげます
テストスクリプトを作成します
http://localhost/へアクセスするとHello World!が表示されます
Controllerに使用するファイル名と、その中で使用されるClassの名前は合致するようにします
例えば、TestController.phpの場合は、その中で使われるClassをTestControllerにします
また、Viewを格納するディレクトリもControllerの名前に合わせるようにします
例えば、TestController.phpの場合は、/var/www/application/views/scripts/testにします
ControllerのからViewを制御することもできます
一昔のphpの仕様みたいな感じになります
個人的には、htm(l)ファイルにphpスクリプトを書き込むとか、phpファイル内にhtmlを書き込むというのは、ソースがスパゲティになるので、あまり好きではありません
MVCでのデザインパターンで開発を行うならhtml、php、javascript、cssはすべて独立したファイルであった方が、所在が明白になるので開発し易いと思います
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
$ > 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
$ > 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
$ > 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>
<?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:55
│Comments(2)
2010年01月23日
xen::kickstart
XenでDomUのインストール自動化
DomUのインストールを自動化します
install_xenの作成
kickstart.cfgを作成します
これで、install_xenを実行することで、一発インストールができます
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
#!/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
# 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:28
│Comments(0)
2010年01月21日
centos::ipvsadm
ロードバランサーの構築
CentOSにipvsadmを導入し、ロードバランサーを構築します
用意した環境は、次のようになります
まずはハードウェアー構成からです
WANからきたパケットは、一度ロードバランサーを経由して、sv1、sv2に振り分けられます
ネットワーク構成は、次のようになります
WANとローカル側で、異なるアドレスクラスまたは異なるサブネットを指定します
lbには仮想IPを割り当て、そちらでパケットを取得するようにします
また、パケットの転送先であるsv1、sv2のゲートウェイですが、こちらはlbのローカルIPを指定します
なお、今回はポート80で検証するので、sv1、sv2にはapacheをインストールし、そのドキュメントルートのindex.htmlを異なるものにして、区別できるようにして置きます
とりあえず、sv1、sv2へのapacheのインストールを行います
sv1へのインストール
sv2へのインストール
では、ipvsadmをインストールします
次にlbのeth0に仮想IPを割り当てます
仮想IPを確認します
ipvsadmの設定を行います
lbでパケット転送が有効になるように設定します
バランシングを確認する方法です
lbでのtcpdump
sv1でのtcpdump
sv2でのtcpdump
異なるホストからのアクセス
curlを実行した結果が、sv1またはsv2であれば成功です
curlの結果ホスト名が見つからない時は、lbからsv1(sv2)への転送は上手くいくが、sv1(sv2)からlbへの転送が上手くいっていないので、lb、sv1(sv2)間のネットワークを確認した方が良いです
なお、ロードバランスアルゴリズムとパケット転送方法には、次のようなものがあります
アルゴリズム
パケット転送方法
CentOSにipvsadmを導入し、ロードバランサーを構築します
用意した環境は、次のようになります
まずはハードウェアー構成からです
www
|
lb
|
+--------+
| |
sv1 sv2
|
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側
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
$ echo `hostname` > /var/www/html/index.html
sv2へのインストール
$ > yum -y install httpd
$ echo `hostname` > /var/www/html/index.html
$ 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
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
$ > 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
# 起動時に有効になるように設定
$ > 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 クライアントに応じた最小コネクション数
wrr 重み付けラウンドロビン
lc 最小コネクション
wlc 重み付け最小コネクション
lblc クライアントに応じた最小コネクション数
パケット転送方法
-g --gatewaying ダイレクトルーティング
-i --ipip トンネリング
-m --masquerading NAT
-i --ipip トンネリング
-m --masquerading NAT
Posted by オタクSE at
21:58
│Comments(0)
2010年01月17日
xen::livemigration::reliability
ライブマイグレーション MySQLで評価
ライブマイグレーションのメリットの1つが、ユーザにダウンタイムを感じさせないというのがあります
本当ですか?
現場でのユーザセッションとトランザクションの数を考えると、少々疑わしいところがありますよね
システムは正常に稼働しているように感じるけど、更新データがメチャクチャでは本末転倒です
趣味と実益がリンクすることが、ノンポリなOtakuSEの唯一のポリシーなので調べました
テストスクリプト
実行する前に、テーブルの初期状態を確認します
Before
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
もちろんレコードはありません
では、スクリプトを実行しながら、マイグレートします
もちろんスクリプトは、v1、v2、マイグレートするmgrとは異なる別のホストから実行します
v1からv2と、その逆で全部で2回実行します
v1からv2を実行したときの結果
データはすべて挿入されています
では、逆を実行してみます
v2からv1を実行したときの結果
キレイに倍になっています
セッション・トランザクション共に保持されていることは確認できました
今回は1セッションだけでしたが、本番環境では複数のn個のテーブルに対して、mセッション発生しますので、それに耐えきれるかどうかというのも検証する必要があります
実際にやるとしたら、複数のテストテーブルと、それぞれのテーブルに対する参照・更新系のスクリプトを用意して、複数のブラウザを立ち上げ一斉攻撃するといった感じです
ライブマイグレーションのメリットの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;
$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)
+----------+
| 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)
+----------+
| count(*) |
+----------+
| 20000 |
+----------+
1 row in set (0.00 sec)
キレイに倍になっています
セッション・トランザクション共に保持されていることは確認できました
今回は1セッションだけでしたが、本番環境では複数のn個のテーブルに対して、mセッション発生しますので、それに耐えきれるかどうかというのも検証する必要があります
実際にやるとしたら、複数のテストテーブルと、それぞれのテーブルに対する参照・更新系のスクリプトを用意して、複数のブラウザを立ち上げ一斉攻撃するといった感じです
Posted by オタクSE at
21:04
│Comments(0)
2010年01月17日
xen::livemigration
Xenライブマイグレーション
一方のDom0から、もう一方のDom0へ、無停止でDomUを移動させることです
理想的にはDom0間でのハードウェア―レベルでの差異がなく、Xenのコンフィギュレーションも同一の環境で行った方が、より安定的にマイグレートできます
今回は、次のような環境を用意しました
この2つのサーバをストレージに接続し、そこにDomUを設置します
サーバ・ストレージ間の接続は、両方ともGigabit Ehternetです
なお、今回はストレージとしてメールサーバの共有バックアップ領域を使用します
また、ストレージへはNFSでマウントします
※両サーバで実施
df -kしておきます
v1
v2
環境が定義できたところで、次にxend-config.sxpを修正です
※両サーバで実施
DomUのコンフィギュレーションファイルを、移動先サーバへコピーし、環境に合わせて修正します
Xendを再起動します
※両サーバで実施
マイグレーションを実施する前に、両サーバのDomUの現状を確認します
v1
v2
今回は青枠のホスト:mgrをマイグレートします
実施する前にApacheのベンチマークを取得しときます
※同時接続数:1000 リクエスト数1000で測定
結果
平均接続時間:2008
精勤処理時間:5353
# v1からv2へのマイグレート
別のホストからのネットワーク疎通確認を実施します
一旦疎通が途切れますが、すぐに復旧します
マイグレートしている時のApacheのベンチマークを測定します
結果
平均接続時間:25
精勤処理時間:1509
Failed requestsが0ですので、セッションは維持されたままということになります
その他、次のような評価もしましたが、セッションが切れることはありませんでした
・SSHでの接続
・MySQLへの接続
v1、v2のDomUの確認をします
v1
v2
上手くマイグレーションができています
どんな時に使う?
長期にわったて運用することで実績を積んでいけば、いろんな用途が発生してくると思います
一方の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
ホスト名: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 |--------
|
|--------- | 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')
# 追加またはコメントアウトします
(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" ]
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...
サーバリプレース
etc...
長期にわったて運用することで実績を積んでいけば、いろんな用途が発生してくると思います
Posted by オタクSE at
16:17
│Comments(0)
2010年01月15日
xen::dom0::memory
Xenカーネルのメモリ管理
XenでDomUを追加し過ぎるとエラーが発生し、追加したDomUが起動できない状態になります
その際、XenからのメッセージがMemory squeeze in netback driverです
この時は、どうトラブルシューティングすれば良いのか?
Dom0のメモリ使用量を指定
xend-config.sxpの修正
再起動
再起動後、Dom0のメモリ使用量の確認
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カーネルのバージョンは環境に依存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
xend-config.sxpの修正
$ > vi /etc/xen/xend-config.sxp
#(dom0-min-mem 256)
(dom0-min-mem 1024)
#(dom0-min-mem 256)
(dom0-min-mem 1024)
再起動
$ > shutdown -r now
再起動後、Dom0のメモリ使用量の確認
$ > cat /proc/meminfo
MemTotal: 1048576 kB
MemFree: 450112 kB
MemTotal: 1048576 kB
MemFree: 450112 kB
Posted by オタクSE at
23:30
│Comments(0)
2010年01月14日
mysql::replication::diff
MySQLレプリカでアンマッチデータ発生した場合
1.Masterでの作業
2.Slaveでの作業
アンマッチとレプリカが少ない場合は、手動でデータを更新
多岐にわたる場合は、一旦Slaveのデータを全部削除し、再度レプリカを作成
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)
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
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:48
│Comments(0)
2010年01月14日
mysql::replication
MySQLでのレプリケーションの構築
Master
Slave
■レプリケーション構築作業
1.Master DBでの作業
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での作業
4.Slave DBでの作業
Master
Host name:repl1
IP Address:192.168.1.27
IP Address:192.168.1.27
Slave
Host name:repl2
IP Address:192.168.1.28
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)
$ > 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 *
# ターボールで丸ごとデータを取得
$ > cd /var/lib/mysql
$ > tar cvf ~/data.tar *
# Lockの解除
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
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)
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)
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:55
│Comments(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 祭り最終日
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:24
│Comments(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 祭り最終日
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:55
│Comments(0)
2010年01月12日
installmaniax::statusnet
インストールマニアックス
StatuNetのインストール
ソース
http://status.net/
IISドキュメントルートにstatusnetディレクトリを作成し、IUSRに書き込み権限を付与
DLしたzipを解凍後、ファイル&フォルダをstatusnetディレクトリへコピー
MySQLにてdb、userを作成し、userに対してdbへのall privilegesを付与
Access to statusnet/install.php
Submit → Click
Finish!!
Access to statusnet
Public
Groups
Recent tags
Popular
My StatusNet
Supported by INSTALL MANIAX 3 Hyper-V 祭り最終日
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 '*********';
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
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:05
│Comments(0)
2010年01月12日
installmaniax::chyrp
インストールマニアックス
Chyrpのインストール
ソース
http://chyrp.net/download/
IISドキュメントルートにchyrpディレクトリを作成し、IUSRに書き込み権限を付与
DLしたzipを解凍後、ファイル&フォルダをchyrpディレクトリへコピー
MySQLにてdb、userを作成し、userに対してdbへのall privilegesを付与
Access to chyrp/install.php
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 祭り最終日
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 '*********';
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_
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:19
│Comments(0)
2010年01月12日
installmaniax::freeway
インストールマニアックス
Freewayのインストール
ソース
http://www.openfreeway.org/
IISドキュメントルートにfreewayディレクトリを作成し、IUSRに対して書き込み権限を付与
DLしたzipを解凍後、ファイル&フォルダをfreewayディレクトリへコピー
MySQLにてdb、userを作成し、userに対してdbへのall privilegesを付与
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
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 祭り最終日
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 '*********';
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
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:00
│Comments(0)