2017年4月3日月曜日

keepalived を使った、高可用性 squid proxyの構築(keepalived+squid+monit)


squidで作っていた、Proxyを『keepalived』を使って、可用性を高めました!
って、お話です!


もくじ



今回の簡易構成図

イメージ的には、こんな構成を作ります。

今回のキモは、『keepalived』

keepalivedで実現したいのは、可用性向上・メンテナンスの柔軟性向上です!

keepalivedは、『VRRP』(Virtual Router Redundancy Protocol)を使った
仮想IP』の切り替えを行えるミドルウェアって、考えで使います!

keepalived自体、通常LVSとしてロードバランサ用途(リバースプロキシ)で使うと思いますが。
基本的に概念としては一緒です。それをインターネット向けに使う『フォワードプロキシ』として利用します。

前提条件

まずは前提条件を整理しますね。
  • OS ・・・ CentOS5,6向け
  • リポジトリ ・・・ EPEL
  • VRRPを扱うミドルウェア ・・・ keepalived
  • Proxy ・・・ squid cache(※ 既存構築済み)
  • サービス監視・操作 ・・・ m/monit
  • 仮想IP ・・・ 192.168.1.10
  • サーバーA(Master) ・・・ 192.168.1.101
  • サーバーB(Backup) ・・・ 192.168.1.102
こんな感じの前提条件でした。

dockerで実現したかったのですが、既存で動いているものを冗長化することが目的なので、今回は対象から外しました。

keepalived インストール

EPELのリポジトリからインストール可能です!
sudo yum install keepalived --enablerepo=epel

keepalived 設定

  • グローバル設定
global_defs {
    notification_email {
      abcd@example.com
    }
    notification_email_from abcd@example.com
    smtp_server localhost
    smtp_connect_timeout 30
}


  • Master側
vrrp_instance VRRP1 {
    state BACKUP
    interface eth0
    virtual_router_id 1
    priority 200
    nopreempt
    advert_int 1
    virtual_ipaddress {
        192.168.1.10
    }
}



  • Backup側
vrrp_instance VRRP1 {
    state BACKUP
    interface eth0
    virtual_router_id 2
    priority 100
    nopreempt
    advert_int 1
    virtual_ipaddress {
        192.168.1.10
    }
}

priorityが大きい方が、仮想IPを優先的に取得するそうです。
stateはどちらも『BACKUP』にしたのは、MASTERが復帰した時に仮想IPが戻らないようにです。

サービス監視の『M/Monit』をインストール

『M/Monit』は、
プロセス名、pidファイル、Portなどから、指定のプロセスを探して、
無かったら、指定のコマンド実行するミドルウェアです!

sudo yum install monit --enablerepo=epel
sudo chkconfig monit on # これが起動しないと意味ないですからね!

『M/Monit』 のsquid設定

今回はCentOS5,6向け設定です。
コマンドを『systemd』で書き換えれば、CentOS7も使えます。

/etc/monit.d/monit-squid.conf
check process squid with pidfile /var/run/squid.pid
    group squid
    start program = "/sbin/service squid start"
    stop  program = "/sbin/service squid stop"
    if failed host localhost port 3128 then restart


『M/Monit』 のkeepalived設定


/etc/monit.d/monit-keepalived.conf
check process keepalived with pidfile /var/run/keepalived.pid
    start program = "/sbin/service keepalived start"
    stop  program = "/sbin/service keepalived stop"


(Option) IP転送を有効にする

今回の使い方で、必要ない気がするけど。
手順に載っていたので。(LVSとして、バックエンドに転送するときは使うのかと。。。)
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1

(Option) iptablesの設定

iptablesで設定を入れている場合、vrrpのチェックのため設定を入れる必要があります!
sudo iptables -A INPUT -d 224.0.0.0/255.0.0.0 -p vrrp -j ACCEPT
sudo iptables -A OUTPUT -d 224.0.0.0/255.0.0.0 -p vrrp -j ACCEPT

keepalived と、M/Monit の設定はここに

githubにサンプルファイルを置いておきます。

snickerjp/keepalived-squid

keepalived-squid - keepalived,squidとM/monitを使った、可用性Proxyのkeepalived設定サンプル


まとめ

  • VRRPのプロトコルを使って、便利に冗長化
  • これで、メンテナンスもしやすくなるし可用性も上がりました!
  • なんか、他にも利用用途ありそう!


参考

Zenback