在实际生产使用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
使用说明 |
结语 |
以上脚本可能还有很多不足之处,望各位指正,也欢迎一起交流。如果能对你有一点帮助,那深感荣幸。