summaryrefslogtreecommitdiffstats
path: root/scripts/maintain/gluster/gluster.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/maintain/gluster/gluster.sh')
-rwxr-xr-xscripts/maintain/gluster/gluster.sh177
1 files changed, 177 insertions, 0 deletions
diff --git a/scripts/maintain/gluster/gluster.sh b/scripts/maintain/gluster/gluster.sh
new file mode 100755
index 0000000..a3ff186
--- /dev/null
+++ b/scripts/maintain/gluster/gluster.sh
@@ -0,0 +1,177 @@
+#! /bin/bash
+
+. opts.sh
+
+[ $? -ne 0 -o -z "$gpod" ] && { echo "No storage pods are running..." ; exit 1 ; }
+[ -z "$1" ] && { echo "Usage: $0 <info|heal|migrate> <vol|all> [src] [dst]" ; exit 1 ; }
+action=$1
+shift
+
+
+function info {
+ vol=$1
+
+ status=$(gluster volume info "$vol" | grep -P 'Status' | awk '{ print $2 }' | tr -d '\r\n')
+ bricks=$(gluster volume info "$vol" | grep -P 'Number of Bricks' | awk '{ print $NF }' | tr -d '\r\n')
+ avail=$(gluster volume status "$vol" detail | grep Brick | wc -l)
+ online=$(gluster volume status "$vol" detail | grep Online | grep Y | wc -l)
+
+ echo "Volume $vol: $status (Bricks: $bricks, Available: $avail, Online: $online)"
+}
+
+function heal {
+ vol=$1
+
+ distributed=0
+ gluster volume info "$vol" | grep "Type:" | grep -i "Distribute" &> /dev/null
+ [ $? -eq 0 ] && distributed=1
+
+ echo "Healing volume $vol"
+ echo "-------------------"
+ gluster volume heal "$vol" full
+ gluster volume heal "$vol" info
+
+ if [ $distributed -eq 1 ]; then
+ echo "Rebalancing distributed volume $vol"
+ gluster volume rebalance "$vol" fix-layout start
+ fi
+
+
+ gluster volume status "$vol"
+}
+
+function migrate {
+ vol=$1
+ src=$2
+ dst=$3
+
+ [ -z "$src" -o -z "$dst" ] && { echo "Source and destination servers are required" ; exit 1 ; }
+
+ src_brick=$(gluster volume info $vol | grep -P '^Brick\d+:' | awk '{ print $2 }' | grep -P "^$src" | tr -d '\r\n' )
+ dst_brick=${src_brick/$src/$dst}
+
+ [ -z "$src_brick" -o -z "$dst_brick" ] && return 0
+
+ echo "Volume $vol: migrating failed brick"
+ echo " from $src_brick"
+ echo " to $dst_brick"
+ echo "Press enter to continue"
+ read
+ [ $? -ne 0 ] && exit
+
+ gluster volume replace-brick $vol "$src_brick" "$dst_brick" commit force
+ heal $vol
+}
+
+
+function transport {
+ vol=$1
+ transport=${2:-tcp,rdma}
+ echo "Changing $vol to transport $transport"
+ gluster volume stop "$vol"
+ gluster volume set "$vol" config.transport "$transport"
+ gluster volume start "$vol"
+}
+
+
+
+function restart {
+ vol=$1
+
+ echo $vol
+ bricks=$(gluster volume info "$vol" | grep -P 'Number of Bricks' | awk '{ print $NF }' | tr -d '\r\n')
+ online=$(gluster volume status "$vol" detail | grep Online | grep Y | wc -l)
+
+ if [ "$bricks" -ne "$online" ]; then
+ echo "Restarting $vol ($online bricks of $bricks are/is online)"
+ gluster --mode=script volume stop "$vol"
+ gluster --mode=script volume start "$vol"
+ fi
+}
+
+function delete_failed {
+ vol=$1
+
+ bricks=$(gluster volume info "$vol" | grep -P 'Number of Bricks' | awk '{ print $NF }' | tr -d '\r\n')
+ online=$(gluster volume status "$vol" detail | grep Online | grep Y | wc -l)
+
+ if [ "$online" == "0" ]; then
+ echo "Deleting $vol ($online bricks of $bricks are/is online)"
+# gluster --mode=script volume stop "$vol"
+ gluster --mode=script volume delete "$vol"
+ fi
+}
+
+
+function lvm_clean {
+ used_bricks=`gluster volume info | grep "/brick_" | sed -r -e 's/.*brick_(.*)\/brick/\1/'`
+
+ for ip in $(seq 1 3); do
+ echo "Node $ip"
+ echo "========"
+ lvm_bricks=`node $ip lvscan | grep brick | sed -r -e 's/.*brick_([0-9a-z]*)[^0-9a-z].*/\1/'`
+
+ diff=$(echo $used_bricks $lvm_bricks | tr -d '\r' | tr ' ' '\n' | sort | uniq -u)
+ remove=$(echo "$diff $lvm_bricks" | tr -d '\r' | tr ' ' '\n' | sort | uniq -d)
+
+ for id in $remove; do
+ echo "Removing ---------------------------------------------"
+ node $ip lvs -o name,time,size -S "'name =~ $id'"
+ echo "Removing ---------------------------------------------"
+ node $ip lvremove -y -S "'name =~ $id'"
+ done
+ done
+
+
+}
+
+function lvm_remove_today {
+ for ip in $(seq 1 3); do
+ node $ip hostname
+#lvdisplay -o name,time -S 'time since "2018-03-16"'
+ done
+}
+
+
+function heketi_cmd {
+ heketi "$@"
+}
+
+function heketi_clean {
+ heketi_vols=`heketi topology info | grep "Name: vol_" | sed -r -e 's/.*(vol_[0-9a-z]+)\s*$/\1/'`
+ gluster_vols=`gluster volume info | grep "Name: vol_" | sed -r -e 's/.*(vol_[0-9a-z]+)\s*$/\1/'`
+ echo $heketi_vols
+
+ diff=$(echo $gluster_vols $heketi_vols | tr -d '\r' | tr ' ' '\n' | sort | uniq -u)
+ remove=$(echo "$diff $gluster_vols" | tr -d '\r' | tr ' ' '\n' | sort | uniq -d)
+
+ for vol in $remove; do
+ echo "Stopping and deleting volume $vol"
+ echo "---------------------------------"
+ gluster --mode=script volume stop "$vol"
+ gluster --mode=script volume delete "$vol"
+ done
+}
+
+if [[ "$action" =~ ^heketi ]]; then
+ eval "$action" "$@"
+elif [[ "$action" =~ ^lvm ]]; then
+ eval "$action" "$@"
+elif [[ -z "$1" || "$1" =~ ^all ]]; then
+ all=0
+ [ "$1" == "all_heketi" ] && all=1
+ [[ "$1" =~ ^all ]] && shift
+
+ vols=$(gluster volume info | grep -P '^Volume Name' | awk '{ print $NF }' | tr '\r\n' ' ')
+ for vol in $vols; do
+ if [ $all -eq 0 ]; then
+ [[ "$vol" =~ [0-9] ]] && continue
+ [[ "$vol" =~ ^vol_ ]] && continue
+ [[ "$vol" =~ ^heketi ]] && continue
+ fi
+
+ eval "$action" "$vol" "$@"
+ done
+else
+ eval "$action" "$@"
+fi