Redisシリーズの4:Redis自動化導入スクリプト(プライマリ・スタンバイ)


Redisは生産環境において、シングルマシンモードをあまり使用しない.原因は明らかである:シングルポイントの故障があり、高可用性を保証できない.したがって、本番環境では、プライマリ・スタンバイ・モードまたはクラスタ・モードを選択できます.ここでは、プライマリ・スタンバイ・モードの自動化された導入スクリプトについて説明し、後述するクラスタ・モードの導入について説明します.
配備スクリプト
#!/bin/bash

#-------------------------------------------------------------------------------------------#
#---------------------------------------    --------------------------------------------#
#-------------------------------------------------------------------------------------------#

#         

#redis  (  )  
redis_path="/usr/redis-3.2.1"
#          --    
save_file_catalog="config"
#    
#  1:          sentinel           
#  2:           sentinel          , master+sentinel1,slave1+sentinel2
#  3:          
deploy_mode="1"

#       
master_ip="192.168.5.33"
master_port="6379"
#       
redis_slave_num="1"
slave_1_port="6380"

#sentinel    
sentinel_num="2"
sentinel_port_1="26379"
sentinel_port_2="26380"
master_alias="mymaster"
#  node_fail_votes sentinel        ,           
node_fail_votes="1"


#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#

#-------------------------------------------------------------------------------------------#
#-------------------------------!!!        !!!--------------------------------#
#-------------------------------------------------------------------------------------------#

#    
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-sentinel" -o ! -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 "

