前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【redis从入门到上线(2)】- redis配置要点

【redis从入门到上线(2)】- redis配置要点

作者头像
一条老狗
发布2019-12-26 11:40:16
6120
发布2019-12-26 11:40:16
举报
文章被收录于专栏:极客运维极客运维

这次我们讲讲redis的一些配置要点,包括日志,持久化,主备,数据压缩,内存分配等,以及一些坑,简单的配置就不说了,可以去看官方文档。

基本配置

代码语言:javascript
复制
daemonize yes

默认情况下,Redis不是在后台运行的,最好在后台运行,把该项的值更改为yes,否则运行时会将运行日志输出到当前终端。


代码语言:javascript
复制
pidfile /var/run/redis.pid

当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis服务时,会用得到,需要指定不同的pid文件和端口。


代码语言:javascript
复制
port 16379

redis的运行端口,务必修改默认端口,尤其是在没有设置密码,且对外网开放时,一般应该也没人开外网。redis的未加密漏洞暴漏在外网会很快被人提权的。


代码语言:javascript
复制
bind 127.0.0.1

官方文档中该处说明bind的是interface,也就是说是网络接口。服务器可以有一个网络接口,或者多个。打个比方说机器上有两个网卡,分别为192.168.205.5 和192.168.205.6,如果bind 192.168.205.5,那么只有该网卡地址接受外部请求,当然也有可能一块网卡上还配置有子网口,上面有两个地址,如果不绑定,则两个网卡口都接受请求。


代码语言:javascript
复制
timeout 0

设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么server端关闭该连接。0为关闭该设置。 当你碰到有些编码习惯不太好的开发同事,比如连接redis操作完后不关闭,你就会用到timeout设置了,得断掉无操作的连接。(总会有些运维痛点,同行们懂的) 当redis为集群架构,前端还有代理时,timeout可能需要根据实际情况来设置,比如保持长连接


代码语言:javascript
复制
tcp-keepalive 0

指定TCP连接是否为长连接,”侦探”信号由server端维护,长连接将会额外的增加server端的开支 默认为0.表示禁用,非0值表示开启”长连接” ;”侦探”信号的发送间隔将有Linux系统决定,可以参考Linux tcp连接优化,我后面有空会写一篇相关文章 在多次”侦探”后,如果对等端仍不回复,将会关闭连接,否则连接将会被保持开启. client端socket也可以通过配置keepalive选项,开启”长连接”


代码语言:javascript
复制
databases 16

设定redis所允许的最大”db簇”(可以理解为数据库)的个数,默认为16个簇. 客户端可以通过”select”指令指定需要使用的”db簇”索引号,默认为0. redis的顶层数据结构中,所有K-V都潜在的包括了”db簇”索引号,任何一个key都将隶属于一个”db”. 任何对数据的检索,只会覆盖指定的”db”;例如数据被插入到”db 10″中,那么在”db 1″中去get,将会返回null. 对数据归类到不同的db簇中,可以帮助我们实现一些特定的需求,比如根据不同客户端连接,来指定不同的db索引号.


代码语言:javascript
复制
maxclients 128

限制同时连接的客户数量。 当连接数超过这个值时,redis 将不再接收其他连接请求,客户端尝试连接时将收到 error 信息

设置为2时候的会显示一下错误

代码语言:javascript
复制
Error: Connection reset by peer

代码语言:javascript
复制
maxmemory <bytes>

内存坑点

设置redis能够使用的最大内存。 达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key(设置过expire信息的key,后面会介绍删除方式的算法) 生产环境推荐设置最大内存为服务器物理内存大小的3/4,防止生产环境发生内存撑满系统的灾难情况。 如果开启了RDB可持久化,最后设定的最大内存最好还要除以2,RDB在转储内存数据到硬盘时,会fork一个redis主程序出来进行数据备份到硬盘,此时可能会造成内存使用的暴涨甚至翻倍,导致内存占满,开始删除生产数据,甚至影响系统运行


代码语言:javascript
复制
maxmemory-policy volatile-lru

当内存达到最大值的时候Redis会选择删除哪些数据?有五种方式可供选择

