From 095d6d58281c208b30df93f0f34ada5f90c582c2 Mon Sep 17 00:00:00 2001 From: Philippe Caseiro Date: Mon, 14 May 2018 21:55:43 +0200 Subject: [PATCH 1/2] Fixing bad service name --- dicos/90_redis.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dicos/90_redis.xml b/dicos/90_redis.xml index 7b737da..03141a9 100644 --- a/dicos/90_redis.xml +++ b/dicos/90_redis.xml @@ -7,8 +7,9 @@ redis-server redisPort + redis-server - + rdClIP From f40cbe1e378a46a02636ad9bad9bcebfbac8abcf Mon Sep 17 00:00:00 2001 From: Philippe Caseiro Date: Mon, 14 May 2018 21:56:00 +0200 Subject: [PATCH 2/2] Adding a working init script !!! --- postservice/90-redis-init | 193 ++++++++++++++++++++++++++++++++++++++ postservice/91-redis-init | 29 ------ 2 files changed, 193 insertions(+), 29 deletions(-) create mode 100755 postservice/90-redis-init delete mode 100755 postservice/91-redis-init diff --git a/postservice/90-redis-init b/postservice/90-redis-init new file mode 100755 index 0000000..5418831 --- /dev/null +++ b/postservice/90-redis-init @@ -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 diff --git a/postservice/91-redis-init b/postservice/91-redis-init deleted file mode 100755 index d0ce85a..0000000 --- a/postservice/91-redis-init +++ /dev/null @@ -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