Redis企业实战的一些坑
一、前言
小伙伴们对Redis应该不陌生,Redis是系统必备的分布式缓存中间件,主要用来解决高并发下分担DB资源的负载,从而提升系统吞吐量。
Redis支持多种数据类型,String(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),不同的类型可以应用到不同的业务需求中。
Redis的集群部署也增强了Redis的高可用性,以及对数据的易扩容。
上面都是Redis知识掌握的重点,这些知识点也是我们工作的时候,经常用到的,网上介绍的也挺多,老顾就不介绍了。
今天老顾分享Redis企业应用,从业务实战的纬度,看看我们平时使用Redis出现了什么问题?如何去解决?
二、Redis集群划分
现在我们企业中,做的项目产品肯定不止一个;或者一个大的平台中,会有很多业务线。不同的项目和业务线肯定是不同的团队进行开发的。那大家都会用到Redis,那怎么去划分?
独立Redis集群
这种方案就是不同的业务用不同的Redis集群,这种方案针对一些小项目或业务线不复杂,以及用到Redis缓存范围不大的话,是对服务器资源的浪费,而且增加了运维的工作量。
当然也有好处,就是Redis资源的独立性,不干扰;一般会用在大项目中。
公共Redis集群
这种方案就是一些业务共用一个Redis集群,增强了对Redis资源的利用率。
三、问题
在一般企业中,不同的业务线一般我们采用的是公共Redis集群,因为业务线都不大,独立集群没有必要。这样虽然对Redis资源充分利用了,但会出现一些问题。
四、如何区分业务
多业务间用Redis,会出现很多缓存Key,根本没法知道哪些key是属于哪个业务的,如:
KEY: user:1000、user:book、book、user:like:book、book:user;甚至会出现key冲突。
Redis的key在开发的使用是要合理进行设计规划的,但两个不同的团队,技术和管理都不一样,即使有规范文档,但不同的业务团队间,规范的执行就不得而知。
五、如何优雅扩容
我们在开发web服务时,会用类似jedis客户端连接Redis服务器,会在配置文件中加入Redis集群地址。不过当系统遇到Redis负载太高,或者redis的数据需要扩容,就需要增加Redis服务器。这时就需要重新把配置文件中的Redis集群更改,再重启应用。
上面的方式是否太low了,都需要重新启动应用,那么多的应用都需要重启,是不是很麻烦,而且如果在无法区分业务的情况下,还不知道重启哪些业务应用。
六、如何发现异常
因为不同的业务,不同的团队,不同的开发人员在真实业务场景中,我们管理者是无法避免bug存在的,也无法预测线上会发生什么样的问题?如:发现Redis集群有不稳定情况,cpu负载非常高,那我们怎么知道是哪个业务导致的呢?
这个是非常重要的,因为这个是公共的Redis集群,一旦这个集群挂了,会影响整个业务。
七、如何截断异常
当我们在生产环境中,发现异常是由哪个业务产生时,或者是哪个应用服务器产生的,那如何很快速截断的让有问题的业务和应用服务器,先不让他们访问我们公共Redis集群,等排查出原因在恢复他们的访问权限。
八、解决方案
小伙伴看到这里,感觉怎么样?是不是工作中,没有想过这些问题,工作中就直接按照网上的介绍先拿来用了。
现在是不是心里在想,怎么去解决上面的问题?
老顾这里介绍一下解决思路,具体整个代码等老顾的开源项目rb-cache上线后,会分享给大家。
九、区分业务
这个问题解决相对比较简单,就是对我们现有的客户端工具,进行二次封装,
上图就是定义一个二次封装接口
其实原理就是强制在方法中,要开发人员赋予业务区分,每个业务都是在开发前,管理人员定下来的,这个管理就比较简单了。
如果项目管理中,对业务的划分比较合理的话,可以在外面再封装一个简单的方法,把business业务放在配置文件中,这样就不需要每次都要传business这个参数了。
十、优雅扩容
解决这个问题,其实原理比较简单,就是程序如果能够知道Redis集群地址产生了变化,重新设置一下jedis客户端的连接配置。现在的问题就是如何知道Redis集群地址发生了改变?
我们可以采用把Redis的集群地址配置在zookeeper中,应用在启动的时候,获取zk上的集群地址的值,进行初始化。如果想要改变集群地址,要在zk上面进行设置。
zk重要的特性就是监听特性,节点发生变化,就会立刻把变化发送给应用,从而应用获取到值,重新设置jedis客户端连接
十一、发现异常
发现异常这个问题,其实就是一个监控的问题,我们需要把各个客户端使用Redis的情况进行监控。怎么监控?
需要一个监控工具,这个监控工具网上有几个,推荐使用小米的open-falcon,自行搭建改监控系统,搭建比较复杂,但功能比较强大,很多公司都在使用。
当然小伙伴们可以用别的监控工具,只要数据上报协议,和监控报表输出功能即可,当然也要有报警的功能,及时给运维人员报告
再使用Aop拦截Redis操作类,拦截Redis操作,把相关数据进行封装。每隔1分钟把这些数据上报到open-falcon平台中。具体监控什么数据,由业务决定,一般要把设置的key,业务,操作时长,哪个客户端IP发起的,都需要监控。
在可以设置相关的报警规则,如:某个key一直被调用,在一段时间内操作次数太高。这样就可以方便排查哪些key导致cpu负载太高,就可以去看一下设置这个key的代码,有没有什么问题?是不是死循环等问题?
十二、截断异常
在上面的发现异常的基础上面,如果发现某些业务应用,不正常,就可以立即发起截断该客户端的请求,这样可以保证其他业务不受影响。这里我们使用客户端方式去实现截断。原理也很简单,在Redis二次封装的类中,我们需要判断本机是否在黑名单中,如果存在,则无法操作方法,或报异常。
如何知道黑名单的变化,跟优雅扩容那个Redis集群地址的改变,方案一样。
十三、总结
在企业应用中,小伙伴们要经常去思考,业务进行中,如何方便管理,及时发现问题,是非常重要的。这也是很多管理者经常忽略的,都只是先把功能完成了,而不顾管理和监控。希望这篇文章能够帮助大家,从另一个纬度发现问题。谢谢!!!
Redis企业实战的一些坑的更多相关文章
- Redis企业实战的几个坑
一.前言 小伙伴们对Redis应该不陌生,Redis是系统必备的分布式缓存中间件,主要用来解决高并发下分担DB资源的负载,从而提升系统吞吐量. Redis支持多种数据类型,String(字符串).li ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- Redis Cluster踩过的坑
Redis Cluster踩过的坑请参考如下链接:http://www.iteye.com/blogs/subjects/Redis_Cluster_Devops
- Docker系列一之基础快速入门企业实战
1.1什么是LXC LXC为Linux Container的简写.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚 ...
- docker企业实战视频教程
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...
- laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到
laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...
- Jenkins持续集成企业实战系列之Jenkins插件下载及邮件配置-----05
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- Jenkins持续集成企业实战系列之Jenkins手动构建-----04
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- Jenkins持续集成企业实战系列之Jenkins配置演示-----03
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
随机推荐
- MIG(ddr3)工程报错解决:IO constraint DQS_BIAS\Multiple Driver Net
现象 在布线自己写的ddr3压力测试代码时,报如下错误. [Constraints 18-586]IO constraint DQS_BIAS with a setting of TRUE for c ...
- Thymeleaf 模板
Thymeleaf 模板布局 th:fragment.th:replace.th:insert.th:remove th:fragment 模板布局 模板片段说明 模板中,经常希望从其他模板中包含⼀ ...
- javascript_02-变量
变量 var number = 5; number = 5; //与上面一样的效果,语法没错误,但是不规范 var:关键字,变量的意思. 变量可以立即赋值,也可以稍后赋值. 堆和栈 内存中有两个区域, ...
- Android笔记(二十八) Android中图片之简单图片使用
用户界面很大程度上决定了APP是否被用户接收,为了提供友好的界面,就需要在应用中使用图片了,Android提供了丰富的图片处理功能. 简单使用图片 使用Drawable对象 为Android应用增加了 ...
- NTFS文件系统概述
NTFS简介 NTFS是Windows NT家族1的限制级专用的文件系统2.Win95.Win98识别不了NTFS,只有支持NT内核的OS才能识别NTFS文件系统.当前,NTFS取代了老式的FAT文件 ...
- Jenkins配置文件
https://github.com/zeyangli/Jenkins-docs 在Linux上的Jenkins 以rpm方式部署的配置文件在/etc/sysconfig/jenkins,可以定义Je ...
- Plot the figure of K-SVCR
clear %% generate data prettySpiral = 0; if ~prettySpiral % generate some random gaussian like data ...
- JDK环境变量配置linux
安装前先查看是否安装过jdk如果安装过则 卸载 1. 确定JDK的版本: rpm -qa | grep jdk rpm -qa | grep gcj 可能的结果是: libgcj-4.1.2-42.e ...
- jquery基础知识3
1.jquery的位置信息 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Kubernetes 从懵圈到熟练 – 集群网络详解(转)
阿里云K8S集群网络目前有两种方案,一种是flannel方案,另外一种是基于calico和弹性网卡eni的terway方案.Terway和flannel类似,不同的地方在于,terway支持Pod弹性 ...