`
cfyme
  • 浏览: 275143 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysql如何解决热点数据更新问题

 
阅读更多

原文地址:http://blog.itpub.net/22664653/viewspace-1269948

 

一  背景

     某个业务线 商品开放开用户申请免费试用,当某个商品特别吸引人时,比如iPhone6 。肯定有一大波人为了少卖一个肾 疯狂去抢申请资格。有甚者利用机器人申请注册,于是简单的申请操作变成了秒杀行为. 大量请求同时更新数据库中的同一个商品的申请次数,update 操作给表加上行锁,导致后面的请求全部排队等待前面一个update完成,释放行锁后才能处理下一个请求。大量后来请求等待,占用了数据库的连接。一旦数据库连接数被占满,就会导致后来的全部请求因拿不到连接而超时,业务请求出现无法及时处理的情况,数据库系统的RT会异常飙高,业务层由于等待出现超时,app 层的连接耗尽,一系列的雪崩效应!

 

二 解决方案

     从上面的背景分析,解决热点数据并发更新需要注意核心问题: 减少直接对db层数据热点的并发更新,本文从业务和数据库的设计层面来规划.同时也希望大家提更好的解决思路。

1 前端层面

   前端是整个流量的入口, 正常业务访问时系统表现平稳,但是当有人恶意请求时,需要加上流控措施,比如常见的

   a 需要用户回答问题,填写验证码,移动图像等等,防止或者减少有机器人来恶意请求。 

   b 页面上采用防止机器人的判断 两秒以内的成功请求一律拒绝。

   c 通过设置nginx ,对同一个ip源的请求次数做限制,防止机器人来申请。 

  优点 有效减少或者防止有人利用机器人恶意请求

  缺点 存在一定的误杀率,错杀了正常的请求。 

 

2  应用层

    应用程序接收前端前端请求,进行一系列的数据库操作,在我们规避了恶意请求之后如果还是有大量的数据库写访问请求,我们需要

    a 对业务做降级

 

限制接口的调用次数,降低对数据库的请求压力。

 

选择不更新请求次数,弱化该商品申请次数的展现。类似于阅读次数,申请次数 ,与金额,库存无关的功能点。

    b 通过异步更新来避免直接写数据库 。

      应用使用分布式缓存(比如tair)来存储某项商品的申请次数或者某人的申请次数,以商品id/user_id 或者将where 条件作为key,申请试用人数为value/符合某项具体条件的 count结果为value, 有用户申请成功则更新申请试用人数。不需要查询和实时写数据库,每隔一定时间/次数将结果写入数据库。

      优点:该方法完全依赖于缓存,读写速度快,不需要实时更新数据库,减轻数据库并发写的压力;

      缺点:缓存不是100%稳定,很容易丢,即使采用持久化的缓存,在高并发下有时也可能会出现异常,穿透缓存到db ,导致前端业务展现问题。

    

3 数据库层

    a 将热点数据拆分,分在不同的库不同的表中,分散热点数据,减轻数据库并发更新热点带来的RT升高和应用连接等待时能保证业务能够正常访问其他商品表,损失局部可用性。 

    优点:实时读写数据库,前端展示数据的准确性。

    缺点:业务逻辑稍显复杂。

   b 限流补丁

     针对某些特定的sql语句 从MySQL 层面加以限制,当系统thread_running达到一定值或者某个sql执行时间超过一定阈值则拒绝该sql的执行。(阿里内部已经实现限流版本)

   c 使用MySQL的 thread pool 功能。在并发较大时,one to one的模式会引起Innodb的mutex锁争用。当前解决方法是通过innodb_thread_concurrency参数,但是该参数自身也存在锁争用,同样影响了MySQL的性能。

优点:thread pool主要从四个方面考虑:减少SQL并发,使得有足够的资源:使用线程组,独立管理:使用优先级队列,限制并发执行的事务:避免死锁。

缺点:在测试过程中发现,会有大量的连接等待kernel mutex锁,但是持续的压力会导致MySQL的thread running飙高,最终导致MySQL不可用。

三 小结

     在电商类业务中数据库的热点/单点更新 一直是DBA和业务方比较关心的问题,它最直观的影响用户体验,比如商品的超卖,系统的可用性。需要不断的细化解决思路和具体实现比如 热点商品的属性是否实时更新 ,库存数量需要实时展示,访问次数,请求次数可以异步延迟展示。本文只是简单阐述了 对热点更新的解决思路,还有不完善的地方,欢迎给位提供更好的建议。

 

 

分享到:
评论

相关推荐

    MySQL 数据库如何解决高并发问题

    - **分离活跃数据**:热点数据放入活跃表,优先查询,未命中再查询全量数据。 - **分块**:数据分块策略,通过预计算定位到数据块,减少全表扫描。 3. **分散压力**:通过分布式策略减轻单个数据库服务器压力。 ...

    sentinel-mysql规则持久化,持久化规则数据至mysql,包含数据表结构,一键启动

    总的来说,这个项目提供了一个完整的 Sentinel 规则持久化到 MySQL 的解决方案,包括必要的数据表结构、配置文件、控制台 JAR 包以及一键启动脚本。通过这个方案,开发者可以方便地管理和维护 Sentinel 的流量规则,...

    用MYSQL构建健壮的数据中心

    无论是从数据完整性与安全性出发,还是考虑系统的高可用性、扩展性以及性能优化等方面,MySQL都能够提供相应的解决方案和技术支持。因此,在规划和建设数据中心时,充分利用MySQL的强大功能,将有助于打造一个更加...

    mysql高并发解决方案

    5. **异步处理**:对于耗时的操作,如大批量数据更新,可以采用消息队列(如RabbitMQ或Kafka)进行异步处理,避免阻塞主线程。 6. **数据库复制**:通过主从复制,实现数据备份和负载均衡。在读多写少的场景下,...

    高可用MySQL_构建健壮的数据中心_第2版

    - 缓存策略:如使用Memcached或Redis缓存热点数据,减少数据库访问。 - 表结构优化:分区、分表、列式存储等技术,针对大数据场景进行优化。 5. **备份与恢复** - 基于时间点的备份:使用binlog进行增量备份,...

    面向海量天文数据的分布式MySQL锥形检索研究.pdf

    分布式系统是解决大规模数据存储和检索问题的关键技术。它通过将数据分布存储在多个物理节点上,能够有效地扩展系统的存储容量和处理能力。分布式中间件作为分布式系统中的一种软件架构,能够管理数据在多个节点间的...

    mysql海量数据的存储和访问解决方案参考.pdf

    理想的路由规则应能平衡数据分布,减少热点问题,同时易于扩展,允许添加更多数据库节点。负载均衡策略也是关键,通过智能地分配请求,确保各数据库节点间的负载均衡,进一步提高系统的可用性。 在实际应用中,...

    mysql海量数据

    - **使用Redis或Memcached**:将热点数据缓存在内存中,减少对数据库的直接访问频率。 - **页面缓存**:对于一些变化不大或者计算复杂度较高的查询结果,可以考虑将其缓存在应用层,避免每次请求都执行相同的SQL语句...

    mysql热点面试题20道.zip

    这份压缩包“mysql热点面试题20道.zip”包含了两份文件,一份是“mysql学习资源.docx”,另一份是“mysql热点面试题20道.pdf”,它们都是关于MySQL面试准备的重要参考资料。以下是基于这些文件可能涵盖的一些核心...

    sentinel-1.6.2控制台增加监控数据持久化mysql和规则数据持久化nacos部署war包.zip

    在这个特定的场景中,我们关注的是 Sentinel 控制台的 1.6.2 版本,它已经针对生产环境进行了增强,支持将监控数据持久化到 MySQL 数据库,并且规则数据可以持久化到 Nacos 配置中心。 首先,Sentinel 控制台默认...

    基于MySQL的分布式数据库实践

    - **第三阶段:** 按照数据的冷热度进行分层缓存,将热点数据存储在更靠近应用层的位置,以进一步提高访问速度。 **缓存原则:** - 采用一致性Hash算法进行缓存分布管理。 - 对于所有热数据都采用双写策略,即同时...

    MySql5.7.zip

    - `refman-5.7.pdf`:这是MySQL 5.7的参考手册,详尽地介绍了所有语法、函数、配置选项以及系统变量等,是学习和解决问题的重要参考资料。 - `Mysql5.7官方文档(英文版).pdf`:英文原版文档提供了更详细的背景信息...

    实战体验几种MysqlCluster 方案.zip

    - 选择合适的数据分片策略,确保热点数据均匀分布。 - 使用高效的网络硬件和低延迟的网络环境。 - 调整集群参数,如内存分配、数据节点数量等。 - 监控集群状态,及时发现和解决问题。 9. **故障恢复与灾难恢复...

    MYSQL集群+HA高可用【MySQL性能调优】.pdf

    MySQL Cluster是一种高度可扩展、高可用的数据库解决方案,特别设计用于处理大规模在线事务处理(OLTP)工作负载,提供接近实时的数据复制和故障恢复能力。其核心优势在于能够达到99.999%以上的高可用性,通过分布式...

    行业-17 MySQL是如何基于冷热数据分离的方案,来优化LRU算法的.rar

    为了解决这个问题,MySQL引入了冷热数据分离的概念。 首先,理解MySQL的InnoDB存储引擎。InnoDB使用缓冲池(Buffer Pool)来缓存数据页和索引页,以减少磁盘I/O。默认情况下,缓冲池中的页会根据LRU算法进行管理。...

    redis+mysql使用学习

    当与关系型数据库MySQL配合使用时,可以作为缓存层,存储热点数据,减少对MySQL的直接访问,降低数据库负载。 1. **Redis缓存策略** - **LRU(Least Recently Used)**:当缓存满时,Redis通常采用LRU策略淘汰最少...

    解决分布式数据插入数据库~一致性hash算法

    一致性哈希算法(Consistent Hashing)是一种常用于分布式系统中的数据分片策略,它有效地解决了数据在多台服务器间均匀分布的问题,同时减少了因节点加入或离开时的数据迁移成本。 首先,一致性哈希的基本原理是将...

    Python+MySQL分表分库实战

    Kafka的高吞吐量和持久化特性使得它在处理大规模数据流时表现出色,而Redis作为内存数据库,能够提供极高的读写速度,非常适用于缓存热点数据。 通过本实战教程的学习,读者将能够掌握MySQL分库分表的理论知识和...

    Mysql性能优化教程

    - 优化数据分布策略,减少热点问题。 **4.4 分布式方案** - **分库&拆表方案**: - 将数据分布在不同的数据库或表中,降低单个节点的压力。 - 采用Hash算法或范围划分等策略分配数据。 - **主从架构**: - 主节点...

Global site tag (gtag.js) - Google Analytics