代码语言:javascript
复制
volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
allkeys-lru -> 利用LRU算法移除任何key
volatile-random -> 移除设置过过期时间的随机key
allkeys->random -> remove a random key, any key
volatile-ttl -> 移除即将过期的key(minor TTL)
noeviction -> 不移除任何可以,只是返回一个写错误

注意:对于上面的策略,如果没有合适的key可以移除,当写的时候Redis会返回一个错误 默认是:maxmemory-policy volatile-lru

日志配置

代码语言:javascript
复制
syslog-enabled no

syslog-enabled设置为yes会把日志输出到系统日志,默认是no

慢日志记录

代码语言:javascript
复制
slowlog-log-slower-than 10000

Redis slow log用来记录超过指定执行时间的查询。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间 可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(毫秒),另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除负数则关闭slow log,0则会导致每个命令都被记录

代码语言:javascript
复制
slowlog-max-len

对日志长度没有限制,只是要注意它会消耗内存 可以通过 SLOWLOG RESET回收被慢日志消耗的内存


持久化快照

RDB

代码语言:javascript
复制
save

save ,用来描述”在多少秒期间至少多少个变更操作”触发snapshot snapshot最终将生成新的dump.rdb文件 save “”用来禁用snapshot功能 例如save 300 1表示5分钟内至少一个key变更,触发snapshot


代码语言:javascript
复制
rdbcompression yes

是否启用rdb文件压缩手段,默认为yes. 压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大小,有利于存储/备份/传输/数据恢复.


代码语言:javascript
复制
rdbchecksum yes

是否对rdb文件使用CRC64校验和,默认为”yes”,那么每个rdb文件内容的末尾都会追加CRC校验和. 对于其他第三方校验工具,可以很方便的检测文件的完整性


代码语言:javascript
复制
 dbfilename dump.rdb

镜像备份文件的文件名

www@iZ23s8agtagZ:/var/lib/redis$ ls dump.rdb


代码语言:javascript
复制
dir ./

指定rdb/AOF文件的目录位置,只能为文件夹不能为文件


AOF

代码语言:javascript
复制
appendonly no

默认情况下,Redis会异步的把数据保存到硬盘。如果你的应用场景允许因为系统崩溃等极端情况而导致最新数据丢失的话,那这种做法已经很ok了。 否则你应该打开append only模式,开启这种模式后,Redis会在#appendonly.aof 文件中添加每一个写操作,这个文件会在Redis启动时被读取来在内存中重新构建数据集。

