高并发的优化lua + openresty+redis +mysql(实现多级缓存)+限流+canal同步解决方案

一、多级缓存(lua + openresty+redis+mysql )

思路:
  1.  先从openresty的缓存中的数据 如果能获取直接返回。
  2.  如果获取不到openresty的数据,再从redis中获取数据 ,如果能获取,将redis的数据存储到 openresty中,再直接返回。
  3. 如果获取不到redis中的数据,再从mysql中获取,将数据存储到redis中,再返回。

1.1 lua介绍

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

1.2 openresty介绍

是一个基于nginx的web平台,主要是集成了lua的模块 直接提供给我们开发人员使用。能够实现超高性能的处理 1000K

OpenResty(又称:ngx_openresty) 是一个基于 nginx的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。

OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。

360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度用户。

OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑,而不再像之前,还需要在nginx中自己编写lua的脚本,再进行调用了。

二、限流(漏桶算法)

一般情况下,首页的并发量是比较大的,即使有了多级缓存,当用户不停的刷新页面的时候,也是没有必要的,另外如果有恶意的请求大量达到,也会对系统造成影响。而限流就是保护措施之一。

2.1 生活中限流对比

  • 水坝泄洪,通过闸口限制洪水流量(控制流量速度)。

  • 办理银行业务:所有人先领号,各窗口叫号处理。每个窗口处理速度根据客户具体业务而定,所有人排队等待叫号即可。若快下班时,告知客户明日再来(拒绝流量)

  • 火车站排队买票安检,通过排队 的方式依次放入。(缓存带处理任务)

2.2 nginx的限流

nginx提供两种限流的方式:

  • 一是控制速率

  • 二是控制并发连接数

2.3控制速率的方式之一:采用漏桶算法

(1)漏桶算法实现控制速率限流

漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.示意图如下:

 

三、canal同步解决方案

3.1 主要用途:基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

   canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的。阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务。

3.2  原理:根据mysql MS架构实现模拟slave获取master的binlog数据进行解析和处理

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流)

 3.3 角色(两个)

canal-server 服务端 伪装他自己是一个malseter的 slave 
canal-client 客户端 用来监听canal-server客户端(java的客户端:处理数据以及业务逻辑)

3.4 canal简单的同步的思路:

1.有个数据库 是master 
2.canal-server 是slave(伪装的)
3.canal-client 进行监听canal-server 
4.一旦数据库master发生数据更新,canal-server就获取到数据,canal-client 监听到数据变化,在客户端中代码实现:统一获取到数据,进行同步即可

3.5 搭建canal并实现监听数据的变化的步骤:

1. mysql 需要开启binlog (master角色)
2. mysql 创建一个账号 用于salve专门使用,授予权限slave的权限 远程授权。
3. 通过docker 安装canal-server 
4. 配置canal-server(配置连接到的master的ip和端口 以及自身的账号和密码以及要监听的数据库和表有哪些)
5. 搭建canal-client(java微服务:监听canal-server 获取被修改的数据,然后做业务逻辑:同步数到redis中)
    1.先下载参考,再安装起步依赖到本地仓库
    2.再添加起步依赖 刷新
    3.创建启动类启用canalclient
    4.创建监听类 监听canal-server 实现当发生了CRUD的时候执行业务代码
    5.配置客户端对应的服务端的地址和端口
    

6.canal-client写代码验证是否能监听到数据。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值