Redis 服务器端优化方案

目录

1、服务器端优化-持久化配置

2、服务器端优化-慢查询优化

2.1 什么是慢查询

2.2 如何查看慢查询

​3、服务器端优化-命令及安全配置

3.1 设置密码方法:

 3.2 禁用命令

4、服务器端优化-Redis内存划分和内存配置

5、服务器端集群优化-集群还是主从


 

1、服务器端优化-持久化配置

Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:

  1. 用来做缓存的Redis实例尽量不要开启持久化功能

  2. 建议关闭RDB持久化功能,使用AOF持久化

  3. 利用脚本定期在slave节点做RDB,实现数据备份

  4. 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞

  5. 设置合理的rewrite阈值,避免频繁的bgrewrite

 

  • 部署有关建议:

    • Redis实例的物理机要预留足够内存,应对fork和rewrite

    • 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力

    • 不要与CPU密集型应用部署在一起

    • 不要与高硬盘负载应用一起部署。例如:数据库、消息队列

2、服务器端优化-慢查询优化

2.1 什么是慢查询

        并不是很慢的查询才是慢查询,而是:在Redis执行时耗时超过某个阈值的命令,称为慢查询。

        慢查询的危害:由于Redis是单线程的,所以当客户端发出指令后,他们都会进入到redis底层的queue来执行,如果此时有一些慢查询的数据,就会导致大量请求阻塞,从而引起报错,所以我们需要解决慢查询问题。

慢查询的阈值可以通过配置指定:

  • slowlog-log-slower-than:慢查询阈值,单位是微秒。默认是10000,建议1000

慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:

  • slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000

也可以在连接Redis实例查询或修改:

修改这两个配置可以使用:config set命令,重启后失效:

2.2 如何查看慢查询

如何去查看慢查询日志列表呢:

  • slowlog len:查询慢查询日志长度

  • slowlog get [n]:读取n条慢查询日志

  • slowlog reset:清空慢查询列表

3、服务器端优化-命令及安全配置

        安全可以说是服务器端一个非常重要的话题,如果安全出现了问题,那么一旦这个漏洞被一些坏人知道了之后,并且进行攻击,那么这就会给咱们的系统带来很多的损失,所以我们这节课就来解决这个问题。

        Redis会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,而Redis如果没有做身份认证,会出现严重的安全漏洞. 漏洞重现方式:Redis未授权访问配合SSH key文件利用分析 - 腾讯云开发者社区-腾讯云

        为什么会出现不需要密码也能够登录呢,主要是Redis考虑到每次登录都比较麻烦,所以Redis就有一种ssh免秘钥登录的方式,生成一对公钥和私钥,私钥放在本地,公钥放在redis端,当我们登录时服务器,再登录时候,他会去解析公钥和私钥,如果没有问题,则不需要利用redis的登录也能访问,这种做法本身也很常见,但是这里有一个前提,前提就是公钥必须保存在服务器上,才行,但是Redis的漏洞在于在不登录的情况下,也能把秘钥送到Linux服务器,从而产生漏洞

漏洞出现的核心的原因有以下几点:

  • Redis未设置密码

  • 利用了Redis的config set命令动态修改Redis配置

  • 使用了Root账号权限启动Redis

所以:如何解决呢?我们可以采用如下几种方案

为了避免这样的漏洞,这里给出一些建议:

  • Redis一定要设置密码

  • 禁止线上使用下面命令:keys、flushall、flushdb、config set等命令。可以利用rename-command禁用。

  • bind:限制网卡,禁止外网网卡访问

  • 开启防火墙

  • 不要使用Root账户启动Redis

  • 尽量不是有默认的端口

3.1 设置密码方法:

找到requirepass关键字,后面就是跟的密码,默认情况下是注释掉的,即默认不需要密码,如下:

打开注释,设置为自己的密码,重启即可。

连接方法

# 1、连接时输入密码
[root@localhost bin]# redis-cli -a qwe123456

# 2、先连接再输入密码
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> auth 123456
OK

 3.2 禁用命令

测试:

4、服务器端优化-Redis内存划分和内存配置

        当Redis内存不足时,可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到90%以上时就需要我们警惕,并快速定位到内存占用的原因。

 有关碎片问题分析

        Redis底层分配并不是这个key有多大,他就会分配多大,而是有他自己的分配策略,比如8,16,20等等,假定当前key只需要10个字节,此时分配8肯定不够,那么他就会分配16个字节,多出来的6个字节就不能被使用,这就是我们常说的 碎片问题

