记录-Redis单机搭建一键安装脚本

一键安装脚本 已兼容服务启动方式和开机自启

文件下载位置 /usr/local/package
安装位置 /usr/local/redis
数据存储位置(aof rdb) /usr/local/redis/data
最终配置文件位置 /usr/local/redis/conf/redis.conf
最终日志记录位置 /usr/local/redis/logs/redis.log
PID文件位置 /run/redis.pid

root目录存在redis.conf配置文件则以存在的为主, 若不存在则创建一个默认的配置文件
默认配置文件端口是7399 密码是Cyber888_VV
只允许本机访问, 若要开通远程访问修改配置文件bind 127.0.0.1为 bind 0.0.0.0

vim /root/redis.sh
#!/bin/bash
# 此命令可以去除文件内在windows编辑的shell文件的\r\n字符等
#sed -i 's/\r//' ./*.sh && chmod 777 ./*.sh
# 清屏
clear
# 必要插件的安装/检查 不打印日志可以在结尾加上 make &> /dev/null
yum install -y gcc gcc-c++ wget make

# 设置输出颜色
# 红色异常
red='-e \e[31m'
# 绿色正常
green='-e \e[32m'
# 黄色警告
yellow='-e \e[33m'
# 颜色输出结尾
end='\e[0m'

# 设置下载包所在位置
package_directory='/usr/local/package'
# Redis选择版本
redis_version='redis-5.0.3'
# 解压之后的源码文件夹
redis_source_directory="${package_directory}/${redis_version}"
# Redis安装所在文件夹
redis_directory='/usr/local/redis'
# Redis安装包全名称
redis_package="${redis_version}.tar.gz"
# Redis配置文件名称
redis_config="redis.conf"

#====================================安装前检查=========================================

# -- 配置文件的检查 没有则创建默认的配置属性
redis_config_directory='/root'
if [ -f "${redis_config_directory}/${redis_config}" ];
  then
    echo $green"指定目录$redis_config_directory找到redis配置文件:$redis_config, 进行安装redis!"$end
else
  echo $yellow"指定目录${redis_config_directory}未找到redis配置文件:$redis_config, 创建默认配置继续安装!"$end
  
cat >"${redis_config_directory}/${redis_config}"<<- EOF
# 单位不区分大小写,因此 1GB 1Gb 1gB 都是一样的。
################################## INCLUDES 引入 ###################################
# 在此处包含一个或多个其他配置文件。如果您有一个适用于所有 Redis 服务器的标准模板,但还需要自定义一些每个服务器的设置,这将非常有用。包含文件可以包含其他文件,因此请明智地使用它。
# 注意选项“include”不会被管理员或 Redis Sentinel 的命令“CONFIG REWRITE”重写。
# 由于 Redis 始终使用最后处理的行作为配置指令的值,因此您最好将包含放在此文件的开头以避免在运行时覆盖配置更改。
# 相反,如果您有兴趣使用包含来覆盖配置选项,最好使用包含作为最后一行。
# include /path/to/local.conf
# include /path/to/other.conf

################################## MODULES #####################################
# 在启动时加载模块。如果服务器无法加载模块,它将中止。可以使用多个 loadmodule 指令。
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so

################################## NETWORK #####################################
# 所有可访问 bind 0.0.0.0 指定访问 192.168.1.1 192.168.5.233 空格隔开
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1
# 如果protected-mode是yes的话,如果没有指定bind或者没有指定密码,那么只能本地访问。
protected-mode yes
# 端口 default = 6379
port 7399
# 密码
requirepass Cyber888_VV
# TCP 侦听()积压。
# 在每秒请求数较高的环境中,您需要大量积压,以避免客户端连接缓慢的问题。
# 请注意,Linux 内核会默默地将其截断为 /proc/sys/net/core/somaxconn 的值,因此请确保同时提高 somaxconn 和 /proc/sys/ipv4/tcp_max_syn_backlog 的值以获得所需的效果。
tcp-backlog 511
# Unix 套接字。指定将用于侦听传入连接的 Unix 套接字的路径。没有默认值,因此 Redis 在未指定时不会侦听 unix 套接字。
# unixsocket /tmp/redis.sock
# unixsocketperm 700
# 是否超时无操作关闭连接 timeout 0代表永不关闭。
timeout 0
# TCP连接保活策略 tcp-keepalive
# TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,
# 以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。
tcp-keepalive 300

