shell脚本一键安装redis集群[最终版]
直接上shell了。
#!/bin/bash #------------------------------------------------------------------------------------------------------------------# #| Some people die at the age of 25 and don't bury themselves in the earth until they are 75 |# #------------------------------------------------------------------------------------------------------------------# #| $$$$ $$ $$ $$$$$$ $$ $$ $$$$$$ $$ $$$$$$ $$$$$$ |# #| $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ |# #| $$ $$$$$$$ $$$$$ $$ $$ $ $$ $$$$$$ $$ $$$$$ $$$$$ |# #| $$ $$ $$ $$ $$ $ $ $$ $$ $$ $$ $$ |# #| $$$$ $$ $$ $$$$$$ $$ $$ $$$$$ $$ $$$$$$ $$$$$$ $$$$$$ |# #------------------------------------------------------------------------------------------------------------------# #| redis-cluster install |# #| 2018.12.10 |# #| blog http://www.cnblogs.com/chenglee/ |# #------------------------------------------------------------------------------------------------------------------# onversion="4.0.3" offversion=`basename redis-*.tar.gz .tar.gz | awk -F '-' '{print$2}'` installdir=$(cd `dirname $0`; pwd) cluster_name="redis-cluster" number=6 numstaring=700 #------------------------------------------------------------------------------------------------------------------# #| 说 明 |# #------------------------------------------------------------------------------------------------------------------# #| 此脚本分有离线安装和联网安装的功能, 联网安装的用法就是直接运行这个脚本 sh ***.sh /或者./***.sh |# #| 而离线安装, 就是把安装包和这个脚本放在想安装在的目录, 然后执行sh ***.sh /或者./***.sh即可,而无论选择哪一 |# #| 方式,都是包是否存在的问题,包在=离线,包不在=联网,下面说一下上面的全局变量的解释。 |# #| onversion 这个是在联网安装的时候需要制定的版本,默认4.0.3,如果需要安装5.0.0的, 修改此参数。 |# #| offversion 这个不用管它,这个是离线安装识别离线包版本的。 |# #| cluster_name 这个就是安装集群的文件夹名字,就是把集群装在这个文件夹里面。 |# #| number 这个就比较重要了, 节点。一台机器需要安装的节点,我这里是6,安装6个节点,可修改。 |# #| numstaring 这个是端口的前缀,比如我这里安装6个节点,端口自动分配为7001,7002,7003..., 如果需要修改成 |# #| 6001,6002...这些端口,修改此属性为600便可。 |# #------------------------------------------------------------------------------------------------------------------# function initize(){ installdir=$(cd `dirname $0`; pwd) } function checkroot(){ if [ $UID -ne 0 ] then echo "|----------------------------------------------------------------------------------------------------------------|" echo "|------------------------------------------[权限不足...请切换至root用户]-----------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" exit; fi } function judge(){ echo offfile=`ls | grep redis-*.tar.gz` if [[ "$offfile" != "" ]] then echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[发现离线压包]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 3 offinstall else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[未发现离线包]-------------------------------------------------|" echo "|--------------------------------------------[开始判断是否连接外网安装]------------------------------------------|" /usr/bin/sleep 3 network fi } function offinstall(){ echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[离线包安装中]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" tar -zxvf redis-${offversion}.tar.gz >/dev/null 2>&1 redis="redis-${offversion}" cd ${redis}/src && make >/dev/null 2>&1 if [[ $? -ne 0 ]]; then echo "编译出错" else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[文件编译完成]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 3 intend fi } function network(){ httpcode=`curl -I -m 10 -o /dev/null -s -w %{http_code}'\n' http://www.baidu.com` net1=$(echo $httpcode | grep "200") if [[ "$net1" != "" ]] then echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-----------------------------------------------------[联网]-----------------------------------------------------|" echo "|-------------------------------------------------[准备联网安装]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 3 online else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------[未联网,无离线安装包,准备退出]---------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 3 exit; fi } function online(){ wget_v=`which wget` wget_vv=$(echo $wget_v | grep wget) if [[ "$wget_vv" != "" ]] then echo "|----------------------------------------------------------------------------------------------------------------|" echo "|--------------------------------------`wget -V |head -n 1`---------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" wget http://download.redis.io/releases/redis-${onversion}.tar.gz installon else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|----------------------------------------[检测到wget没有安装, 准备安装wget]---------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" yum install wget -y echo "|----------------------------------------------------------------------------------------------------------------|" echo "|--------------------------------------`wget -V |head -n 1`---------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" wget http://download.redis.io/releases/redis-${onversion}.tar.gz installon fi } function installon(){ echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[在线安装包中]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" tar -zxvf redis-${onversion}.tar.gz >/dev/null 2>&1 redis="redis-${onversion}" cd ${redis}/src && make >/dev/null 2>&1 if [[ $? -ne 0 ]]; then echo "编译出错" else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[文件编译完成]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 3 intend fi } function intend(){ echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[开始迁移文件]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" cd ${installdir} redis="redis-${onversion}" cd ${redis}/src if [ -f "redis-server" ];then echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[准备分配数据]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[失败重新编译]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 2 make >/dev/null 2>&1 fi mkdir -p ${installdir}/${cluster_name}/{logs,nodes,conf,bin} cp redis-cli redis-server ${installdir}/${cluster_name}/bin cp redis-trib.rb ${installdir}/${cluster_name} for((i=1;i<=${number};i++)); do port=${numstaring}${i} confile="redis-${numstaring}${i}.conf" cp ../redis.conf ${installdir}/${cluster_name}/conf/${confile} done echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[数据迁移完成]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 2 echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[清理多余文件]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" #finish /usr/bin/sleep 2 echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[配置快捷启动]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" service /usr/bin/sleep 2 echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[修改配置文件]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" configfile /usr/bin/sleep 3 echo "|****************************************************************************************************************|" echo "| WW WW EEEEEEE LL CCCCC OOOOOO MM MM EEEEEEE |" echo "| WW WWWW WW EE LL CC OO OO MMMM MMMM EE |" echo "| WW WW WW WW EEEEE LL CC OO OO MM MM MM MM EEEEE |" echo "| WW W W WW EE LL CC OO OO MM M M MM EE |" echo "| WW WW EEEEEEE LLLLLL CCCCC OOOOOO MM MMM MM EEEEEEE |" echo "|****************************************************************************************************************|" } function finish(){ echo rm -rf ${installdir}/redis-* } #------------------------------------------------------------------------------------------------------------------# #| service 复制多份redis.conf conf 目录 |# #| configfile 对整改的内容做个整合 |# #| background 后台运行 |# #| updateport 端口 |# #| logpath 日志输出目录文件 logs 目录 |# #| colony 开启集群模式 |# #| clusterconf 集群数据输出目录文件 nodes目录 |# #| trib 创建集群 连接所有节点 redis-cluster.log |# #------------------------------------------------------------------------------------------------------------------# function service(){ cd ${installdir}/${cluster_name} for((i=1;i<=${number};i++)); do port=${numstaring}${i} confile="redis-${numstaring}${i}.conf" echo "./bin/redis-server conf/${confile}" >> start.sh done chmod +x start.sh } function configfile(){ cd ${installdir}/${cluster_name} pathdir=`pwd` cd ${installdir}/${cluster_name}/conf for((i=1;i<=${number};i++)); do port=${numstaring}${i} confile="redis-${numstaring}${i}.conf" #后台 background #端口 updateport #日志输出文件 logpath #开启集群 colony #集群数据文件 clusterconf done } function background(){ cd ${installdir}/${cluster_name}/conf for((i=1;i<=${number};i++)); do confile="redis-${numstaring}${i}.conf" sed -i 's/daemonize no/daemonize yes/' ${confile} done } function updateport(){ cd ${installdir}/${cluster_name}/conf for((i=1;i<=${number};i++)); do port=${numstaring}${i} confile="redis-${numstaring}${i}.conf" sed -i "s|port 6379|port ${port}|g" ${confile} done } function colony(){ cd ${installdir}/${cluster_name}/conf for((i=1;i<=${number};i++)); do confile="redis-${numstaring}${i}.conf" sed -i 's/# cluster-enabled yes/cluster-enabled yes/' ${confile} done } function logpath(){ cd ${installdir}/${cluster_name} pathdir=`pwd` cd ${installdir}/${cluster_name}/conf for((i=1;i<=${number};i++)); do port=${numstaring}${i} confile="redis-${numstaring}${i}.conf" logfileold=`cat "${confile}" | grep logfile | awk -F '"' '{print$2}'` logfile="redis-${numstaring}${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 clusterconf(){ cd ${installdir}/${cluster_name} pathdir=`pwd` cd ${installdir}/${cluster_name}/conf for((i=1;i<=${number};i++)); do port=${numstaring}${i} confile="redis-${numstaring}${i}.conf" nodes="nodes-${numstaring}${i}.conf" clusternumber=`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 number=`cat -n ${confile} | grep cluster-config-file | grep -v '#' | awk '{print$1}' | head -n 1` sed -i "${number}d" ${confile} else sed -i "${clusternumber}i ${clusterconfnew}" ${confile} fi done } function trib(){ cd ${installdir}/${cluster_name} echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[启动集群进程]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" ./start.sh /usr/bin/sleep 2 echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[进程 已启动]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" bindip=`ps aux | grep "redis" | awk '{print$12}' | grep -v "auto" | head -n ${number}` echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[安装 gem环境]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 2 wget https://rubygems.org/downloads/redis-3.2.0.gem gem install redis-*.gem echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[gem 环境已装]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" /usr/bin/sleep 2 echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[搭建节点连接]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" ./redis-trib.rb create --replicas 1 ${bindip} > redis-cluster.log > /dev/null 2>&1 } function main(){ gem=`which gem` gemv=$(echo $gem | grep gem) if [[ $gemv != "" ]] then echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[gem 环境存在]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" checkroot judge trib else echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[gem 环境未装]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" yum install ruby rubygems -y wget https://rubygems.org/downloads/redis-3.2.0.gem gem install redis-*.gem /usr/bin/sleep 2 echo "|----------------------------------------------------------------------------------------------------------------|" echo "|-------------------------------------------------[gem 环境已装]-------------------------------------------------|" echo "|----------------------------------------------------------------------------------------------------------------|" checkroot judge trib fi } main