redis集羣搭建腳本
> 注意點1: centos7.x的系統,低版本沒有嘗試,失敗一般發生在編譯redis源碼的時候缺少依賴
> 注意點2: IPADDRS的服務器間通信必須正常,防火牆關閉或開放對應集羣端口
> 注意點3: !!!!!! 必須在IPADDRS中的某一臺服務器上用root賬號執行此腳本 !!!!!!
執行時必須在此節點執行的命令: yum install sshpass -y
安裝完成後不使用此腳本可以remove掉sshpass,自己決定
> 注意點4: EXEPATH指定的目錄下不建議存在redis開頭的任何文件夾,不然此腳本會影響你的
文件,刪除集羣時可能造成誤刪除.
> 注意點5: IPADDRS和PASSWORD的順序必須一一對應,FIRSTPORT是每臺服務器的起始端口號
安裝幾個實例取決於NODES參數,端口號以此遞增
eg:NODES=3時 端口是6379 6380 6381
> 注意點6: 運行start時,redis集羣創建存在交互,需要輸入yes完成節點載入集羣
使用方法
腳本.sh install
腳本.sh make
腳本.sh start
腳本.sh stop
腳本.sh delete
腳本.sh service
#!/bin/bash
FIRSTPORT=6379
TIMEOUT=2000
NODES=2
REPLICAS=1
IPADDRS=(192.168.37.10 192.168.37.11 192.168.37.12)
PASSWORD=(10pwd 11pwd 12pwd)
EXEPATH=/opt
if [ -a config.sh ]
then
source "config.sh"
fi
if [ "$1" == "install" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
echo -e "\033[43;31m install $IPADDR Start \033[0m"
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "yum install gcc-c++ tcl libstdc++-devel wget -y"
echo -e "\033[43;31m install $IPADDR End \033[0m"
done
exit 0
fi
if [ "$1" == "make" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
echo -e "\033[43;31m download $IPADDR Start \033[0m"
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "cd $EXEPATH && wget http://download.redis.io/releases/redis-5.0.5.tar.gz && tar -zxf $EXEPATH/redis-5.0.5.tar.gz && rm -rf $EXEPATH/redis-5.0.5.tar.gz && cd $EXEPATH/redis-5.0.5 && make MALLOC=libc "
echo -e "\033[43;31m download $IPADDR End \033[0m"
for(( i=0;i<$NODES;i++)); do
PORT=$((FIRSTPORT+i))
echo -e "\033[43;31m make $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "cd $EXEPATH/redis-5.0.5 && make install PREFIX=$EXEPATH/redis_$PORT && mkdir $EXEPATH/redis_$PORT/etc && mkdir $EXEPATH/redis_$PORT/pid && mkdir $EXEPATH/redis_$PORT/logs && mkdir $EXEPATH/redis_$PORT/data && cp $EXEPATH/redis-5.0.5/redis.conf $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '69c bind 0.0.0.0' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '88c protected-mode no' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '92c port $PORT' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '136c daemonize yes' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '158c pidfile $EXEPATH/redis_$PORT/pid/redis_$PORT.pid' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '171c logfile $EXEPATH/redis_$PORT/logs/redis.log' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '263c dir $EXEPATH/redis_$PORT/data' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '832c cluster-enabled yes' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '840c cluster-config-file $EXEPATH/redis_$PORT/etc/nodes_$PORT.conf' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '846c cluster-node-timeout $TIMEOUT' $EXEPATH/redis_$PORT/etc/redis.conf "
echo -e "\033[43;31m make $IPADDR:$PORT End \033[0m"
done;
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "rm -rf $EXEPATH/redis-5.0.5"
done
exit 0
fi
if [ "$1" == "start" ]
then
HOSTS=""
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
for(( i=0;i<$NODES;i++)); do
PORT=$((FIRSTPORT+i))
HOSTS="$HOSTS $IPADDR:$PORT"
echo -e "\033[43;31m Starting $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "$EXEPATH/redis_$PORT/bin/redis-server $EXEPATH/redis_$PORT/etc/redis.conf"
echo -e "\033[43;31m Starting $IPADDR:$PORT End \033[0m"
done;
done
echo -e "\033[43;31m create cluster: $HOSTS \033[0m"
$EXEPATH/redis_$FIRSTPORT/bin/redis-cli --cluster create $HOSTS --cluster-replicas $REPLICAS
exit 0
fi
if [ "$1" == "stop" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
for((i=($NODES-1);i>=0;i--)); do
PORT=$((FIRSTPORT+i))
echo -e "\033[43;31m Stopping $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "$EXEPATH/redis_$PORT/bin/redis-cli -h $IPADDR -p $PORT shutdown nosave"
echo -e "\033[43;31m Stopping $IPADDR:$PORT End \033[0m"
done;
done
exit 0
fi
if [ "$1" == "delete" ];then
read -p "你確定要刪除整個集羣麼?刪除前請先stop,該操作會刪除所有數據,輸入[yes/no]?" input
echo $input
if [ $input = "yes" ];then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
echo -e "\033[43;31m Delete $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "rm -rf redis-5.0.5.tar.gz && rm -rf redis-5.0.5 && rm -rf $EXEPATH/redis_*"
echo -e "\033[43;31m Delete $IPADDR:$PORT End \033[0m"
done
fi
exit 0
fi
if [ "$1" == "service" ];then
read -p "設置成服務會重啓新系統,我也不建議你註冊成服務,確定要操作麼,輸入[yes/no]?" input
echo $input
if [ $input = "yes" ];then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
for((i=($NODES-1);i>=0;i--)); do
PORT=$((FIRSTPORT+i))
echo -e "\033[43;31m service $IPADDR:$PORT Start \033[0m"
echo -e "\033[43;31m service $IPADDR:$PORT End \033[0m"
done;
echo -e "\033[43;31m systemctl $IPADDR Start \033[0m"
echo -e "\033[43;31m systemctl $IPADDR End \033[0m"
done
fi
exit 0
fi
echo "Usage: $0 [install|make|start|stop|delete|server]"
echo "install -- step1:yum安裝redis-5.0.5集羣所需要的環境,最好配置阿里的yum源"
echo "make -- step2:編譯redis源碼並初始化redis集羣實例和配置"
echo "start -- step3:運行集羣所有節點並構建成集羣,注意要關閉防火牆或開放對應的端口"
echo "stop -- step4:停止集羣所有節點"
echo "delete -- step5:刪除整個集羣所有數據(刪除的是配置的個目錄下所有以redis_開頭的文件夾和源碼包),刪除前請先stop,謹慎操作!"