################################# GENERAL #####################################
# 默认情况下,Redis 不作为守护进程运行。如果需要,请使用“是”。请注意,Redis 在守护进程时会在 var/run/redis.pid 中写入一个 pid 文件。
daemonize yes
# pid文件位置
pidfile "/run/redis.pid"
# 指定服务器日志详细级别。这可以是以下之一:
# debug (很多资料,对开发测试很有用)
# verbose (许多很少有用的信息,但不像调试级别那样混乱)
# notice (适度冗长,您可能在生产中想要什么)
# warning (只记录非常重要的关键消息)
loglevel warning
# 指定日志文件名。此外,空字符串可用于强制 Redis 登录标准输出。请注意,如果您使用标准输出进行日志记录但守护进程,则日志将被发送到 dev/null
logfile "/usr/local/redis/logs/redis.log"
# 要启用对系统记录器的日志记录,只需将“启用系统日志”设置为是,并可选择更新其他系统日志参数以满足您的需要。
# syslog-enabled no
# 指定系统日志标识。
# syslog-ident redis
# 指定系统日志工具。必须是 USER 或介于 LOCAL0-LOCAL7 之间。
# syslog-facility local0
# 设置数据库的数量。默认数据库是 DB 0 SELECT <1..16>
databases 8
# 启动是否显示logo
always-show-logo yes

################################ 快照  ################################
#    900 秒(15 分钟)后 如果至少 1 个键更改
#    300 秒(5 分钟)后 如果至少 10 个键在
#    60 秒后更改 如果至少 10000 个键更改
# 如果想禁用RDB持久化的策略,只要不设置任何save指令就可以,或者给save传入一个空字符串参数也可以达到相同效果,就像这样:
# save ""
save 900 1
save 300 10
save 60 10000
# 出现失败是否继续写入
stop-writes-on-bgsave-error yes
# 是否进行压缩存储。如果是的话,Redis会采用LZF算法进行压缩。如果不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbcompression yes
# 在存储快照后,我们还可以让Redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum no
# 快照文件的名称
dbfilename dump.rdb
# 快照文件存放的路径
# Append Only File 也将在此目录中创建。请注意,您必须在此处指定目录,而不是文件名。
dir /usr/local/redis/data

################################### CLIENTS ####################################
# 允许客户端的连接数
maxclients 500

############################## MEMORY MANAGEMENT ################################
# 指定Redis最大内存限制。达到内存限制时,Redis将尝试删除已到期或即将到期的Key。
maxmemory 2GB
# 配置达到最大内存限制后,Redis进行何种操作。默认noeviction
# volatile-lru -> 当内存不足时,从设置了过期时间的key中使用LRU(最近最少使用)算法,选出最近使用最少的数据,进行淘汰;
# allkeys-lru -> 当内存不足时,从所有key中使用LRU(最近最少使用)算法,选出最近使用最少的数据,进行淘汰。
# volatile-lfu -> 当内存不足时,从设置了过期时间的key中使用LFU算法,选出使频率最低的数据,进行淘汰。
# allkeys-lfu -> 当内存不足时,从所有key中使用LFU算法,从所有key中使用LFU算法,选出使频率最低的数据,进行淘汰。
# volatile-random -> 当内存不足时,从设置了过期时间的key中,随机选出数据,进行淘汰。
# allkeys-random -> 当内存不足时,从所有的key中,随机选出数据,进行淘汰。
# volatile-ttl -> 当内存不足时,从设置了过期时间的key中,选出即将过期的数据(按照过期时间的先后,选出先过期的数据),进行淘汰.
# noeviction -> 当内存不足时,禁止淘汰数据,写入操作报错默认策略,是Redis默认的内存淘汰策略。
# LRU 表示最近最少使用
# LFU 表示最不常用
# LRU、LFU 和 volatile-ttl 都是使用近似随机算法实现的。
maxmemory-policy allkeys-lfu
# LRU、LFU 和最小 TTL 算法不是精确算法,而是近似算法(为了节省内存),因此您可以对其进行调整以提高速度或准确性。
# 对于默认 Redis 将检查五个键并选择最近使用较少的一个,您可以使用以下配置指令更改样本大小。
# 默认值 5 会产生足够好的结果。 10 非常接近真实的 LRU,但 CPU 成本更高。 3更快但不是很准确。
maxmemory-samples 5

# 配置Redis主从复制时,从库超过maxmemory也不淘汰数据。
# 这个配置主要是为了保证主从库的一致性,因为Redis的淘汰策略是随机的,如果允许从库自己淘汰key,
# 那么会导致主从不一致的现象出现(master节点删除key的命令会同步给slave节点)。
# replica-ignore-maxmemory yes

