#author("2017-07-23T22:28:17+09:00","default:nowsky","nowsky")
*Raspbian [#e88dd0e7]
-[[Raspbian:+https://www.raspberrypi.org/downloads/raspbian/]]
#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]]

Raspberry Pi用としてメンテナンスされているDebian系ディストリビューションの一つ。
Debian系なのでAPT(apt-get)を利用してパッケージをインストールする事が出来る。
初期設定を簡素化する為にRaspbian特有のシェルスクリプトが準備されており、
Linux初心者でも楽に最低限のOS設定をする事が出来るようになっている。
LinuxでVRRPを喋る時に利用するプログラム。
非常に細かい制御が可能で、特定プロセスのトラッキング、ユニキャストVRRPも実装出来る。
また、VRRPv3に対応しているので、実行プロトコルを変更すればIPv6でVRRPも可能。
 
単独で利用する事は少なく、ロードバランサー(HAProxy、UltraMonkey)と組み合わせたり、
リバースプロキシ自体の冗長化として使う場合が多い。

~
*イメージバックアップ [#idb40e4e]
Raspberry PiではSDカードにOSをインストールする事を前提としている為、
ddコマンドによるイメージバックアップ・リストアが簡単に実行できるが、
小さい容量のSDカードへリストアすると、SDカード容量不足でddが欠落してしまう。
*インストール [#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
 
よって、Raspberry Pi(Raspbian)では専用のOSコピー(バックアップ)コマンドが用意されており、
こちらを利用する方が正確にコピーを取得する事が出来る。
また、面倒な場合はパッケージ管理で導入する事も可能。
 # yum install keepalived

~
*設定 [#r3f75d67]
今回は下記構成例を作成する。
前述した通り、中身はVRRPなので詳細はVRRPのRFCを見れば大体わかる。
今回は敢えてNICを分割し、それぞれでVRRPv2とVRRPv3を喋る構成だが、
デュアルスタックなどの場合はVRRPv3で設定を一纏めにする事も可能。
 
#region(&color(#ff0000){rpi-clone};)
-&font(b){参考サイト};
[[billw2/rpi-clone:+https://github.com/billw2/rpi-clone]]
[[Raspberry PiでIoTなシステム開発:+http://www.homu.net/raspberry-pi%E3%81%A7iot%E3%81%AA%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%EF%BC%9Asd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AFrpi/]]
・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 |
 
-&font(b){コマンド実行};
バックアップ取得前に、コピー先SDカードをRaspberry Piに接続しておく。
今回はSDカードが、&color(#ff0000){"/dev/sda"};に接続されているとする。
 # git clone https://github.com/billw2/rpi-clone
 # ./rpi-clone sda -f
 ---
 Do you want to initialize the destination disk /dev/sda? (yes/no): "yes"
 You may enter a label for the destination rootfs /dev/sda2: [Enter]
 Final check, is it Ok to proceed with the clone (yes/no)?: "yes"
 Starting the filesystem rsync to sda
 (This may take several minutes)...
 ---
 Hit Enter when ready to unmount the /dev/sda partitions... [Enter]
 unmounting /mnt/clone/boot
 unmounting /mnt/clone
・オプション定義
+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           ## メール送信しないのでコメント
     }
 }
 
 ##
 ## 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           ## メール送信しないのでコメント
     }
 }
 
 ##
 ## 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