redis集群部署准备
1.安装包默认放在redis安装脚本所在路径下(/usr/local/redis/),每台机器都需放一份。
2.机器ip和redis端口可任意变更,但ip数量和端口数量乘积必须是偶数且大于等于6。
(此脚本采用一主对一从方式构建.若一主对多从,自行更改ip和端口数量)
3.各个机器之间需提前配置免密登录。若不配置需在机器交互时手动输入密码。
4.若内网安装,需提前配置yum私服和yum源,此脚本依赖gcc expect spawn 组件,保证yum私服中能加载到这三个组件。
部署脚本
- main.sh
#!/bin/bash
ip_arr=('192.168.21.211' '192.168.21.212')
port_arr=('6380' '6381' '6382')
cluster_name="redis-cluster"
redis_path="/usr/local/redis/"
nodenum=${#port_arr[@]}
port=22
user=root
redis_sh_path=/usr/local/redis/
redis_sh_name=redis.sh
length=${#ip_arr[@]}
echo '自动化部署任务开始。。。。'
for (( k=0; k < $length; k++ ))
do
echo '开始操作服务器:'${ip_arr[$k]}
ssh -t -p $port $user@${ip_arr[$k]} "sh $redis_sh_path$redis_sh_name '${ip_arr[k]}' '${port_arr[*]}' '${cluster_name}' '${redis_path}'"
done
echo '开始安装expect组件'
yum install -y expect spawn >/dev/null 2>&1
echo 'expect安装完成'
cd ${redis_path}${cluster_name}
echo '#!/usr/bin/expect -f' >>cluster.sh
echo -n "spawn ./bin/redis-cli --cluster create " >> cluster.sh
for (( k=0; k < $length; k++ ))
do
for((i=0;i<${nodenum};i++));
do
port=${port_arr[i]}
ip=${ip_arr[k]}
echo -n "${ip}:${port} " >> cluster.sh
done
done
echo "--cluster-replicas 1" >> cluster.sh
echo 'expect "*to accept*"' >> cluster.sh
echo 'send "yes\r"' >> cluster.sh
echo 'expect eof' >> cluster.sh
chmod +x cluster.sh
echo "创建集群"
./cluster.sh
- redis.sh
#!/bin/bash
onversion="5.0.0"
offversion=`basename redis-*.tar.gz .tar.gz | awk -F '-' '{print$2}'`
installdir=$(cd `dirname $0`; pwd)
redis_path=$4
cluster_name=$3
port_arr=($2)
localIp=$1
nodenum=${#port_arr[@]}
function initize(){
installdir=$(cd `dirname $0`; pwd)
}
function checkenv(){
if [ $UID -ne 0 ]
then
echo "权限不足...请切换至root用户"
exit;
fi
if [ ! -d $redis_path ]
then
mkdir -p $redis_path
fi
}
function checkgcc(){
data=`gcc --version`
gccinfo=""
if [ "$data" = "$gccinfo" ]
then
yum -y install gcc
fi
}
function judge(){
cd ${installdir}
offfile=`ls | grep redis-*.tar.gz`
if [[ "$offfile" != "" ]]
then
echo "发现离线压包"
/usr/bin/sleep 3
else
echo "未发现离线包,准备下载"
/usr/bin/sleep 3
wget -P /install -c http://192.168.12.120/rpm_repo/tar/redis-5.0.0.tar.gz
fi
offinstall
}
function openfirewall(){
for((i=0;i<${nodenum};i++));
do
firewall-cmd --zone=public --add-port=${port_arr[$i]}/tcp --permanent
firewall-cmd --zone=public --add-port=$[10000+${port_arr[$i]}]/tcp --permanent
done
firewall-cmd --reload
echo "已开放防火墙端口"
}
function offinstall(){
echo "离线包安装中"
cp ${installdir}/redis-${offversion}.tar.gz ${redis_path}
cd ${redis_path}
tar -zxvf redis-${offversion}.tar.gz >/dev/null 2>&1
redis="redis-${offversion}"
cd ${redis}/src && make && make install >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo "编译出错"
else
echo "文件编译完成"
/usr/bin/sleep 3
intend
fi
}
function intend(){
cd ${redis_path}
redis="redis-${onversion}"
cd ${redis}/src
if [ -f "redis-server" ];then
echo "准备分配数据"
else
echo "失败重新编译"
/usr/bin/sleep 2
make && make install >/dev/null 2>&1
fi
mkdir -p ${redis_path}/${cluster_name}/{logs,nodes,conf,bin,rdb}
cp redis-cli redis-server ${redis_path}/${cluster_name}/bin
for((i=0;i<${nodenum};i++));
do
port=${port_arr[$i]}
confile="redis-${localIp##*.}-${port}.conf"
cp ../redis.conf ${redis_path}/${cluster_name}/conf/${confile}
done
echo "配置快捷启动"
service
/usr/bin/sleep 2
echo "修改配置文件"
configfile
}
function service(){
cd ${redis_path}/${cluster_name}
for((i=0;i<${nodenum};i++));
do
port=${port_arr[$i]}
confile="redis-${localIp##*.}-${port}.conf"
echo "./bin/redis-server conf/${confile}" >> start.sh
done
chmod +x start.sh
}
function configfile(){
cd ${redis_path}/${cluster_name}
pathdir=`pwd`
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
background
updateport
edittimeout
logpath
rdbfile
colony
clusterconf
protected
bindIP
pidfileconfig
bgsave
done
}
function background(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i 's/daemonize no/daemonize yes/' ${confile}
done
}
function updateport(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i "s|port 6379|port ${port_arr[$i]}|g" ${confile}
done
}
function edittimeout(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i 's/# cluster-node-timeout 15000/cluster-node-timeout 15000/' ${confile}
done
}
function colony(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i 's/# cluster-enabled yes/cluster-enabled yes/' ${confile}
done
}
function logpath(){
cd ${redis_path}/${cluster_name}
pathdir=`pwd`
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
port=${port_arr[$i]}
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
logfileold=`cat "${confile}" | grep logfile | awk -F '"' '{print$2}'`
logfile="redis-${localIp##*.}-${port_arr[$i]}.logs"
logfilenew=${pathdir}/logs/${logfile}
if [ ! $logfileold ];then
sed -i 's/logfile ""/logfile "judgement"/' ${confile}
logfileold=`cat "${confile}" | grep logfile | awk -F '"' '{print$2}'`
if [ ! $logfileold ];then
echo
else
sed -i "s|$logfileold|$logfilenew|g" ${confile}
fi
sed -i "s|$logfileold|$logfilenew|g" ${confile}
else
sed -i "s|$logfileold|$logfilenew|g" ${confile}
fi
done
}
function rdbfile(){
cd ${redis_path}/${cluster_name}
pathdir=`pwd`
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
port=${port_arr[$i]}
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
rdbname="redis-${localIp##*.}-${port_arr[$i]}.rdb"
rdbdirnew="${pathdir}/rdb"
sed -i "s/dbfilename dump.rdb/dbfilename ${rdbname}/" ${confile}
sed -i "s|dir ./|dir ${rdbdirnew}|" ${confile}
done
}
function clusterconf(){
cd ${redis_path}/${cluster_name}
pathdir=`pwd`
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
port=${port_arr[$i]}
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
nodes="nodes-${localIp##*.}-${port_arr[$i]}.conf"
clusternodenum=`cat -n ${confile} | grep cluster-config-file | awk '{print$1}' | head -n 1`
clusterconfnew="cluster-config-file ${pathdir}/nodes/${nodes}"
clusterNM=`cat -n ${confile} | grep cluster-config-file | grep -v '#' | wc -l`
if [ ${clusterNM} -ge 1 ];then
nodenum=`cat -n ${confile} | grep cluster-config-file | grep -v '#' | awk '{print$1}' | head -n 1`
sed -i "${nodenum}d" ${confile}
else
sed -i "${clusternodenum}i ${clusterconfnew}" ${confile}
fi
done
}
function protected(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i 's/protected-mode yes/protected-mode no/' ${confile}
done
}
function bindIP(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i "s/127.0.0.1/${localIp}/g" ${confile}
done
}
function pidfileconfig(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i "s#pidfile /var/run/redis_6379.pid#pidfile /var/run/redis_${port_arr[$i]}.pid#" ${confile}
done
}
function bgsave(){
cd ${redis_path}/${cluster_name}/conf
for((i=0;i<${nodenum};i++));
do
confile="redis-${localIp##*.}-${port_arr[$i]}.conf"
sed -i 's/stop-writes-on-bgsave-error yes/stop-writes-on-bgsave-error no/' ${confile}
done
}
function trib(){
cd ${redis_path}/${cluster_name}
echo "启动集群进程"
./start.sh
/usr/bin/sleep 2
echo "进程 已启动"
}
function main(){
checkenv
openfirewall
checkgcc
judge
trib
}
main
- uninstall.sh
#!/bin/bash
#redis ip集合
ip_arr=('192.168.61.211' '192.168.61.212' '192.168.61.213')
#集群目录
cluster_name="redis-cluster"
nodenum=${#port_arr[@]}
port=22
user=root
redis_path=/root/redis1/
length=${#ip_arr[@]}
echo '删除redis集群。。。。'
for (( k=0; k < $length; k++ ))
do
echo '开始操作服务器:'${ip_arr[$k]}
ssh -t -p $port $user@${ip_arr[$k]} "rm -rf ${redis_path} && killall redis-server -9 "
done
echo '删除完成'
部署说明
- 自行下载redis源码安装包,将脚本和安装包放到一起(/usr/local/redis/)本脚本用的5.0.0稳定版。
- 更改main.sh脚本中的ip和端口集合,改成自己的机器ip和需要启动的端口。ip需要配置外网可以访问到的地址。
- 运行main.sh。
- 如有需要,可直接下载压缩包,包含执行脚本、安装脚本、卸载脚本、源码安装包、注意事项和部署说明。