Memo/Linux/haproxy

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/haproxy
 

HAProxyでフェイルオーバー/負荷分散

L7ロードバランサ。アプリケーション層のHTTPやSMTP等が対象。
対するL4ロードバランサはネットワーク層のTCP/UDP等が対象

  • メリット
    • DB Slave, memcacheノード追加/変更/削除時にアプリケーション側を変更しなくて良い。常にローカル(127.0.0.1:xxxx)へアクセスすれば良い
    • 負荷分散/フェイルオーバー機能を担保してくれるため、アプリ側で実装しなくて良い
    • 上記ノード変更時にサービス停止の可能性が減る
    • 負荷分散/フェイルオーバー機能を持たないソフトでも利用できる場合がある
  • デメリット
    • 複雑性が一つ増す。単一障害点が一つ増す。(対策:複数台用意する事でリスクを減らす)
  • 注意
    • 起動時にDNS名前解決を行いIPアドレスをキャッシュするので、ELBのように動的にIPアドレスが変わる場合は変更を通知する仕組みが必要

サービスを止めずに設定の再読み込み


一時的に設定を無効にする

  • disabledを使えば、セクション丸ごと無効にできる。
    • 例:mysql-slaveを無効にする場合
      vim /etc/haproxy/haproxy.cfg
      ----
      listen mysql-slave
          disabled
      ----
      service haproxy reload

muninでの監視

  • munin-nodeプラグイン
    • https://github.com/p01nt/haproxy_munin
    • http://exchange.munin-monitoring.org/plugins/?filter=tag:haproxy
    • memcacheのダウンタイムを知りたい場合
      yum install socat --enablerepo=rpmforge
      wget --no-check-certificate -O /usr/share/munin/plugins/haproxy_dwn_ "https://github.com/p01nt/haproxy_munin/raw/master/haproxy_dwn_"
      perl -p -i -e 's#/tmp/haproxy#/var/lib/haproxy/stats#i' "/usr/share/munin/plugins/haproxy_dwn_"
      chmod 755 /usr/share/munin/plugins/haproxy_dwn_
      ln -s /usr/share/munin/plugins/haproxy_dwn_ /etc/munin/plugins/haproxy_dwn_memcache
      
      cat > /etc/munin/plugin-conf.d/haproxy <<EOF
      [haproxy_*]
      user root
      group root
      EOF
      
      service munin-node restart
  • 確認。エラーが起きる度にカウントアップされる
    • 異常時
      munin-run haproxy_dwn_memcache
      
      memcache1_dwn.value 2
      memcache1_dwntime.value 138

インストール

  • CentOS6.x
    • インストール
      yum install haproxy --enablerepo=epel
  • CentOS5.x
    • インストール:epelにCentOS6.0用のrpmはあるが、5.x用の1.4.xが無いのでリビルド
      cd /usr/src/redhat/
      wget "http://download.fedora.redhat.com/pub/epel/6/SRPMS/haproxy-1.4.18-1.el6.src.rpm"
      rpm -ivh --nomd5 haproxy-1.4.18-1.el6.src.rpm
      
      yum install pcre-devel
      rpmbuild -ba SPECS/haproxy.spec
      
      rpm -ivh RPMS/i386/haproxy-1.4.18-1.i386.rpm
  • ログを出力する
    "-r"オプションを追加
    vim /etc/sysconfig/syslog
    ----
    SYSLOGD_OPTIONS="-m 0 -r"
    ----
    
    "local2.none""local2.*  /var/log/haproxy.log"を追加
    vim /etc/syslog.conf
    ----
    *.info;mail.none;authpriv.none;cron.none;local0.none;local2.none                /var/log/messages
    
    local2.*        /var/log/haproxy.log
    ----
    
    service syslog restart
  • /etc/haproxy/haproxy.cfg
    • logはnoticeにしないと、延々と「Connect from ...」が出る
    • 対象サービスが停止しているとコンソールにもログが出る
    • hostXX」の部分をホスト名やIPアドレスに書き換える
    • haproxyの先のapacheのアクセスログにはロードバランサのIPアドレスが記録されるが、元IPを記録したい場合はmod_rpafを使う
    • httpのヘルスチェック用に「/check.html」を作っておく
    • memcache:使用しないほうが良い。全キャッシュサーバが落ちてもMemcache::connect()はtrueが返ってくる。memcaheはキーのハッシュを元にサーバを決める。通常Memcache::addServer()で2台追加した場合、同一キーのキャッシュは2回目でヒットするし、容量も2倍使える。haproxyのroundrobinだとキャッシュがヒットするには最悪4アクセスかかるし、容量も1台と同じ。「balance source」なら同一IPは同じサーバを使うので2回目でヒットする。
      global
          log         127.0.0.1 local1 notice
      
          chroot      /var/lib/haproxy
          pidfile     /var/run/haproxy.pid
          maxconn     10000
          user        haproxy
          group       haproxy
          daemon
          quiet # Do not display any message during startup.
      
          stats socket /var/lib/haproxy/stats
      
      defaults
          mode                    tcp
          log                     global
          retries                 3
          timeout connect         10s
          timeout client          1m
          timeout server          1m
      
      listen http
          disabled
          bind 0.0.0.0:80
          mode http
          option httpchk GET /check.html HTTP/1.0
          option log-health-checks
          option forwardfor # Enable insertion of the X-Forwarded-For header to requests sent to servers.
          option redispatch # Enable or disable session redistribution in case of connection failure.
          option httplog    # Enable logging of HTTP request, session state and timers.
      #    option httpclose  # KeepAlive Off
          balance roundrobin
          server http01 host01:80 check inter 5s fall 2
          server http02 host02:80 check inter 5s fall 2
      
      listen mysql-master
      #    disabled
          bind 0.0.0.0:3306
          mode tcp
          option mysql-check
          balance roundrobin
          server mysql01 host01:3306 check port 3306
      
      listen mysql-slave
      #    disabled
          bind 0.0.0.0:3307
          mode tcp
          option mysql-check
          balance roundrobin
          server mysql02 host02:3306 check port 3306
          server mysql03 host03:3306 check port 3306
      
      listen memcache
          disabled
          bind 0.0.0.0:11211
          mode tcp
          balance source
          server memcache01 host01:11211 check port 11211
          server memcache02 host02:11211 check port 11211

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (39d)