Glusterfs虽然是一个很好的分布式文件系统,但几乎没有办法监视它的完整性。 服务器可以来来去去,砖块可能会陈旧或者失败,我恐怕知道这个可能太晚了。
最近我们有一个奇怪的失败,当一切都显现出来的时候,却有一块砖块掉了下来(纯粹是巧合)。
有一个简单可靠的方法(cron脚本?),让我知道我的GlusterFS 3.2卷的健康状况?
这已经是GlusterFS开发者一段时间的要求了,而且现在没有什么可以使用的开箱即用的解决scheme。 但是,用几个脚本不是不可能的。
几乎所有的Gluster系统都是由一个gluster命令进行pipe理的,只有几个选项,您可以编写自己的健康监控脚本。 在这里查看砖和卷的列表信息 – http://gluster.org/community/documentation/index.php/Gluster_3.2:_Displaying_Volume_Information
要监控性能,请看这个链接 – http://gluster.org/community/documentation/index.php/Gluster_3.2:_Monitoring_your_GlusterFS_Workload
更新:请考虑升级到http://gluster.org/community/documentation/index.php/About_GlusterFS_3.3
由于他们似乎有更多的错误修复并得到很好的支持,所以在最新发布版本上总是比较好。 当然,运行你自己的testing之前,移动到一个新的版本 – http://vbellur.wordpress.com/2012/05/31/upgrading-to-glusterfs-3-3/ 🙂
在第10章中有一个pipe理员指南,具体介绍如何监控你的GlusterFS 3.3的安装 – http://www.gluster.org/wp-content/uploads/2012/05/Gluster_File_System-3.3.0-Administration_Guide-en-US .PDF
在这里看到另一个nagios脚本 – http://code.google.com/p/glusterfs-status/
有一个可用于监视的nagios插件 。 尽pipe你可能需要为你的版本进行编辑。
我可以像下面提到的那样configurationglusterfs的nagios监视:
http://gopukrish.wordpress.com/2014/11/16/monitor-glusterfs-using-nagios-plugin/
请查看附件脚本https://www.gluster.org/pipermail/gluster-users/2012-June/010709.html获取gluster 3.3; 它可能很容易适应gluster 3.2。
#!/bin/bash # This Nagios script was written against version 3.3 of Gluster. Older # versions will most likely not work at all with this monitoring script. # # Gluster currently requires elevated permissions to do anything. In order to # accommodate this, you need to allow your Nagios user some additional # permissions via sudo. The line you want to add will look something like the # following in /etc/sudoers (or something equivalent): # # Defaults:nagios !requiretty # nagios ALL=(root) NOPASSWD:/usr/sbin/gluster peer status,/usr/sbin/gluster volume list,/usr/sbin/gluster volume heal [[\:graph\:]]* info # # That should give us all the access we need to check the status of any # currently defined peers and volumes. # define some variables ME=$(basename -- $0) SUDO="/usr/bin/sudo" PIDOF="/sbin/pidof" GLUSTER="/usr/sbin/gluster" PEERSTATUS="peer status" VOLLIST="volume list" VOLHEAL1="volume heal" VOLHEAL2="info" peererror= volerror= # check for commands for cmd in $SUDO $PIDOF $GLUSTER; do if [ ! -x "$cmd" ]; then echo "$ME UNKNOWN - $cmd not found" exit 3 fi done # check for glusterd (management daemon) if ! $PIDOF glusterd &>/dev/null; then echo "$ME CRITICAL - glusterd management daemon not running" exit 2 fi # check for glusterfsd (brick daemon) if ! $PIDOF glusterfsd &>/dev/null; then echo "$ME CRITICAL - glusterfsd brick daemon not running" exit 2 fi # get peer status peerstatus="peers: " for peer in $(sudo $GLUSTER $PEERSTATUS | grep '^Hostname: ' | awk '{print $2}'); do state= state=$(sudo $GLUSTER $PEERSTATUS | grep -A 2 "^Hostname: $peer$" | grep '^State: ' | sed -nre 's/.* \(([[:graph:]]+)\)$/\1/p') if [ "$state" != "Connected" ]; then peererror=1 fi peerstatus+="$peer/$state " done # get volume status volstatus="volumes: " for vol in $(sudo $GLUSTER $VOLLIST); do thisvolerror=0 entries= for entries in $(sudo $GLUSTER $VOLHEAL1 $vol $VOLHEAL2 | grep '^Number of entries: ' | awk '{print $4}'); do if [ "$entries" -gt 0 ]; then volerror=1 let $((thisvolerror+=entries)) fi done volstatus+="$vol/$thisvolerror unsynchronized entries " done # drop extra space peerstatus=${peerstatus:0:${#peerstatus}-1} volstatus=${volstatus:0:${#volstatus}-1} # set status according to whether any errors occurred if [ "$peererror" ] || [ "$volerror" ]; then status="CRITICAL" else status="OK" fi # actual Nagios output echo "$ME $status $peerstatus $volstatus" # exit with appropriate value if [ "$peererror" ] || [ "$volerror" ]; then exit 2 else exit 0 fi
@Arie Skliarouk,你的check_gluster.sh在最后一行有一个错字,你grep exitst而不是exist 。 我继续前进,把它改写得更紧凑一点,并删除临时文件的要求。
#!/bin/bash # Ensure that all peers are connected gluster peer status | grep -q Disconnected && echo "Peer disconnected." && exit 1 # Ensure that all bricks have a running log file (ie, are sending/receiving) for vol in $(gluster volume list); do for brick in $(gluster volume info "$vol" | awk '/^Brick[0-9]*:/ {print $2}'); do gluster volume log locate "$vol" "$brick"; done; done | grep -qE "does not (exist|exitst)" && echo "Log file missing - $vol/$brick ." && exit 1