前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis配置模板及持久化解决方案

Redis配置模板及持久化解决方案

作者头像
用户1263954
发布2018-10-25 10:50:36
1.3K0
发布2018-10-25 10:50:36
举报
文章被收录于专栏:IT技术精选文摘IT技术精选文摘

前言

本文根据贵金属使用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-lruvolatile-lruallkeys-randomvolatile-randomvolatile-ttl }

maxmemory-policy noeviction

2)持久化方案选择

cpu、磁盘性能是否支持持久化

支持

不支持

参考下面2种因素

Master关闭持久化Slave开启rdb定时rdb同步

使用内存上限

超过10G

不超过10G

Master开启aofslave开启rdb定时脚本执行bgrewriteaof

Master开启rdbSlave开启rdb

能否容忍少量数据丢失

不能

Master开启rdbslave开启rdb

Master开启aofSlave开启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参考配置

代码语言:javascript
复制
<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
代码语言:javascript
复制
#!/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 -gt 13 ]
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)
eval rsync -a /home/redisInstance/"$project"/data/dump.rdb "$backup_dir"dump.rdb."$backuptime"
cp "$backup_dir"dump.rdb."$backuptime" "$backup_dir"dump.rdb
if [ $? -eq 0 ]
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)
eval rsync -avzP /home/redisInstance/"$project"/data/rdb_bak/dump.rdb appuser@10.120.117.165::"$project" --password-file=/etc/rsyncd.secrets
if [ $? -eq 0 ]
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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术精选文摘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1. Redis哨兵模板
  • 2. Redis Server模板
  • 3. Redis监控方案及阈值设置
  • 4. 客户端jedis连接池配置建议
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档