############################# LAZY FREEING ####################################
# Redis有两个删除keys的原语。一个是DEL并且它是一个阻塞的删除对象的操作。意味着server会停止处理新的command以便以同步的方式回收与对象关联的所有内存。如果被删除的key关联的是一个小对象,那么执行DEL命令所需要的时间非常短,与Redis中其它O(1)或O(log_N)的命令时间开销几乎一样。然鹅,如果key与包含了数百万个元素的大对象相关联,那么服务器为了完成删除命令会阻塞很长时间(甚至几秒钟)。
# 出于以上原因,Redis提供了非阻塞的删除原语,例如UNLINK(非阻塞式的DEL)和FLUSHALL、FLUSHDB命令的ASYNC选项,以便在后台回收内存。这些命令会在常量(固定的)时间内执行。另外一个线程会在后台尽可能快的以渐进式的方式释放对象。
# 使用DEL,UNLINK以及FLUSHALL和FLUSHDB的ASYNC选项是由用户来控制的。这应该由应用程序的设计来决定使用其中的哪一个。 然鹅,作为其它操作的副作用,Redis server有时不得不去删除keys或者刷新整个数据库。具体来说,Redis在以下情况下会独立于用户调用而删除对象:
# 1) 由于maxmemory 和maxmemory policy的设置,为了在不超出指定的内存限制而为新对象腾出空间而逐出旧对象;
# 2) 因为过期:当一个key设置了过期时间且必须从内存中删除时;
# 3) 由于在已经存在的key上存储对象的命令的副作用。例如,RENAME命令可能会删除旧的key的内容,当该key的内容被其它内容代替时。类似的,SUNIONSTORE或者带STORE选项的SORT命令可能会删除已经存在的keys。SET命令会删除指定键的任何旧内容,以便使用指定字符串替换。
# 4)在复制过程中,当副库与主库执行完全重新同步时,整个数据库的内容将被删除,以便加载刚刚传输的RDB文件。
# 在上述所有情况下,默认情况是以阻塞方式删除对象,就像调用DEL一样。但是,你可以使用以下配置指令专门配置每种情况,以非阻塞的方式释放内存,就像调用UNLINK一样。

# 内存达到设置的maxmemory时,是否使用惰性删除,对应上面 1)
lazyfree-lazy-eviction no
# 过期keys是否惰性删除,对应上面 2)
lazyfree-lazy-expire no
# 内部删除选项,对应上面选项 3)的情况是否惰性删除
lazyfree-lazy-server-del no
# slave接收完RDB文件后清空数据是否是惰性的,对应上面情况 4)
replica-lazy-flush no

############################## APPEND ONLY MODE ###############################
# 开始/关闭aof
appendonly yes
# aof文件名称
appendfilename "appendonly.aof"
# 执行fsync()系统调用刷盘的频率
# everysec:每秒执行,可能会丢失最后一秒的数据。
# always:每次写操作执行,数据最安全,但是对性能有影响。
# no:不强制刷盘,由内核决定什么时候刷盘,数据最不安全,性能最好。
# appendfsync always
appendfsync everysec
# appendfsync no

# 当有后台保存任务时,关闭appendfsync
# 当后台在执行save任务或者aof文件的rewrite时,会对磁盘造成大量I/O操作,在某些Linux配置中,Redis可能会在fsync()系统调用上阻塞很长时间。需要注意的是,目前还没有很好的解决方法,因为即使是在不同的线程中执行fsync()调用也会阻塞write(2)调用。
# 为了缓解上述问题,可以使用以下选项,防止在进行BGSAVE或者BGREWRITEAOF时在主进程中调用fsync()。
# 这意味这如果有其它子进程在执行saving任务时,Redis的行为相当于配置了appendfsync none。实际上,
# 这意味着在最坏的情况下(使用Linux默认设置),可能丢失最多30s的日志。
no-appendfsync-on-rewrite no

# 自动重写aof文件
# 在AOF文件大小增长到了指定的百分比(相对于上次AOF文件大小的增长量)或者最小体积时,自动调用BGREWRITEAOF命令重写AOF文件。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# AOF文件末尾被截断
# 在Redis启动过程的最后,当AOF数据加载回内存时,可能会发现AOF文件被截断。当运行Redis的系统崩溃时,可能会发生这种情况,尤其是在安装ext4文件系统时,没有data=ordered选项(然而,当Redis本身崩溃或中止,但操作系统仍然正常工作时,这种情况不会发生)。
# Redis可以在出现这种情况时带着错误退出,也可以加载尽可能多的数据(现在是默认值),并在发现AOF文件在最后被截断时启动。以下选项控制此行为。
# 如果aof load truncated设置为yes,则会加载一个被截断的aof文件,Redis服务器开始发送日志,通知用户该事件。否则,如果该选项设置为“no”,服务器将因错误而中止并拒绝启动。当选项设置为“no”时,用户需要使用“redis-check-aof”实用程序修复AOF文件,然后才能重新启动服务器。
# 请注意,如果在中间发现AOF文件已损坏,服务器仍将退出并出现错误。此选项仅适用于Redis尝试从AOF文件读取更多数据,但找不到足够字节的情况。
aof-load-truncated yes

