LVS構築

linux

過去に構築したLVSのメモ。内容の見直し等行ってないので不備あるかも。参考程度に。

概要

構成

  • LVS(centOS7):2台,dns-cache:2台
  • 全て同一のセグメント
  • LVSはNAT方式ではなく、DSR(Direct Server Return)方式で行う
    • DSRとは、ワンアーム構成において、ロードバランサに着信したクライアントからのリクエストパケットを、レスポンスはロードバランサを経由せずに、直接(Direct)にクライアントに返す方式
      • ロードバランサでLayer7の情報に基づいた負荷分散は行えない
      • リアルサーバでVIPの設定が必要となる
  • 簡易構成図(IPはテスト時のもの)
  ゲートウェイ
       |.1
       |
─┬──┴───┬─────┬────┬─── 192.168.0.0/24
  |  .141   |      |    |
  |   [VIP]    |      |    |
  |       |      |        |
  |.139     |.140    |.142   |.143
lvs-a     lvs-b      sv-a       sv-b

LVS構築(ipvsadm)

  • インストール
    • # yum install ipvsadm
  • パケット転送ON
    • # vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
  • パケット転送ON有効化
    • # sysctl -p
  • おまじない?(不要かも)
    • # touch /etc/sysconfig/ipvsadm
  • 設定のクリア(空なのでどっちでもいい)
    • # ipvsadm -C
  • 設定の確認
    • # ipvsadm -S
  • 設定の投入
    • # ipvsadm -A -t 192.168.0.141:53
    • # ipvsadm -a -t 192.168.0.141:53 -r 192.168.0.142:53 -g
    • # ipvsadm -a -t 192.168.0.141:53 -r 192.168.0.143:53 -g
  • 設定の確認
    • # ipvsadm -S
  • 動作状況の確認
    • # ipvsadm -L
  • ※補足
keepalived は LVS の API を用いて LVS の設定を行うようになっており、
keepalived.conf を編集して keepavlied を立ち上げると、LVS のエントリが自動で設定される。
keepalived が LVS のフロントエンドとしての役割も果たします。

