#author("2017-07-23T23:20:07+09:00","default:nowsky","nowsky")
#author("2017-07-23T23:21:24+09:00","default:nowsky","nowsky")
*Keepalived [#e88dd0e7]
-[[Keepalived:+http://www.keepalived.org/]]
-[[Keepalived SYNOPSIS:+https://github.com/acassen/keepalived/blob/master/doc/keepalived.conf.SYNOPSIS]]
-[[RedHat ロードバランサーの管理:+https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/ch-lvs-overview-VSA.html]]

LinuxでVRRPを喋る時に利用するプログラム。
非常に細かい制御が可能で、特定プロセスのトラッキング、ユニキャストVRRPも実装出来る。
また、VRRPv3に対応しているので、実行プロトコルを変更すればIPv6でVRRPも可能。
 
単独で利用する事は少なく、ロードバランサー(HAProxy、UltraMonkey)と組み合わせたり、
リバースプロキシ自体の冗長化として使う場合が多い。

~
*インストール [#idb40e4e]
上記のオフィシャルにソースコードが置いてあるので、
Linuxにダウンロードして通常通りにビルドする。
 # tar zxvf keepalived-1.3.5.tar.gz
 # cd keepalived-1.3.5
 # ./configure --prefix=/usr/local/keepalived-1.3.5
 # make && make install
 # cd /usr/local
 # ln -s /usr/local/keepalived-1.3.5 keepalived
 
また、面倒な場合はパッケージ管理で導入する事も可能。
 # yum install keepalived

~
*設定 [#r3f75d67]
今回は下記構成例を作成する。
前述した通り、中身はVRRPなので詳細はVRRPのRFCを見れば大体わかる。
今回は敢えてNICを分割し、それぞれでVRRPv2とVRRPv3を喋る構成だが、
デュアルスタックなどの場合はVRRPv3で設定を一纏めにする事も可能。
 
・IPアドレス、NIC情報
|NIC |VRID|仮想IP          |サーバ1(Backup)|サーバ2(Master)|
|eth0|10  |10.0.0.254      |10.0.0.1       |10.0.0.2       |
|eth1|80  |fe80::10:0:0:254|fe80::10:0:0:1 |fe80::10:0:0:2 |
 
・オプション定義
+HAProxyのプロセスをtrack対象とする
+平文でVRRPの認証を行う
+VRRP切り替え時のメール送信は行わない
+自動切り戻し(preempt)を有効にする
+パケット効率化の為にユニキャストVRRPを利用する
+プライオリティは「サーバ1:1/サーバ2:2」とする

 
・実コンフィグ
#region(&color(#ff0000){サーバ1(Backup)};)
 ##
 ## Mail Notification
 ##
 global_defs {
     notification_email {
     # hoge-test@gmail[.]com           ## メール送信しないのでコメント
     # hoge-test★gmail.com           ## メール送信しないのでコメント
     }
 }
 
 ##
 ## Process Check
 ##
 vrrp_script check_haproxy {
     script   "pkill -0 -x haproxy"    ## HAProxyのプロセスtrack設定
     interval 1                        ## 1秒毎に確認
     fall     5                        ## 5回プロセス確認が失敗したらVRRP切替
     raise    10                       ## 10回プロセス確認が成功したらVRRP切戻
 }
 
 ##
 ## eth0
 ##
 vrrp_instance eth0-ipv4 {
     # nopreempt                       ## 自動切戻(preempt)の有効化
     vrrp_version      2               ## VRRPv2を利用する
     state             BACKUP          ## 常時バックアップにする事でプライオリティを優先化
     interface         eth0            ## VRRPv2を出力するNIC
     virtual_router_id 10              ## VRIDを設定
     garp_master_delay 5               ## 自サーバがMasterになった後、GARP再送までの待ち時間
     advert_int        1               ## VRRPパケット送信間隔。単位は秒
     priority          1               ## VRRPプライオリティ
     unicast_src_ip    10.0.0.1        ## VRRPを送信する、送信元IPアドレス
     unicast_peer {
         10.0.0.1                      ## ユニキャストVRRP送信先(自サーバ)
         10.0.0.2                      ## ユニキャストVRRP送信先(他サーバ)
     }
     authentication {
         auth_type PASS                ## VRRPに認証を追加
         auth_pass vrrp_pass           ## VRRPの認証パスワード。左記だと"vrrp_pass"がパスワード
     }
     virtual_ipaddress {
         10.0.0.254                    ## VRRP代表アドレス。所謂、仮想IPアドレス
     }
     track_script {
         check_haproxy                 ## trackスクリプトとして、HAProxyのプロセスチェックを指定
     }
 }
 
 ##
 ## eth1
 ##
 vrrp_instance eth1-ipv6 {
     # nopreempt                       ## 自動切戻(preempt)の有効化
     native_ipv6                       ## IPv6でVRRPパケットをやり取りする場合に設定
     vrrp_version      3               ## IPv6でVRRPを実行する為に、VRRPv3を指定
     state             BACKUP          ## 常時バックアップにする事でプライオリティを優先化
     interface         eth1            ## VRRPv3を出力するNIC
     virtual_router_id 80              ## VRIDを設定
     garp_master_delay 5               ## 自サーバがMasterになった後、GARP再送までの待ち時間
     advert_int        1               ## VRRPパケット送信間隔。単位は秒
     priority          1               ## VRRPプライオリティ
     unicast_src_ip    fe80::10:0:0:1  ## VRRPを送信する、送信元IPアドレス
     unicast_peer {
         fe80::10:0:0:1                ## ユニキャストVRRP送信先(自サーバ)
         fe80::10:0:0:2                ## ユニキャストVRRP送信先(他サーバ)
     }
     authentication {
         auth_type PASS                ## VRRPに認証を追加
         auth_pass vrrp_pass           ## VRRPの認証パスワード。左記だと"vrrp_pass"がパスワード
     }
     virtual_ipaddress {
         fe80::10:0:0:254              ## VRRP代表アドレス。所謂、仮想IPアドレス
     }
     track_script {
         check_haproxy                 ## trackスクリプトとして、HAProxyのプロセスチェックを指定
     }
 }
#endregion
#region(&color(#ff0000){サーバ2(Master)};)
 ##
 ## Mail Notification
 ##
 global_defs {
     notification_email {
     # hoge-test@gmail[.]com           ## メール送信しないのでコメント
     # hoge-test★gmail.com           ## メール送信しないのでコメント
     }
 }
 
 ##
 ## Process Check
 ##
 vrrp_script check_haproxy {
     script   "pkill -0 -x haproxy"    ## HAProxyのプロセスtrack設定
     interval 1                        ## 1秒毎に確認
     fall     5                        ## 5回プロセス確認が失敗したらVRRP切替
     raise    10                       ## 10回プロセス確認が成功したらVRRP切戻
 }
 
 ##
 ## eth0
 ##
 vrrp_instance eth0-ipv4 {
     # nopreempt                       ## 自動切戻(preempt)の有効化
     vrrp_version      2               ## VRRPv2を利用する
     state             BACKUP          ## 常時バックアップにする事でプライオリティを優先化
     interface         eth0            ## VRRPv2を出力するNIC
     virtual_router_id 10              ## VRIDを設定
     garp_master_delay 5               ## 自サーバがMasterになった後、GARP再送までの待ち時間
     advert_int        1               ## VRRPパケット送信間隔。単位は秒
     priority          2               ## VRRPプライオリティ
     unicast_src_ip    10.0.0.2        ## VRRPを送信する、送信元IPアドレス
     unicast_peer {
         10.0.0.1                      ## ユニキャストVRRP送信先(他サーバ)
         10.0.0.2                      ## ユニキャストVRRP送信先(自サーバ)
     }
     authentication {
         auth_type PASS                ## VRRPに認証を追加
         auth_pass vrrp_pass           ## VRRPの認証パスワード。左記だと"vrrp_pass"がパスワード
     }
     virtual_ipaddress {
         10.0.0.254                    ## VRRP代表アドレス。所謂、仮想IPアドレス
     }
     track_script {
         check_haproxy                 ## trackスクリプトとして、HAProxyのプロセスチェックを指定
     }
 }
 
 ##
 ## eth1
 ##
 vrrp_instance eth1-ipv6 {
     # nopreempt                       ## 自動切戻(preempt)の有効化
     native_ipv6                       ## IPv6でVRRPパケットをやり取りする場合に設定
     vrrp_version      3               ## IPv6でVRRPを実行する為に、VRRPv3を指定
     state             BACKUP          ## 常時バックアップにする事でプライオリティを優先化
     interface         eth1            ## VRRPv3を出力するNIC
     virtual_router_id 80              ## VRIDを設定
     garp_master_delay 5               ## 自サーバがMasterになった後、GARP再送までの待ち時間
     advert_int        1               ## VRRPパケット送信間隔。単位は秒
     priority          2               ## VRRPプライオリティ
     unicast_src_ip    fe80::10:0:0:2  ## VRRPを送信する、送信元IPアドレス
     unicast_peer {
         fe80::10:0:0:1                ## ユニキャストVRRP送信先(他サーバ)
         fe80::10:0:0:2                ## ユニキャストVRRP送信先(自サーバ)
     }
     authentication {
         auth_type PASS                ## VRRPに認証を追加
         auth_pass vrrp_pass           ## VRRPの認証パスワード。左記だと"vrrp_pass"がパスワード
     }
     virtual_ipaddress {
         fe80::10:0:0:254              ## VRRP代表アドレス。所謂、仮想IPアドレス
     }
     track_script {
         check_haproxy                 ## trackスクリプトとして、HAProxyのプロセスチェックを指定
     }
 }
#endregion