過去に構築したLVSのメモ。内容の見直し等行ってないので不備あるかも。参考程度に。
概要
- LVS(Linux Virtual Server)とは
- Linux上でLayer4負荷分散装置と同様の機能を実現するためのソフトウェア
- https://www.designet.co.jp/faq/term/?id=TFZT
- https://mag.osdn.jp/13/05/14/083000
構成
- LVS(centOS7):2台,dns-cache:2台
- 全て同一のセグメント
- LVSはNAT方式ではなく、DSR(Direct Server Return)方式で行う
- DSRとは、ワンアーム構成において、ロードバランサに着信したクライアントからのリクエストパケットを、レスポンスはロードバランサを経由せずに、直接(Direct)にクライアントに返す方式
- ロードバランサでLayer7の情報に基づいた負荷分散は行えない
- リアルサーバでVIPの設定が必要となる
- DSRとは、ワンアーム構成において、ロードバランサに着信したクライアントからのリクエストパケットを、レスポンスはロードバランサを経由せずに、直接(Direct)にクライアントに返す方式
- 簡易構成図(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
- ※補足
- ipvsadmをサービスとして稼働させる必要のない理由
- 参考文献:https://blog.adachin.me/archives/3048
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カウントが上がっていく
- lvs-a,bで下記を実行
- 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でも実行が必要
- # ipvsadm -d -t 192.168.0.141:53 -r 192.168.0.142
- LVSからRealServerの切り戻し
- # ipvsadm -a -t 192.168.0.141:53 -r 192.168.0.142:53 -g
- 実際にはLVSの設定に追加するということ
- 最後の「-g」はダイレクトルーティングなので忘れないこと
- コマンド実行したLVS側のみとなるので、Bkup側も消すならそちらのSVでも実行が必要
- # ipvsadm -a -t 192.168.0.141:53 -r 192.168.0.142:53 -g
- LVSの設定保存(標準出力になるので、リダイレクトでファイル保存も可能)
- # ipvsadm –save
コメント