持久化配置
Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:
①用来做缓存的Redis实例尽 量不要开启持久化功能
②建议关闭RDB持久化功能,使用AOF持久化
③利用脚本定期在slave节点做RDB,实现数据备份
④设置合理的rewrite阈值,避免频繁的bgrewrite
⑤配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞
部署有关建议:
①Redis实例的物理机要预留足够内存,应对fork和rewrite
②单个Redis实例内存 上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力
③不要与CPU密集型应用部署在一-起
④不要与高硬盘负载应用一起部署。例如:数据库、消息队列
慢查询
慢查询:在Redis执行时耗时超过某个阈值的命令,称为慢查询。
慢查询的阈值可以通过配置指定:
●slowlog-log-slower-than: 慢查询阈值,单:位 是微秒。默认是10000,建议1000
慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:
●slowlog-max-len: 慢查询日志(本质是一个队列)的长度。默认是128,建议1000
修改这两个配置可以使用: config set命令:
查看慢查询日志列表:
●slowlog len:查询慢查询日志长度
●slowlog get [n]:读取n条慢查询日志
●slowlog reset:清空慢查询列表
命令及安全配置
Redis会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,而Redis如果没有做身份认证,会出现严重的安全漏洞.
漏洞重现方式: https://cloud.tencent.com/developer/article/1039000
漏洞出现的核心的原因有以下几点:
●Redis未设置密码
●利用了Redis的config set命令动态修改Redis配置
●使用了Root账号权限启动Redis
为了避免这样的漏洞,这里给出一些建议:
①Redis一定要设置密码
②禁止线上使用下面命令: keys、flushall flushdb、config set等命令。可以利用rename-command禁用。
③bind: 限制网卡,禁止外网网卡访问
④开启防火墙
⑤不要使用Root账户启动Redis
⑥尽量不使用默认的端口
内存配置
当Redis内存不足时,可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到90%以上时就需要我们警惕,并快速定位到内存占用的原因。
Redis提供了一些命令,可以查看到Redis目前的内存分配状态:
●info memory
●memory xxx
内存缓冲区配置
内存缓冲区常见的有三种:
●复制缓冲区: 主从复制的repL backlog_ buf, 如果太小可能导致频繁的全量复制,影响性能。通过repl-backlog-size来设置,默认1mb
●AOF缓冲区: AOF刷盘之前的缓存区域, AOF执行rewrite的缓冲区。无法设置容量上限
●客户端缓冲区:分为输入缓冲区和输出缓冲区,输入缓冲区最大1G且不能设置。输出缓冲区可以设置
默认的配置如下:
集群最佳实践
集群虽然具备高可用特性,能实现自动故障恢复,但是如果使用不当,也会存在一些问题:
①集群完整性问题
在Redis的默认配置中,如果发现任意一个插槽不可用,则整个集群都会停止对外服务:
为了保证高可用特性,这里建议将cluster-require-full-coverage配置为false
②集群带宽问题
●集群状态信息
集群中节点越多,集群状态信息数据量也越大,10个节点的相关信息可能达到1 kb,此时每次集群互通需要的带宽会非常高。
解决途径:
①避免大集群,集群节点数不要太多最好少于1000,如果业务庞大,则建立多个集群。
②避免在单个物理机中运行太多Redis实例
③配置合适的cluster-node-timeout值
③数据倾斜问题
④客户端性能问题
⑤命令的集群兼容性问题
⑥lua和事务问题
注意
单体Redis (主从Redis) 已经能达到万级别的QPS,并且也具备很强的高可用特性。如果主从能
满足业务需求的情况下,尽量不搭建Redis集群。