# 开启混合持久化
# 当重写AOF文件时,Redis能够在AOF文件中使用RDB前导,以更快地重写和恢复。启用此选项后,重写的AOF文件由两个不同的节组成:
# [RDB file][AOF tail]
# 加载时,Redis识别出AOF文件以“Redis”字符串开头,并加载带前缀的RDB文件,然后继续加载AOF尾部。
aof-use-rdb-preamble no

################################ LUA SCRIPTING-LUA 脚本相关 ###############################
# 配置LUA脚本最大执行时长
# 单位毫秒,默认5s。当脚本运行时间超过限制后,Redis将开始接受其他命令当不会执行,而是会返回BUSY错误。
lua-time-limit 5000

################################## SLOW LOG 慢日志 ###################################
# Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度
# 超过这个值的命令会被记录到慢日志中,默认10000微秒。
slowlog-log-slower-than 10000
# 可以通过这个配置改变慢日志文件的最大长度,超过这个长度后最旧的记录会被删除。默认128。
slowlog-max-len 128

################################ LATENCY MONITOR 延迟监控 ##############################
# Redis延迟监控子系统在运行时对不同的操作进行采样,以收集与Redis实例可能的延迟源相关的数据。
# 通过延迟命令,用户可以打印图表和获取报告。
# 系统仅记录在等于或大于通过延迟监视器阈值配置指令指定的毫秒数的时间内执行的操作。当其值设置为零时,延迟监视器将关闭。
# 默认情况下,延迟监控是禁用的,因为如果没有延迟问题,通常不需要延迟监控, 而且收集数据会对性能产生影响,虽然影响很小,但可以在大负载下进行测量。
# 如果需要,可以在运行时使用命令CONFIG SET latency-monitor-threshold <millists>轻松启用延迟监控。
# 设置延迟阈值
latency-monitor-threshold 0

############################# EVENT NOTIFICATION 事件通知 ##############################
# Redis 可以通知 PubSub 客户端有关密钥空间中发生的事件。此功能记录在 http://redis.io/topics/notifications
# 实时的监控keys和values的更改。
# Redis可以将key space中发生的事件通过发布/订阅通知客户端。
# 例如,如果notify-keyspace-events已经启用,并且客户端对数据库0中存储的键foo执行DEL操作,则将通过Pub/Sub发布两条消息:
#      PUBLISH _keyspace@0_:foo del
#      PUBLISH _keyevent@0_:del foo
#  可以在一组类中选择Redis将通知的事件。每个类由一个字符标识:
#     K Keyspace事件,通过__keyspace@<db>__前缀发布。
#     E Keyevent事件,通过__keyevent@<db>__ 前缀发布。
#     g 通用命令(非特定类型),例如DEL,EXPIRE,RENAME…
#     $ String相关命令
#     l List相关命令
#     s Set相关命令
#     h Hash相关命令
#     z Sorted Set(ZSet)相关命令
#     x 过期事件(每次key过期时生成的事件)
#     e 回收事件(达到maxmemory时回收key的事件)
#     t Stream相关命令
#     m Key-miss events,访问的key不存在时触发
#     A g$lshzxet的别名,因此AKE代表了除了m之外的所有事件。

#  默认情况下所有事件通知都是关闭的,因为大多数用户不需要这些特性。且需要至少有K或者E时事件通知才会生效。
notify-keyspace-events ""

