由于公司ganglia的gmond leader角色需要更改区分,最近在一直在搞这个玩意,终于一切OK了,做个记录,遇到的一些问题以及解决方法share下
leader机器的更改很简单了,这里不做叙述。直接说下面的问题
更改leader后,新的角色下面的老数据丢失,显示开始时间为更改时间
举例说明:
比如之前有个redis队长名称,下面包含master和slave所有机器,没有区别开来,现在需要更改为redis_master和redis_slave,区分开来
问题来了,区分后,master和slave下的数据起始点为更改时间以及之后的数据,之前的老数据丢失了。。。。。
恢复数据
ganglia数据存储是以rrd文件形式存储的,rrd文件不能直接编辑查看,但是可以通过rrdtool工具查看,具体参考
rrdtool工具使用
http://oss.oetiker.ch/rrdtool/doc/rrdtool.en.html
rrd文件提取数据
http://wenku.baidu.com/link?url=Fm4fl5jyyGsG8ERXTk8S7HgCXCUpTB6iZBKqiFQl3ppFZiUdvA9kIFpv6tkmXjOhU2o9KI5h7zpNiqI_7u3qNHgAPfU4HtRvouTrvSnAyQ_
以boottime.rrd 文件为例
rrdtool dump boottime.rrd | less
<database>
<!-- 2014-12-20 22:51:30 PST / 1419144690 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:51:45 PST / 1419144705 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:52:00 PST / 1419144720 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:52:15 PST / 1419144735 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:52:30 PST / 1419144750 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:52:45 PST / 1419144765 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:53:00 PST / 1419144780 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:53:15 PST / 1419144795 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:53:30 PST / 1419144810 --> <row><v>1.4083982160e+09</v></row>
<!-- 2014-12-20 22:53:45 PST / 1419144825 --> <row><v>1.4083982160e+09</v></row>
2014-12-20 22:51:30 表示数据时间
1419144690 数据时间记录,使用date -d '1970-1-1 1419144690 sec utc'可以转换为正常时间格式,其实是和前面的时间一致的
1.4083982160e+09 这就是真正的数据值,科学计数法记录,如果为空则为NaN
接下来我们就开始整合数据
思路:
找出新的rrd文件中数据位NaN的行,取出时间点A
然后在老的rrd文件中取出时间点A的数据
将取出的数据写入新文件中
在将修改后的文件rrdtool restore为rrd文件,放在数据存取目录,ganglia便可以读取到了。
脚本如下,根据适当更改即可
#!/bin/sh
HOME=/home/xxx
DIR=/home/xxx/redis-master
DIR_O=/home/xxx/redis
for FN in `ls $DIR/$1/`
do
filename=`echo $FN | cut -d. -f1`
mkdir $HOME/$1rrdfile
grep NaN $DIR/$1/$filename.xml | grep '[0~9]' | awk '{for(i=1;i<NF;i++)printf $i" ";printf"\n"}' > $HOME/$1rrdfile/$filename.file
cat $HOME/$1rrdfile/$filename.file | while read i
do
DATA=`grep "$i" $DIR_O/$1/$filename.xml | awk '{print $NF}'`
for j in `echo $DATA`
do
sed -i 's@'"$i"' <row><v>NaN</v></row>@'"$i"' '"$j"'@g ' $DIR/$1/$filename.xml
done
echo
done
done
cd $DIR/$1
rm -rf $DIR/$1/*.rrd
for RF in `ls `
do
filename=`echo $RF | cut -d. -f1`
rrdtool restore $filename.xml $filename.rrd
done
rm -rf /var/lib/ganglia/rrds/redis-master/$1/*
cp $DIR/$1/*.rrd /var/lib/ganglia/rrds/redis-master/$1/
chown nobody.nobody /var/lib/ganglia/rrds/ -R
因为我改为leader大概1周后才开始找回之前的数据,所以涉及到数据的整合,如果修改leader时直接拷贝之前的rrd文件,那么就不会丢失数据了,拷贝花费的几分钟时间数据忽略不计