进程内存问题分析:

        这片内存,通常我们都可以忽略不计

缓冲区内存问题分析:

        一般包括客户端缓冲区、AOF缓冲区、复制缓冲区等。客户端缓冲区又包括输入缓冲区和输出缓冲区两种。这部分内存占用波动较大,所以这片内存也是我们需要重点分析的内存问题。

内存占用说明
数据内存是Redis最主要的部分,存储Redis的键值信息。主要问题是BigKey问题、内存碎片问题
进程内存Redis主进程本身运⾏肯定需要占⽤内存,如代码、常量池等等;这部分内存⼤约⼏兆,在⼤多数⽣产环境中与Redis数据占⽤的内存相⽐可以忽略。
缓冲区内存一般包括客户端缓冲区、AOF缓冲区、复制缓冲区等。客户端缓冲区又包括输入缓冲区和输出缓冲区两种。这部分内存占用波动较大,不当使用BigKey,可能导致内存溢出。

于是我们就需要通过一些命令,可以查看到Redis目前的内存分配状态:

  • info memory:查看内存分配的情况

 

  • memory xxx:查看key的主要占用情况 

 

接下来我们看到了这些配置,最关键的缓存区内存如何定位和解决呢?

内存缓冲区常见的有三种:

  • 复制缓冲区:主从复制的repl_backlog_buf,如果太小可能导致频繁的全量复制,影响性能。通过replbacklog-size来设置,默认1mb
  • AOF缓冲区:AOF刷盘之前的缓存区域,AOF执行rewrite的缓冲区。无法设置容量上限
  • 客户端缓冲区:分为输入缓冲区和输出缓冲区,输入缓冲区最大1G且不能设置。输出缓冲区可以设置

以上复制缓冲区和AOF缓冲区 不会有问题,最关键就是客户端缓冲区的问题

客户端缓冲区:指的就是我们发送命令时,客户端用来缓存命令的一个缓冲区,也就是我们向redis输入数据的输入端缓冲区和redis向客户端返回数据的响应缓存区,输入缓冲区最大1G且不能设置,所以这一块我们根本不用担心,如果超过了这个空间,redis会直接断开,因为本来此时此刻就代表着redis处理不过来了,我们需要担心的就是输出端缓冲区

我们在使用redis过程中,处理大量的big value,那么会导致我们的输出结果过多,如果输出缓存区过大,会导致redis直接断开,而默认配置的情况下, 其实他是没有大小的,这就比较坑了,内存可能一下子被占满,会直接导致咱们的redis断开,所以解决方案有两个

1、设置一个大小

2、增加我们带宽的大小,避免我们出现大量数据从而直接超过了redis的承受能力

5、服务器端集群优化-集群还是主从

集群虽然具备高可用特性,能实现自动故障恢复,但是如果使用不当,也会存在一些问题:

  • 集群完整性问题
  • 集群带宽问题
  • 数据倾斜问题
  • 客户端性能问题
  • 命令的集群兼容性问题
  • lua和事务问题

 问题1、在Redis的默认配置中,如果发现任意一个插槽不可用,则整个集群都会停止对外服务:

大家可以设想一下,如果有几个slot不能使用,那么此时整个集群都不能用了,我们在开发中,其实最重要的是可用性,所以需要把如下配置修改成no,即有slot不能使用时,我们的redis集群还是可以对外提供服务

为了保证高可用特性,这里建议将 cluster-require-full-coverage配置为 no

问题2、集群带宽问题

集群节点之间会不断的互相Ping来确定集群中其它节点的状态。每次Ping携带的信息至少包括:

  • 插槽信息
  • 集群状态信息

集群中节点越多,集群状态信息数据量也越大,10个节点的相关信息可能达到1kb,此时每次集群互通需要的带宽会非常高,这样会导致集群中大量的带宽都会被ping信息所占用,这是一个非常可怕的问题,所以我们需要去解决这样的问题

解决途径:

  • 避免大集群,集群节点数不要太多,最好少于1000,如果业务庞大,则建立多个集群。
  • 避免在单个物理机中运行太多Redis实例
  • 配置合适的cluster-node-timeout值

问题3、命令的集群兼容性问题

有关这个问题咱们已经探讨过了,当我们使用批处理的命令时,redis要求我们的key必须落在相同的slot上,然后大量的key同时操作时,是无法完成的,所以客户端必须要对这样的数据进行处理,这些方案我们之前已经探讨过了,所以不再这个地方赘述了。

