サーバー構築 · 4 min read · Sep 10, 2025

Ubuntu 8.04 Hardy HeronでXenを実行する2台のサーバーによる完璧な負荷分散と高可用性のWebクラスター

Ubuntu 8.04 Hardy HeronでXenを実行する2台のサーバーによる完璧な負荷分散と高可用性のWebクラスター

はじめに

これは私のサイトからのコピーです: blogama.org

このハウツーでは、Xen、heartbeat、およびldirectordを使用して2台の実際のサーバー上に負荷分散および高可用性のWebクラスターを構築します。このクラスターは、http、メール、DNS、MySQLデータベースを処理し、完全に監視されます。これは現在、いくつかのウェブサイトを持つ本番サーバーで使用されています。

このチュートリアルの目的は、できるだけ少ない実際のサーバーで負荷分散と高可用性を達成すること、そしてもちろんオープンソースソフトウェアを使用することです。サーバーが多いほど、ハードウェアとホスティングコストが増加します。

ここにインストールされるサービスとアプリケーションの簡単なリストがあります:

  • Apache
  • MySQL + phpmyadmin
  • Postfix (SMTP) とウェブベースのユーザー設定およびSpamassassin
  • Courier (IMAP & POP) とsquirrelmail
  • Bind (DNSサーバー)
  • Muninとmonitによるウェブベースの監視
  • 監視用の自作スクリプト

必要なもの

デュアルLANを持つ2台のサーバー、少なくとも7つのIP。IPは次のように使用されます:

  • dom01.example.com : 192.168.1.100
  • dom02.example.com : 192.168.1.101
  • lb1.example.com : 192.168.1.102
  • lb2.example.com : 192.168.1.103
  • web1.example.com : 192.168.1.104
  • web2.example.com : 192.168.1.105
  • example.com : 192.168.1.106
  • yousite.com (オプション) : 192.168.1.107

Dom0は負荷分散装置とWebサーバーから分離されます。私は試していませんが、負荷分散装置をDom0に配置することは可能だと思います。

本番サーバーには少なくとも2GBのRAMとRAID 1または10のハードドライブを推奨します。

制限事項

  1. これは私にとって機能しました。あなたにとっても機能するとは限りませんが、ハウツーは本番およびテストサーバーで100%テスト済みです!

  2. このセットアップは2台のサーバーでスケーラブルですが、そうする場合はMySQLレプリケーションの別の方法を見つける必要があります。

  3. ISPConfig、CPanelなどのコントロールパネルはありません…

  4. 一部のウェブサイトはMySQLのマスターマスターレプリケーションを壊す可能性があります。Drupalでそれが起こりましたが、キャッシュを無効にするか、最小キャッシュ寿命を設定することで修正しました。これを進める前にお読みください:

A: MySQLレプリケーションは、マスターとスレーブ間のロックプロトコルをサポートしておらず、分散(クロスサーバー)更新の原子性を保証することができません。言い換えれば、クライアントAが共通マスター1に更新を行い、その間に共通マスター2に伝播する前に、クライアントBが共通マスター2に更新を行うと、クライアントAの更新が共通マスター1で行われたのとは異なる動作をする可能性があります。したがって、クライアントAの更新が共通マスター2に到達すると、共通マスター1にあるものとは異なるテーブルが生成されます。これは、2台のサーバーを双方向レプリケーション関係で連鎖させるべきではないことを意味します。更新が任意の順序で安全に行われることが確実でない限り、またはクライアントコード内で何らかの方法で順序が乱れた更新に対処しない限り。

1. Ubuntuのインストール

Ubuntu 8.04 LTSサーバーエディションの基本インストールを行います。

ソフトウェアRAID 1でインストールしたい場合は、私が書いたこのハウツーをお読みください:

Ubuntu 8.04をソフトウェアRAID 1でインストール

2. Xenのインストール

Xenはイメージファイルまたは専用パーティションから実行できます。どちらにも利点と欠点があります。

イメージファイルからのディスクI/Oは遅くなりますが、バックアップや管理が容易です。パーティションで作業する場合はその逆です。

私が提案するのは、イメージファイルから始めて、セットアップが完了したらパーティションで終えることです。この方法で、イメージファイルのバックアップを取り、テスト時に必要に応じてロールバックできます。

