redis一键部署脚本

发布时间 2023-12-02 02:30:30作者: tom_log
#!/bin/bash
#DEST: 本地环境搭建redis
#verion: 1.0

################################################
# 系统 Centos7.9 2009
# 脚本一键编译安装redis
# 使用需要有root权限
# 若yum安装依赖报错或无法安装,尝试手动安装或跳过checkTools函数即可
# 初始端口密码于开头声明变量可按需求更改
# 脚本使用搭配官网下载好的安装包,解压后将脚本置于安装包文件夹内运行即可
# 适用于redis3.x-5.x 如需要高版本,编译安装正常,需要手动改配置文件部分
# 默认安装目录 /opt/ 日志 /var/log 二进制文件 /uar/local/bin 
##################################################

[[ $USER != "root" ]] && echo -e "\033[31m +-------------请使用ROOT用户操作!\033[0m"&& \
    echo -e "\033[31m +-------------安装程序退出\033[0m" && exit 2

source /etc/profile
cat /etc/redhat-release 

LIMT_MEM=$(awk '/MemTotal/ {printf("%.0f\n", $2*0.8)}' /proc/meminfo)
#HOST_IP=`ifconfig eth0 | awk '/inet / {print $2}'`
REDIS_PORT="16379"
REDIS_PWD="123456"
INSTALL_DIR=/opt/redis
REDIS_LOG_DIR="/var/log/redis"
RDB_DIR="${INSTALL_DIR}/data/"

# 初始化创建用户与目录
[[ ! -d ${INSTALL_DIR} ]] && mkdir -p ${INSTALL_DIR} 
[[ ! -d ${REDIS_LOG_DIR} ]] && mkdir -p ${REDIS_LOG_DIR} 
[[ ! -d ${RDB_DIR} ]] && mkdir -p ${RDB_DIR} 
id redis &>/dev/null
[[ $? != 0 ]] && groupadd redis && useradd redis -u 1005 -g redis
mv ./* ${INSTALL_DIR} 
chown -R redis.redis /opt/redis

# 检查yum源
checkYumRepo(){
    if sudo yum list -q updates >/dev/null 2>&1; then
        echo -e "\033[32m +-------------Yum 源可用\033[0m"
    else
        echo -e "\033[31m +-------------Yum 源不可用\033[0m" &&\
        read -p "\033[31m +-------------请确认是否不需要Yum源 y/n\033[0m" ACK &&\
        [[ $ACK != "n" ]] && exit 2 
    fi
}

# 检查编译工具版本
checkTools(){
    GCC_MIN_VERSION="4.7"
    gcc_version=$(gcc --version | awk '{print $NF}')
    if [[ $(echo -e "$gcc_version >= $GCC_MIN_VERSION" | bc -l) -eq 0 ]]; then
        echo -e "\033[31m +-------------GCC 版本过低,需要升级到 $GCC_MIN_VERSION 或更高版本\033[0m"
        checkYumRepo
        # 安装 devtoolset-9(包含 GCC 9)软件集合
        sudo yum install centos-release-scl -y
        #sudo yum install devtoolset-9 -y
    fi
    # 检查 make 是否已安装
    if ! command -v make &> /dev/null; then
        echo -e "\033[31m +-------------未找到 make 工具,将尝试安装\033[0m"
        sudo yum install make -y
    fi
    # 检查 C++ 编译器是否已安装
    if ! command -v g++ &> /dev/null; then
        echo -e "\033[31m +-------------未找到 C++ 编译器,将尝试安装\033[0m"
        sudo yum install gcc-c++ -y
    fi
}

compileInstall(){
    while true
    do
        echo -e "\033[32m +-------------编译开始\033[0m"
        cd ${INSTALL_DIR}/src && make || make clean && checkTools
        cd ${INSTALL_DIR}/src && make install
        if [ -x "/usr/local/bin/redis-cli" ]; then
            echo -e "\033[33m +-------------编译成功\033[0m"
            break
        fi
        echo -e "\033[31m +-------------编译失败\033[0m"
        echo -e "\033[31m +-------------重试编译\033[0m"
    done
}

checkConf(){   
echo -e "\033[32m +-------------写入配置文件\033[0m"
cp ${INSTALL_DIR}/redis.conf ${INSTALL_DIR}/redis.conf.bk

#配置文件仅做简单优化,内存限制当前主机80%,关闭TMP,启用密码,启用rdb
#防止低内存保存错误
sysctl vm.overcommit_memory=1
# 禁用TMP
echo -e "\033[31m +-------------禁用TMP\033[0m"
echo madvise | tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | tee /sys/kernel/mm/transparent_hugepage/defrag

        cat > ${INSTALL_DIR}/redis.conf<<EOF
protected-mode no
port ${REDIS_PORT}
tcp-backlog 511
requirepass "${REDIS_PWD}"
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_${REDIS_PORT}.pid
loglevel notice
logfile "${REDIS_LOG_DIR}/redis${REDIS_PORT}.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump_${REDIS_PORT}.rdb
dir ${RDB_DIR}
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
maxmemory ${LIMT_MEM}
#####################
#主从模式从库需手动配置
#从库可考虑开启aof或混合
#slaveof ip port
#masterauth 主节点密码
#slave-read-only yes #是否只读
EOF
    chown redis.redis /var/log/redis
    chmod 755 /var/log/redis
    chown  redis.redis /opt/redis/redis.conf
    chmod 644 /opt/redis/redis.conf
    echo -e "\033[32m +-------------写入配置文件成功\033[0m"
}

# 添加systemd并运行检查程序状态
writeService(){
    echo -e "\033[32m +-------------写入systemd\033[0m"
    cat > /usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /opt/redis/redis.conf
# 无法终止进程,因为自带命令需要输入密码,需要终止请手动关闭
# /usr/local/bin/redis-cli shutdown -a "密码" -p "端口" 
ExecStop=pkill -f redis
User=redis
Group=redis

[Install]
WantedBy=multi-user.target
EOF

    echo -e "\033[32m +-------------写入systemd成功\033[0m"
    echo -e "\033[32m +-------------启动Redis服务\033[0m"
    systemctl daemon-reload
    systemctl enable redis
    echo -e "\033[32m +-------------正在启动Redis服务\033[0m"
    systemctl start redis
    sleep 6

    # 检测 Redis 服务是否在运行并且监听指定端口
    if ps aux | grep -v grep | grep -q "redis" && ss -tln | grep -q ":${REDIS_PORT}"; then
        echo -e "\033[32m +-------------Redis 服务正在运行并监听 ${REDIS_PORT} 端口\033[0m"
        echo -e "\033[32m +-------------Redis 服务安装成功!\033[0m"
        echo -e "\033[32m +-------------测试服务连接性\033[0m"
        echo ping | redis-cli -a "${REDIS_PWD}" -p ${REDIS_PORT}
        echo -e "\033[32m +-------------回复PONG即可连通\033[0m"
    else
        echo -e "\033[31m +-------------Redis 服务未运行或未监听 ${REDIS_PORT} 端口\033[0m"
	echo -e "\033[31m +-------------请尝试回滚并重试\033[0m"
    fi
}

rollBack(){
	rm -rfv /opt/redis
	rm -rfv /usr/local/bin/redis*
	rm -rfv /var/log/redis
	rm -rfv //usr/lib/systemd/system/redis.service
}

compileInstall
checkConf
writeService
# 出现错误打开下方注释可清除目前安装进度
#rollBack