Redis运维脚本(十二)

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: redis运维脚本1.设计思路redis经常需要去管理,而编译安装的redis没有启动脚本以及运维相关的脚本,我们可以自己设计一个脚本需求:

redis运维脚本

1.设计思路

redis经常需要去管理,而编译安装的redis没有启动脚本以及运维相关的脚本,我们可以自己设计一个

脚本需求:

1.可以启动、关闭、重启redis

启动:当redis没有运行的时候直接启动并输出启动成功,运行了就输出已经启动,避免重复进程

关闭:如果进程存在就关闭并输出已经关闭,没有进程则直接输出redis没有启动

重启:当进程存在就先执行关闭再启动,并输出重启成功,如果进程不存在直接执行启动

2.可以查看redis进程

3.可以登录redis

4.可以查看redis日志

5.由于redis是多端口实例,因此需要能够实现指定一个端口就能够启动这个端口的进程

实现思路

1.将所有的功能都做成函数

2.通过判断$1输入的是什么指令,并执行对应的脚本

2.编写脚本

2.1.定义各种变量

将redis部署路径、端口号、配置文件、主机IP都定义成变量

redis_port=$2               #redis端口  
redis_name="redis_${redis_port}"        #redis节点所在目录名称,即redis_6379
redis_home=/data/redis_cluster/${redis_name}        #redis节点所在万年竹路径
redis_conf=${redis_home}/conf/${redis_name}.conf      #redis配置文件路径  
redis_host=`ifconfig ens33 | awk 'NR==2{print $2}'`     #主机ip
redis_pass=$3                   #redis密码,用到了在登陆那边加个-a参数
red="\e[031m"
green="\e[032m"
yellow="\e[033m"
black="\e[0m"

2.2.编写使用模块

主要实现如何使用这个脚本

Usage(){
        echo "usage: sh $0 {start|stop|restart|login|ps|logs|-h} PORT"
}

2.3.编写启动模块

思路:首先判断指定端口的redis是否存在,如果不存在就执行启动命令,启动后输出启动成功,然后将开启的端口列出来

这里还需要判断一下state的值是不是空的,因为到重启模块需要判断,在重启模块会定义一个state值,这里检测到state的值为空就输出echo的内容,到了restart的时候如果进程一开始是没有的无需输出echo内容,主要是为了重启的时候不输出这些echo


启动后echo的时候,也会判断state的值,如果不为空就表示是重启了,就提示重启成功

Start(){
        redis_cz=`netstat -lnpt | grep redis | grep "${redis_port}" | wc -l`
        if [ $redis_cz -eq 0 ];then
                redis-server ${redis_conf}
                if [ -z $state ];then
                        echo -e "${green}redis ${redis_port}实例启动成功!${black}"
                else
                        echo -e "${green}redis ${redis_port}实例重启成功!${black}"
                fi
                netstat -lnpt | grep ${redis_port}
        else
                if [ -z $state ];then
                        echo -e "${yellow}redis "${redis_port}"实例已经是启动状态!${black}"
                        netstat -lnpt | grep ${redis_port}
                fi
        fi
}

2.4.编写关闭模块

思路:首先判断进程是否存在,如果存在就执行关闭命令,不存在就直接输出没有启动

这里还需要判断一下state的值是不是空的,因为到重启模块需要判断,在重启模块会定义一个state值,这里检测到state的值为空就输出echo的内容,到了restart的时候如果进程一开始是没有的无需输出echo内容,主要是为了重启的时候不输出这些echo

Stop(){
        redis_cz=`netstat -lnpt | grep redis | grep "${redis_port}" | wc -l`
        if [ $redis_cz -gt 0 ];then
                redis-cli -h $redis_host -p $redis_port shutdown
                if [ -z $state ];then
                        echo -e "${green}redis ${redis_port}实例关闭成功!"
                fi
        else
                if [ -z $state ];then
                        echo -e "${red}redis "${redis_port}"实例没有启动!${black}"
                fi
        fi
}

2.5.编写重启模块

思路:重启模块直接调用Stop模块和Start模块即可

重启模块一开始要增加一个state的变量,当执行stop模块的时候就去判断state的值,如果不为空即使是没有进程也不需要输出stop模块的echo命令,直接执行start,属于跳过某个命令的实现吧

