Adding a working init script !!!

This commit is contained in:
Philippe Caseiro 2018-05-14 21:56:00 +02:00
parent 095d6d5828
commit f40cbe1e37
2 changed files with 193 additions and 29 deletions

193
postservice/90-redis-init Executable file
View File

@ -0,0 +1,193 @@
#!/bin/bash
#
# Cluster init !
#
#function ProgressBar {
# # Process data
# let _progress=(${1}*100/${2}*100)/100
# let _done=(${_progress}*4)/10
# let _left=40-$_done
# # Build progressbar string lengths
# _fill=$(printf "%${_done}s")
# _empty=$(printf "%${_left}s")
#
# # 1.2 Build progressbar strings and print the ProgressBar line
# # 1.2.1 Output example:
# # 1.2.1.1 Progress : [########################################] 100%
# printf "\rProgress : [${_fill// /#}${_empty// /-}] ${_progress}%%"
#}
function redisRun()
{
cmd="redis-cli"
host=$1
shift
port=$1
shift
#pass=$1
#shift
#opt="-h ${host} -p ${port} -a ${pass}"
opt="-h ${host} -p ${port}"
act=${@}
${cmd} ${opt} ${act}
return ${?}
}
#
# Get Node ID with IP Adress and Port Number
# Params :
# - $1 => Leader IP
# - $2 => Leader Port
# - $3 => Cluster Password
# - $4 => Node IP Adress
# - $5 => Node Port
#
function getNodeID()
{
if [[ ${1} == ${3} ]]
then
searchCmd="awk '/myself,master/ { print \$1 }'"
else
searchCmd="awk '/${3}:${4}@/ { print \$1 }'"
fi
redisRun $1 $2 cluster nodes | eval ${searchCmd}
return ${?}
}
function redisClusterForgetAll()
{
local res=0
for node in $(redisRun ${1} ${2} ${3} cluster nodes | awk '!/myself,master/ {print $1}')
do
redisRun ${1} ${2} ${3} "cluster forget ${node}"
res=$((res+${?}))
done
return ${res}
}
#
# Assing redis slots to master Node
# Params :
# - $1 => Node IP
# - $2 => Node Port
# - $3 => Cluster Password
# - $4 => First slot
# - $5 => Last slot
#
function redisSlotAssign()
{
res=0
for slot in $(seq ${3} ${4})
do
OUT=$(redisRun ${1} ${2} "cluster ADDSLOTS $slot")
res=$((res+${?}))
if [[ ${OUT} =~ ERR ]]
then
OUT=$(redisRun ${1} ${2} "cluster ADDSLOTS $slot")
fi
done
return ${res}
}
function redisAddReplica()
{
redisRun ${1} ${2} "cluster replicate ${3}"
return ${?}
}
CONF="/etc/redis/cluster.conf"
#CONF=/tmp/cluster.conf
[[ ! -e ${CONF} ]] && exit 0
declare -A IPADDRS
declare -A PORTS
declare -A ROLES
declare -A MASTERS
declare -A NIDS
index=0
while read line
do
line=${line//::/:none:}
li=(${line//:/ })
name=${li[0]}
ip=${li[1]}
port=${li[2]}
role=${li[3]}
master=${li[4]}
NAMES+=(${name})
IPADDRS+=([${name}]=${ip})
PORTS+=([${name}]=${port})
ROLES+=([${name}]=${role})
MASTERS+=([${name}]=${master})
done < ${CONF}
if [[ ${1} == "forget" ]]
then
redisClusterForgetAll ${IPADDRS["Leader"]} ${PORTS["Leader"]}
exit ${?}
fi
echo " * Organise Cluster Meeting."
for node in ${NAMES[@]}
do
act="cluster meet ${IPADDRS[${node}]} ${PORTS[${node}]}"
echo " - ${node} - ${IPADDRS[${node}]}:${PORTS[${node}]} meeting with :"
for oth in ${NAMES[@]}
do
[[ ${oth} == ${node} ]] && continue
echo -en " -> ${oth} - ${IPADDRS[${oth}]} ${PORTS[${oth}]} "
redisRun ${IPADDRS[${oth}]} ${PORTS[${oth}]} "${act}"
done
done
nbMaster=$(grep -c ":master" ${CONF})
totalslots=16384
perNodeSlots=$((totalslots/nbMaster))
startSlot=0
echo " * Assign Slots to the nodes."
for node in ${NAMES[@]}
do
if [[ ${ROLES[$node]} == "master" ]]
then
if [[ ${startSlot} -eq 0 ]]
then
lastSlot=$(((perNodeSlots+startSlot)-1))
else
lastSlot=$((perNodeSlots+startSlot))
fi
[[ ${lastSlot} -ge ${totalslots} ]] && lastSlot=$((totalslots-1))
echo " - Slots ${startSlot} to ${lastSlot} => ${node} - ${IPADDRS[${node}]} ${PORTS[${node}]}"
redisSlotAssign ${IPADDRS[${node}]} ${PORTS[${node}]} ${startSlot} ${lastSlot}
startSlot=$((lastSlot+1))
fi
done
echo " * Configuring replication."
NIDS+=()
for node in ${NAMES[@]}
do
NIDS+=([${node}]=$(getNodeID ${IPADDRS["Leader"]} ${PORTS["Leader"]} ${IPADDRS[${node}]} ${PORTS[${node}]}))
done
for node in ${NAMES[@]}
do
[[ ${MASTERS[$node]} == "" ]] && continue
echo -ne " - Replicate ${MASTERS[${node}]} to ${node}"
redisAddReplica ${IPADDRS[${node}]} ${PORTS[${node}]} ${NIDS[${MASTERS[${node}]}]}
done
echo
echo "Cluster status :"
echo
redisRun ${IPADDRS["Leader"]} ${PORTS["Leader"]} cluster info
echo
exit 0

View File

@ -1,29 +0,0 @@
#!/bin/bash
#
# Cluster init !
#
redisTrib="/usr/share/doc/redis-tools/examples/redis-trib.rb"
CONF="/etc/redis/cluster.conf"
if [[ -f ${1} ]]
then
CONF=${1}
fi
if [[ -f "${CONF}" ]]
then
LEADER=$(awk -F ':' '/^leader/ {print $2 ":" $3}' ${CONF})
REPLICA=$(${redisTrib} check ${LEADER} | awk '/additional replica/ {print $1}')
if [[ ${REPLICA} -eq 0 ]]
then
# Create Cluster
yes yes | ${redisTrib} create --replicas 1 $(awk -F ':' '{printf "%s:%s ", $2, $3}' ${CONF})
fi
else
echo "${CONF} is missing"
exit 0
fi