Redis系列之六:Redis自動化部署腳本(離線部署集羣)

在實際生產使用Redis時,更多的還是使用Redis集羣,因爲這既可以保證性能,又可以保障穩定性。這裏介紹一下Redis集羣部署,下面是筆者之前寫的自動部署腳本,供各位參考。當時(包括下面的腳本)使用的Redis版本是3.2.1,目前最新的版本已經是6.0了,相較於老版本增加了很多令人期待的特性,比如權限控制、客戶端緩存等。下面進入正題。

部署腳本

部署腳本包含兩個部分,第一個腳本是集羣安裝前的一些準備工作,第二個腳本是執行集羣部署工作。

腳本1: prepare-script.sh

#!/bin/bash
# 此腳本爲離線安裝時準備工作執行的腳本,每個集羣節點都要運行該腳本
# 運行該腳本前請確保已安裝gcc
# 檢查是否已上傳redis安裝包,這裏使用redis-3.2.1.tar.gz,且放在/usr目錄下

#-------------------------------------------------------------------------------------------#
#---------------------------------------配置信息--------------------------------------------#
#-------------------------------------------------------------------------------------------#

#redis所在(絕對)路徑
redis_path="/usr/redis-3.2.1"

#Redis數據節點端口
node_port=6379

#保存配置文件的目錄 --可不修改
save_file_catalog="config"


#-------------------------------------------------------------------------------------------#
#-------------------------------!!!下方內容請勿修改!!!--------------------------------#
#-------------------------------------------------------------------------------------------#

# 關閉防火牆
systemctl stop firewalld
service iptables status

#創建目錄
cd ${redis_path}
if [ -e "${save_file_catalog}" ]
then
	rm -rf ${save_file_catalog}
fi
mkdir ${save_file_catalog}


#編譯安裝redis
function compileRedis(){
	cd ${redis_path}
	if [ ! -f "src/redis-server" -o ! -f "src/redis-cli" ]
	then
		echo "The redis may not be compiled. Compile it first! Please wait a moment..."
		echo -e "\n\nComplie redis : $(date)\n" >> ${save_file_catalog}/compile.log
		make >> ${save_file_catalog}/compile.log 2>&1
		make install >> ${save_file_catalog}/compile.log 2>&1
		echo -e "Compile success!\n"
	fi
}

# 創建配置文件
function createClusterCfgFile() {
	echo "Begin to create cluster config file..."

	cd ${redis_path}
	cd ${save_file_catalog}
	echo -e "port ${node_port}" >> redis_cluster.conf
	echo -e "cluster-enabled yes" >> redis_cluster.conf
	echo -e "cluster-config-file nodes.conf" >> redis_cluster.conf
	echo -e "cluster-node-timeout 5000" >> redis_cluster.conf
	echo -e "appendonly yes" >> redis_cluster.conf
	echo -e "protected-mode no" >> redis_cluster.conf
	
	echo "Create cluster config file success!"
}



#創建啓動文件
function createStartScrit(){
	echo "Begin to create start script..."
	
	cd ${redis_path}
	cd ${save_file_catalog}
	echo "echo \"Begin to start Redis!\"" >> startRedis.sh
	echo "nohup redis-server redis_cluster.conf > redis.log  2>&1 &" >> startRedis.sh	
	echo "echo \"Start Redis Success!\"" >> startRedis.sh
	
	chmod 777 startRedis.sh
	
	echo -e "Create start script success!\n"
}


#創建停止文件
function createStopScrit(){
	echo "Begin to create stop script..."

	cd ${redis_path}
	cd ${save_file_catalog}
	echo "echo \"Begin to stop Redis!\"" >> stopRedis.sh	
	echo 'pids=$(ps -ef | grep redis | cut -c 10-16)' >> stopRedis.sh
	echo 'pidArr=$(echo ${pids}|tr "\n", "\n")' >> stopRedis.sh
	echo 'for pid in ${pidArr}' >> stopRedis.sh
	echo 'do' >> stopRedis.sh
	echo '    ps -p ${pid} > /dev/null' >> stopRedis.sh
	echo '    if [ $? -eq 0 ]' >> stopRedis.sh
	echo '    then' >> stopRedis.sh
	echo '        kill -9 ${pid}' >> stopRedis.sh
	echo '    fi' >> stopRedis.sh
	echo 'done' >> stopRedis.sh
	echo "echo \"Stop Redis Success!\"" >> stopRedis.sh
	chmod 777 stopRedis.sh
	
	echo -e "Create stop script success!\n"
}


#調用腳本,完成redis編譯及相關腳本的生成
compileRedis
createClusterCfgFile
createStartScrit
createStopScrit

#啓動Redis節點
cd ${redis_path}
cd ${save_file_catalog}
./startRedis.sh

腳本2: install-cluster-script.sh

#!/bin/bash
# ==注意事項:==
# 1. 運行該腳本前請確保各節點已運行prepare-script.sh
# 2. 運行該腳本前請確保已安裝gcc
# 3. 運行該腳本前請確保各節點已關閉防火牆
# 4. 運行該腳本前請確保以下文件已上傳至package_path所配置的目錄下:
#    /usr
#       |-- redis-3.2.1.tar.gz
#       |-- zlib-1.2.11.tar.gz
#       |-- perl-5.16.1.tar.gz
#       |-- openssl-1.1.0h.tar.gz
#       |-- ruby-2.5.1.tar.gz
#       |-- redis-3.3.3.gem


#-------------------------------------------------------------------------------------------#
#---------------------------------------配置信息--------------------------------------------#
#-------------------------------------------------------------------------------------------#

#redis所在(絕對)路徑
redis_path="/usr/redis-3.2.1"

