ロードバランサーとは良い響きではないですか!

きっかけ

IMG_0087.JPG
冗長化(じょうちょうか)というものをやってみたくなって、サーバーをもう一つ買ってみました。これから、WEB+DBサーバーのテストや、ロードバランサーの構築にチャレンジしてみたいと思っています。安くなったもんです。得にROMドライブがいらないし、ハードディスクも一つにしたので、3万くらいでした。詳細はこちら

2つ目のサーバーをインストール

基本的に、前のサーバーと同じものをインストールします。
  • LAMP、PostgreSQL、SSH です。詳しくは、Ubuntu/Server/8.10/インストールをご覧ください。(Apache・PHP5の設定あたりまでで終わりにします。)
  • サーバー名は web1 にしました。(初代は felix-labo.org にしています。揃ってなくてかっこ悪いです><)
  • eth0 は、もちろん statice(固定IP)で、192.168.99.8 にしました。問題のが余計な気を使ってくれて、DHCPを割り当てて情報を残していると、つなげなかったりします。そちらもちょっと覗いてみた方がよいかもしれません。

全体的な流れ

以下の様な構成で物理的な2台をロードバランサーをつかった構成にできないかと思っています。物理的には、どちらかでも壊れたら、結局つながらないので冗長化というより、負荷分散ってことなんでしょうが・・・、この構成がうまくいけば、たとえば 物理的にロードバランサー+Webサーバー2台+DBサーバーって構成を作ろうとしても、必要な技術的なことはほとんど網羅できると思っています。
Screenshot_2.png

共通のDBサーバーへ web1からつなぎにいく

もとからある felix-labo.org のDBサーバーへweb1からつなぎに行きます。ちょうど開発中のPRADOアプリケーションを公開したばかり(ネットショップ屋さん)なので、このWEBアプリをweb1サーバーにもおいて、felix-labo.orgのDBに接続します。 Screenshot_1.png
ローカルホスト(開発環境クライアント)にある /home/felix/www/felix-labo.org/NetShopYasan ディレクトリを 192.168.99.8 の /virtual/www/felix-labo.org に scpでコピー転送します。また同列にある framework (PRADOフレームワーク)もコピーします。
(ローカルホスト:開発環境クライアント端末から)
$ cd /home/felix/www/felix-labo.org
$ scp -r ./NetShopYasan flabo@192.168.99.6:/virtual/www/felix-labo.org/
$ scp -r ./framework flabo@192.168.99.6:/virtual/www/felix-labo.org/
DBへの接続情報はPRADOフレームワークの場合、/NetShopYasan/protected/application.xml にあるので、192.168.99.8 にログインしたのち、書き換えます。
$ cd /virtual/www/felix-labo.org/NetShopYasan
$ vi ./protected/application.xml
ここで、localhost となっているホストの情報を 192.168.99.6 に書き換えます。これで web1 のURL 192.168.99.6/NetShopYsan にアクセスすると・・・
Can't connect to MySQL server on '192.168.99.6' (111)
とエラーが表示されます。要するに、つなげないよ ということです。

felix-labo.org側のMySQLの設定

felix-labo.org側のMySQLを他のサーバーに公開するには、まず、MySQLの設定を変更する必要があります。初期状態としてMySQLは、自分のサーバーにだけ接続できる様に設定してあります。そうしておかないと、Web公開したと同時に、MySQLも公開ってことになってしまうからでしょう。
(felix-labo.orgから)
$ cd /etc/mysql
$ sudo vi ./my.cnf
このファイルの35行目あたり
bind-address            = 127.0.0.1
となっている部分の前に # をつけて コメント化(無効に)します。その後、
$ sudo /etc/init.d/mysql restart
でOKです。
つづいて、felix-labo.org のポート開放をします。現在どのポートが開いているかは、[メニュー]→[システム]→[システム管理]→[ネットワーク・ツール]でも確認できますが、コンソール上から確認できる nmap というパッケージをインストールします。今回は得に、web1から felix-labo.orgのmysqlサーバーが触れるかを調査したいので、コンソール上で動く、nmapをweb1でインストールします。
(web1上で)
$ sudo apt-get install nmap
でもって
$ nmap 192.168.99.6
とすると
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
993/tcp  open  imaps
995/tcp  open  pop3s
こんな情報がでてきます。mysql のポート 3306 がopen になっていればOKですが、この時点では mysql のポートは、開いていません。

ufw で ポート設定(開放)