Restart(){
        state=restart
        Stop
        Start
}

2.7.编写登陆模块

思路:首先判断redis有没有启动,如果没有启动就询问是否启动,按y启动,按n就退出

Login(){
        redis_cz=`netstat -lnpt | grep redis | grep "${redis_port}" | wc -l`
        if [ $redis_cz -gt 0 ];then
                redis-cli -h $redis_host -p $redis_port
        else
                echo -e "${red}redis ${redis_port}实例没有启动!${black}"
                echo -en  "${yellow}是否要启动reis? [y/n]${black}"
                read action
                case $action in
                y|Y)
                        Start
                        Login
                        ;;
                n|N)
                        exit 1
                        ;;
                esac
        fi
}

2.8.编写查看进程模块

思路:直接用ps查即可

Ps(){
        ps aux | grep redis
}

2.9.编写查看日志模块

思路:配合各种变量去找到指令路径的日志即可

Logs(){
        tail -f ${redis_home}/logs/${redis_name}.log
}

2.10编写帮助信息模块

思路:通过echo输出提示信息

Help(){
        Usage
        echo "+-------------------------------------------------------------------------------+"        
        echo "| start           启动redis                                                       |"
        echo "| stop            关闭redis                                                       |"
        echo "| restart 重启redis                                                       |"
        echo "| login           登陆redis                                                       |"
        echo "| ps              查看redis的进程信息,不需要加端口号                              |"
        echo "| logs            查看redis日志持续输出                                           |"
        echo "| 除ps命令外,所有命令后面都需要加端口号                                           |"      
        echo "+-------------------------------------------------------------------------------+"        
}

2.11编写判断脚本参数模块

思路:判断脚本的参数是否不等于2,如果传入的参数不是两个的时候(因为很多模块都需要传入指令和端口这俩参数),再判断$1传入的值是不是ps和-h,因为ps和-h只需要一个参数即可,如果不是ps和-h,那么久输出使用方法,然后退出脚本

if [ $# -ne 2 ];then
        if [ "$1" != "ps" ] &&  [ "$1" != "-h" ];then
                Usage
                exit 1
        fi
fi

2.12编写指令判断模块

思路:通过case实现,根据不同的指令执行不同的函数

case $1 in
start)
        Start
        ;;
stop)
        Stop
        ;;
restart)
        Restart
        ;;
login)
        Login
        ;;
ps)
        Ps
        ;;
logs)
        Logs
        ;;
-h)
        Help
        ;;
*)
        Help
        ;;
esac

3.整合脚本内容

#!/bin/bash
#redis控制脚本
redis_port=$2
redis_name="redis_${redis_port}"
redis_home=/data/redis_cluster/${redis_name}
redis_conf=${redis_home}/conf/${redis_name}.conf
redis_host=`ifconfig ens33 | awk 'NR==2{print $2}'`
redis_pass=$3
red="\e[031m"
green="\e[032m"
yellow="\e[033m"
black="\e[0m"
Usage(){
  echo "usage: sh $0 {start|stop|restart|login|ps|logs|-h} PORT"
}
Start(){
        redis_cz=`netstat -lnpt | grep redis | grep "${redis_port}" | wc -l`
        if [ $redis_cz -eq 0 ];then
                redis-server ${redis_conf}
                if [ -z $state ];then
                        echo -e "${green}redis ${redis_port}实例启动成功!${black}"
                else
                        echo -e "${green}redis ${redis_port}实例重启成功!${black}"
                fi
                netstat -lnpt | grep ${redis_port}
        else
                if [ -z $state ];then
                        echo -e "${yellow}redis "${redis_port}"实例已经是启动状态!${black}"
                        netstat -lnpt | grep ${redis_port}
                fi
        fi
}
Stop(){
        redis_cz=`netstat -lnpt | grep redis | grep "${redis_port}" | wc -l`
        if [ $redis_cz -gt 0 ];then
                redis-cli -h $redis_host -p $redis_port shutdown
                if [ -z $state ];then
                        echo -e "${green}redis ${redis_port}实例关闭成功!"
                fi
        else
                if [ -z $state ];then
                        echo -e "${red}redis "${redis_port}"实例没有启动!${black}"
                fi
        fi
}
Restart(){
  state=restart
  Stop
  Start
}
Login(){
        redis_cz=`netstat -lnpt | grep redis | grep "${redis_port}" | wc -l`
        if [ $redis_cz -gt 0 ];then
    redis-cli -h $redis_host -p $redis_port 
  else
    echo -e "${red}redis ${redis_port}实例没有启动!${black}"
    echo -en  "${yellow}是否要启动reis? [y/n]${black}"
    read action
    case $action in 
    y|Y)
      Start
      Login
      ;;
    n|N)
      exit 1
      ;;
    esac
  fi
}
Ps(){
  ps aux | grep redis
}
Logs(){
  tail -f ${redis_home}/logs/${redis_name}.log
}
Help(){
  Usage
  echo "+-------------------------------------------------------------------------------+"  
  echo "| start   启动redis             |"
  echo "| stop    关闭redis             |"
  echo "| restart 重启redis             |"
  echo "| login   登陆redis             |"
  echo "| ps    查看redis的进程信息,不需要加端口号        |"
  echo "| logs    查看redis日志持续输出           |"
  echo "| 除ps命令外,所有命令后面都需要加端口号            |"  
  echo "+-------------------------------------------------------------------------------+"  
}
if [ $# -ne 2 ];then
  if [ "$1" != "ps" ] &&  [ "$1" != "-h" ];then
    Usage
    exit 1
  fi
fi
case $1 in 
start)
  Start
  ;;