#相關安裝包所在(絕對)路徑
package_path="/usr/packages"


#cluster相關配置
#每個redis節點的從節點個數
each_node_slave_num=0

#redis節點個數
node_num=3

#redis節點具體信息(形式爲ip:port)
redis_node_1=192.168.5.33:6395
redis_node_2=192.168.5.33:6396
redis_node_3=192.168.5.33:6397


#保存配置文件的目錄 --可不修改
save_file_catalog="config5"


#-------------------------------------------------------------------------------------------#
#-------------------------------!!!下方內容請勿修改!!!--------------------------------#
#-------------------------------------------------------------------------------------------#

# 安裝zlib,ruby編譯時需要使用
function installZlib() {
	checkStr=`rpm -qa zlib`
	if [[ ${checkStr} =~ ^zlib.* ]]; then
			echo "Zlib has installed!"
	else
		echo "Begin to install zlib..."	
		cd ${package_path}
		tar -zxvf zlib-1.2.11.tar.gz > /dev/null
		cd zlib-1.2.11
		./configure >> createCluster.log
		make clean >> createCluster.log
		make >> createCluster.log
		make install >> createCluster.log
		echo -e "Install zlib success!\n"		
	fi
}


# 安裝perl 5,openssl編譯環境
function installPerl() {
	checkStr=`rpm -qa perl`
	if [[ ${checkStr} =~ ^perl.* ]]; then
			echo -e "Perl has installed!\n"
	else
		echo "Begin to install perl 5..."	
		cd ${package_path}
		tar -xzf perl-5.16.1.tar.gz > /dev/null
		cd perl-5.16.1
		./Configure -des -Dusethreads -Dprefix=/usr/local/perl >> createCluster.log
		make clean >> createCluster.log
		make >> createCluster.log
		make install >> createCluster.log
		echo -e "Install perl 5 success!\n"	
	fi
}

# 安裝openssl
function installOpenssl() {
	checkStr=`rpm -qa openssl`
	if [[ ${checkStr} =~ ^openssl.* ]]; then
			echo -e "Openssl has installed!\n"
	else
		echo "Begin to install openssl..."	
		cd ${package_path}
		tar -zxvf openssl-1.1.0h.tar.gz > /dev/null
		cd openssl-1.1.0h
		./config --prefix=/usr/local/openssl >> createCluster.log
		./config -t >> createCluster.log
		make clean >> createCluster.log
		make >> createCluster.log
		make install >> createCluster.log
		echo -e "Install openssl success!\n"
	fi
}

# 安裝ruby,創建集羣工具的運行環境
function installRuby() {
	checkStr=`ruby -v`
	if [[ ${checkStr} =~ ^ruby.* ]]; then
			echo -e "Ruby has installed!\n"
	else
		echo "Begin to install ruby..."	
		cd ${package_path}
		tar -zxvf ruby-2.5.1.tar.gz > /dev/null
		cd ruby-2.5.1
		./configure >> createCluster.log
		make clean >> createCluster.log
		make >> createCluster.log
		make install >> createCluster.log
		echo -e "Install ruby success!\n"		
	fi
}

# 將openssl集成到ruby
function integrateOpensslToRuby() {
	echo "Begin to integrate openssl to ruby..."	

	cd ${package_path}
	cd ruby-2.5.1/ext/openssl	
	ruby extconf.rb --with-openssl-dir=/usr/local/openssl >> createCluster.log
	#因爲Makefile有錯誤,這裏進行修改
	sed -i "s/\$(top_srcdir)\/include\/ruby.h/\.\.\/\.\.\/include\/ruby.h/g" Makefile
	make clean >> createCluster.log
	make >> createCluster.log
	make install >> createCluster.log
	
	echo -e "Integrate openssl to ruby success!\n"
}

# 安裝ruby的redis的接口
function installGem() {	
	echo "Begin to install redis gem..."	
	cd ${package_path}
	gem install redis-3.3.3.gem >> createCluster.log
	echo -e "Install redis gem success!\n"	
}



# 準備安裝環境
function prepareEnvironment() {
	echo "Begin to prepare environment..."
	
	installZlib
	installPerl
	installOpenssl
	installRuby
	integrateOpensslToRuby
	installGem
	
	echo -e "Prepare environment all success!\n"
}

# 創建集羣
function createRedisCluster() {
	echo "Begin to create redis cluster..."
	
	cd ${redis_path}/src
	nodeStr=""
	for((i=1;i<=${node_num};i++))
	do
		temp=`eval echo '$'redis_node_"$i"`
		nodeStr="${nodeStr} ${temp}"		
	done
	echo "nodeStr: ${nodeStr}"  
	
	# 說明:--replicas 0表示各節點沒有從節點,將0改爲1,則每個節點有1個從節點
	./redis-trib.rb create --replicas ${each_node_slave_num} ${nodeStr}
	
	echo -e "Create redis cluster success!\n"
}


prepareEnvironment
createRedisCluster

exit 0
使用說明
  1. 第一個腳本爲集羣安裝前的一些準備工作,該腳本需要在每個集羣節點執行。執行該腳本前請確保已安裝gcc,且已將redis安裝包上傳至/usr目錄下;
  2. 第二個腳本是執行集羣部署工作,該腳本只需要在其中一個節點執行即可。執行該腳本前請確保各節點已運行prepare-script.sh(第一個腳本), 確保各節點已關閉防火牆,且腳本中指定的文件已上傳至package_path所配置的目錄下。
結語

以上腳本可能還有很多不足之處,望各位指正,也歡迎一起交流。如果能對你有一點幫助,那深感榮幸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章