问题4、lua和事务的问题

lua和事务都是要保证原子性问题,如果你的key不在一个节点,那么是无法保证lua的执行和事务的特性的,所以在集群模式是没有办法执行lua和事务的

那我们到底是集群还是主从

单体Redis(主从Redis)已经能达到万级别的QPS,并且也具备很强的高可用特性。如果主从能满足业务需求的情况下,所以如果不是在万不得已的情况下,尽量不搭建Redis集群。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
服务器工程师岗位主要职责   服务器工程师岗位职责1   职责:   1、熟悉VMware虚拟化规划、部署、支持、维护和P2V迁移   2、规划、实施服务器项目、公有云、混合云项目   3、熟悉各类微软产品,尤其是AD及E_change,基础服务器的结构并能提出改善解决 方案   4、服务器发生系统故障时的分析与解决   5、微软体系架构的设计   岗位要求:   1、具有VCP或微软方面的认证证书   2、精通虚拟化及Windows各类应用   3、大专以上学历,计算机专业,英语精通   4、有三年以上从事服务器工程师经验,性格稳重   5、从事过公有云或大型混合云工作者优先   6、有系统集成工作经验者优先   服务器工程师岗位职责2   1、具备3- 4年大型分布式数据库规划,设计经验。熟悉主流的结构化数据库,如Mysql,Postgres ql,Oracle。熟悉主流的Nosql,如Mango,Redis等。   2、理解分布式存储,分布式计算原理。如Hadoop,Spark,Strom等。熟悉数据结构 及数据挖掘算法。   3、理解Java编程语言,Python等脚本语言。熟悉Restfulwebservice及http相关协 议。   4、熟悉基于Linu_系统的开发及项目部署。   5、负责数据库的日常维护与监控;   6、负责数据库的集成安装,测试,升级等;   7、制订数据库备份,恢复流程策略,并保证正确实施;   8、定期对数据库运行状况进行巡检;   9、快速处理业务数据库运行中出现的问题,保证业务数据安全、可用;   10、迅速处理数据库常见告警;   11、快速分析数据库性能异常,升级故障处理流程;   12、根据项目需要,进行数据库结构更改、跟踪、优化等操作。   服务器工程师岗位职责3   1、负责IBM/LENOVO/DELL/HP服务器的售后硬件维修、安装。   2、windows/linu_服务器OS的安装、部署、配置与维护。   3、数据机房日常运维(设备巡检、上架等)。   4、存储设备的安装、部署、配置、维护及日常运维工作等。   5、按照公司的要求进行客户服务,维护客户满意度及维修效率。   服务器工程师岗位职责4   职责:   1、服务器、存储、工作站系统架设和维护   2、项目实施售前、售后技术支持   3、项目实施(架设、安装、调试)   岗位要求:   1、具有一年以上相关工作经验,善于沟通、善于处理客户间的关系;   2、熟悉各种计算机硬件,软件,网络;   3、熟悉linu_、Redhat、windows20__、20__服务器操作系统   4、了解防火墙、路由器、交换机的基础支持,有相关的调试经验   5、具有优秀的沟通能力与逻辑分析能力,工作认真仔细,吃苦耐劳   6、有较强的责任心和事业心,能严格落实执行公司明确的作业规范   7、富有开拓创新意识与工作激情,思维敏捷、有团队协作精神。   服务器工程师岗位职责5   1、编写服务器端总体设计文档,实现关键框架代码   2、负责服务器端架构设计与通讯协议拟定、模块划分、团队合作和人员分工   3、服务器端核心模块与逻辑代码实现   4、服务器端负载优化,网络安全方案设计   5、分析策划案的技术可行性,根据策划文档,独立设计开发相应的游戏模块   6、对游戏设定功能进行服务器端系统设计、编码、测试以及开发文档编写   7、使用c++开发维护服务器底层,开发游戏逻辑,开发周边支持工具等   8、审核其他程序员的代码,帮助程序员提高编码能力,具有在需求明确情况下合理 估算开发时间并严格按照文档要求完成开发功能的能力    ----------------------- 服务器工程师岗位主要职责全文共4页,当前为第1页。 服务器工程师岗位主要职责全文共4页,当前为第2页。 服务器工程师岗位主要职责全文共4页,当前为第3页。 服务器工程师岗位主要职责全文共4页,当前为第4页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stars.Sky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值