stop)
  Stop
  ;;
restart)
  Restart
  ;;
login)
  Login
  ;;
ps)
  Ps
  ;;
logs)
  Logs
  ;;
-h)
  Help
  ;;
*)
  Help
  ;;
esac

4.使用redis运维脚本

4.1.查看帮助信息

[root@redis-1 ~]# sh redis_shell.sh  -h
usage: sh redis_shell.sh {start|stop|restart|login|ps|logs|-h} PORT
+-------------------------------------------------------------------------------+
| start   启动redis                                |
| stop    关闭redis                                |
| restart 重启redis                                |
| login   登陆redis                                  |
| ps    查看redis的进程信息,不需要加端口号                     |
| logs    查看redis日志持续输出                          |
| 除ps命令外,所有命令后面都需要加端口号                                     |
+-------------------------------------------------------------------------------+

4.2.启动redis

第一次启动会提示启动成功,第二次在启动提示已经启动

[root@redis-1 ~]# sh redis_shell.sh start 6379
redis 6379实例启动成功!
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      101765/redis-server 
tcp        0      0 192.168.81.210:6379     0.0.0.0:*               LISTEN      101765/redis-server 
[root@redis-1 ~]# sh redis_shell.sh start 6379
redis 6379实例已经是启动状态!
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      101765/redis-server 
tcp        0      0 192.168.81.210:6379     0.0.0.0:*               LISTEN      101765/redis-server 
[root@redis-1 ~]# 

4.3.关闭redis

[root@redis-1 ~]# sh redis_shell.sh stop 6379
redis 6379实例关闭成功!
[root@redis-1 ~]# 
[root@redis-1 ~]# sh redis_shell.sh stop 6379
redis 6379实例没有启动!

4.4.重启redis

[root@redis-1 ~]# sh redis_shell.sh restart 6379
redis 6379实例重启成功!
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      102654/redis-server 
tcp        0      0 192.168.81.210:6379     0.0.0.0:*               LISTEN      102654/redis-server 

4.5.登陆redis

启动了redis进行登陆

[root@redis-1 ~]# sh redis_shell.sh login 6379
192.168.81.210:6379> DBSIZE
(integer) 0

没有启动redis进行登陆,首先询问是否启动,启动即可进入,不启动就退出

[root@redis-1 ~]# sh redis_shell.sh login 6379
redis 6379实例没有启动!
是否要启动reis? [y/n]y
redis 6379实例启动成功!
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      -                   
tcp        0      0 192.168.81.210:6379     0.0.0.0:*               LISTEN      -                   
192.168.81.210:6379> DBSIZE
(integer) 0
192.168.81.210:6379> exit
[root@redis-1 ~]# sh redis_shell.sh stop 6379
redis 6379实例关闭成功!
[root@redis-1 ~]# sh redis_shell.sh login 6379
redis 6379实例没有启动!
是否要启动reis? [y/n]n

