redis线上部署规划

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis线上部署规划相关的知识,希望对你有一定的参考价值。

一,cpu,内存规划

CPU:

CPU不求核数多,但求主频高,Cache大,因为redis主处理模式是单进程的


内存:

一定要设置最大内存maxmemory参数,否则物理内存用爆了就会大量使用Swap

最少预留出55%的内存,在系统极度繁忙时,如果父进程的所有Page在子进程写RDB过程中都被修改过了,就需要两倍内存。

mem_fragmentation_ratio为内存碎片率

>内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低,也说明redis没有发生内存交换。

>但如果内存碎片率超过1.5,那就说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率

>若是内存碎片率低于1的话,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。内存交换会引起非常明显的响应延迟


内存优化系统配置:

echo "vm.overcommit_memory = 1" >>  /etc/sysctl.conf

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag


lru策略:

默认策略为volatile-lru,对设置了expire time的key进行LRU清除,如果所有的key都没有设置expire timep写redis会报错

配置为noeviction时,内存超过maxmemory时写redis会报错

配置为allkeys-lru时,对所有key都做LRU


如果没有设置超时时间,则lru的策略需要设置为allkeys-lru,并且应用需要做好未命中的异常处理。特殊的,当redis当做DB时,请使用noneviction策略,但是需要对系统内存监控加强粒度




二,持久化设置

RDB和AOF两者毫无关系,完全独立运行,如果使用了AOF,重启时只会从AOF文件载入数据,不会再管RDB文件。

在配置上有三种选择:不持久化,RDB,RDB+AOF。官方不推荐只开启AOF(因为恢复太慢另外如果aof引擎有bug),除非明显的读多写少的应用。 

开启AOF时应当关闭AOF自动rewrite,并在crontab中启动在业务低峰时段进行的bgrewrite。 如果在一台机器上部署多个redis实例,则关闭RDB和AOF的自动保存(save "", auto-aof-rewrite-percentage 0),通过crontab定时调用保存:

m h * * * redis-cli -p <port> BGSAVE

m h */4 * * redis-cli -p <port> BGREWRITEAOF

持久化的部署规划上,如果为主从复制关系,建议主关闭持久化。




如果一台服务器上启多个redis实例,为了防止上下文切换导致的开销,可以采用taskset。taskset是LINUX提供的一个命令,可以让某个程序运行在某个(或)某些CPU上。

# ps -ef | grep redis   查看redis-server进程 

1009      6658     1  0 Sep02 ?        00:24:18 redis-server *:6382 [cluster]                            


# taskset -p 6658    显示进程运行的CPU,6658为redis-server的进程号

pid 6658‘s current affinity mask: ffffff


# taskset -pc 23 6658    指定进程6658运行在第24个cpu(从0开始计数)

pid 6658‘s current affinity list: 0-23

pid 6658‘s new affinity list: 23


# taskset -p 6658

pid 6658‘s current affinity mask: 800000


也可以在启动时指定运行的cpu:

taskset -c 23 ./redis-server ../redis.conf


taskset命令选项:

-p, --pid operate on an existing PID and not launch a new task

-c, --cpu-list specify a numerical list of processors instead of a bitmask. The list may contain multiple items, separated by comma, and ranges. For example, 0,5,7,9-11.


本文出自 “一直在路上” 博客,请务必保留此出处http://chenql.blog.51cto.com/8732050/1963616

以上是关于redis线上部署规划的主要内容,如果未能解决你的问题,请参考以下文章

Nginx无法获取带下划线的请求头数据问题

线上项目mysqlredis平滑迁移方案及步骤

ELK:日志收集分析平台

redis线上问题及解决方法

PHP 基于redis实现的流量控制系统

redis 线上问题排查思路总结