Cactiサーバーのデータ移行

Cactiサーバーのデータ移行 Ubuntu 10.04 32bit(Cacti 0.8.7e) から CentOS 6.7 64bit(Cacti 0.8.8b) を行ったメモです。

## 移行方針

- 移行元サーバーと移行先サーバーでCactiを並行稼働させ、移行が完了したら移行元サーバーを停止する
- グラフはなるべく途切れないようにする

## 移行の手順

1. 移行先サーバーでApache, MySQL, SNMP, Cactiをインストールし、Cactiの管理画面から初期化を行う手前の状態にします

1. データを移行します(DB, rrd, 追加スクリプト, 追加リソース, 追加テンプレート）

1. 移行先のCactiの管理画面でアップグレードを選択して初期設定を進めます

1. 全てのグラフが更新できているか確認します

1. 全てのグラフが正常に更新されるようになったらもう一度rrdファイルを上書き移行します（一発成功の場合は不要）


## 移行対象

- 監視対象の定義
  - MySQLのcactiデータベースに格納されています
- グラフデータ
  - ファイルシステム上に*.rrdの形でグラフ毎にファイルが存在します
- 追加スクリプト
  - cacti/scripts配下
- 追加リソース
  - cacti/resource配下
- 追加テンプレート


### 監視対象定義の移行

MySQLのcactiデータベースを移行元でダンプし、移行先にリストアします。

```
# バックアップ
mysqldump -u root -p cacti > cacti.db

# scp等で移動

# リストア
mysql -u cacti -p cacti < cacti.db
```

### グラフデータのコンバートと移行

アーキテクチャの異なる環境への移行（今回のような32bitから64bitへの移行）の場合、移行元でrrdファイルをXML形式にダンプして移行先でリストアする必要があります。

ubuntuでは /var/lib/cacti/rra ディレクトリに格納されていたので、エクスポート用にコピーしてXML形式に一括変換します。

```
# rraディレクトリのある場所に移動 sudo find / -name *.rrd で探す
cd /var/lib/cacti/

# エクスポート用にコピー
cp -rp rra rra_export

# エクスポート用ディレクトリに移動
cd rra_export

# 変換用スクリプトを作成（下記参照）
vi dump.sh

# 進捗が見えるようにデバッグオプション -x を付けてスクリプトを実行
sh -x dump.sh
```

```dump.sh
# 変換元のファイルを削除するのでオリジナルのディレクトリで実行しないように注意
for i in *.rrd ;do
        rrdtool dump $i ${i%.rrd}.xml
        rm -f $i
done
```

xml形式に変換できたらscp等で移行先サーバーにコピーします。

```
# ホームディレクトリにコピーした場合
cd ~/rra_export

# 変換用スクリプトを作成（下記参照）
vi restore.sh

# 進捗が見えるようにデバッグオプション -x を付けてスクリプトを実行
sh -x restore.sh
```

```restore.sh
for i in *.xml ;do
        rrdtool restore $i ${i%.xml}.rrd
        rm -f $i
done
```

rrd形式に変換できたら移行先のCactiのrraディレクトリに上書きコピーします。

```
# リストアしたrrdファイルを上書きコピー
unalias cp    # 逐一上書き確認されないようにエイリアス cp -i を解除する
cp -p ~/rra_export/*.rrd /var/www/cacti/rra/
```

cactiユーザーでrrdファイルに書き込めないとグラフが更新されないのでrrdファイルのオーナーをセットし直します。

```
chown -R cacti.cacti /var/www/cacti/rra/
```

### 追加スクリプトの移行

cacti/scripts/ に追加したスクリプトがある場合は移行します。
僕は ws_apachestats.pl を追加していたのでこれを移行しました。


### 追加リソースの移行

cacti/resource/ に追加したリソースがある場合は移行します。
僕は SNMP Informant を追加していたので resource/snmp_queries/snmp_informant_* を移行しました。

### 追加テンプレートの移行

移行元のCactiでエクスポート（Console > Exports Templates）、移行先でインポート（Console > Import Templates）で移行します。
僕はSNMP Informantの元ファイルを持っていたのでそれをインポートしました。



## グラフが更新されないときのチェック事項

### 移行先サーバーからのSNMPアクセスが許可されているか？

移行先サーバーからsnmpwalkコマンドでレスポンスが得られるか確認します。
レスポンスが得られない場合はSNMPのアクセス許可、ファイアウォールの設定を見直します。

```
snmpwalk -v 1 -c public xxx.xxx.xxx.xxx
```

### poller.phpが動いているか？

/etc/cron.d/cactiの内容を確認します。

```/etc/cron.d/cacti
*/5 * * * *	cacti	php /var/www/cacti/poller.php &>/dev/null
```

### ポーリング中にエラーが出ていないか？

デバッグメッセージ付きでpoller.phpを実行してみます。
移行元にあったテンプレートが移行先で存在しない場合はここでエラーが確認できます。

```
su - cacti -c "php /var/www/cacti/poller.php --force --debug"
```

エラーの確認後にテンプレートを追加した場合は、Cactiの Console>Device から該当する監視対象の定義を開いて一度saveしないと更新されないようです。


### rrdファイルが更新されているか？

rrdファイルの日付がポーリングを実行した時刻に更新されているか確認します。
オーナーがcactiユーザーになっているか確認します。

```
ls -l /var/www/cacti/rra
```


## 参考サイト
[サーバー監視システム構築(RRDtool+Cacti)](https://centossrv.com/rrdtool-cacti.shtml)
[rrdtool の RRD はアーキテクチャが異なると使用できない](http://www.maruko2.com/mw/rrdtool_%E3%81%AE_RRD_%E3%81%AF%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%A8%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)