LVS構築(keepalive)

  • インストール
    • # yum install keepalived
  • 自動起動
    • # systemctl enable keepalived.service
  • DIR作成(管理上分けただけなのでしなくてもいい)
    • # mkdir /etc/keepalived/virtualservers
  • 設定ファイルの編集1
    • # vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id LVS_DNS
}
vrrp_instance VRRP_1 {
   ! priorityでMasterの判定をさせる為両方BACKUP
   state BACKUP
   ! VRRPのインターフェースを指定
   interface eth0
   ! VRRPのID(master_slaveで合わせる)
   virtual_router_id 51
   ! master判定時の優先度(masterの値を大きくする)
   priority 100    ・・・★lvs-aに設定する値
   priority 50     ・・・★lvs-bに設定する値
   ! VRRPの送信間隔
   advert_int 3
   ! フェイルバックしない
   nopreempt
   ! フェイルーバー時にコネクションテーブルを同期 (UDPのため不要?)
   !lvs_sync_daemon_interface bond0
   virtual_ipaddress {
       192.168.0.141/23 dev eth0
   }
}
include virtualservers/*.conf
  • 設定ファイルの編集2
    • # vi /etc/keepalived/virtualservers/dns-tcp.conf
    • # vi /etc/keepalived/virtualservers/dns-udp.conf
! Configuration File for virtualserver
virtual_server 192.168.0.141 53 {
    ! 監視周期 5秒
    delay_loop 5
    ! 負荷分散方式 rr = ラウンドロビン
    lvs_sched rr
    ! パケット転送方式。 DR = Direct Return
    lvs_method DR
    ! プロトコル指定
    protocol TCP    ・・・★それぞれのconfでTCP/UDP選択を変える
    protocol UDP    ・・・★それぞれのconfでTCP/UDP選択を変える
    ! sv-a-dns
    real_server 192.168.0.142 53 {
        ! 重みづけ
        weight 1
        ! ヘルスチェックに失敗時、削除ではなくweightをゼロに
        inhibit_on_failure
        DNS_CHECK {
           connect_port 53
           ! ポーリングのタイムアウト時間(秒)
           connect_timeout 5
           ! リトライ回数
           retry 3
        }
    }
    ! sv-b-dns
    real_server 192.168.0.143 53 {
        ! 重みづけ
        weight 1
        ! ヘルスチェックに失敗時、削除ではなくweightをゼロに
        inhibit_on_failure
        TCP_CHECK {
           connect_port 53
           ! ポーリングのタイムアウト時間(秒)
           connect_timeout 5
           ! リトライ回数
           retry 3
        }
    }
}
  • サービス起動
    • # systemctl start keepalive
  • VIPが付与されていることを確認
    • # ip a

ログ関連の調整(別にしなくてもいい)

  • ログ出力変更
    • # vi /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D"
  ↓
KEEPALIVED_OPTIONS="-D -S 6"
  • rsyslogの編集
    • # vi /etc/rsyslog.conf
local6.*                      /var/log/keepalive.log
  • ログローテの編集
    • # vi /etc/logrotate.d/syslog

DNSサーバ側の設定

  • loopbackinterface設定
    • # cd /etc/sysconfig/network-scripts/
    • # cp -p ifcfg-lo ifcfg-lo:0
    • # vi ifcfg-lo:0
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255

  ↓上記を下記に。

DEVICE=lo:0
IPADDR=192.168.0.141
NETMASK=255.255.255.255
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
  • ネットワーク再起動
    • # systemctl restart network
  • ARPの反応をOFFに
    • # vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
  • 反映
    • # sysctl -p
  • DNSのMWがunboundの時、以下の設定でないと応答を返さなかった(詳細未調査)
    • # vi /etc/unbound/unbound.conf
interface-automatic: no
 ↓
interface-automatic: yes

動作試験結果

VRRP切替試験

  • 初期状況
    • lvs-aがVIPを所持
  • lvs-aのNW切断
    • VIP所持:lvs-bに変わる
    • VIPへのping:体感5秒程度かかる、その後復旧
  • lvs-aのNW復旧
    • VIP所持:lvs-bのまま
    • VIPへのping:タイムアウト無し
  • lvs-bのSVシャットダウン
    • VIP所持:lvs-aに変わる
    • VIPへのping:体感1-2秒程度かかる、その後復旧
  • lvs-bの起動
    • VIP所持:lvs-aのまま
    • VIPへのping:タイムアウト無し
  • lvs-aのkeepalivedサービス停止
    • VIP所持:lvs-bに変わる
    • VIPへのping:体感2秒程度かかる、その後復旧
    • lvs-aのkeepalivedはmonitがその後自動起動するがVIPはlvs-bのまま

ロードバランサー試験

  • 初期状況
    • lvs-a,bで下記を実行
      • # watch -n 1 ipvsadm -L
    • 適当なサーバからVIPに対してdigを実行
      • ラウンドロビンでsv-a,sv-bに均等に振り分けられる
      • VIPを持っている側のみのConnカウントが上がっていく
  • sv-aのunbound止めて名前解決
    • sv-aのweightが0になるまで10秒超える(HealthCheck閾値見直しがいるかも)
    • sv-bのconnカウントだけが上がっていく
  • sv-aのunbound起動させて名前解決
    • sv-aのweightが1になるまで3秒ぐらいかかる
    • sv-a,sv-bのconnカウントが均等に振り分けられて上がっていく
  • sv-bのunbound止めて名前解決
    • sv-bのweightが0になるまで10秒超える(HealthCheck閾値見直しがいるかも)
    • sv-aのconnカウントだけが上がっていく
  • sv-bのunbound起動させて名前解決
    • sv-bのweightが1になるまで3秒ぐらいかかる
    • sv-a,sv-bのconnカウントが均等に振り分けられて上がっていく
  • sv-a,sv-bのunbound止めて名前解決
    • 名前解決ができなくなる

コマンドなど

  • オプションなどの細かいところはこちらが詳しい
  • LVSの状態確認
    • # ipvsadm -L
  • LVSからRealServerの切り離し
    • # ipvsadm -d -t 192.168.0.141:53 -r 192.168.0.142
      • 実際にはLVSの設定から削除するということ
      • コマンド実行したLVS側のみとなるので、Bkup側も消すならそちらのSVでも実行が必要
  • LVSからRealServerの切り戻し
    • # ipvsadm -a -t 192.168.0.141:53 -r 192.168.0.142:53 -g
      • 実際にはLVSの設定に追加するということ
      • 最後の「-g」はダイレクトルーティングなので忘れないこと
      • コマンド実行したLVS側のみとなるので、Bkup側も消すならそちらのSVでも実行が必要
  • LVSの設定保存標準出力になるので、リダイレクトでファイル保存も可能
    • # ipvsadm –save

コメント