# 关于脚本: # 使用root用户执行此脚本,提前关闭selinux; # 执行脚本之前,hostsIP内的IP修改成自己的机器IP; # hostsIp内的IP数量如果有增加或者减少,for循环的变量也需要增减; # sshCopy内的root密码改成自己的root密码; # installRedis内配置了redis的密码,自行修改
# 关于环境: # 此脚本部署的是redis-6.0.5版本 # 脚本中的命令需要用到net-tools软件,如果没有网络,将ifconfig注释,打开ip a这个命令的变量即可; # 因为是虚拟机测试,所以redis-cluster使用的是3节点6实例,具体环境请根据自身需求修改,部署redis也是3主机的形式,如果是单节点,需要修改hostsIP和sshCopy内的内容(ps:单节点没测试过,不确定可用性,可以直接执行installRedis内的命令); # 生产环境,测试完之后再使用,如果生产环境没有网络,需要提前准备好redis的tar包; # 如果是自己准备的redis tar包,需要修改installRedis内的脚本,注释掉wget字段,打开scp字段,注意自己路径和tar包名字;
# 关于主从复制: # 如果需要使用redis 5以下版本的主从复制,需要修改redisBGSAVE内的replicaof,5.0版本以下的,需要改成slaveof
# 脚本执行方式:sh redis.sh install (编译安装redis) # sh redis.sh bgsave (部署redis-主从复制) # sh redis.sh cluster (部署redis-cluster)
#!/bin/env bash # from:半癫 set -euxo pipefail redisHome=/opt/redis-6.0.5 redisClusterHome=/opt/redis-cluster # 关闭防火墙,检查selinux stopFirewalld (){ systemctl disable firewalld --now sedisabled=$(sestatus | awk '{print $NF}') if [ $sedisabled = disabled ] then printf "\e[1;32m===========================selinux is disabled==================================\e[0m\n" else printf "\e[1;32m===========================请关闭selinux后再操作================================\e[0m\n" exit 1 fi } # 安装net-tools,ifconfig命令需要用到,已有的情况下,不会再次yum netTools(){ tools=$(rpm -qa net-tools | wc -l) if [ $tools -gt 0 ] then printf "\e[1;32m===========================net-tools 已安装=====================================\e[0m\n" else printf "\e[1;32m===========================net-tools 未安装,开始安装===========================\e[0m\n" yum -y install net-tools if [ $? -ne 0 ] then printf "\e[1;32m===========================net-tools 安装失败===================================\e[0m\n" exit 2 else printf "\e[1;32m===========================net-tools 安装成功===================================\e[0m\n" fi fi } # 检查网络是否通 checkNetwork(){ ping -c1 www.baidu.com > /dev/null 2>&1 if [ $? -eq 0 ] then printf "\e[1;32m===========================网络正常=============================================\e[0m\n" else printf "\e[1;32m===========================请检查网络===========================================\e[0m\n" exit 3 fi } checkNetwork stopFirewalld netTools # 配置hosts hostsIp(){ ip=$(ifconfig eth0 | grep netmask | awk '{print $2}') # ip=$(ifconfig eth0 | grep netmask | awk '{print $2}') ip1=192.168.10.134 ip2=192.168.10.135 cat >> /etc/hosts <<eof $ip redis01 $ip1 redis02 $ip2 redis03 eof } # ssh配置免密 sshCopy(){ yum -y install sshpass > /dev/null 2>&1 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa for cluster in redis01 redis02 redis03 do sshpass -p '123.com' ssh-copy-id $cluster -o StrictHostKeyChecking=no scp /etc/hosts $cluster:/etc/hosts if [ $? -eq 0 ];then printf "\e[1;32m===========================$cluster 秘钥copy完成================================\e[0m\n" else printf "\e[1;32m===========================$cluster 秘钥copy失败================================\e[0m\n" exit 4 fi done } # tar包编译安装redis,如果没有网络的情况下,可以提前下载tar包,注释掉wget这一行,关闭scp这一行的注释即可 installRedis(){ if [ $(find / -iname 'redis-server' | wc -l) -gt 0 ] then echo 'redis 已安装' else echo 'redis 未安装,开始安装' for k in redis01 redis02 redis03 do ssh root@$k "yum -y install gcc glibc glibc-kernheaders glibc-common glibc-devel make" ssh root@$k "yum -y install centos-release-scl" ssh root@$k "yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils" ssh root@$k "echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile.d/gcc9.sh && source /etc/profile.d/gcc9.sh" ssh root@$k "wget -O /opt/redis.tar.gz http://download.redis.io/releases/redis-6.0.5.tar.gz" # scp redis-6.0.5.tar.gz root@$k:/opt/ ssh root@$k "cd /opt/ && tar xf redis.tar.gz && cd redis-6.0.5 && make && make install" ssh root@$k "sed -i 's/bind.*/bind 0.0.0.0/g' $redisHome/redis.conf" ssh root@$k "sed -i 's/protected-mode yes/protected-mode no/g' $redisHome/redis.conf" ssh root@$k "sed -i 's/daemonize no/daemonize yes/g' $redisHome/redis.conf" ssh root@$k "sed -i 's/# requirepass.*/requirepass redis/g' $redisHome/redis.conf" ssh root@$k "$redisHome/src/redis-server $redisHome/redis.conf" ssh root@$k "ss -nltp | grep 6379" if [ $? -eq 0 ] then printf "\e[1;32m===========================$k 启动成功=======================================\e[0m\n" else printf "\e[1;32m===========================$k 启动失败=======================================\e[0m\n" exit 5 fi done fi } # redis主从复制 redisBGSAVE(){ ip=$(ifconfig eth0 | grep netmask | awk '{print $2}') # ip=$(ip a | grep global | awk '{print $2}' | awk -F '/' '{print $1}') egrep -v "^$|#" $redisHome/redis.conf > $redisHome/redis.conf.bak sed -i "s/# replicaof.*/replicaof $ip 6379/g" $redisHome/redis.conf.bak sed -i "s/# masterauth.*/masterauth redis/g" $redisHome/redis.conf.bak $redisHome/src/redis-server $redisHome/redis.conf if [ $? -eq 0 ] then printf "\e[1;32m===========================redis01 启动成功=====================================\e[0m\n" else printf "\e[1;32m===========================redis01 启动失败=====================================\e[0m\n" exit 6 fi for m in redis02 redis03 do scp $redisHome/redis.conf.bak root@$m:$redisHome/redis.conf ssh root@$m "$redisHome/src/redis-server $redisHome/redis.conf" ssh root@$m "ss -nltp | grep 6379" if [ $? -eq 0 ] then printf "\e[1;32m===========================$m 启动成功===================================== \e[0m\n" else printf "\e[1;32m===========================$m 启动失败===================================== \e[0m\n" exit 7 fi done } # redis-cluster集群 redisCluster(){ node1=6001 node2=6002 ulimit=$(ulimit -a | grep 'open files' | awk '{print $NF}') if [ $ulimit -le 10032 ] then ulimit -n 10032 else printf "\e[1;32m===========================开始部署集群==================================== \e[0m\n" fi mkdir -p $redisClusterHome/{$node1,$node2}/{conf,data,log} egrep -v "^$|#" $redisHome/redis.conf > $redisClusterHome/$node1/conf/redis-$node1.conf sed -i "s/port.*/port $node1/g" $redisClusterHome/$node1/conf/redis-$node1.conf sed -i "s#dir.*#dir $redisClusterHome/$node1/data#g" $redisClusterHome/$node1/conf/redis-$node1.conf sed -i "s#pidfile.*#pidfile $redisClusterHome/$node1/#g" $redisClusterHome/$node1/conf/redis-$node1.conf sed -i "s#logfile.*#logfile $redisClusterHome/$node1/log/redis.log#g" $redisClusterHome/$node1/conf/redis-$node1.conf cat >> $redisClusterHome/$node1/conf/redis-$node1.conf <<EOF cluster-enabled yes cluster-config-file $redisClusterHome/$node1/conf/cluster-$node1.conf cluster-node-timeout 5000 EOF sed "s/$node1/$node2/g" $redisClusterHome/$node1/conf/redis-$node1.conf > $redisClusterHome/$node2/conf/redis-$node2.conf scp -r $redisClusterHome root@redis02:/opt/ scp -r $redisClusterHome root@redis03:/opt/ for n in redis01 redis02 redis03 do for node in $node1 $node2 do ssh root@$n "$redisHome/src/redis-server $redisClusterHome/$node/conf/redis-$node.conf" ssh root@$n "ss -nltp | grep $node" if [ $? -eq 0 ] then printf "\e[1;32m===========================$node 启动成功================================== \e[0m\n" else printf "\e[1;32m===========================$node 启动失败================================== \e[0m\n" exit 8 fi done done } # 引用位置变量,选择自己需要的功能,如果已有redis环境,需要配置cluster集群,需要自己根据环境修改脚本 case $1 in 'install') hostsIp sshCopy installRedis ;; 'bgsave') redisBGSAVE ;; 'cluster') redisCluster ;; '*') printf "\e[1;32m===========================输入错误,请检查拼写=================================\e[0m\n" exit 9 ;; esac