分析脚本开发逻辑思路
- 基于redis的命令行方式加入各个节点到集群
- 分3个步骤
- 通过cluster meet 识别各个节点
- 通过cluster replicate 遍历节点uuid,设置为从节点
- 通过cluster addslots 主节点添加slots槽位
- 脚本中需用到declare 存入变量到变量,以及ip_var调用变量的变量
- 在k8s环境中需通过内部域名解析到各个节点的ip地址去做集群初始化操作
- 通过dig +short ${PODNAME}-$i.${SVCNAME}.${NAMESPACE}.svc.cluster.local 得到节点的ip地址,需要引入k8s的当前环境的变量PODNAME,SVCNAME,NAMESPACE去对内部域名进行拼接
根据手动添加节点的命令,提取关键操作,实现脚本化自动初始化
执行cluster meet 100.96.2.183 51002 cluster meet 100.96.2.184 51002 cluster meet 100.96.2.185 51002 cluster meet 100.96.2.187 51002 cluster meet 100.96.2.188 51002 master 分配 slot ./redis-cli -h 100.96.2.182 -p 51002 cluster addslots {0..5461} ./redis-cli -h 100.96.2.183 -p 51002 cluster addslots {5462..10922} ./redis-cli -h 100.96.2.184 -p 51002 cluster addslots {10923..16383} 配置从节点md5值 登陆到服务器,执行 ./redis-cli -h 100.96.2.185 -p 51002 cluster replicate bc27a7068e55370aad426574443353a4dbe61118 ./redis-cli -h 100.96.2.187 -p 51002 cluster replicate 20a784320dee978822b13c41d0e6abccbb51407b ./redis-cli -h 100.96.2.188 -p 51002 cluster replicate a977cbba702bebce993ce6c940dae1fabb383a34 |
最终脚本
#!/bin/bash set -ue sleep 10 PORT=51002 #PODNAME=$1 SIZE=3 #PASSWORD=$2 #NAMESPACE=$3 #SVCNAME=$4 slot_num=$((16384 / ${SIZE})) for (( i = 0; i < 6; i++)); do declare "ip$i"=”$(dig +short ${PODNAME}-$i.${SVCNAME}.${NAMESPACE}.svc.cluster.local)“ done for (( i = 0; i < 6; i++ )); do ip_var="ip$i" ./redis-cli -h ${ip0} -p ${PORT} -a ${PASSWORD} cluster meet ${!ip_var} ${PORT} done echo "cluster meet done......" sleep 10 ./redis-cli -h ${ip0} -p ${PORT} -a ${PASSWORD} cluster nodes for (( i = 0; i < 3; i++ )); do uuid[i]=$(./redis-cli -h ${ip0} -p ${PORT} -a ${PASSWORD} cluster nodes | grep "ip$i" | awk '{print $1}') done for (( i = 3; i < 6; i++ )); do ./redis-cli -h "ip$i" -p ${PORT} -a ${PASSWORD} cluster replicate "${uuid[$((i-3))]}" done ./redis-cli -h ${ip0} -p ${PORT} -a ${PASSWORD} cluster addslots {0..5461} ./redis-cli -h ${ip1} -p ${PORT} -a ${PASSWORD} cluster addslots {5462..10922} ./redis-cli -h ${ip2} -p ${PORT} -a ${PASSWORD} cluster addslots {10923..16383} echo "cluster build done.." sleep 5 ./redis-cli -h ${IP}.10 -p ${PORT} -a ${PASSWORD} cluster nodes |