サーバーには、それぞれ、開放してくれるポートがあります。どんな穴でもあったら入れるわけではなく、決められた入り口からしかサーバーにたどり着かないという訳です。上記のとおり、例えば、webサーバー(apache)は、80 番のポートです。 今回は、mysql の3306 を開けることにします。このポート開放の設定はいわゆるファイヤーをウォールの設定です。必要なサーバー以外は、ポートを占めて、外からの攻撃方法を限定させると言う訳です。Linux のファイヤーウォールは、iptables というアプリケーションです。ただし、設定は、結構難しくて手間のかかるものです。ubuntu には、ufw という ipatables の設定を簡単に行うためのパッケージがあります。
(web1から)
$ sudo apt-get install ufw
で、現状の確認をしてみる
$ sudo ufw status
状態: 非アクティブ
となる。つまりは、ufw は初期状態では アクティブになっていません。ここからのながれは、
  1. 非アクティブ状態から必要なポートの設定を追加する
  2. ufw をアクティブにする
という順番です。まずアクティブにしてしまうと、接続が切れたりしてやっかいです。例えば、ssh(ポート22)で接続してサーバーを設定する場合に、22を開けずにアクティブにしてしまうとその時点で接続がきれます><。そうなれば、直接サーバーをディスプレイ・キーボードを接続して操作しなくてはならなくなります。
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw allow 3306
これで、それぞれ必要なポートが開く設定がおわりです。なお、間違った設定を削除する場合には、
$ sudo ufw delete allow 3306
といった様にします。また、もっと詳細な設定(たとえば、どこからのアクセスしか許さないなど)の場合には、
$ sudo ufw allow from 192.168.99.8 to any port 3306
ちなみに これを削除する場合には
$ sudo ufw delete allow from 192.168.99.8 to any port 3306
です。こういった感じで最低限のポートと相手にだけ開放する方法がこのましいのですが、ちょっと面倒だという場合には、ルーターのフィルター設定をしておくという方法もあります。
以上、ufw の話はここ辺を参考にさせてもらいました。

画像ファイルなどの共有

DBは共通にしたので、これで、どちらのWebからでも、データが同期されます。でもネットショップ屋さんでは、商品画像へのアップ機能があります。つまり、画像データの同期が必要となってくる訳です。このデータは
/NetShopYasan/products/
内にすべて収められていて、これを nfs というパッケージをつかって、サーバーを越えてファイル共有してしまう訳です。今回は felix-labo.org側のディレクトリをサーバーとして、web1側で共有する仕組みとします。
(felix-labo.orgから)
$ sudo apt-get install nfs-kernel-server
また、web1側でもインストールする必要があります。
つづいて、nfs でどのディレクトリを誰に共有するのかを設定します。
(felix-labo.orgから)
$ cd /etc
$ sudo vi ./exports
このファイルが個別の共有ファイルの許可を記述するファイルです。これに以下を追加
#NetShopYasan photopile
/virtual/www/felix-labo.org/NetShopYasan/products 192.168.11.8(rw)
設定の中身は、[共有するディレクトリ] [共有先][(ルール)]といった感じで、最後のルール(rw)は、読み書きOKの設定です。これで、サーバー側(felix-labo.org側)のnfs の設定は終了です。設定を有効にします。
$ sudo service nfs-kernel-server reload

nfs でもポート設定

どんな詳細な理由があるのか、いっこうに分かりませんが、nfs のポート開放の対象である、2049 と その振り分けをおこなっている portmapper(nfs-kernel-server をインストールすると同時にインストールされる) のポート 111 を開放すれば、よい気がするのですが、クライアント側のマウントがうまくいきません。LAN内に限るので、web1からのすべての信号にはフィルターをかけないことにしました。
ということで、felix-labo.org側の設定から
(felix-labo.orgから)
$ sudo ufw allow from 192.168.99.8
web1側
(web1 から)
$ sudo apt-get install nfw-kernel-server
$ cd /virtual/www/felix-labo.org/NetShopYasan/    #web1 の 画像フォルダーの上へ移動
$ rm -r ./products/*          #画像フォルダー内を一旦削除
$ sudo mount -t nfs -o soft 192.168.99.6:/web_root/NetShopYasan/products ./products
テストは、 192.168.99.8 (web1) 側から、画像が表示されること、どちらからか画像をUPしたときに、双方に反映されることを確認します。
nfsについての詳細はここなどを参考にさせていただきました。