Redis 安装与配置

Redis(Remote Dictionary Server),高性能 key-value 数据库,内存数据库,支持数据持久化

 

一、安装

1.编译安装

这里下载Linux版本。也有 Windows 版本,但不是官方,由微软维护,还有其它 windows 版本:tporadowski/redisredis-windowsmemurai

# 下载
curl http://download.redis.io/releases/redis-4.0.11.tar.gz -o /tmp/redis-4.0.11.tar.gz
# 解压
tar -zxvf redis-4.0.11.tar.gz
# 进入解压目录编译并安装,编译需要 gcc,不指定路径默认为 /usr/local/bin/
yum install gcc
cd redis-4.0.11
make PREFIX=/opt/redis install MALLOC=libc
# 安装后,要手动从解压路径拷贝配置文件到安装路径
# 测试是否编译成功(测试需安装 tcl)
yum install tcl
make test

编译成功,可执行文件在指定目录下
tu

# 启动服务,加上&为后台运行,不占用命令行
./redis-server &
# 指定配置文件方式启动
./redis-server ${redis.conf}
# 指定端口号启动
./redis-server --port 端口号
# 强制停止服务
kill -9 PID进程号
# 停止服务
./redis-cli -p 端口号 -h 地址 shutdown
./redis-cli -p 端口号 -h 地址 shutdown save
./redis-cli -p 端口号 -h 地址 shutdown nosave
# 启动客户端
./redis-cli
# 指定参数启动客户端
./redis-cli -p 端口号 -h 地址 -a 密码

添加到环境变量

# 修改profile文件
vi /etc/profile
# 在最后行追加
export PATH="$PATH:/opt/redis/bin"
# 刷新环境变量
. /etc/profile

2.yum 方式安装

https://mirrors.huaweicloud.com/redis/

# 要安装最新的 redis,需要安装 Remi 源 https://rpms.remirepo.net/wizard/
yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum --enablerepo=remi install redis -y
systemctl start redis
systemctl enable redis.service
# 查看下 redis 安装时创建的相关文件
rpm -qa | grep redis
rpm -ql redis
# 查看 redis 版本
redis-cli --version

 

二、配置

1.配置说明

################################## INCLUDES ###################################

# 指定包含其他的配置文件,可以在同一主机上多个 Redis 实例之间使用同一份配置文件,而同时各实例又拥有自己的特定配置文件
include /path/to/local.conf

################################## MODULES #####################################

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

################################## NETWORK #####################################

# 绑定的主机地址,后跟一个或多个 IP 地址。如果没有绑定,接受所有 IP 的连接请求
bind 127.0.0.1

# 保护模式,默认启用。禁止公网访问 redis cache,启用有两个条件:没有 bind IP,没有设置访问密码
protected-mode yes

# 指定 Redis 监听端口,默认端口为 6379,如果指定0端口,表示 Redis 不监听 TCP 连接
port 6379

#  在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志
tcp-backlog 511

# redis 不监听端口,怎么通信,redis 还支持通过 unix socket 方式来接收请求。可以通过 unixsocket 配置项来指定 unixsocket 文件的路径,并通过 unixsocketperm 来指定文件的权限
unixsocket /tmp/redis.sock
unixsocketperm 700

# 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
timeout 0

# TCP 连接保活策略,单位为秒,向连接空闲的客户端发起一次 ACK 请求,对于无响应的客户端则会关闭其连接,如果设置为 0,则不进行检测。
tcp-keepalive 300

################################# GENERAL #####################################

# 默认不启用,启用守护进程后,Redis 会把 pid 写到一 个pidfile 中,在 /var/run/redis.pid
daemonize no

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised no

# 指定了 pid 文件,Redis 启动时会将其写入指定的位置并在退出时将其删除。
pidfile /var/run/redis_6379.pid

# 指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
loglevel notice

# 日志文件的位置,指定为空字符串为标准输出,如果 redis 已守护进程模式运行,那么日志将会输出到 /dev/null
logfile ""

# 设置为 yes 会把日志输出到系统日志,默认是 no
syslog-enabled no

# 指定 syslog 的标示符,如果 'syslog-enabled' 是 no,则这个选项无效
syslog-ident redis

# 指定 syslog 设备(facility), 必须是 USER 或者 LOCAL0 到 LOCAL7
syslog-facility local0

# 设置数据库的数量,默认数据库为 0,可以使用select <dbid> 切换数据库,dbid 是介于 0 到 'databases'-1 之间的数
databases 16

# 设置为 yes 来强制执行 4.0 之前的行为,始终在启动日志中显示 ASCII 艺术徽标(Logo)。
always-show-logo yes

