Redis配置模板及持久化解决方案 | 网易乐得技术团队

标签: | 发表时间:2018-09-21 14:47 | 作者:
出处:http://tech.lede.com

前言

本文根据贵金属使用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             
2
3
4
5
6
7
8
9
10
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">             
<property name="maxIdle" value="30" /> //JedisPool最大空闲连接数
<property name="minIdle" value="10" /> //JedisPool最小空闲连接数,也即初始化连接数
<property name="testOnBorrow" value="false" /> //从JedisPool获取jedis实例时检查连接的有效性,默认是false
<property name="testWhileIdle" value="false" /> //表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉
<property name="testOnReturn" value="true" /> //将jedis实例归还连接池时检查连接的有效性,默认是false ;test开启太多会影响性能,都不开启异常连接可能会被使用,建议至少开启一个
<property name="maxTotal" value="300"/> //JedisPool最大连接数
<property name="maxWaitMillis" value="4000"/> //从JedisPool获取连接等待毫秒数,超时则抛异常;若blockWhenExhausted为false,该配置项无效
<property name="blockWhenExhausted" value="false"/> //blockWhenExhausted 表示连接耗尽时是否阻塞, false报异常,ture阻塞maxWaitMillis直到超时 ;不配默认是true;建议配置为false
</bean>

注: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            
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh            
project=$1
backup_dir="/home/redisInstance/$project/data/rdb_bak/"
if[ ! -d"$backup_dir"]; then
mkdir -p"$backup_dir"
fi
list=`ls /home/redisInstance/$project/data/rdb_bak/ | wc -l `
echo"[$(date +%Y%m%d-%H:%M:%S)] the backup files number is $list"
result=$(find"$backup_dir"-amin +60-name dump.rdb.* -print)
if[ $list -gt13]
then
if[ x"$result"= x ]
then
echo"[$(date +%Y%m%d-%H:%M:%S)] no backup files found to delete!"
else
echo -e"[$(date +%Y%m%d-%H:%M:%S)] backup files found to delete : \"$result\" !"
fi
find"$backup_dir"-amin +60-name"dump.rdb.*"-exec rm -rf {} \;
else
echo"[$(date +%Y%m%d-%H:%M:%S)] the backup files number is less than 13, no files allowed to delete"
fi
backuptime=$(date +%Y%m%d%H%M)
evalrsync -a /home/redisInstance/"$project"/data/dump.rdb"$backup_dir"dump.rdb."$backuptime"
cp"$backup_dir"dump.rdb."$backuptime""$backup_dir"dump.rdb
if[ $? -eq0]
then
echo"[$(date +%Y%m%d-%H:%M:%S)] the rdb file backup to local dir (rdb_bak) is OK"
else
echo"[$(date +%Y%m%d-%H:%M:%S)] the rdb file backup to local dir (rdb_bak) is error"
fi
rsynctime=$(date -d"-5 min"+%Y%m%d%H%M)
evalrsync -avzP /home/redisInstance/"$project"/data/rdb_bak/dump.rdb [email protected]::"$project"--password-file=/etc/rsyncd.secrets
if[ $? -eq0]
then
echo"[$(date +%Y%m%d-%H:%M:%S)] the rdb file backup to remote host(10.120.117.165) dir (data) is OK"
else
echo"[$(date +%Y%m%d-%H:%M:%S)] the rdb file backup to remote host(10.120.117.165) dir (data) is error"
fi
rm -rf"$backup_dir"dump.rdb

相关 [redis 模板 网易] 推荐:

Redis配置模板及持久化解决方案 | 网易乐得技术团队

- -
本文根据贵金属使用Redis的经验,整理了Redis服务端配置模板、哨兵配置模板、监控项部署、持久化解决方案、Jedis客户端连接池配置说明,旨在减少大家在使用Redis过程中因为配置不当引发的问题. 后续的文章链接中也给出了之前遇到的一些问题,以及对默认配置项进行选择的原因,供大家参考. (Redis Server端版本2.8.19,客户端使用Jedis2.6.0),截止到本文发表前Redis4.0已经release,但并不影响本文的配置选择,4.0的新特性我们也会持续跟进,欢迎大家一起讨论.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

Redis 起步

- - 博客园_首页
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章:. Redis是一个key-value存储系统. 和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型.

redis 配置

- - 谁主沉浮
# 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写). # 内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB. # daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes. # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址.

Cassandra代替Redis?

- - Tim[后端技术]
最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例. 而这篇 百万用户时尚分享网站feed系统扩展实践文章则提到了Fashiolista和Instagram从Redis迁移到Cassandra的案例. 考虑到到目前仍然有不少网友在讨论Redis的用法问题,Redis是一个数据库、内存、还是Key value store?以及Redis和memcache在实际场景的抉择问题,因此简单谈下相关区别.

redis 部署

- - CSDN博客云计算推荐文章
一、单机部署 tar xvf redis-2.6.16.tar.gz cd redis-2.6.16 make make PREFIX=/usr/local/redis install  #指定安装目录为/usr/local/redis,默认安装安装到/usr/local/bin. # chkconfig: 2345 80 10       #添加redhat系列操作系统平台,开机启动需求项(运行级别,开机时服务启动顺序、关机时服务关闭顺序) # description:  Starts, stops redis server.

nagios 监控redis

- - C1G军火库
下载check_redis.pl. OK: REDIS 2.6.12 on 192.168.0.130:6379 has 1 databases (db0) with 49801 keys, up 3 days 14 hours - connected_clients is 1, blocked_clients is 0 | connected_clients=1 blocked_clients=0.

转 redis vs memcached

- - 数据库 - ITeye博客
传统MySQL+ Memcached架构遇到的问题.   实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:.   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间.

Redis优化

- - 数据库 - ITeye博客
键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名. 键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong). 当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能,不过一般都要持久化比较安全,而且是快照和aof同时使用比较安全.

笔记--redis

- - 移动开发 - ITeye博客
接着准备面试内容,今天学习了下redis,继续我的笔记加深印象. 1.为什么要使用redis.  答:主要是 性能和 并发两个方面,另外redis也可以做分布式锁和消息队列等其他功能. 但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis.