Redis配置模板及持久化解决方案 | 网易乐得技术团队
前言
本文根据贵金属使用Redis的经验,整理了Redis服务端配置模板、哨兵配置模板、监控项部署、持久化解决方案、Jedis客户端连接池配置说明,旨在减少大家在使用Redis过程中因为配置不当引发的问题。
后续的文章链接中也给出了之前遇到的一些问题,以及对默认配置项进行选择的原因,供大家参考。(Redis Server端版本2.8.19,客户端使用Jedis2.6.0),截止到本文发表前Redis4.0已经release,但并不影响本文的配置选择,4.0的新特性我们也会持续跟进,欢迎大家一起讨论。
1. Redis哨兵模板
哨兵的部署至少3台,物理机独立部署,奇数个;
哨兵模板见附录1
2. Redis Server模板
Server模板见附录2
配置模板需要根据使用情况做调整:
1)根据Redis用途需要指定不同的key淘汰策略
Redis用作缓存(允许数据淘汰) | Redis作为内存数据库(不允许淘汰) |
---|---|
maxmemory-policy { allkeys-lru volatile-lru allkeys-random volatile-random volatile-ttl } | maxmemory-policy noeviction |
2)持久化方案选择
cpu、磁盘性能是否支持持久化
支持 | 不支持 |
---|---|
参考下面2种因素 | Master关闭持久化 Slave开启rdb 定时rdb同步 |
使用内存上限
超过10G | 不超过10G |
---|---|
Master开启aof slave开启rdb 定时脚本执行bgrewriteaof | Master开启rdb Slave开启rdb |
能否容忍少量数据丢失
能 | 不能 |
---|---|
Master开启rdb slave开启rdb | Master开启aof Slave开启rdb |
需要根据使用场景综合考虑三个因素的影响,评估可接受的方案。
备注:
1)Rdb定时同步主要防止主从切换失败时手动启动Master或误重启导致数据丢失(脚本见附录3)。
2)不建议主备都开启aof,slave开启rdb可以防止aof文件损坏造成数据无法恢复。
3)选择10G作为rdb是否适用的阈值是因为:
- 新浪微博给的建议是不超过20G,而我们虚机上的测试,要想保证应用毛刺不明显,内存建议在控制在10G以下。
- 内存空间达到40G(考虑每个页表条目消耗 8 个字节),那么页表大小就有80M,复制页表有些虚拟机需要200ms以上,我们设置慢日志的阈值是50ms,为保证不被慢日志捕获内存也建议控制在10G以下。
3. Redis监控方案及阈值设置
1)连接数
监控项:check.redis.connected_clients.XXX
案例举例:方法内部有耗时操作,导致连接数归还缓慢,连接数上升;没有正确归还连接,导致连接数上升。
2)ops
监控项:check.redis.instantaneous_ops_per_sec.XXX
案例举例:业务代码有bug,导致频繁的操作redis,导致ops上升。
3)内存使用
监控项:check.redis.used_memory.XXX
案例举例:客户端连续的hgetAll操作,请求数据过多,响应数据放入缓冲区,占用了redis内存空间,导致内存使用突然飙升。
4)慢日志开启
在redis配置文件中配置慢日志门限
slowlog-log-slower-than 50000 //表示redis操作超过50ms的操作记录慢日志
slowlog-max-len 1024 //慢日志记录最多保留1024个
通过在redis服务端使用slowlog get命令可以获取最新的慢日志记录,通过慢日志记录排查操作耗时的命令并进行相应的调整。
5)cpu steal、cpu load
监控项:system.cpu.util.steal、system.cpu.load
cpu steal或者cpu load过高,都有可能卡redis实例,导致业务超时等问题。
cpu steal过高如果是由于共享cpu导致的,可考虑调整为独享的方式;cpu load过高需要排查看是该机器上什么操作影响的。
报警方案根据应用的具体情况来设置:
1)内存最大容量6G, 报警门限4G (75%左右)
2)连接数超过5000(最高10000)报警 (50%左右)
3)操作数每秒超过50000(最高100000)报警 (50%左右)
4)慢日志50ms报警
4. 客户端jedis连接池配置建议
JedisPoolConfig参考配置
1 | <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> |
注:jedis的读超时和连接超时都是timeout
配置模板参数设置原因可以参考 http://tech.lede.com/2017/07/03/rd/server/redisconfig/
附录1
port {port}
daemonize yes
pidfile “/{HOME}/log/sentinel.pid”
logfile “/{HOME}/log/sentinel.log”
sentinel monitor master {ip address} {port} {quorum} / 当哨兵数为3的时候,quorum需配置为2,哨兵数为5的时候,quorum需配置为3/
sentinel down-after-milliseconds master 60000 / 哨兵与master失连1分钟则主观下线/
sentinel failover-timeout master 180000
sentinel config-epoch master 0
附录2
1)Master配置:
port {port}
daemonize yes
pidfile /{HOME}/log/redis.pid
logfile /{HOME}/log/redis.log
dir /{HOME}/data
dbfilename dump.rdb
requirepass {password}
masterauth {password}
timeout 0
loglevel notice
databases 16
rdbcompression yes
maxclients 10000
maxmemory {maxmemory}
maxmemory-policy noeviction
save 900 1
save 300 10
save 60 300
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
slowlog-log-slower-than 50000
slowlog-max-len 1024
client-output-buffer-limit normal 10mb 5mb 10
client-output-buffer-limit slave 1024mb 256mb 300
client-output-buffer-limit pubsub 32mb 8mb 60
lua-time-limit 1000
rename-command FLUSHALL SUPER_FLUSHALL
rename-command FLUSHDB SUPER_FLUSHDB
rename-command SHUTDOWN SUPER_SHUTDOWN
rename-command KEYS SUPER_KEYS
rename-command MONITOR SUPER_MONITOR
2)Slave配置:
port {port}
daemonize yes
pidfile /{HOME}/log/redis.pid
logfile /{HOME}/log/redis.log
dir /{HOME}/data
dbfilename dump.rdb
requirepass {password}
masterauth {password}
timeout 0
loglevel notice
databases 16
rdbcompression yes
maxclients 10000
maxmemory {maxmemory}
maxmemory-policy noeviction
save 900 1
save 300 10
save 60 300
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
slowlog-log-slower-than 50000
slowlog-max-len 1024
client-output-buffer-limit normal 10mb 5mb 10
client-output-buffer-limit slave 1024mb 256mb 300
client-output-buffer-limit pubsub 32mb 8mb 60
lua-time-limit 1000
slaveof {ip address} {port}
rename-command FLUSHALL SUPER_FLUSHALL
rename-command FLUSHDB SUPER_FLUSHDB
rename-command SHUTDOWN SUPER_SHUTDOWN
rename-command KEYS SUPER_KEYS
rename-command MONITOR SUPER_MONITOR
附录3
1 | #!/bin/sh |