注意:如果你需要,你可以同时开启‘append only’模式和异步dumps模式(你需要注释掉上面的‘save’表达式来禁#止dumps),这种情况下,Redis重建数据集时会优先使用appendonly.aof而忽略dump.rdb


代码语言:javascript
复制
appendfilename appendonly.aof

AOF文件名称 (默认: “appendonly.aof”)


代码语言:javascript
复制
appendfsync everysec

调用fsync()函数通知操作系统立刻向硬盘写数据 Redis支持三种同步AOF文件的策略:

代码语言:javascript
复制
# no:不fsync, 只是通知OS可以flush数据了,具体是否flush取决于OS.性能更好.
# always: 每次写入append only 日志文件后都会fsync . 性能差,但很安全.
# everysec: 没间隔1秒进行一次fsync. 折中.

默认是”everysec”,按照速度和安全折中这是最好的。 如果想让Redis能更高效的运行,你也可以设置为”no”,让操作系统决定什么时候去执行或者相反想让数据更安全你也可以设置为”always”

如果不确定就用 “everysec”.


代码语言:javascript
复制
no-appendfsync-on-rewrite no

AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作 在某些linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理 # 为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite


代码语言:javascript
复制
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

append only 文件的自动重写 当AOF 日志文件即将增长到指定百分比时,Redis可以通过调用BGREWRITEAOF 来自动重写append only文件。 它是这么干的:Redis会记住最近一次重写后的AOF 文件size。然后它会把这个size与当前size进行比较,如果当前size比指定的百分比大,就会触发重写。同样,你需要指定AOF文件被重写的最小size,这对避免虽然百分比达到了, 但是实际上文件size还是很小(这种情况没有必要重写)却导致AOF文件重写的情况很有用。


代码语言:javascript
复制
auto-aof-rewrite-percentage

设置为 0 可以关闭AOF重写功能

数据结构相关设置

代码语言:javascript
复制
hash-max-zipmap-entries 512
hash-max-zipmap-value 64

redis 2.0后引入了 hash 数据结构。 当hash中包含超过指定元素个数并且最大的元素没有超过临界时, hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值 Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。


代码语言:javascript
复制
activerehashing yes

是否重置Hash表 设置成yes后redis将每100毫秒使用1毫秒CPU时间来对redis的hash表重新hash,可降低内存的使用

当使用场景有较为严格的实时性需求,不能接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。 如果没有这么严格的实时性要求,可以设置为 yes,以便能够尽可能快的释放内存


代码语言:javascript
复制
list-max-ziplist-entries 512
list-max-ziplist-value 64

list 数据类型多少节点以下会采用去指针的紧凑存储格式。 list 数据类型节点值大小小于多少字节会采用紧凑存储格式。


代码语言:javascript
复制
set-max-intset-entries 512

set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。

代码语言:javascript
复制
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

zsort 数据类型多少节点以下会采用去指针的紧凑存储格式。 zsort 数据类型节点值大小小于多少字节会采用紧凑存储格式。

Replication(主备)

代码语言:javascript
复制
slaveof

将当前server做为slave,并为其指定master信息.

代码语言:javascript
复制
slaveof <masterip> <masterport>

当本机为从服务时,设置主服务的IP及端口


代码语言:javascript
复制
slave-serve-stale-data yes

如果当前server是slave,那么当slave与master失去通讯时,是否继续为客户端提供服务,”yes”表示继续,”no”表示终止. 在”yes”情况下,slave继续向客户端提供只读服务,有可能此时的数据已经过期. 在”no”情况下,任何向此server发送的数据请求服务(包括客户端和此server的slave)都将被告知”error”,但 INFO 和SLAVEOF命令除外。

虚拟内存

代码语言:javascript
复制
vm-enabled no

是否开启虚拟内存支持。 redis 是一个内存数据库,当内存满时,无法接收新的写请求,所以在redis2.0后,提供了虚拟内存的支持 但需要注意的,redis 所有的key都会放在内存中,在内存不够时,只把value 值放入交换区 虽使用虚拟内存,但性能基本不受影响,需要注意的是要把vm-max-memory设置到足够来放下所有的key


代码语言:javascript
复制
vm-swap-file /tmp/redis.swap

设置虚拟内存的交换文件路径,不可多个Redis实例共享


代码语言:javascript
复制
vm-max-memory 0

设置开启虚拟内存后,redis能使用的最大物理内存大小。 默认为0,redis将把他所有能放到交换文件的都放到交换文件中,以尽量少的使用物理内存 即当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘 内存够用的前提下,我们还是不要存在交换文件 在生产环境下,需要根据实际情况设置该值,最好不要使用默认的 0


代码语言:javascript
复制
vm-page-size 32

设置虚拟内存的页面大小

视value值大小来定,如果 value 值比较大,比如要在 value 中放置博客、新闻之类的文章内容,就设大一点


代码语言:javascript
复制
vm-pages 134217728

设置交换文件的 page 数量

注意: page table信息是放在物理内存中,每8个page 就会占据RAM中的 1 个 byte 总的虚拟内存大小 = vm-page-size * vm-pages


代码语言:javascript
复制
vm-max-threads 4

设置 VM IO 并发线程数量


VM设置建议

一般情况下不建议使用虚拟内存,如果有特殊需求,请考虑以下几种情况:

  • 当key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大
  • 当key较大时,可以考虑用一些非常方法将很大的key变成很大的value,如可将key,value组成一个新的value
  • 最好使用linux ext4 等对稀疏文件支持比较好的文件系统保存你的swap文件
  • vm-max-threads参数可设置访问swap文件的线程数,最好不要超过机器的核数;设置为0则所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟,但是对数据完整性有很好的保证

安全

代码语言:javascript
复制
rename-command

命令重命名. 例如: rename-command CONFIG sdfsadfasdfa rename-command CONFIG “” 可以把一个命令重命名为空或随机字符来达到取消掉这个命令的功能,让这个命令失效。 在多人维护同一个redis时,以及需要开发登陆redis进行操作时,可以屏蔽一些危险命令,提升安全性


下一次讲讲redis集群主备以及架构方面。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客运维 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档