В моей организации Redis работает в конфигурации Master / Slave, используя Keepalived для переключения между ними. Было обнаружено, что, когда экземпляр Slave по какой-то причине умирает, Keepalived не перезапускает его. Я начал писать задание cron, чтобы проверить, работает ли redis, и если подчиненное устройство умирает, перезапустить его.
#!/bin/bash
#redis_cron_restart.sh
######variables########
REDIS_IP="10.19.105.229"
REDIS_CONF="/var/lib/redis/redis.conf"
#Check to see if Redis is running
killall -0 redis-server
if [ $? -eq 1 ]
then
date >> /var/lib/redis/log.txt
echo redis-server not running. Checking redis master >> /var/lib/redis/log.txt
redis-cli -h ${REDIS_IP} PING
if [ $? -eq 1 ]
then
echo redis master not running. Doing nothing. >> /var/lib/redis/log.txt
else
echo redis master is running. I must be the slave. Restarting keepalived >> /var/lib/redis/log.txt
redis-server ${REDIS_CONF}
sleep 1
wait
redis-cli SLAVEOF ${REDIS_IP} 6379
fi
else
echo redis-server running. >> /var/lib/redis/log.txt
fi
Он запускается и перезапускает Redis. Однако он не переводит Redis в подчиненный режим. Если я напечатаю
redis-cli SLAVEOF 10.19.105.229 6379
на моем терминале, однако, он переходит в подчиненный режим. Любые идеи?
Возможно ли, что в самом сокровенном else
блок, вызов redis-server
немедленно возвращается, но сам сервер запускается более одной секунды? В таком случае, wait
не будет ждать достаточно долго.
Вы пробовали написать в скрипте полный путь к redis-cli и redis-server? Или просто установите переменную PATH в начале скрипта и сделайте то же самое, что вы видите при вводе echo $PATH
в вашем терминале.