redis一键部署集群(非主从模式、哨兵模式)

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 '删除完成'

部署说明

  1. 自行下载redis源码安装包,将脚本和安装包放到一起(/usr/local/redis/)本脚本用的5.0.0稳定版。
  2. 更改main.sh脚本中的ip和端口集合,改成自己的机器ip和需要启动的端口。ip需要配置外网可以访问到的地址。
  3. 运行main.sh。
  4. 如有需要,可直接下载压缩包,包含执行脚本、安装脚本、卸载脚本、源码安装包、注意事项和部署说明。

下载地址:

点我下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值