在實際生產使用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
使用說明 |
- 第一個腳本爲集羣安裝前的一些準備工作,該腳本需要在每個集羣節點執行。執行該腳本前請確保已安裝gcc,且已將redis安裝包上傳至/usr目錄下;
- 第二個腳本是執行集羣部署工作,該腳本只需要在其中一個節點執行即可。執行該腳本前請確保各節點已運行prepare-script.sh(第一個腳本), 確保各節點已關閉防火牆,且腳本中指定的文件已上傳至package_path所配置的目錄下。
結語 |
以上腳本可能還有很多不足之處,望各位指正,也歡迎一起交流。如果能對你有一點幫助,那深感榮幸。