Complie redis : $(date)
" >> ${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!
" fi } # redis function modifyAndCreateRedisConfigFile(){ echo "Beging to Create and Mmodify redis config file..." cd ${redis_path} # redis.conf (slave_num+1) if [ ! -e "redis.conf" ] then echo "redis.conf is not exist!" exit 1 fi # lineNum=$(egrep "^bind" redis.conf | wc -l) if [ ${lineNum} -gt 0 ] then sed -i 's/^bind\( \|.\|[0-9]\)\+/bind 0.0.0.0/g' redis.conf else echo "${lineNum}, into else" echo "bind 0.0.0.0" >> redis.conf fi sed -i 's/^protected-mode yes/protected-mode no/g' redis.conf # cp redis.conf ${save_file_catalog}/redis_master.conf sed -i "s/^port\( \|[0-9]\)\+/port ${master_port}/g" ${save_file_catalog}/redis_master.conf # for((i=1;i<=${redis_slave_num};i++)) do cp redis.conf ${save_file_catalog}/redis_slave_$i.conf slave_port=`eval echo '$'slave_"$i"_port` sed -i "s/^port\( \|[0-9]\)\+/port ${slave_port}/g" ${save_file_catalog}/redis_slave_$i.conf echo "slaveof ${master_ip} ${master_port}" >> ${save_file_catalog}/redis_slave_$i.conf done echo -e "Config redis success!
" } # sentinel function createSentinelConfigFile(){ echo "Begin to create sentinel config file..." cd ${redis_path} for((i=1;i<=${sentinel_num};i++)) do sentinel_port=`eval echo '$'sentinel_port_"$i"` sentinel_config_filename="${save_file_catalog}/sentinel_$i.conf" echo -e "bind 0.0.0.0" >> ${sentinel_config_filename} echo -e "port ${sentinel_port}" >> ${sentinel_config_filename} echo -e "daemonize yes" >> ${sentinel_config_filename} echo -e "logfile \"${sentinel_port}.log\"" >> ${sentinel_config_filename} echo -e "sentinel monitor ${master_alias} ${master_ip} ${master_port} ${node_fail_votes}" >> ${sentinel_config_filename} echo -e "sentinel down-after-milliseconds ${master_alias} 30000" >> ${sentinel_config_filename} echo -e "sentinel parallel-syncs ${master_alias} 1" >> ${sentinel_config_filename} echo -e "sentinel failover-timeout ${master_alias} 180000" >> ${sentinel_config_filename} echo -e "protected-mode no" >> ${sentinel_config_filename} done echo -e "Config sentinel success!
" } # function createStartScrit(){ echo "Begin to create start script..." cd ${redis_path} cd ${save_file_catalog} echo "echo \"Begin to start Redis and Sentinel!\"" >> startRedis.sh echo "nohup redis-server redis_master.conf > redis_master.log 2>&1 &" >> startRedis.sh for((i=1;i<=${redis_slave_num};i++)) do echo "nohup redis-server redis_slave_${i}.conf > redis_slave_${i}.log 2>&1 &" >> startRedis.sh done for((i=1;i<=${sentinel_num};i++)) do echo "nohup redis-sentinel sentinel_$i.conf > sentinel_$i.log 2>&1 &" >> startRedis.sh done echo "echo \"Start Redis and Sentinel Success!\"" >> startRedis.sh chmod 777 startRedis.sh echo -e "Create start script success!
" } # function createStopScrit(){ echo "Begin to create stop script..." cd ${redis_path} cd ${save_file_catalog} echo "echo \"Begin to stop Redis and Sentinel!\"" >> stopRedis.sh echo 'pids=$(ps -ef | grep redis | cut -c 10-16)' >> stopRedis.sh echo 'pidArr=$(echo ${pids}|tr "
", "
")' >> 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 and Sentinel Success!\"" >> stopRedis.sh chmod 777 stopRedis.sh echo -e "Create stop script success!
" } # , redis compileRedis modifyAndCreateRedisConfigFile createSentinelConfigFile createStartScrit createStopScrit originFolderName=${redis_path##*/} #----------------------- 3: 、 、sentinel -----------------------# # function createMasterFolder() { echo "Begin to create master folder..." cd ${redis_path} cd .. cp -r ${originFolderName} "${originFolderName}_master" cd "${originFolderName}_master/${save_file_catalog}" rm -f ./redis_slave_* rm -f ./sentinel_* sed -i 's/Redis and Sentinel/Redis/g' startRedis.sh sed -i 's/Redis and Sentinel/Redis/g' stopRedis.sh # redis_slave sed -i '/redis_slave/d' startRedis.sh # sentinel_ sed -i '/sentinel_/d' startRedis.sh echo -e "Create master folder success!
" } # function createSlaveFolderForMode3() { echo "Begin to create slave_$1 folder..." cd ${redis_path} cd .. cp -r ${originFolderName} "${originFolderName}_slave$1" cd "${originFolderName}_slave$1/${save_file_catalog}" rm -f ./redis_master* rm -f ./redis_slave_[^$1].conf rm -f ./sentinel_* sed -i 's/Redis and Sentinel/Redis/g' startRedis.sh sed -i 's/Redis and Sentinel/Redis/g' stopRedis.sh # redis_master sed -i '/redis_master/d' startRedis.sh # slave sed -i "/redis_slave_[^$1]/d" startRedis.sh # sentinel_ sed -i '/sentinel_/d' startRedis.sh echo -e "Create slave_$1 folder success!
" } # sentinel function createSentinelFolder() { echo "Begin to create sentinel_$1 folder..." cd ${redis_path} cd .. cp -r ${originFolderName} "${originFolderName}_sentinel$1" cd "${originFolderName}_sentinel$1/${save_file_catalog}" rm -f ./redis_master* rm -f ./redis_slave_* rm -f ./sentinel_[^$1].conf sed -i 's/Redis and Sentinel/Sentinel/g' startRedis.sh sed -i 's/Redis and Sentinel/Sentinel/g' stopRedis.sh # redis_master sed -i '/redis_master/d' startRedis.sh # slave sed -i "/redis_slave_*/d" startRedis.sh # sentinel_ sed -i "/sentinel_[^$1]/d" startRedis.sh echo -e "Create sentinel_$1 folder success!
" } #----------------------- 2: +sentinel、 +sentinel -----------------------# # sentinel function createMasterAndSentinelFolder() { echo "Begin to create master and sentinel$1 folder..." cd ${redis_path} cd .. cp -r ${originFolderName} "${originFolderName}_master_sentinel$1" cd "${originFolderName}_master_sentinel$1/${save_file_catalog}" rm -f ./redis_slave_* rm -f ./sentinel_[^$1].conf # redis_slave sed -i '/redis_slave/d' startRedis.sh # sentinel_ sed -i "/sentinel_[^$1]/d" startRedis.sh echo -e "Create master and sentinel$1 folder success!
" } # sentinel function createSlaveAndSentinelFolder() { echoStr="" folderSubstr="" flag=0 # slave sentinel if [ $1 -gt ${redis_slave_num} ]; then echoStr="sentinel$2" folderSubstr="sentinel$2" flag=1 elif [ $2 -gt ${sentinel_num} ]; then echoStr="slave$1" folderSubstr="slave$1" flag=2 else echoStr="slave$1 and sentinel$2" folderSubstr="slave$1_sentinel$2" flag=3 fi echo "Begin to create ${echoStr} folder..." cd ${redis_path} cd .. cp -r ${originFolderName} "${originFolderName}_${folderSubstr}" cd "${originFolderName}_${folderSubstr}/${save_file_catalog}" rm -f ./redis_master* rm -f ./redis_slave_[^$1].conf rm -f ./sentinel_[^$2].conf if [ ${flag} -eq 1 ]; then sed -i 's/Redis and Sentinel/Sentinel/g' startRedis.sh sed -i 's/Redis and Sentinel/Sentinel/g' stopRedis.sh elif [ ${flag} -eq 2 ]; then sed -i 's/Redis and Sentinel/Redis/g' startRedis.sh sed -i 's/Redis and Sentinel/Redis/g' stopRedis.sh fi # redis_master sed -i '/redis_master/d' startRedis.sh # slave sed -i "/redis_slave_[^$1]/d" startRedis.sh # sentinel_ sed -i "/sentinel_[^$2]/d" startRedis.sh echo -e "Create ${echoStr} folder success!
" } #******----------------------------**** ***------------------------------******# function createDeployedFolderByModel() { echo "Start to create deployed folders by model..." if [ $1 -eq 1 ]; then echo -e "You input mode is 1, namely all the node deployed in one!
" elif [ $1 -eq 2 ]; then echo -e "You input mode is 2, namely master+sentinel1, slaveX+sentinelX+1!
" createMasterAndSentinelFolder 1 num=0 if [ ${redis_slave_num} -gt $[${sentinel_num}-1] ]; then num=${redis_slave_num} else num=$[${sentinel_num}-1] fi for((i=1;i<=${num};i++)) do createSlaveAndSentinelFolder ${i} $[${i}+1] done elif [ $1 -eq 3 ]; then echo -e "You input mode is 3, namely every node deployed in different machines!
" createMasterFolder for((i=1;i<=${redis_slave_num};i++)) do createSlaveFolderForMode3 ${i} done for((i=1;i<=${sentinel_num};i++)) do createSentinelFolder ${i} done fi echo -e "Create deployed folders by model success!
" } # createDeployedFolderByModel ${deploy_mode} exit 0