################################ SNAPSHOTTING  ################################

# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# 满足以下条件将会同步数据:
# 900 秒(15分钟)内有 1 个更改
# 300 秒(5分钟)内有 10 个更改
# 60 秒内有 10000 个更改
# 可以把所有“save”行注释掉,这样就取消同步操作了
save 900 1
save 300 10
save 60 10000

# 如果用户开启了 RDB 快照功能,那么在 redis 持久化数据到磁盘时如果出现失败,默认情况下,redis 会停止接受所有的写请求
stop-writes-on-bgsave-error yes

# 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes

# 在存储快照后,可以让 redis 使用 CRC64 算法来进行数据校验,这样做会增加大约 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
rdbchecksum yes

# 转储数据库的文件名,默认值为 dump.rdb
dbfilename dump.rdb

# 工作目录,指定本地数据库存放目录,文件名由上一个 dbfilename 配置项指定,这里只能指定一个目录,不能指定文件名
dir ./

################################# REPLICATION #################################

# 主从复制。使用 slaveof 从 Redis 服务器复制一个 Redis 实例。注意,该配置仅限于当前 slave 有效
# 设置本机为 slav 服务时,设置 master 服务的 ip 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
slaveof <masterip> <masterport>

# 当 master 服务设置了密码保护时,slav 服务连接 master 的密码
masterauth <master-password>

# 当从 redis 与主 redis 失去了连接,或者正在同步时,redis 该如何处理外部发来的访问请求呢
# 第一种选择:yes(默认),从redis仍会继续响应客户端的读写请求
# 第二种选择:no,从redis会对客户端的请求返回“SYNC with master in progress”,也有例外,当客户端发来INFO请求和SLAVEOF请求,从redis还是会进行处理
slave-serve-stale-data yes

# 可以控制从 redis 是否可以接受写请求。将数据直接写入从 redis,一般只适用于那些生命周期非常短的数据,因为在主从同步时,这些临时数据就会被清理掉。自从 redis 2.6 版本之后,默认从 redis 为只读。
slave-read-only yes

# 只读的从 redis 并不适合直接暴露给不可信的客户端。为了尽量降低风险,可以使用 rename-command 指令来将一些可能有破坏力的命令重命名,避免外部直接调用。比如:
rename-command Config za8asd7a8sd7wd87asd9

# 主从数据复制是否使用无硬盘复制功能,新的从站和重连后不能继续备份的从站,需要做所谓的“完全备份”,即将一个 RDB 文件从主站传送到从站
# 1)硬盘备份:redis 主站创建一个新的进程,用于把 RDB 文件写到硬盘上。过一会儿,其父进程递增地将文件传送给从站。
# 2)无硬盘备份:redis 主站创建一个新的进程,子进程直接把RDB文件写到从站的套接字,不需要用到硬盘。
# 在硬盘备份的情况下,主站的子进程生成RDB文件。一旦生成,多个从站可以立即排成队列使用主站的RDB文件。
# 在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要等待现在的传送结束,才能开启新的传送。
# 如果使用无硬盘备份,主站会在开始传送之前等待一段时间(可配置,以秒为单位),希望等待多个子站到达后并行传送。在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好。
repl-diskless-sync no

# 当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,延迟时间以秒为单位,默认为5秒。设置0秒为关闭,传送会立即启动。一旦传送开始,就不能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送
repl-diskless-sync-delay 5

# 从redis会周期性的向主redis发出PING包,默认是10秒
repl-ping-slave-period 10

# 在主从同步时,可能在这些情况下会有超时发生:
# 以从redis的角度来看,当有大规模IO传输时。
# 以从redis的角度来看,当数据传输或PING时,主redis超时
# 以主redis的角度来看,在回复从redis的PING时,从redis超时
# 用户可以设置上述超时的时限,要确保比repl-ping-slave-period的值要大,否则每次主redis都会认为从redis超时
repl-timeout 60

# 同步之后是否禁用从站上的TCP_NODELAY
# yes会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。Linux内核默认配置情况下最多40毫秒的延时
# no从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们针对低延迟进行优化,但是在非常高的流量条件下,或者当主设备和从设备经过路由转发的次数多时,将其转为yes会更好
repl-disable-tcp-nodelay no

# 设置设置同步队列长度。同步队列是一个缓冲区,当从站断开一段时间,它替从站接收存储数据,当从站重连时,就不必重新全量同步数据,只需要同步这部分增量数据即可
# 只要有一个从站连接,就会立刻分配一个同步队列
repl-backlog-size 1mb

