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所配置的目录下。
结语

以上脚本可能还有很多不足之处,望各位指正,也欢迎一起交流。如果能对你有一点帮助,那深感荣幸。

你可能感兴趣的:(Redis入门与实战)