2011年2月10日木曜日

さくらVPSでLighttpd+PHP+MySQLの高速軽量サーバを作る


以前、さくらVPSで一日6万PVを処理するためにしたことを書かせていただいたのですが


DBが必要になり、以前のApache構成ではメモリとパフォーマンスに不安があったので軽量WebサーバのLighttpd(ライティ)を使ってみました。


LighttpdとPHPを使う場合は、PHPをCGIモードでインストールする必要があります。


Apache+PHPで構成されるサーバは基本的にモジュール版で動いている物が殆どですが、Lighttpdの場合はPHPモジュールがないためWebサーバ(Lighttpd)とPHPを別に動かす必要があります。


PHPを動かすためにfastcgiを使ってPHPのプロセスを管理します。


Lighttpdでは標準でfastcgiをサポートしていますので設定さえすればすぐにPHPが利用できます。



さくらVPSのコントロールパネルからすること


コントロールパネルからrootでログインしユーザを作る

作業用のユーザを作ります



adduser hogehoge


passwd hogehoge





サーバの細かい設定


SSHからhogehogeでログインする

先ほど作ったユーザをwheelに入れます



su -


usermod -aG wheel hogehoge


id hogehoge



wheelグループ以外rootに昇格できないようにします。


必ず一般ユーザをwheelに追加してからこの作業を行ってください。


rootになれなくなります。


vi /etc/pam.d/su



auth required pam_wheel.so use_uid


#コメントアウトを外す



よく使う&必要なライブラリーインストール


yum install bzip2-devel libjpeg libpng libjpeg-devel libpng-devel pcre pcre-devel bzip2 libxml2-devel



全てY



ライブラリーのパスを追加します


vi /etc/ld.so.conf