# 如果主redis等了一段时间之后,还是无法连接到从redis,那么缓冲队列中的数据将被清理掉。默认是1个小时,0表示不释放
repl-backlog-ttl 3600

# 给从redis设置优先级,在主redis持续工作不正常的情况,优先级高的从redis将会升级为主redis。编号越小优先级越高,当优先级被设置为0时,这个从redis将永远也不会被选中。默认的优先级为100。
slave-priority 100

# 假如有大于等于3个从redis的连接延迟大于10秒,那么主redis就不再接受外部的写请求。上述两个配置中有一个被置为0,则这个特性将被关闭
min-slaves-to-write 3
min-slaves-max-lag 10

# Redis主站能够以不同方式列出所连接从站的地址和端口
# 从站可以使用以下两个选项,以便向其主站报告一组特定的IP和端口,以便INFO和ROLE都报告这些值。
slave-announce-ip 5.5.5.5
slave-announce-port 1234

################################## SECURITY ###################################

# 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过auth <password>命令提供密码,默认关闭
requirepass foobared

#   将命令重命名,为了安全考虑,可以将某些重要的、危险的命令重命名。当把某个命令重命名成空字符串的时候就等于取消了这个命令
rename-command CONFIG ""

################################### CLIENTS ####################################

# 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max Number of clients reached错误信息
maxclients 10000

############################## MEMORY MANAGEMENT ################################

# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,移除规则可以通过maxmemory-policy来指定,当处理后,仍然到达最大内存,将无法再进行写入操作,但仍然可以进行读取操作
# Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>

# 当内存使用达到最大值时,redis 使用的清除策略:
# LRU 表示最近最少使用,LFU 意味着最少使用
# volatile-lru -> 利用 LRU 算法移除设置过过期时间的 key
# allkeys-lru -> 利用 LRU 算法移除任何 key
# volatile-lfu -> 利用 LFU 算法移除设置过过期时间的 key
# allkeys-lfu -> 利用 LFU 算法移除任何 key
# volatile-random -> 移除设置过过期时间的随机 key
# allkeys-random -> 移除随机 key
# volatile-ttl -> 移除即将过期的 key(minor TTL)
# noeviction -> 不移除任何 key,只是返回一个写错误 ,默认选项
maxmemory-policy noeviction

# LRU,LFU 和最小 TTL 算法不是精确的算法,而是近似算法(为了节省内存),默认 Redis 将检查五个键并选择最近使用的键,可以配置指令更改样本大小获得速度或精度。默认值 5 会产生足够好的结果,10 非常接近真实的 LRU 但耗 CPU,3 更快但不是很准确。
maxmemory-samples 5
View Code

2.Replication(独立(单机)主从)配置

redis-server.exe redis-master.conf

bind 0.0.0.0
port 6379
# 后台运行
daemonize yes
# 必须设置(防止未授权访问)
requirepass "STR0NG_P@SS"

# 防止从节点高延迟导致 OOM
client-output-buffer-limit replica 512mb 256mb 300
# 网络带宽 > 200MB/s 时启用
repl-diskless-sync yes

# databases 16
# protected-mode yes
# logfile ./logs/redis-server.log
# loglevel notice
# 内存配置(建议预留 20% 余量)
maxmemory 2GB
maxmemory-policy volatile-lru
# 持久化配置(RDB 和 AOF 必须开启至少一种)
# 900 秒内至少 1 个 key 发生变化(新增、修改和删除),则重写 rdb 文件
save 900 1 300 10 60 10000
# rdbcompression yes
# dbfilename dump.rdb
# dir ./data
# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
# 连接限制
# maxclients 10000
# tcp-backlog 511
# timeout 0
# 性能配置,建议禁用透明大页
# io-threads-do-reads yes
# io-threads 4

redis-server.exe redis-slave.conf --port 6379

bind 0.0.0.0
port 6389
daemonize yes
requirepass "STR0NG_P@SS"
# 核心配置,主节点地址。Redis 5.0+ 后废弃 slaveof,统一使用 replicaof 指令
replicaof 127.0.0.1 6379
# 必须与主节点密码一致
masterauth "STR0NG_P@SS"

# 强制从节点只读
replica-read-only yes

查看节点复制状态:redis-cli -p 6379 -a STR0NG_P@SS info replication

3.Sentinel(主从复制+哨兵)配置

3 台 Sentinel + 1 主 2 从构成最小高可用集群,客户端应连接 Sentinel 集群(不直接连 Redis),所有节点相同配置:redis-sentinel.exe sentinel.conf --port 26379

