shell脚本部署redis以及redis主从复制和redis-cluster集群

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: shell脚本部署redis以及redis主从复制和redis-cluster集群
# 关于脚本:
# 使用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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
121 1
|
1月前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
41 5
|
2月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
73 2
6种方法打造出色的Shell脚本
|
2月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
73 1
|
2月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
67 2
|
3月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
68 6
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
93 4
|
3月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
67 3
|
3月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
41 0