include ld.so.conf.d/*.conf


/usr/lib


/usr/local/lib


/usr/lib64


/usr/local/lib64



ldconfig




作業用ディレクトリ作成を作っておきます。


今後、ダウンロードや解凍作業などはこのディレクトリで行います。


mkdir /usr/local/work



インストール


cd /usr/local/work



MySQLダウンロード

mysql-5.5.9-linux2.6-x86_64.tar.gz


http://dev.mysql.com/downloads/mirror.php?id=401187#mirrors



MySQLのインストール

MySQLユーザの追加。


MySQLインストール作業はマニュアル通りになります。



adduser mysql -s /sbin/nologin


tar -zxvf mysql-5.5.9-linux2.6-x86_64.tar.gz -C /usr/local/


cd /usr/local/


ln -s /usr/local/mysql-5.5.8-linux2.6-x86_64 /usr/local/mysql


chown root: mysql-5.5.9-linux2.6-x86_64


cd mysql


chown -R mysql .


chgrp -R mysql .


mv data var


scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var


chown -R root .


chown -R mysql var


cp support-files/my-large.cnf /etc/my.cnf


cp bin/mysql /usr/local/bin/


cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql




設定ファイル編集


vi /etc/my.cnf



[client]


#password = your_password


port = 3306


socket = /tmp/mysql.sock



[mysqld]


port = 3306


socket = /tmp/mysql.sock


skip-external-locking


key_buffer_size = 256M


max_allowed_packet = 1M


table_open_cache = 256


sort_buffer_size = 1M


read_buffer_size = 1M


read_rnd_buffer_size = 4M


myisam_sort_buffer_size = 64M


thread_cache_size = 8


query_cache_size= 16M


thread_concurrency =


max_connections = 300


#skip-networking


#log-bin=mysql-bin


#binlog_format=mixed


server-id = 1


#server-id = 2


#master-host = <hostname>


#master-user = <username>


#master-password = <password>


#master-port = <port>


#log-bin=mysql-bin


#innodb_data_home_dir = /usr/local/mysql/data


innodb_data_file_path = ibdata1:512M:autoextend


#innodb_log_group_home_dir = /usr/local/mysql/data


innodb_buffer_pool_size = 256M


#innodb_additional_mem_pool_size = 20M


#innodb_log_file_size = 64M


#innodb_log_buffer_size = 8M


#innodb_flush_log_at_trx_commit = 1


#innodb_lock_wait_timeout = 50


[mysqldump]


quick


max_allowed_packet = 16M


[mysql]


no-auto-rehash


#safe-updates


[myisamchk]


key_buffer_size = 128M


sort_buffer_size = 128M


read_buffer = 2M


write_buffer = 2M


[mysqlhotcopy]


interactive-timeout




起動スクリプト編集

vi /etc/init.d/mysql


46行目辺り



basedir=/usr/local/mysql


datadir=/usr/local/mysql/var




起動します。(少し時間がかかります。)


service mysql start



MySQLにログイン


パスワードはまだ設定していないので空白でログインできます。



mysql -uroot -p




パスワードなしユーザを消してrootにパスワードを付ける



SET PASSWORD FOR [email protected]=PASSWORD('パスワード');


drop database test;


delete from mysql.user where user='';


delete from mysql.user where password='';


select user,host,password from mysql.user;




Lighttpd


今回のメインのLighttpdのインストールです。


インストール



wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.28.tar.gz


tar -zxvf lighttpd-1.4.28.tar.gz


cd lighttpd-1.4.28


./configure --disable-ipv6 --without-proxy --without-rrdtool --without-secdownload --without-trigger_b4_dl --without-webdav


make


make install




設定ファイルなどをコピーします。



cp ./doc/initscripts/rc.lighttpd.redhat /etc/init.d/lighttpd


ln -s /usr/local/sbin/lighttpd /usr/sbin/lighttpd


mkdir /etc/lighttpd


cp -r ./doc/config/* /etc/lighttpd/




Lighttpd実行ユーザを追加します。



adduser lighttpd -s /sbin/nologin




Lighttpdが必要とするディレクトリを作ります。



mkdir /var/log/lighttpd


mkdir -p /srv/www/cgi-bin


mkdir /srv/www/htdocs


mkdir -p /var/lib/lighttpd/sockets/


chown lighttpd:lighttpd /var/log/lighttpd


chown -R lighttpd:lighttpd /srv/www


chown -R lighttpd:lighttpd /var/lib/lighttpd/




Lighttpdの設定

server.tagのコメントアウトを外して、server.max-worker=10を追記しました。


server.max-workerはLighttpdの最大起動数です。


Apacheのmpmに該当しますが、アクセス数に応じて設定する必要があります。


さくらVPSの場合は10~30(100万PV/Day~300万PV/Day)ぐらいです。


vi /etc/lighttpd/lighttpd.conf



#######################################################################


##


## /etc/lighttpd/lighttpd.conf


##


## check /etc/lighttpd/conf.d/*.conf for the configuration of modules.


##


#######################################################################


#######################################################################


##


## Some Variable definition which will make chrooting easier.


##


## if you add a variable here. Add the corresponding variable in the


## chroot example aswell.


##


var.log_root = "/var/log/lighttpd"


var.server_root = "/srv/www"


var.state_dir = "/var/run"


var.home_dir = "/var/lib/lighttpd"


var.conf_dir = "/etc/lighttpd"



server.max-worker=10



##


## run the server chrooted.


##


## This requires root permissions during startup.


##


## If you run Chrooted set the the variables to directories relative to


## the chroot dir.


##


## example chroot configuration:


##


#var.log_root = "/logs"


#var.server_root = "/"


#var.state_dir = "/run"


#var.home_dir = "/lib/lighttpd"


#var.vhosts_dir = "/vhosts"


#var.conf_dir = "/etc"


#


#server.chroot = "/srv/www"


##


## Some additional variables to make the configuration easier


##


##


## Base directory for all virtual hosts


##


## used in:


## conf.d/evhost.conf


## conf.d/simple_vhost.conf


## vhosts.d/vhosts.template


##


var.vhosts_dir = server_root + "/vhosts"


##


## Cache for mod_compress


##


## used in:


## conf.d/compress.conf


##


var.cache_dir = "/var/cache/lighttpd"


##


## Base directory for sockets.


##


## used in:


## conf.d/fastcgi.conf


## conf.d/scgi.conf


##


var.socket_dir = home_dir + "/sockets"


##


#######################################################################


#######################################################################


##


## Load the modules.


include "modules.conf"


##


#######################################################################


#######################################################################


##


## Basic Configuration


## ---------------------


##


server.port = 80


##


## Use IPv6?


##


#server.use-ipv6 = "enable"


##


## bind to a specific IP


##


#server.bind = "localhost"


##


## Run as a different username/groupname.


## This requires root permissions during startup.


##


server.username = "lighttpd"


server.groupname = "lighttpd"


##


## enable core files.


##


#server.core-files = "disable"


##


## Document root


##


server.document-root = server_root + "/htdocs"


##


## The value for the "Server:" response field.


##


## It would be nice to keep it at "lighttpd".


##


server.tag = "lighttpd"


##


## store a pid file


##


server.pid-file = state_dir + "/lighttpd.pid"


##


#######################################################################


#######################################################################


##


## Logging Options


## ------------------


##


## all logging options can be overwritten per vhost.


##


## Path to the error log file


##


server.errorlog = log_root + "/error.log"


##


## If you want to log to syslog you have to unset the


## server.errorlog setting and uncomment the next line.


##


#server.errorlog-use-syslog = "enable"


##


## Access log config


##


include "conf.d/access_log.conf"


##


## The debug options are moved into their own file.


## see conf.d/debug.conf for various options for request debugging.


##


include "conf.d/debug.conf"


##


#######################################################################


#######################################################################


##


## Tuning/Performance


## --------------------


##


## corresponding documentation:


## http://www.lighttpd.net/documentation/performance.html


##


## set the event-handler (read the performance section in the manual)


##


## possible options on linux are:


##


## select


## poll


## linux-sysepoll


##


## linux-sysepoll is recommended on kernel 2.6.


##


server.event-handler = "linux-sysepoll"


##


## The basic network interface for all platforms at the syscalls read()


## and write(). Every modern OS provides its own syscall to help network


## servers transfer files as fast as possible


##


## linux-sendfile - is recommended for small files.


## writev - is recommended for sending many large files


##


server.network-backend = "linux-sendfile"


##


## As lighttpd is a single-threaded server, its main resource limit is


## the number of file descriptors, which is set to 1024 by default (on


## most systems).


##


## If you are running a high-traffic site you might want to increase this


## limit by setting server.max-fds.


##


## Changing this setting requires root permissions on startup. see


## server.username/server.groupname.


##


## By default lighttpd would not change the operation system default.


## But setting it to 2048 is a better default for busy servers.


##


server.max-fds = 2048


##


## Stat() call caching.


##


## lighttpd can utilize FAM/Gamin to cache stat call.


##


## possible values are:


## disable, simple or fam.


##


server.stat-cache-engine = "simple"


##


## Fine tuning for the request handling


##


## max-connections == max-fds/2 (maybe /3)


## means the other file handles are used for fastcgi/files


##


server.max-connections = 1024


##


## How many seconds to keep a keep-alive connection open,


## until we consider it idle.


##


## Default: 5


##


#server.max-keep-alive-idle = 5


##


## How many keep-alive requests until closing the connection.


##


## Default: 16


##


#server.max-keep-alive-requests = 16


##


## Maximum size of a request in kilobytes.


## By default it is unlimited (0).


##


## Uploads to your server cant be larger than this value.


##


#server.max-request-size = 0


##


## Time to read from a socket before we consider it idle.


##


## Default: 60


##


#server.max-read-idle = 60


##


## Time to write to a socket before we consider it idle.


##


## Default: 360


##


#server.max-write-idle = 360


##


## Traffic Shaping


## -----------------


##


## see /usr/share/doc/lighttpd/traffic-shaping.txt


##


## Values are in kilobyte per second.


##


## Keep in mind that a limit below 32kB/s might actually limit the


## traffic to 32kB/s. This is caused by the size of the TCP send


## buffer.


##


## per server:


##


#server.kbytes-per-second = 128


##


## per connection:


##


#connection.kbytes-per-second = 32


##


#######################################################################


#######################################################################


##


## Filename/File handling


## ------------------------


##


## files to check for if .../ is requested


## index-file.names = ( "index.php", "index.rb", "index.html",


## "index.htm", "default.htm" )


##


index-file.names += (


"index.xhtml", "index.html", "index.htm", "default.htm", "index.php"


)


##


## deny access the file-extensions


##


## ~ is for backupfiles from vi, emacs, joe, ...


## .inc is often used for code includes which should in general not be part


## of the document-root


url.access-deny = ( "~", ".inc" )


##


## disable range requests for pdf files


## workaround for a bug in the Acrobat Reader plugin.


##


$HTTP["url"] =~ "\.pdf$" {


server.range-requests = "disable"


}


##


## url handling modules (rewrite, redirect)


##


#url.rewrite = ( "^/$" => "/server-status" )


#url.redirect = ( "^/wishlist/(.+)" => "http://www.example.com/$1" )


##


## both rewrite/redirect support back reference to regex conditional using %n


##


#$HTTP["host"] =~ "^www\.(.*)" {


# url.redirect = ( "^/(.*)" => "http://%1/$1" )


#}


##


## which extensions should not be handle via static-file transfer


##


## .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi


##


static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" )


##


## error-handler for status 404


##


#server.error-handler-404 = "/error-handler.html"


#server.error-handler-404 = "/error-handler.php"


##


## Format: <errorfile-prefix><status-code>.html


## -> ..../status-404.html for 'File not found'


##


#server.errorfile-prefix = "/srv/www/htdocs/errors/status-"


##


## mimetype mapping


##


include "conf.d/mime.conf"


##


## directory listing configuration


##


include "conf.d/dirlisting.conf"


##


## Should lighttpd follow symlinks?


##


server.follow-symlink = "enable"


##


## force all filenames to be lowercase?


##


#server.force-lowercase-filenames = "disable"


##


## defaults to /var/tmp as we assume it is a local harddisk


##


server.upload-dirs = ( "/var/tmp" )


##


#######################################################################



#######################################################################


##


## SSL Support


## -------------


##


## To enable SSL for the whole server you have to provide a valid


## certificate and have to enable the SSL engine.::


##


## ssl.engine = "enable"


## ssl.pemfile = "/path/to/server.pem"


##


## The HTTPS protocol does not allow you to use name-based virtual


## hosting with SSL. If you want to run multiple SSL servers with


## one lighttpd instance you must use IP-based virtual hosting: ::


##


## $SERVER["socket"] == "10.0.0.1:443" {


## ssl.engine = "enable"


## ssl.pemfile = "/etc/ssl/private/www.example.com.pem"


## server.name = "www.example.com"


##


## server.document-root = "/srv/www/vhosts/example.com/www/"


## }


##


## If you have a .crt and a .key file, cat them together into a


## single PEM file:


## $ cat /etc/ssl/private/lighttpd.key /etc/ssl/certs/lighttpd.crt \


## > /etc/ssl/private/lighttpd.pem


##


#ssl.pemfile = "/etc/ssl/private/lighttpd.pem"


##


## optionally pass the CA certificate here.


##


##


#ssl.ca-file = ""


##


#######################################################################




fastcgiモジュールの設定

PHPを使う場合はfastcgiのコメントアウトを外す必要があります。


vi /etc/lighttpd/modules.conf



include "conf.d/fastcgi.conf"




fastcgi本体の設定

PHPの起動数を設定します。


PHP_FCGI_CHILDREN * max-procsが最大起動します。


以下の設定ファイルの値で100万PV/Day~300万PV/Dayぐらいを処理できます。



vi /etc/lighttpd/conf.d/fastcgi.conf



server.modules += ( "mod_fastcgi" )


fastcgi.server = ( ".php" =>


( "php-local" =>


(


"socket" => socket_dir + "/php-fastcgi-1.socket",


"bin-path" => server_root + "/cgi-bin/php5",


"max-procs" => 150,


"broken-scriptfilename" => "enable",


)


),


( "php-tcp" =>


(


"host" => "127.0.0.1",


"port" => 9999,


"check-local" => "disable",


"broken-scriptfilename" => "enable",


)


),


( "php-num-procs" =>


(


"socket" => socket_dir + "/php-fastcgi-2.socket",


"bin-path" => server_root + "/cgi-bin/php5",


"bin-environment" => (


"PHP_FCGI_CHILDREN" => "3",


"PHP_FCGI_MAX_REQUESTS" => "10000",


),


"min-procs" => 1,


"max-procs" => 2,


"max-load-per-proc" => 50,


"idle-timeout" => 360,


"broken-scriptfilename" => "enable",


)


),


)





PHPダウンロード

http://php.net/downloads.php



PHPのインストール


tar -zxvf php-5.2.17.tar.gz


cd php-5.2.17


PHP5.3以上の場合は‘--enable-fastcgi’を指定する必要はない




'./configure' \


'--enable-zend-multibyte' \


'--with-zlib' \


'--with-xmlrpc' \


'--with-gd' \


'--with-jpeg-dir=/usr/local' \


'--with-png-dir=/usr/local' \


'--enable-mbstring' \


'--enable-fastcgi' \


'--with-pdo-mysql=/usr/local/mysql' \



make


make test


make install




リンクを張ります。



ln -s /usr/local/bin/php-cgi /srv/www/cgi-bin/php5


ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20060613/ /usr/local/lib/extensions


ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20060613/apc.so /usr/local/lib/


cp php.ini-recommended /usr/local/lib/php.ini


ln -s /usr/local/lib/php.ini /etc/



APCインストール

パフォーマンスをあげるためにAPCもインストールしておきます



pecl install APC


デフォルトでenter




ログローテート


現在の状態では無限にLogが溜まっていくのでログローテートなどで適宜ログを削除していく必要があります。


Apacheのlogrotate時にApacheが停止する問題のログローテートを利用します。


vim /etc/logrotate.d/lighttpd



/var/log/lighttpd/*log {


rotate 14


daily


missingok


sharedscripts


postrotate


for max in $(seq 1 5)


do


LHTTPD_P=`pgrep lighttpd | wc -l`


if [ "$LHTTPD_P" != 0 ]


then


`/usr/bin/pkill lighttpd` > /dev/null


sleep 5s


elif [ "$LHTTPD_P" = 0 ]


then


/etc/init.d/lighttpd start > /dev/null


break


fi


done


LHTTPD_P=`pgrep lighttpd | wc -l`


if [ "$HTTPD_P" = 0 ]


then


echo Can Not Run HTTPD | mail -s HTTPD ALERT メールアドレス


fi


endscript


}







2011年2月8日火曜日

LVSを利用したロードバランサーの構築方法


前回はロードバランサー(LB)について書きましたが今回は実際にLVSを用いてLBを構築してみます。


LVSの仕組み


LVSについては前回の記事で紹介しましたが、Linuxを高パフォーマンス、高可用性(HA)を持つサーバを作るプロジェクトや機能です。



準備


VMwareでゲストを3つ作る。


  1. LVS

  2. WEB01(ApacheなどのWEBサーバを導入しててください)

  3. WEB02(ApacheなどのWEBサーバを導入しててください)


LVSにはネットワークアダプターを2つにしてください。


片方はNATかブリッジ、もう片方はホストオンリー。



WEB01/WEB02に関してはネットワークアダプターは1つで、ホストオンリーにしてください。



OS


LVSはOSのkernelバージョンに影響します。


2.6以上であれば基本的に問題ありません。(標準では2.4 2.6に導入されています)



kernelバージョン確認



uname -r






  • 最新CentOS 32bit でも 64bitどちらも可


http://mirror.centos.org/centos/5/isos/



オプション(必須ではない)

LVSで本番運用を目指す場合は、できるだけOSを軽くしたいのでインストール時にcustomを選択し、base + editorのみインストールします。


kernelのバージョンが古くIPVSに対応していない場合はkernelを再構築する必要がありますが、それ以外の場合は特に必要ありません。



【LVS】インストール作業



baseとeditorのみをインストールした場合はコンパイラーやライブラリーが殆どインストールされていないのでインストールします。



yum install gcc libnl-devel kernel-devel openssl-devel ipvsadm





ipvsadmをソースからインストールする場合

ipvsadmはLVSに接続されるクライアントのウェイトを設定したり、LVSに接続したり、LVSから切り離したりなどLVSを操作するコマンドをサポートします。


上記でyumと一緒にインストールした場合はこの作業は不要です。


ipvsadmをダウンロードします。


http://www.linuxvirtualserver.org/software/kernel-2.6/



現在利用しているkernelのリンクを作成します。


現在使用しているkernelはuname -rで調べられます。



ln -s /usr/src/kernels/2.6.18-194.1.AXS3-i686 /usr/src/linux



tar -zxvf ipvsadm-1.24.tar.gz


cd ipvsadm-1.24


make


make install




ポートフォワーディングを有効にする

sysctl -w net.ipv4.ip_forward=1



  • 永続的に変更する


vim /etc/sysctl.conf



net.ipv4.ip_forward = 1




VIPを設定する

現在ゲストOSのLVSには、2つのIPが割り振られていると思います。



ifconfig



eth0 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:AE


inet addr:172.16.0.129 Bcast:172.16.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1ae/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:3344953346 errors:0 dropped:0 overruns:0 frame:0


TX packets:3344935139 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:1933681498 (1.8 GiB) TX bytes:760781469 (725.5 MiB)


Interrupt:67 Base address:0x2000


eth1 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:B8


inet addr:10.1.0.134 Bcast:10.1.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1b8/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:7718486 errors:0 dropped:0 overruns:0 frame:0


TX packets:7669463 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:510259346 (486.6 MiB) TX bytes:574126235 (547.5 MiB)


Interrupt:75 Base address:0x2080


lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0


inet6 addr: ::1/128 Scope:Host


UP LOOPBACK RUNNING MTU:16436 Metric:1


RX packets:604367655 errors:0 dropped:0 overruns:0 frame:0


TX packets:604367655 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:0


RX bytes:190831055 (181.9 MiB) TX bytes:190831055 (181.9 MiB)





このeth0にはさらに1つの仮想IPアドレス(VIP)を設定します。


冗長構成ではない場合はVIPを設定する意味は殆どありませんが、冗長構成に移行する際にあらゆる設定ファイルを書き換えなければならない点とipvsadmを利用するためにVIPを設定します。


VIPは冗長化された構成内で共通に使えるIPを指定しルータ間や今回であればLVS間で利用することになります。


本来IPはユニークな物ではなければなりませんが、あえて重複させマスターにはVIPを割り当てマスターがダウンした際はバックアップにVIPを割り当てる事で冗長化します。


Linuxの場合は比較的簡単にVIPを設定することができます。




以下のコマンドは172.16.0.252というIPをデバイスeth0に割り当て、そのラベル名はeth0:lvs-vipという意味になります。ラベル名は適当な物で大丈夫です。



ip addr add 172.16.0.252 label eth0:lvs-vip dev eth0



これで、eth0に2つのIPが割り当てる事ができました。


ifconfigコマンドを打つとeth0がエイリアスされているのが伺えると思います。


172.16.0.252がVIPになります。今後、WEBへのアクセスは172.16.0.252を利用します。





eth0 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:AE


inet addr:172.16.0.129 Bcast:172.16.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1ae/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:3344953346 errors:0 dropped:0 overruns:0 frame:0


TX packets:3344935139 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:1933681498 (1.8 GiB) TX bytes:760781469 (725.5 MiB)


Interrupt:67 Base address:0x2000


eth0:lvs-vip Link encap:Ethernet HWaddr 00:0C:29:A9:E1:AE


inet addr:172.16.0.252 Bcast:0.0.0.0 Mask:255.255.255.255


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


Interrupt:67 Base address:0x2000


eth1 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:B8


inet addr:10.1.0.134 Bcast:10.1.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1b8/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:7718486 errors:0 dropped:0 overruns:0 frame:0


TX packets:7669463 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:510259346 (486.6 MiB) TX bytes:574126235 (547.5 MiB)


Interrupt:75 Base address:0x2080


lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0


inet6 addr: ::1/128 Scope:Host


UP LOOPBACK RUNNING MTU:16436 Metric:1


RX packets:604367655 errors:0 dropped:0 overruns:0 frame:0


TX packets:604367655 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:0


RX bytes:190831055 (181.9 MiB) TX bytes:190831055 (181.9 MiB)





LVS設定作業


LVSの操作は先ほどインストールしたipvsadmコマンドを利用して行います。




LVS本体の設定

設定したVIPをLVSに追加します。



ex.ipvsadm -A -t VIP:ポート番号 -s 分散方式




ipvsadm -A -t 172.16.0.252:80 -s lc






分散方式

sオプションには次の分散方式が有効です。メジャーな方式のみを紹介します。


rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|



  • rr:順番に各サーバに振分ける、最も単純な方式

  • wrr:設定されたウェイトによって負荷分散する方式。負荷分散するマシンに性能差がある場合などに利用する

  • lc:接続されているコネクション数が最も少ないところに分散する。DBやSMTPなどに有効。

  • wlc:設定されたウェイトと接続されているコネクション数から負荷の低いサーバに振分ける


etc...




クライアントの追加

LVSに接続されるクライアント(リアルサーバ)をLVSに追加します。


今回は通信方式にNATを利用します。


ex. ipvsadm -a -t VIP:ポート番号 -r クライアントのIP 通信方式



ipvsadm -a -t 172.16.0.252:80 -r 10.1.0.100 -m


ipvsadm -a -t 172.16.0.252:80 -r 10.1.0.101 -m





通信方式

通信方式は大きく分け2種類あります



  • g:DSR(DirectServerReturn)方式で行きはLVSにより分散されて来ますが帰りはLVSを通りません。


経路が1つしかないので帰りもLVSを通過しますがIPアドレスの書き換えを行わないのでApacheなどのアクセスログに残るのはLVSのeth1のアドレス(10.1.0.134)が記録されます。


ただし、IPアドレスの書き換えを行わないのでLVSの負荷が低くなりますが、リアルサーバの作業が多くなります。



  • m:NAT方式で行きも帰りもLVSを通過し、Apacheなどに残るIPアドレスは接続元のIPアドレスになります。通常はこの方式でリアルサーバの作業も殆どありませんが、LVSの負荷は高くなります。




リアルサーバ(WEB01/WEB02の設定)


リアルサーバにはLVSのeth1側のIPアドレスをゲートウェイとして指定します。



vim /etc/sysconfig/network


GATEWAY=10.1.0.134



service network restart




クライアントの接続確認


LVS側で以下のコマンドを実行します。



ipvsadm -ln




すると先ほど追加したクライアントが表示されるはずです。




IP Virtual Server version 1.2.1 (size=4096)


Prot LocalAddress:Port Scheduler Flags


-> RemoteAddress:Port Forward  Weight  ActiveConn  InActConn


TCP 172.16.0.252:80 lc


-> 10.1.0.100:80   Masq    1      0    0


-> 10.1.0.101:80   Masq   1      0   0




http://172.16.0.252 にアクセスするとWEB01かWEB02のページが表示されれば完了です。



LVSからクライアントを切り離す


ex. ipvsadm -d -t VIP:ポート番号 -r クライアントのIP





接続できない場合の対処


http://172.16.0.252 にアクセスできない場合は次のような原因が考えられます。



  1. クライアントのデフォルトゲートウェイが間違っている。ネットワークを再起動していない。

  2. クライアントのWEBサーバポートが80ではない。

  3. net.ipv4.ip_forwardが1になっていない。




問題点


LVSによりWEBサーバの冗長化は行えましたが、LVS本体の冗長化は行えてないため単一障害点が存在します。


次はLVS本体の冗長化を行いたいと思います。



参考書





2011年2月1日火曜日

ロードバランサーを構築するまで~基本編~


ある程度の規模になると複数台サーバを準備し負荷を分散させる必要があります。


負荷を分散させると一概に言っても様々な方法があるので紹介したいと思います。




ロードバランサー(LB)


負荷分散を行うための製品がLBです。


LBには負荷分散以外に次のような機能を持っていることが多いです。



  • SSLアクセレーション

  • データ圧縮

  • キャッシュ

  • フィルタリング



LBは多機能かつ高性能ではありますが、非常に高価な製品です。(400万~)


通常であれば冗長化なども必要なので数千万という単位の費用がかかります。



DNSラウンドロビン


1つのドメインに対して複数のIPを割り当てる事で負荷を分散します。


メリット


  • 負荷分散する上でもっとも簡単かつ安価にできる

  • ネットワーク的に離れたサーバにも分散できる

  • DNSサーバのみで動作する


デメリット


  • グローバルIPをサーバの数だけ準備する必要がある

  • 複数のサーバに対して均等に分散しにくい

  • サーバが停止していても振り分けられる


ゾーンファイル


test IN A 127.0.1.1


test IN A 127.0.1.2




上記の場合でも問題無く動作するのですがDNSのキャッシュ機能により一方のサーバに負荷が偏る場合があるのでTTLを明示的に短めにする事が推奨されています。



test 20m IN A 127.0.1.1


test 20m IN A 127.0.1.2




Linux Virtual Server(LVS)


LVSはLinuxを高パフォーマンス、高可用性(HA)を持つサーバを作るプロジェクトや機能です。


その成果としてできたのがロードバランシングです。


今回はLVSを中心に解説していきたいと思います。




LVSのメリット

現在LVSは=ロードバランサーとして表現されることが殆どです。


LBではなくLVSを利用するメリットをいくつかあげます。



  • LBを購入するより1/4程度のコストで運用できる

  • LB自身の冗長化も可能

  • LVSに対応したLinuxさえあればすぐに構築可能

  • ネットワーク的に離れたマシンにも分散可能


このようにローコストかつ、高いパフォーマンスを持ったLBを利用できるのは大きなメリットです。




LBを導入する際に考慮すべき点


LBには大きく分けてL4LB(レイヤー4LB)とL7LB(レイヤー7LB)があります。



L4やL7に関してはOSI参照モデルなどを参考にしてください。



L4LBの特徴

L4LBはクライアントからSYNパケットが到達した段階で振り分けるサーバを選定します。



そのためLBへの負荷は非常に低く、L7LBよりも高速に処理できると言われています。



この点に関しては近年CPUパワーが大きくなってきており殆ど差はないとされていますがスペックの低いLBの場合はL4LBの導入がよいでしょう。


DBやメールサーバなどに向いています。



L7LBの特徴

L7はL4と違い、TCPのトランザクションを全てLBで受け取りパケットの内容を見て振り分けることが可能です。


パケットの内容とは、cookieやHTTPヘッダなどを見て判断するので複数のサービスを1つのLBで受け持つ場合重要な機能になります。



Webサーバなどに向いています。



次は、実際にLVSを構築する前段階まで解説したいと思います。