イメージファイルにインストールするには、ハウツーマスターFalkoのこの素晴らしいチュートリアルを参照してください:

Ubuntu 8.04 (Hardy Heron) サーバーにXenをインストールする

パーティションに直接インストールするには(Falkoのハウツーの私の修正バージョン):

Ubuntu Hardy Heron (8.04) サーバーシステムAMD64またはi386用の高性能XEN

各サーバーに2つのXenドメインを作成する必要があります(dom01とdom02はDom0またはVMコントローラーです):

サーバー #1 - dom01.example.com

lb1.example.com (256MB RAM - 5GB HDで十分) ip : 192.168.1.102

web1.example.com

(RAMが多いほど良い、Dom0には512MBを確保)

ip : 192.168.1.104

サーバー #2 - dom02.example.com

lb2.example.com (256MB RAM - 5GB HDで十分) ip : 192.168.1.103

web2.example.com (RAMが多いほど良い、Dom0には512MBを確保) ip : 192.168.1.105

3. ローカルデータ転送用のXenブリッジの作成(オプション)

デフォルトでは、Xenを使用した仮想マシンでは1つのネットワークカードのみが有効になっています。rsync、MySQLレプリケーション、バックアップなどのローカル転送には、2台のサーバー間にギガビットクロスオーバーケーブルを使用します。これは必須ではありませんが、帯域幅コストを節約し、レプリケーションが速くなります。

Xenブリッジを作成するためのこのハウツーを参照してください:

Ubuntu 8.04で新しいXenブリッジを作成する

このハウツーでは、2番目のネットワークカード(クロスオーバー)で使用されるIPは次のとおりです:

  • dom01.example.com : 192.168.0.100
  • dom02.example.com : 192.168.0.101
  • lb1.example.com : 192.168.0.102
  • lb2.example.com : 192.168.0.103
  • web1.example.com : 192.168.0.104
  • web2.example.com : 192.168.0.105

4. ノードの準備(dom01、dom02、lb1、lb2、web1、web2)

4.1 opensshサーバーとVIMのインストール

実行:

sudo su apt-get install vim ssh openssh-server

4.2 リポジトリの更新

mv /etc/apt/sources.list /etc/apt/sources.list.bak vi /etc/apt/sources.list

sources.listを次のようにします:

#
# deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
#deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ - Release i386 (20080423.2)]/ hardy main restricted
# http://help.ubuntu.com/community/UpgradeNotes を参照して、
# 新しいバージョンのディストリビューションにアップグレードする方法を確認してください。
deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy main restricted
## 最終リリース後に生成された主要なバグ修正アップデート。
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted
## N.B. このリポジトリのソフトウェアは、Ubuntu
## チームによって完全にサポートされておらず、自由なライセンスの下にない可能性があります。ソフトウェアの使用権を確認してください。また、universeのソフトウェアは、Ubuntuのセキュリティ
## チームからのレビューや更新を受けません。
deb http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy universe
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates universe
## N.B. このリポジトリのソフトウェアは、Ubuntu
## チームによって完全にサポートされておらず、自由なライセンスの下にない可能性があります。ソフトウェアの使用権を確認してください。また、multiverseのソフトウェアは、Ubuntuのセキュリティ
## チームからのレビューや更新を受けません。
deb http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-updates multiverse
## 次の2行のコメントを解除して、'backports'リポジトリからのソフトウェアを追加します。
## N.B. このリポジトリのソフトウェアは、
## メインリリースに含まれるものほど広範囲にテストされていない可能性がありますが、役立つ機能を提供する新しいバージョンのアプリケーションが含まれています。
## また、backportsのソフトウェアは、Ubuntuのセキュリティチームからのレビューや更新を受けません。
# deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
# deb-src http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
## 次の2行のコメントを解除して、Canonicalの
## 'partner'リポジトリからのソフトウェアを追加します。このソフトウェアはUbuntuの一部ではありませんが、
## CanonicalとそれぞれのベンダーによってUbuntuユーザーへのサービスとして提供されています。
# deb http://archive.canonical.com/ubuntu hardy partner
# deb-src http://archive.canonical.com/ubuntu hardy partner
deb http://security.ubuntu.com/ubuntu hardy-security main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted
deb http://security.ubuntu.com/ubuntu hardy-security universe
deb-src http://security.ubuntu.com/ubuntu hardy-security universe
deb http://security.ubuntu.com/ubuntu hardy-security multiverse
deb-src http://security.ubuntu.com/ubuntu hardy-security multiverse

