メールサービスの負荷分散

#概要
ロードバランサーを使って、メールサービスの負荷分散をする。

#環境
- CentOS 6.7

#ロードバランサーの調査
取り扱うレイヤーによって以下の種類がある。

- L4 ・・・ LVS(Linux Virtual Server)など。
	- L4-NAT (Network Address Translation)
	- L4-DSR (Direct Server Return)
- L7 ・・・ nginxなど、リバースプロキシとも呼ぶ。

PostfixへのSMTPアクセスを分散させることを考える。
nginxはメールプロトコルのプロキシに対応しており、ユーザー認証のロジックを独自で定義することができる。
ここでは、ユーザー認証はPostfix側でSMTP AUTHを使って実施するので、L4(LVM)のロードバランサーを使用する。

#ネットワーク設計

一つのホスト内で擬似的に以下のようなロードバランシングを構築する。

- LVSで587番ポート(submission)と465ポート(SMTPs)をLISTENする。
- Postfixをマルチプルインスタンスモードで2インスタンス起動する。
- L4-NATで以下のようにラウンドロビン(rr)でアクセスを分散させる。
	- {global IP}:587 -> 127.0.0.1:8025 or 127.0.0.1:9025
	- {global IP}:465 -> 127.0.0.1:8465 or 127.0.0.1:9465

```
                          |
                          | {global IP}:587 (submission)
                          | {global IP}:465 (SMTPs)
                    +----------+
--------------------|    LVS   |---------------------
                    +----------+
                          |
      127.0.0.1:8025      |      127.0.0.1:9025
      127.0.0.1:8465      |      127.0.0.1:9465
      +-------------------|-------------------+
+-----|-----+                           +-----|-----+
| Postfix 1 |                           | Postfix 2 |
+-----------+                           +-----------+

```

#LVS (Linux Virtual Server)

##IPフォワーディングを有効化
IPフォワーディングを有効にして、NATを使用できるようにする。

```Bash
# sysctl.confを修正
$ sudo vi /etc/sysctl.conf
===
net.ipv4.ip_forward = 1

# sysctl.confの設定を有効化
$ sudo sysctl -p
```

##ipvsadmのインストール
ipvsadmをインストールしたが、ipvsモジュールがインストールされていない模様。

```Bash
# インストール
$ sudo yum install ipvsadm

# バージョン確認
$ sudo ipvsadm -v
FATAL: Module ip_vs not found.
Can't initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?

# カーネルモジュールを探す
$ sudo find / -name ip_vs.ko
(なし)
```

#おまけ

##nginx
nginxでもSMTPのロードバランシングを実現できるが、ユーザー認証をpostfix側でSMTP AUTHを使って実施したかったため、使用しなかった。

###yumのレポジトリURLを追加

```
$ sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
```

###パッケージのインストール
```
$ sudo yum install nginx

$ nginx -v
nginx version: nginx/1.10.3
```

###httpsの設定

```
$ sudo vi /etc/nginx/conf.d/default.conf

server {
 :
    listen 443;
    ssl on;
    ssl_certificate {cert file path};
    ssl_certificate_key {cert key file path};
 :
```

###起動確認

```
$ sudo /etc/init.d/nginx start
```

#参考資料
##ロードバランサー
- [Webエンジニアが知っておきたいインフラの基本 ~インフラの設計から構成、監視、チューニングまで~](https://www.amazon.co.jp/Web%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%8B%E3%82%89%E6%A7%8B%E6%88%90-%E7%9B%A3%E8%A6%96-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7-%E9%A6%AC%E5%A0%B4-%E4%BF%8A%E5%BD%B0/dp/4839953554/)
- http://nginx.org/en/linux_packages.html
- https://www.nginx.com/resources/admin-guide/mail-proxy/
- http://www.harumaki.net/2015/04/22/oss-load-balancer_collection/
- http://knowledge.sakura.ad.jp/tech/274/
- https://www.server-world.info/query?os=CentOS_6&p=lvs
- http://dsas.blog.klab.org/archives/50664843.html

##postfixマルチインスタンス
- http://akira-arets.blogspot.jp/2016/02/postfix-howto-running-multiple-instances.html

##yum
- http://d.hatena.ne.jp/yushin_hirano/20130604/1370357942