Redisシリーズの4:Redis自動化導入スクリプト(プライマリ・スタンバイ)
12665 ワード
Redisは生産環境において、シングルマシンモードをあまり使用しない.原因は明らかである:シングルポイントの故障があり、高可用性を保証できない.したがって、本番環境では、プライマリ・スタンバイ・モードまたはクラスタ・モードを選択できます.ここでは、プライマリ・スタンバイ・モードの自動化された導入スクリプトについて説明し、後述するクラスタ・モードの導入について説明します.
配備スクリプト
使用方法の説明実行前に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起動スクリプト、停止スクリプトが含まれます.
締めくくり
以上のシナリオには多くの欠点があるかもしれませんが、ご指摘いただき、少しでもお役に立てば幸いです.
配備スクリプト
#!/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
使用方法の説明
締めくくり
以上のシナリオには多くの欠点があるかもしれませんが、ご指摘いただき、少しでもお役に立てば幸いです.