########################### ACTIVE DEFRAGMENTATION 碎片整理 #######################
# 主动(在线)碎片整理允许Redis服务器压缩内存中数据的少量分配和释放之间的空间(内存碎片),从而回收内存。
# 碎片化是每个分配器(幸运的是,Jemalloc比较少发生这种情况)和某些工作负载都会发生的自然过程。通常需要重启服务器以降低碎片,或者至少清除所有数据并重新创建。然而,多亏了Oran Agra为Redis 4.0实现的这一功能,这个过程可以在服务器运行时以“hot”的方式在运行时发生(类似热部署的意思,不需要停止服务)。
# 基本上,当碎片超过某个级别(参见下面的配置选项)时,Redis将通过利用特定的Jemalloc功能(以了解分配是否导致碎片并将其分配到更好的位置)开始在连续内存区域中创建值的新副本,同时释放数据的旧副本。对所有键递增地重复该过程将导致碎片降至正常值。
# 需要了解的重要事项:
# 1.默认情况下,此功能被禁用,并且仅当您编译Redis以使用我们随Redis源代码提供的Jemalloc副本时,此功能才有效。这是Linux版本的默认设置。
# 2.如果没有碎片问题,则无需启用此功能。
# 3.一旦遇到内存碎片,可以在需要时使用命令CONFIG SET activedefrag yes启用此功能。
# 配置参数能够微调碎片整理过程的行为。如果你不确定它们是什么意思,最好不要改变默认值。
# 开启活动碎片整理
# activedefrag yes
# M启动活动碎片整理的最小内存碎片阈值
# active-defrag-ignore-bytes 100mb
# 启动活动碎片整理的最小内存碎片百分比
# active-defrag-threshold-lower 10
# 尝试释放的最大百分比
# active-defrag-threshold-upper 100
# 最少CPU使用率
# active-defrag-cycle-min 5
# 最大CPU使用率
# active-defrag-cycle-max 75
# 最大扫描量
# 主字典扫描
# active-defrag-max-scan-fields 1000
# 使用后台线程
# jemalloc-bg-thread yes

EOF

  echo $yellow"默认文件写入完成!"$end
  
fi


# 检查安装包存放目录是否存在
echo $green"redis安装包的下载位置是:$package_directory"$end
if [ -d $package_directory ];
  then echo ''
else
  mkdir $package_directory
fi


# 检查是否已存在二进制安装
if [ -d $redis_directory ];
  then
    echo $red"找到$redis_directory目录,你可能已经安装了redis,请检查!"$end
    echo $red'终止程序!'$end
    exit
fi

echo ${green}'开始下载redis......'${end}
echo ${green}"redis安装包版本为: $redis_version!"${end}
sleep 1

# 清空文件夹原有可能存在的旧包 或者所有与Redis相关的
echo $yellow'开始清除redis原有下载安装包,如果有的话!'$end
rm -rf ${package_directory:-default}/redis*
# 进入文件夹
cd $package_directory || exit 0


# 下载
if wget "https://download.redis.io/releases/$redis_package"
  then
    # 解压
    tar -zxvf $redis_package
else
  echo $red'下载Redis安装包失败,请检查网络!'$end
  echo $red'终止程序!'$end
  exit
fi

# 进入源码文件夹
cd $redis_source_directory || exit 0

# 编译
if make && make install PREFIX=$redis_directory
  then
    echo $green'编译成功!'$end
else
  echo $red'编译失败!'$end
  echo $red'终止程序!'$end
  exit
fi

# 执行成功 创建所需的文件夹 并赋予读写权限
echo $green'创建redis运行所需的文件夹: conf、data、logs!'$end
mkdir -p ${redis_directory}/{conf,data,logs} && chmod -R 777 ${redis_directory}/{data,logs}
# 移动配置文件至指定文件夹
mv "${redis_config_directory}/${redis_config}" "${redis_directory}/conf"

# 添加至服务
redis_service_directory='/lib/systemd/system'
redis_service='redis.service'
cat >"${redis_service_directory}/${redis_service}"<<- EOF
# 1, 新建redis.service文件 vim /lib/systemd/system/redis.service
# 2, 添加以下内容
# 3, systemctl enable redis.service
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=${redis_directory}/bin/redis-server ${redis_directory}/conf/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF


# 写入文件的内容
content="
# 解决Redis启动的三个告警问题 此处解决两个 第三个请查看 /etc/rc.d/rc.local
net.core.somaxconn = 1024
vm.overcommit_memory = 1"

read -r -t 30 -p "是否追加解决redis启动告警的问题 (y/n): " confirm
case ${confirm} in
  y | Y)
# 写入文件尾行
  echo $yellow"开始写入到 /etc/sysctl.conf 解决redis启动告警的tcp前两个问题,请手动检查, 写入内容为: $content"$end
cat >> /etc/sysctl.conf <<- EOF
$content
EOF

# 重新加载配置文件
sysctl -p

# 写入第三个解决告警的问题
echo "# 解决redis启动的第三个告警问题
echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.d/rc.local

  # 给权限 重新刷新文件
  chmod +x /etc/rc.d/rc.local
  source /etc/rc.d/rc.local
  ;;
esac

# 开启配置
systemctl enable redis.service
# 刷新文件
systemctl daemon-reload
# 启动服务
systemctl start redis
# 结束
echo "结束!"

去除windows的格式

sed -i 's/\r//' /root/redis.sh && chmod 777 /root/redis.sh
# 执行
sh /root/redis.sh
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值