redis集羣搭建腳本(最簡單的搭建方式)

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完成節點載入集羣

使用方法

#1. 安裝依賴環境
腳本.sh install
#2. 目錄配置和編譯源碼
腳本.sh make
#3. 啓動集羣
腳本.sh start
#4. 停止集羣
腳本.sh stop
#5. 卸載集羣
腳本.sh delete
#6. 把集羣所有節點註冊成服務(不太建議使用,後期可能不方便)
腳本.sh service
#!/bin/bash

# 基本設置
#單臺服務器起始端口號 eg:如果NODES=2 則端口號爲6379,6380,爲3的話就多一個6381
FIRSTPORT=6379
#超時時間配置
TIMEOUT=2000
#單臺服務器實例數
NODES=2
#master的備份節點數
REPLICAS=1
#服務器ip集合
IPADDRS=(192.168.37.10 192.168.37.11 192.168.37.12)
#服務器密碼集合,與ip對應
PASSWORD=(10pwd 11pwd 12pwd)
#實例安裝根目錄
EXEPATH=/opt


if [ -a config.sh ]
then
    source "config.sh"
fi

#安裝redis集羣依賴環境
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

#編譯redis集羣
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"
				#sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "touch /usr/lib/systemd/system/redis_$PORT.service && echo '[Unit]' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'Description=Redis-Cluster' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'After=network.target' >> /usr/lib/systemd/system/redis_$PORT.service && echo '[Service]' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'Type=forking' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'PIDFile=$EXEPATH/redis_$PORT/pid/redis_$PORT.pid' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'ExecStart=$EXEPATH/redis_$PORT/bin/redis-server $EXEPATH/redis_$PORT/etc/redis.conf' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'ExecReload=/bin/kill -s HUP $MAINPID' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'ExecStop=/bin/kill -s QUIT $MAINPID' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'PrivateTmp=true' >> /usr/lib/systemd/system/redis_$PORT.service && echo '[Install]' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'WantedBy=multi-user.target' >> /usr/lib/systemd/system/redis_$PORT.service "
				echo -e "\033[43;31m service $IPADDR:$PORT End \033[0m"
			done;
			echo -e "\033[43;31m systemctl $IPADDR Start \033[0m"
			#sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "systemctl daemon-reload && reboot"
			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,謹慎操作!"

發佈了72 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章