mysql读写分离在项目实践中的应用「终于解决」

mysql读写分离在项目实践中的应用「终于解决」工程背景介绍: 我们开发了一个万能接口,用户通过这个接口中传入数据,我们拿到数据进行复杂的逻辑处理然后再将数据各种匹配展示分发等操作,处理的流程相当庞大,接口中我们只保留了接收数据和返回一个本次请求…

mysql读写分离在项目实践中的应用

mysql读写分离在项目实践中的应用「终于解决」

工程背景介绍:

我们开发了一个万能接口,用户通过这个接口中传入数据,我们拿到数据进行复杂的逻辑处理然后再将数据各种匹配展示分发等操作,处理的流程相当庞大,接口中我们只保留了接收数据和返回一个本次请求的id的操作,其余操作都是异步到其他程序中处理的。

返回id的操作是需要和数据库进行两次连接,一次读库得到最新的id 然后把id更新到数据库。

v2-4d5a5146e4cb1120114a4e26917d8222_720w.jpg

项目出现问题:

我们以为自己的程序就像上图中的那样运行,一次请求,读库,写库,返回id,其余异步处理。但是没有考虑高并发,强压力写的性能问题,在高并发下,多个接口线程同事访问数据库,这样的情况会出现并发同步的问题,当然这点我们是考虑到了 ,使用线程锁可避免数据的幻读,重复读等。可一旦这样大量的接口线程堆积,很快服务器cpu将扛不住发生宕机!

那如果不试用线程同步锁呢,很明显不只是数据的错乱问题将发生,数据库在极大线程的访问压力下也将抗不住,cpu使用率达到85%!程序面临着瘫痪的风险。

v2-87f40e3a447c72efd7f6327d44fa457f_720w.jpg

解决方式:

1.数据库集群?

好处:增加数据库服务器,压力随之分摊到几个服务器中,减小数据库压力

坏处:硬件成本大 数据库主从问题 哈希一致性问题 单点故障问题

2.接口服务器集群

好处:访问压力被分摊到几个服务器中 线程的堆积问题得到有效解决

坏处:硬件成本大 单点故障问题 nignx负载均衡服务器的搭建 操作复杂

 

以上两种方案都是增加硬件成本,加大了开发难度,难以真正实施

终极解决方案:读写分离的应用!

好处:硬件成本不变 释放了数据库压力 再也不用担心数据库和服务器压力了

坏处:无

实现思路:

1.对读库操作解耦合,增加缓存服务ecache(也可以是其它如redis),读不再直接面对数据库,只有缓存中没有数据时才把数据库中的数据读写到缓存之中,这样数据库的读压力完全被释放!

2.对写数据库进行异步操作,在更新数据库操作中增加消息中间件rabbitmq(也可以是其它如activemq,spring对前者支持较好),我们将更新后的id写入到rabbitmq中,单线程消费mq到数据库,由于此时跟新后的id已经返回给客户,写库的操作并不需要高时效性。这样数据库的写压力也完全被释放!

这个时候我们来看看整个操作,读写均不再直接面对数据库,但是数据库中的数据依然没有错乱,缓存的操作速度极快,接口服务器也不再有很多的线程挤压,我们在硬件成本不变的情况下解决了数据库和服务器压力过大,可以说是一种完美的解决方案

v2-93fb5dcaa468c2500f41fe25f056289d_720w.jpg

至此,压力的问题成功解决,当然问题的解决并非是一撮而就的,这里还有着一些其它的问题,比如分布式事务的解决,这里不再一一赘述,后面我们找机会仔聊聊这些分布式服务的经典问题!

 

mysql读写分离在项目实践中的应用「终于解决」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7216.html

(0)
上一篇 2023-03-24
下一篇 2023-03-24

相关推荐

  • 第一次SQL注入[通俗易懂]

    第一次SQL注入[通俗易懂]
    第一次sql注入 1.在sqlmap文件安装目录下输入打开cmd,输入: sqlmap.py 2. sqlmap.py -u url(url:目标地址) s…

    2023-04-09
    159
  • 集群行为分析_redis多级hash嵌套

    集群行为分析_redis多级hash嵌套KINGBASE、repmgr、PostgreSQL

    2023-04-19
    156
  • 利用Python Dictionary实现数据快速查询

    利用Python Dictionary实现数据快速查询Python中的字典是一种无序的键值对数据类型,其底层实现采用了哈希表的数据结构,使得字典可以实现快速的数据查找。使用字典可以方便地通过键来获取对应的值,同时也可以添加、修改、删除键值对。以下是一个简单的字典示例:

    2024-01-10
    109
  • 使用Python Launcher执行Python脚本

    使用Python Launcher执行Python脚本Python是一门广泛应用于各种开发场景下的高级编程语言,由于其简洁、易读、易学以及强大的库和工具集,Python在Web开发、数据科学、机器学习、人工智能等领域得到了广泛的应用。Python Launcher是一个方便的工具,可以轻松地管理和运行多个Python版本和脚本。

    2024-04-25
    60
  • Python降低字符串大小写

    Python降低字符串大小写在Python中,字符串的大小写问题经常需要处理。一般情况下,我们需要将一个字符串的大小写进行统一,以方便后续的处理。Python内置的字符串处理函数可以实现这个功能。

    2024-02-05
    83
  • 使用正则表达式优化文本内容处理

    使用正则表达式优化文本内容处理正则表达式是一种文本处理工具,它用于匹配、搜索及替换字符串中的特定的字符序列。正则表达式在多种编程语言中均有支持,在很多场景中都可以使用,例如文本编辑器、命令行工具等。

    2024-01-21
    106
  • Python中数字转换为字符串的几种方法

    Python中数字转换为字符串的几种方法Python 是一种强大而又易学的编程语言,其内置了许多现成的函数,使我们的编程工作变得更加方便。在本文中,我们将介绍 Python 如何将数字转换为字符串,并提供一些常用的方法和实例。

    2024-06-28
    41
  • 综合脚手架工程量怎么算_脚手架工程资质

    综合脚手架工程量怎么算_脚手架工程资质高日耀 资深数据库内核研发 毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),现主要负责 MyS

    2023-04-27
    157

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注