4.6.查看进程

无需跟端口号

[root@redis-1 ~]# sh redis_shell.sh ps
avahi      6935  0.0  0.1  62272  2296 ?        Ss   1月29   0:04 avahi-daemon: running [redis-1.local]
root      79457  0.1  0.4 136972  7720 ?        Ssl  2月01   1:43 redis-server 192.168.81.210:6380 [cluster]
root      79461  0.1  0.4 136972  7688 ?        Ssl  2月01   1:44 redis-server 192.168.81.210:6381 [cluster]
root     101261  0.0  0.3 151888  5648 pts/2    S+   13:10   0:01 vim redis_shell.sh
root     102767  0.0  0.0 113176  1412 pts/0    S+   13:51   0:00 sh redis_shell.sh ps
root     102772  0.0  0.0 112728   968 pts/0    R+   13:51   0:00 grep redis

4.7.查看日志

持续输出日志信息

[root@redis-1 ~]# sh redis_shell.sh logs 6379

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
107 1
|
2月前
|
运维 Java Shell
Linux非常详细的shell运维脚本一键启动停止状态SpringBoot打成可运行jar包
Linux非常详细的shell运维脚本一键启动停止状态SpringBoot打成可运行jar包
120 0
|
17天前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
46 0
|
1月前
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
13天前
|
人工智能 运维 自然语言处理
自动化运维的演进之路:从脚本到智能化管理
随着信息技术的快速发展,自动化运维已经从简单的脚本执行演变为复杂的智能化系统。本文将深入探讨自动化运维的发展脉络,从早期的脚本化工具,到当下流行的配置管理和DevOps实践,再到未来可能实现的AI驱动的运维模式。通过分析不同阶段的技术特点和挑战,揭示自动化运维如何提升效率、减少错误并预测潜在问题。
|
14天前
|
人工智能 运维 物联网
自动化运维的演进之路:从脚本到AI
【6月更文挑战第30天】自动化运维,作为提升IT效率和稳定性的关键手段,经历了从简单的脚本编写到集成复杂人工智能技术的跨越。本文将探讨自动化运维的发展历程,分析当前技术趋势,并展望未来可能的变革。
|
23天前
|
运维 监控 应用服务中间件
自动化脚本:提升运维效率的秘诀
**自动化脚本提升服务器管理效率:** - 数据库备份脚本自动执行mysqldump,保证数据安全。 - DoS防护脚本监测Nginx日志,异常IP自动屏蔽。 - 实时网卡流量监控脚本展示网络流量,辅助异常检测。 - 配置邮件发送环境,利用mailx发送告警通知。 - Nginx日志按天切割脚本优化存储,日志分析脚本提供访问洞察。 这些脚本简化运维工作,增强系统安全与响应能力。
26 6
|
24天前
|
机器学习/深度学习 人工智能 运维
自动化运维的崛起:从脚本到智能
【6月更文挑战第20天】在数字化时代,自动化运维不再是一个选择,而是企业追求效率和稳定性的必要条件。本文将探讨自动化运维的发展轨迹,从最初的脚本编写到现今的智能化工具应用,揭示自动化技术如何重塑IT运维领域,提升业务连续性和敏捷性。
|
29天前
|
运维 监控 API
自动化运维实践指南:Python脚本优化服务器管理任务
本文探讨了Python在自动化运维中的应用,介绍了使用Python脚本优化服务器管理的四个关键步骤:1) 安装必备库如paramiko、psutil和requests;2) 使用paramiko进行远程命令执行;3) 利用psutil监控系统资源;4) 结合requests自动化软件部署。这些示例展示了Python如何提升运维效率和系统稳定性。
42 8
|
10天前
|
机器学习/深度学习 运维 物联网
自动化运维的进阶之路:从脚本到智能化
在数字化转型的浪潮中,自动化运维不再是可选项,而是企业持续竞争力的核心要素。本文旨在探讨自动化运维的演变轨迹,分析从基础脚本编写到复杂系统整合、再到智能化运维平台的跃迁过程中的关键技术和实践挑战,并提供面向未来的策略建议。