port 26379
daemonize yes
# 核心监控配置,仅需显式配置主节点监控,从节点和其他 Sentinel 节点会通过机制自动发现
# sentinel monitor <master-name> <ip> <port> <quorum>
# 示例:sentinel monitor mymaster 192.168.1.100 6379 2
# - mymaster: 自定义主节点组名
# - 192.168.1.100 6379: 真实主节点地址
# - 2: 故障判定法定人数(必须 <= Sentinel 节点总数)
sentinel monitor mymaster 127.0.0.1 6379 2
# 安全认证(若主节点有密码),必须与主节点 requirepass 一致,否则无法故障转移
sentinel auth-pass mymaster STR0NG_P@SS
# 主节点响应超时判定(5秒,建议3-10秒区间)
sentinel down-after-milliseconds mymaster 5000
# 控制故障转移后,新主节点同时允许的从节点同步连接数,安全模式(配置了 requirepass)下建议设置为 1
sentinel parallel-syncs mymaster 1
# 定义故障转移流程的超时时间窗口(单位:毫秒)
sentinel failover-timeout mymaster 60000

# Sentinel 节点间认证
requirepass "STR0NG_P@SS"
# 禁止运行时修改危险参数
# sentinel deny-scripts-reconfig yes
# 日志目录需要手动创建
# logfile "./logs/sentinel.log"
# loglevel notice

查看状态:redis-cli -p 26379 -a STR0NG_P@SS info sentinel

查看主节点监控状态:redis-cli -p 26379 -a STR0NG_P@SS sentinel master mymaster

查看从节点监控状态:redis-cli -p 26379 -a STR0NG_P@SS sentinel replicas mymaster

查看 Sentinel 节点列表:redis-cli -p 26379 -a STR0NG_P@SS sentinel sentinels mymaster

4.Scale(多主从复制+分片(分配16384个槽位))集群配置

以 6 节点(3主3从)为例,所有节点相同配置(这里只列出集群相关必要配置,其它配置可参考上面 redis-master.conf):redis-server.exe redis-cluster.conf --port 6379 --cluster-config-file nodes.conf

# 启用集群模式
cluster-enabled yes
# 节点超时(ms)
cluster-node-timeout 5000
# 集群节点配置,由 Redis 自行更新,不用手动配置
cluster-config-file nodes.conf

创建集群(所有节点时间要同步,要开放端口:6379 (客户端通信) + 16379 (集群通信,自动+10000))

# 启动所有节点(至少 3 主节点)
redis-server redis.conf
# 创建集群(Redis7+ 命令),会自动分配主从关系(这里是3主3从)
redis-cli --cluster create IP1:6379 IP2:6379 IP3:6379 IP4:6379 IP5:6379 IP6:6379 --cluster-replicas 1 -a STR0NG_P@SS

验证

# 验证集群状态
redis-cli --cluster check HOST_IP:6379 -a STR0NG_P@SS
# 查看集群节点
redis-cli -c -h HOST_IP -p 6379 cluster nodes -a STR0NG_P@SS
# 检查槽位分布
redis-cli --cluster slots HOST_IP:6379 -a STR0NG_P@SS
# 监控集群状态
redis-cli --cluster info HOST_IP:6379 -a STR0NG_P@SS

集群扩展主节点流程

# 1. 添加新的主节点
redis-cli --cluster add-node new_node:port existing_node:port
# 2. 迁移槽位(以平衡集群)
redis-cli --cluster reshard EXISTING_IP:6379 --cluster-from <源节点ID> --cluster-to <目标节点ID> --cluster-slots 1000
# 3. 自动平衡(可选)
redis-cli --cluster rebalance EXISTING_IP:6379

集群扩展从节点流程

# 添加从节点并指定主节点ID
redis-cli --cluster add-node new_node:port existing_node:port --cluster-slave --cluster-master-id 3a5b7c9d1e2f4g6h8i0j1k2l3m4n5o6p7q8

关于集群脑裂

# 最少 slave 节点为 1 个,如果出现网络问题,主节点没有从节点了,那么服务端将拒绝数据写入,这样脑裂出来的主节点就不会产生新数据
min-replicas-to-write 1
# 数据复制和同步的延迟不能超过 5 秒
min-replicas-max-lag 5

 


https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack & https://redis.io/downloads
https://redis.io/docs/latest/operate/oss_and_stack/management/config-file
https://redis.io/insight & https://redis.io/docs/latest/operate/redisinsight
https://redis.io/topics/faq
posted @ 2019-10-25 10:46  江湖小小白  阅读(665)  评论(0)    收藏  举报