今回はホストの冗長化するのに使う keepalived のログを rsyslog と logrotate を使ってローテーションさせる方法について書く。
検証環境には CentOS7 を使った。
$ cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) $ uname -r 3.10.0-229.11.1.el7.x86_64
デフォルトの状態で keepalived を動かす
まずは keepalived と rsyslog をインストールしておく。
$ sudo yum -y install keepalived rsyslog
今回は keepalived を動かすこと自体が目的ではないので設定は最低限に留める。 以下の設定で enp0s8 インターフェースに仮想 IP アドレス (VIP) を付けることができる。 通常であればこれ以外にも LVS (IPVS) や HAProxy などの設定を行うことになる。
$ cat << EOF | sudo tee /etc/keepalived/keepalived.conf > /dev/null vrrp_instance VipInstance { state BACKUP interface enp0s8 virtual_router_id 51 priority 100 advert_int 1 garp_master_delay 5 nopreempt virtual_ipaddress { 192.168.33.100/24 dev enp0s8 } } EOF
VIP を付ける先の enp0s8 インターフェースはこんな状態。 現状では 192.168.33.10/24 が IP アドレスとして付与されている。
$ ip addr show enp0s8 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:8e:c3:94 brd ff:ff:ff:ff:ff:ff inet 192.168.33.10/24 brd 192.168.33.255 scope global enp0s8 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe8e:c394/64 scope link valid_lft forever preferred_lft forever
とりあえずはデフォルトの状態での挙動を確認しておこう。 keepalived のサービスを開始する。
$ sudo systemctl start keepalived
$ sudo systemctl enable keepalived
上手くいけば enp0s8 インターフェースに VIP の 192.168.33.100/24 が付与される。
$ ip addr show enp0s8 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:8e:c3:94 brd ff:ff:ff:ff:ff:ff inet 192.168.33.10/24 brd 192.168.33.255 scope global enp0s8 valid_lft forever preferred_lft forever inet 192.168.33.100/24 scope global secondary enp0s8 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe8e:c394/64 scope link valid_lft forever preferred_lft forever
そして、デフォルトでは keepalived のログが /var/log/messages に出力されている。
$ sudo cat /var/log/messages | tail Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Registering Kernel netlink command channel Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Opening file '/etc/keepalived/keepalived.conf'. Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Configuration is using : 5197 Bytes Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Using LinkWatch kernel netlink reflector... Aug 19 18:33:40 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Transition to MASTER STATE Aug 19 18:33:41 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Entering MASTER STATE Aug 19 18:33:41 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) setting protocol VIPs. Aug 19 18:33:41 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Sending gratuitous ARPs on enp0s8 for 192.168.33.100 Aug 19 18:33:41 localhost Keepalived_healthcheckers[13323]: Netlink reflector reports IP 192.168.33.100 added Aug 19 18:33:46 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Sending gratuitous ARPs on enp0s8 for 192.168.33.100
ログをローテーションさせる
ここからは keepalived のログをローテーションさせるための設定に入る。 まずは現状で /var/log/messages に書き込まれているログを別の場所に書き込むように変更したい。 そこで、デフォルトの状態では 'LOG_DAEMON' になっている keepalived のログファシリティを変更する。
$ cat /etc/sysconfig/keepalived # Options for keepalived. See `keepalived --help' output and keepalived(8) and # keepalived.conf(5) man pages for a list of all options. Here are the most # common ones : # # --vrrp -P Only run with VRRP subsystem. # --check -C Only run with Health-checker subsystem. # --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop. # --dont-release-ipvs -I Dont remove IPVS topology on daemon stop. # --dump-conf -d Dump the configuration data. # --log-detail -D Detailed log messages. # --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON) # KEEPALIVED_OPTIONS="-D"
設定ファイルに書かれている通りに 'KEEPALIVED_OPTIONS' の設定に -S オプションを追加する ここではパラメータに 7 を指定することで、ファシリティを local7 に変更しておく。 これは、他で使っていないものであれば何を使っても構わない構わない。
$ sudo sed -i.back -e 's:^KEEPALIVED_OPTIONS="-D"$:KEEPALIVED_OPTIONS="-D -S 7":' /etc/sysconfig/keepalived $ cat /etc/sysconfig/keepalived | grep KEEPALIVED_OPTIONS KEEPALIVED_OPTIONS="-D -S 7"
次に syslog を受信する rsyslog 側の設定でファシリティ local7 のものは全て /var/log/keepalived/keepalived.log に記録するようにしておく。
$ cat << EOF | sudo tee /etc/rsyslog.d/keepalived.conf > /dev/null local7.* /var/log/keepalived/keepalived.log EOF
あとは上記のログをローテーションするように logrotate の設定も入れておく。
$ cat << EOF | sudo tee /etc/logrotate.d/keepalived > /dev/null /var/log/keepalived/keepalived.log { dateext hourly missingok rotate 3 notifempty nocompress sharedscripts delaycompress postrotate /bin/kill -HUP \`cat /var/run/syslogd.pid 2> /dev/null\` 2> /dev/null || true /bin/kill -HUP \`cat /var/run/rsyslogd.pid 2> /dev/null\` 2> /dev/null || true endscript } EOF
準備ができたら rsyslog と keepalived を再起動する。
$ sudo systemctl restart rsyslog $ sudo systemctl restart keepalived
これで keepalived のログが /var/log/keepalived/keepalived.log に記録されるようになる。
$ sudo cat /var/log/keepalived/keepalived.log | tail Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: Opening file '/etc/keepalived/keepalived.conf'. Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: Configuration is using : 59637 Bytes Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: Using LinkWatch kernel netlink reflector... Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Entering BACKUP STATE Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)] Aug 19 18:44:06 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Transition to MASTER STATE Aug 19 18:44:07 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Entering MASTER STATE Aug 19 18:44:07 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) setting protocol VIPs. Aug 19 18:44:07 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Sending gratuitous ARPs on enp0s8 for 192.168.33.100 Aug 19 18:44:07 localhost Keepalived_healthcheckers[13360]: Netlink reflector reports IP 192.168.33.100 added
ローテーションに関しても動作も確認しておこう。 強制的にローテーションさせるために logrotate コマンドを実行する。
$ sudo logrotate -fv /etc/logrotate.d/keepalived reading config file /etc/logrotate.d/keepalived Handling 1 logs rotating pattern: /var/log/keepalived/keepalived.log forced from command line (3 rotations) empty log files are not rotated, old logs are removed considering log /var/log/keepalived/keepalived.log log needs rotating rotating log /var/log/keepalived/keepalived.log, log->rotateCount is 3 dateext suffix '-2015081918' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' glob finding old rotated logs failed renaming /var/log/keepalived/keepalived.log to /var/log/keepalived/keepalived.log-2015081918 running postrotate script
ディレクトリを確認すると、これまでのログがリネームされていることがわかる。
$ sudo ls /var/log/keepalived/
keepalived.log-2015081918
元の名前のファイルがないのはまだ新しいログが出力されていないためなので、keepalived のサービスを再起動したりすればできる。
$ sudo systemctl restart keepalived $ sudo ls /var/log/keepalived/ keepalived.log keepalived.log-2015081918
いじょう。
まとめ
今回は keepalived のログを syslog で飛ばして、それを rsyslog と logrotate でローテーションさせる方法について扱った。 ホストを運用する上でログの管理は重要なので、ローテーションの設定は必ず入れておきたい。