今、実行:

apt-get update apt-get upgrade

4.3 修正

/bin/shは/bin/dashへのシンボリックリンクですが、/bin/bashが必要です。したがって、次のようにします:

ln -sf /bin/bash /bin/sh

次のようにして、AppArmorを無効にします(dom01およびdom02で):

/etc/init.d/apparmor stop update-rc.d -f apparmor remove

5. ネットワーク構成(dom01、dom02、lb1、lb2、web1、web2)

5.1 IPの設定

Ubuntuでネットワーク構成を編集するには:

vi /etc/network/interfaces

これから各ネットワーク構成を1つずつ行います。2つのネットワークカードを使用していると仮定します。eth0はインターネットに接続されているもので、eth1はクロスオーバーケーブルのものです。個別に設定ファイルを書くことはせず、dom01.example.comのためだけに書きますので、次のリストに応じて修正してください:

dom01.example.com

dom01.example.com

eth0 : 192.168.1.100 eth1 : 192.168.0.100

dom02.example.com

eth0 : 192.168.1.101 eth1 : 192.168.0.101

lb1.example.com

eth0 : 192.168.1.102 eth1 : 192.168.0.102

lb2.example.com

eth0 : 192.168.1.103 eth1 : 192.168.0.103

web1.example.com

eth0 : 192.168.1.104 eth1 : 192.168.0.104

web2.example.com

eth0 : 192.168.1.105 eth1 : 192.168.0.105

dom01.example.comの例のネットワーク構成:

/etc/network/interfacesファイルを次のようにします:

# このファイルは、システムで利用可能なネットワークインターフェースとそれを有効にする方法を説明します。
# 詳細については、interfaces(5)を参照してください。
# ループバックネットワークインターフェース
auto lo
iface lo inet loopback
# インターネットに接続されたプライマリネットワークインターフェース
auto eth0
iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
# 他のサーバーにクロスオーバーケーブルで接続されたセカンダリネットワークインターフェース
auto eth1
iface eth1 inet static
        address 192.168.0.100
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255

ファイルを保存して、次を実行:

/etc/init.d/networking restart

5.2 ホスト名

vi /etc/hosts

次のようにします。そうしないと、後でldirectordで問題が発生します: dom01.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       dom01.example.com dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# 次の行は、IPv6対応ホストにとって望ましいものです
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo dom01.example.com > /etc/hostname /etc/init.d/hostname.sh start

dom02.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       dom02.example.com dom02
192.168.1.100   dom01.example.com     dom01
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# 次の行は、IPv6対応ホストにとって望ましいものです
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo dom02.example.com > /etc/hostname /etc/init.d/hostname.sh start

lb1.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       lb1.example.com lb1
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# 次の行は、IPv6対応ホストにとって望ましいものです
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo lb1.example.com > /etc/hostname /etc/init.d/hostname.sh start

lb2.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       lb2.example.com lb2
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.104   web1.example.com     web1
192.168.1.105   web2.example.com     web2
# 次の行は、IPv6対応ホストにとって望ましいものです
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo lb2.example.com > /etc/hostname /etc/init.d/hostname.sh start

web1.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       web1.example.com web1
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.105   web2.example.com     web2
# 次の行は、IPv6対応ホストにとって望ましいものです
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo web1.example.com > /etc/hostname /etc/init.d/hostname.sh start

web2.example.com

127.0.0.1       localhost.localdomain   localhost
127.0.1.1       web2.example.com web2
192.168.1.100   dom01.example.com     dom01
192.168.1.101   dom02.example.com     dom02
192.168.1.102   lb1.example.com     lb1
192.168.1.103   lb2.example.com     lb2
192.168.1.104   web1.example.com     web1
# 次の行は、IPv6対応ホストにとって望ましいものです
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

echo web2.example.com > /etc/hostname /etc/init.d/hostname.sh start

6. ソフトウェアのインストール(dom01、dom02、lb1、lb2、web1、web2)

実行:

apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev g++ build-essential

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。