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
shell脚本部署redis以及redis主从复制和redis-cluster集群的更多相关文章
- Redis搭建(五):Cluster集群搭建
一.方案 1. 介绍 redis3.0及以上版本实现,集群中至少应该有奇数个节点,所以至少有三个节点,官方推荐三主三从的配置方式 使用哈希槽的概念,Redis 集群有16384个哈希槽,每个key通过 ...
- Redis 超详细的手动搭建Cluster集群步骤
功能概述 Redis Cluster是Redis的自带的官方分布式解决方案,提供数据分片.高可用功能,在3.0版本正式推出. 使用Redis Cluster能达到负载均衡的问题,内部采用哈希分 ...
- Redis搭建(七):Redis的Cluster集群动态增删节点
一.引言 上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cluste ...
- 2、Redis 底层原理:Cluster 集群部署与详解
Redis 简介 Redis 提供数据缓存服务,内部数据都存在内存中,所以访问速度非常快. 早期,Redis 单应用服务亦能满足企业的需求.之后,业务量的上升,单机的读写能力满足不了业务的需求,技术上 ...
- centos6下redis cluster集群部署过程
一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...
- K8S部署Redis Cluster集群
kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html Redis 介绍 • Redis代表REmote DI ...
- K8S部署Redis Cluster集群(三主三从模式) - 部署笔记
一.Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序 ...
- Redis高可用(持久化、主从复制、哨兵、集群)
Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...
- redis cluster集群部署
上一篇http://www.cnblogs.com/qinyujie/p/9029153.html,主要讲解了 redis cluster 集群架构 的优势.redis cluster 和 redis ...
随机推荐
- Three.js 实现虎年春节3D创意页面
背景 虎年 春节将至,本文使用 React + Three.js 技术栈,实现趣味 3D 创意页面.本文包含的知识点主要包括:ShadowMaterial. MeshPhongMaterial 两种基 ...
- 万字总结Keras深度学习中文文本分类
摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...
- 用格里高利公式求给定精度的PI值
本题要求编写程序,计算序列部分和 4∗(1−1/3+1/5−1/7+...) ,直到最后一项的绝对值小于给定精度eps. 输入格式: 输入在一行中给出一个正实数eps. 输出格式: 在一行中按照&qu ...
- 【Java】main方法的理解
main方法的理解 main()方法作为程序的入口 main()方法也是一个普通的静态方法 main()方法可以作为我们与控制台交互的方式.(之前:使用Scanner) main方法中的参数args就 ...
- Visaul Studio 2015 MFC 应用程序工程创建
近一段时间开始接触到MFC桌面开发程序,忙完了一段时间的项目开发之后,来整理整理Visaul Studio 2015开发MFC桌面程序的基本功能. 首先从创建软件工程项目开始,Visaul Studi ...
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...
- leetcode 51. N皇后 及 52.N皇后 II
51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...
- Scala 中下划线的用法
1.存在性类型:Existential types def foo(l: List[Option[_]]) = ... 2.高阶类型参数:Higher kinded type parametersca ...
- IoC容器-Bean管理XML方式(注入空值和特殊符号)
Ioc操作Bean管理(xml注入其他类型属性), 字面量 (1)null值 (2)属性值包含特殊符号
- linux中yum本地私有仓库安装搭建《全面解析》
目录 一:yum本地仓库安装 1.yum简介 2.yum安装解析 二:yum安装的生命周期 三:yum私有仓库作用与必要性 四:搭建yum私有仓库 本地版本 1.下载必须的软件包 2.创建软件仓库(就 ...