75142913在线留言
Redis 生产环境配置设置参考_服务器与网络_网络人

Redis 生产环境配置设置参考

Kwok 发表于:2020-02-02 15:02:01 点击:150 评论: 0

Redis内存满了怎么办

登陆进入Redis命令行输入:

config get maxmemory

获取当前内存的最大使用配置情况,我是64位系统,设置为:0使用最大的内存(如果纯REDIS环境可以使用),如果32位最大可设置为3G。

Redis支持运行时通过命令动态修改内存大小:

config set maxmemory 100mb

Redis在64位系统下默认配置为0 ,附配置文件位置:/usr/local/redis/etc/redis.conf或者/etc/redis.conf里面改。

如果还有其它服务,如MYSQL、NGINX等,最好能算好REDIS可使用多少,预留其它服务的内存使用,以下是我16G内存的分配方案供参考:

MYSQL分配8G的的内存做为缓存(因为生产服务器有大量的读取操作),Redis分配5G内存,余下的留给系统和其它服务使用足以。如果你的PHP有很复杂的逻辑计算,可尽量留多一点内存。实在不行,就再买一台大内存的服务器只放REDIS使用。

一定一定要限制Redis的内存使用,因为如果物理内存不足的时候,Redis会使用SWAP区的内存,因为SWAP区是硬盘IO,速度非常慢,而且部分内存管理软件还会KILL掉Redis的进程(OOM),导致链接失败的情况。我还遇到过kswapd0的CPU使用极高,导致WEB不断的报503错误。

当内存不够用或者超过了配置情况下,Redis有几种内存回收机制:

noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)

allkeys-lru:从所有key中使用LRU算法进行淘汰,least RecentlyUsed,最近最少使用算法。也就是说默认删除最近最少使用的键。

volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰

allkeys-random:从所有key中随机淘汰数据

volatile-random:从设置了过期时间的key中随机淘汰

volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰

当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误

 

获取当前内存淘汰策略:

config get maxmemory-policy

通过配置文件设置淘汰策略(修改redis.conf文件):

maxmemory-policy allkeys-lru

通过命令修改淘汰策略:

 config set maxmemory-policy allkeys-lru

Redis4.0新特性Lazy Free

惰性删除或延迟释放,有效地避免删除big key带来的性能和可用性问题。下面新增的4个参数说明。默认都是关闭状态,可以根据业务场景选择性开启。

lazyfree-lazy-eviction:当内存使用达到maxmeory,并设置有淘汰策略时;在被动淘汰键时,是否采用lazy free机制;可能使用淘汰键的内存释放不及时,导致redis内存超用,超过maxmemory的限制。

lazyfree-lazy-expire:是否异步进行key过期事件的处理,针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazy free机制;建议开启,因TTL本身是自适应调整的速度。

lazyfree-lazy-server-del:del命令是否异步执行删除操作,类似unlink,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 此参数设置就是解决这类问题,建议可开启

replica-lazy-flush:replica client做全同步的时候,是否异步flush本地db,如果内存变动不大,建议可开启。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。

Redis 持久化关闭处理(因为我只当缓存使用)

修改配置文件:

stop-writes-on-bgsave-error yes

修改为:

stop-writes-on-bgsave-error no

 或者使用线上命令: 

config set stop-writes-on-bgsave-error no

当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了.

关闭持久化(只使用内存):

save 900 1
save 300 10
save 60 10000

修改为:

save ""
#save 900 1
#save 300 10
#save 60 10000

 rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

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

dbfilename :设置快照的文件名,默认是 dump.rdb

dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。

也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,将当前的内存快照保存在 dir 配置的目录中,文件名由配置的 dbfilename 决定。

解决redis启动时的三个警告

第一个警告:The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

net.core.somaxconn = 1024添加到/etc/sysctl.conf中,然后执行sysctl -p生效配置。

第二个警告:overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to/etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

vm.overcommit_memory = 1添加到/etc/sysctl.conf中,然后执行sysctl -p生效配置。

第三个警告:you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain thesetting after a reboot. Redis must be restarted after THP is disabled.

命令行执行:

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

不过echo 方式只是临时解决这个问题。下次重启系统后需要再次运行这个命令,我们可以使用一劳永逸的方式:

编辑:/etc/rc.d/rc.local

在后面加入:

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

文件结尾将跟上一个换行(回车),最后还需要执行一下:

chmod +x /etc/rc.d/rc.local

以保证开机的时候rc.local可以正常运行。

除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/61
标签:redisKwok最后编辑于:2020-03-28 19:28:06
43
感谢打赏!

《Redis 生产环境配置设置参考》的网友评论(0)

本站推荐阅读

热门点击文章