使用方法の説明
  • 実行前にGCCなどの基礎環境を設置する必要がある.
  • 構成情報部分の内容を変更するだけで、redis_pathは解凍後のredisのルートディレクトリパス、deploy_modeは配置モードで、ここでは3つのオプションを提供します:モード1:すべてのプライマリ・スレーブ・ノードとsentinelノードを同じマシンに配置し、生成するすべてのプロファイルを1つのRedisディレクトリのconfigディレクトリに保存します.モード2:master+sentinel 1、slave 1+sentinel 2などのマシンにデータノードとsentinelノードを配置し、この2つのセットのプロファイルをそれぞれ1つのRedisディレクトリのconfigディレクトリの下に保存します.最終的に2つのRedisディレクトリが生成され、そのうちの1つを他のマシンにコピーできます.モード3:すべてのノードを別々に配置し、すべてのノードのプロファイルを1つのRedisディレクトリのconfigディレクトリに保存します.最終的には複数のRedisディレクトリが生成され、1つのノードがホストに保存された後、他のディレクトリを他のマシンにコピーできます.
  • スクリプトが正常に実行された後、redis_pathディレクトリの下にconfigディレクトリが生成され、プロファイル、Redis起動スクリプト、停止スクリプトが含まれます.

  • 締めくくり
    以上のシナリオには多くの欠点があるかもしれませんが、ご指摘いただき、少しでもお役に立てば幸いです.