高性能MySQL.读书笔记(四)可扩展的MySQL

高性能MySQL读书笔记(一) mysql是开发必备知识,不管是工作还是面试中mysql性能优化都是一个热门话题,最近买了《高性能MySQL》这本书,我在每看完一章后都会写一遍博客来作为读书笔记,方便自己日后查阅也希望能帮助到正在看这边博客的你。 MySQL逻辑架构 MySQL的逻辑架构图如下所示: 最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。 第二层机构是MySQL比较有意思的部分。大多数MySQL的核心服务功能都在这一层,包括查询解析、分析、. 阅读详情

向上扩展

向上扩展(有时也称为垂直扩展)意味着购买更多强悍的硬件,对很多应用来说这是唯一需要做的事情。这种策略有很多好处。例如,单台服务器比多台服务器更加容易维护和开发,能显著节约开销。在单台服务器上备份和恢复应用同样很简单,因为无须关心一致性或者哪个数据集是权威的。向上扩展比处外扩展更简单。

 

尽管可以在非常强大的服务器上运行MySQL,但和大多数据库一样,在增加硬件资源的情况下MySQL也无法很好地扩展(非常奇怪!)。为了更好地在大型服务器上MySQL,一定要尽量选择最新的版本。建议使用MySQL5.5或更新的版本,或者PerconaServer 5.1及后续版本。即使如此,当前合理的“收益递减点”的机器配置大约是256G RAM,32核CPU以及一个PCIeflash驱动器。实际上在更大的系统上,可以通过运行多个小的MySQL实例来替代单个大实例,这样可以获得更好的性能。

 

向上扩展的策略能够顶一段时间,实际很多应用是不会达到天花板的。但是如果应用变得非常庞大,向上扩展就没办法了。

 

向外扩展

向外扩展有时也称为横向扩展或者水平扩展,策略划分为三个部分:复制、拆分,以及数据分片(sharding)。

 

最简单的扩展方法是通过复制将数据分发到多个服务器上,然后将备库用于读查询,即读写分离。

 

另外一个比较常见的向外扩展方法是将工作负载分布到多个“节点”。许多大型的MySQL应用不能自动分布负载,就算有也没有做到完全的自动化。

 

一个节点可能就是一台服务器,如果设计冗余,那么一个节点通常是下面的某一种:主主复制,一主多备复制,一主多备DRBD复制,共享存储。大多数情况下,一个节点内的所有服务器应该拥有相同的数据。我们倾向于把主主复制架构作为两台服务器的主动被动节点。

 

按功能拆分

按功能拆分,或者说按业务拆分,意味着不同的节点执行不同的任务。将独立的服务节节点分配给不同的应用,这样每个节点只包含特定应用的数据,即按库划分。

 

另一个可能的按功能划分方法是对单个服务器的数据进行划分,产确保划分的表集合之间不会执行关联操作,即按表划分。

 

但是功能划分不能无限地进行扩展,因为如果一个功能区哉被捆绑到单个MySQL节点,就只能进行垂直扩展。如果进行了太多的功能划分,以后就很难采用更具扩展性的设计了。

 

数据分片

在目前用于扩展大型MySQL应用的方案中,数据分片是最通用且最成功的方法。它把数据分割成一小片,或者说一块,然后存储到不同的节点中。

 

数据分片和某些类型的按功能划分联合使用时非常有用。大多数分片系统也有一些“全局”的数据不会被分片(例如城市列表或者登录数据)。全局数据一般存储在单个节点上,并且通常保存在类似memcached这的缓存里。

实际上,大多数应用只会对需要的数据做分片,通常是那些将会增长得非常庞大的数据。

 

如果事先知道应用会扩大到很大的规模,并且清楚按功能划分的局限性,就可以跳过中间步骤,直接从单个节点升级为分片数据存储。事实上,这种前瞻性可以帮你避免由于粗糙分片方案带来的挑战。

采用分片的应用常用一个数据库访问抽象层,用以降低应用和分片数据存储之间通信的复杂度,但无法完全隐藏分片。因为相比数据存储,应用通常更了解跟查询相关的一些信息。

 

分片?还是不分片?

这是个问题,对吧?答案很简单:如非必要,尽量不分片。首先看是否能通过性能调优或者更好的应用或数据库设计来推迟分片。如果能足够长时间地推迟分片,也许可以直接购买更大的服务器,升级MySQL到性能更优的版本,然后继续使用单台服务器,也可以增加或减少复制。

 

简单的说,对单台服务器而言,数据大小或负载变得太大时,分片将是不避免的,如果不分片,而是尽可能地优化应用,系统能扩展到什么程度呢?答案可能会让你很惊讶。有些非常受欢迎的应用,你可能以为从一开始就分片了,但实际上直到已经值数十亿美元并且流量极其巨大也还没有采用分片的设计。分片不是城里唯一的游戏,在没有必要的情况下采用分片的架构来构建应用会步履维艰。

 

 

分片要解决如下几个问题,关于分片的详细做法我们以后详细讨论。

选择分区键

多个分区键

跨分片查询

在节点上部署分片

重新均衡分片数据

 

生成全局唯一ID

当希望把一个现有系统转换为分片数据存储时,经常会多台机器上生成全局唯一ID。单一数据存储时通常可以使用AUTO_INCREMENT来获取唯一ID。但涉及多台服务器时就不凑效了。以下几种方法可以解决这个问题:

使用auto_increment_increment和auto_increment_offset

这种方法比较简单,是普遍的方法。

全局节点中创建表

在一个全局数据库节点创建一个包含AUTO_INCREMENT列的表,应用可以通过这个表来生成唯一数字。

使用memcached

在memcached的API中有一个incr()函数,可以自动增长一个数字并返回结果。

批量分配数字

应用可以从一个全局节点中请求一批数字,用完后再申请。

使用复合值

可以使用一个复合值来做唯一ID,例如分片号和自增数的组合。

使用GUID值

可以使用UUID()函数来生成全局唯一键值。注意,这个函数在基于语句的复制时不能正确复制,但可以先获得这个值,再存放到应用的内存中,然后作为数字在查询中使用。GUID的值很大并且不连续,因此不适合作InnoDB表的主键


关于数据库Sharding方面的资料,可以下载一份文档:http://download.youkuaiyun.com/download/xtjsxtj/6506217

 

通过多实例扩展

研究和经验表明MySQL并不能完全发挥现代硬件的性能。当扩展到超过24个CPU核时,MySQL的性能开始趋于平缓,不再上升。当内存超过128G时也同样如此,MySQL甚至不能完全发挥诸如Virdent或Fusion-io卡这样的高端PCIeflash设备的I/O性能。

 

不要在一台性能强悍的服务器上只运行一个服务器实例,你可以让数据分片足够小,以使每台机器上都放置多个分片(这也是我们一直提倡的),每台服务器上运行多个实例,然后划分服务器的硬件资源,将其分配给每个实例。

这样做尽管比较麻烦,但确实有效。这是一种向上扩展和向外扩展的组合方案。

 

我们已经在一台性能强悍的硬件上获得10倍或15倍的合并系数。你需要平衡管理复杂度代价和更优性能的收益,以决定哪种方法是最优的。

这个时候网卡可能会成为瓶颈,可以通过使用多块网卡并进行绑定来解决这个问题。

 

另一个方法是将每个MySQL实例绑定到特定的CPU内核上。

 

向内扩展

处理不断增长的数据和负载最简单的办法是对不再需要的数据进行归档和清理。这种操作可能会带来显著的成效,具体取决于工作负载和数据特性。

 

保持活跃数据独立性

即使不真的把老数据转移到别的服务器,许多应用也能受益于活跃数据和非活跃数据的隔离。这有助于高效利用缓存,并为活跃数据使用不同的硬件或应用架构。下面列举了几种方法:

将表划分为几个部分:

分表是一种比较明智的办法,特别是整张表无法完全加载到内存时。

 

MySQL分区表

MySQL5.1以后提供了对表进行分区的功能,能够帮助把最近的数据留在内存中。

 

基于时间的数据分区

如果应用不断有新数据进来,一般新数据总是比旧数据更加活跃。例如博客流量最大的是七天内发表的文章和评论。更新的大部分是相同的数据集。因此这些数据被完整地保留在内存中,其它数据则完全可以放到别的地方。

象日志,异动,通话记录这样的数据,往往经常查询的都是最近几个月的数据,这样就比较适合按年,按月或按天建表存储数据。

 

直接连接

有些人认为负载均衡是配置在应用和MySQL服务器之间的东西。但这并不是唯一的负载均衡方法。你可以在保持应用和MySQL连接的情况下使用负载均衡。事实上,集中化的负载均衡系统只有在存在一个对等置换的服务器池时才能很好地工作。如果应用需要做一些决策,例如在备库上执行读操作是否安全,就需要直接连到服务器。

 

除了出现的一些逻辑,应用为负载均衡做决策是非常高效的。例如,如果有两个完全相同的备库,你可以使用其中一个来处理特定分片的数据查询,另一个处理其他的查询。

 

 

 

复制上的读写分离

MySQL复制产生了多个数据副本,你可以选择在备库还是主库上执行查询。由于备库复制是异步的,因此主要的难点是如何处理备库上的脏数据。

 

基于查询分离

将所有不能容忍脏数据的读和写查询分配到主库,其它的读查询分配到备库上。

 

基于脏数据分离

让应用检查复制延迟,以确定备库数据是否太理。许多报表类应用都用这个策略:只需要晚上加载的数据复制到备库即可。

 

基于会话的分离

判断用户自己是否修改了数据,需要看到自己的更新。可以在会话层设置一个标记,表明做了更新,就将该用户的查询在一段时间内总是指向主库。这是我们通常推荐的策略,因为它是在简单和有效性之间的一种很好的妥协。

还可以把基于会话的分离和复制延迟监控结合起来,如果用户在10S前更新了数据,而所有备库延迟在5S内,就可以安全地从备库读取数据。

 

基于版本分离

从备库读取对象的版本或时间戳来判断数据是否够新。如果备库数据太旧,可以从主库获取最新数据。

 

基于全局版本/会话分离

当应用执行写操作时,在提交事务后,执行一次SHOW MATERSTATUS操作。然后在缓存中存储主库日志坐标,作为被修改对象以及/或者会话的版本号。当应用连接到血库时,执行SHOWSLAVE STATUS并将血库上的坐标和缓存中的版本号相对比。如果备库更新,就可以安全地读取备库数据。

 

大多数读/写分离解决方案都需要监控复制延迟来决策读查询的分配,不管是通过复制或负载均衡器,或是一个中间系统。如果这么做,需要注意通过SHOWSLAVE STATUS得到的Seconds_behind_maste列的值并不能准确地用于监控延迟。

 

 

总结

正确地扩展MySQL并没有看起来那么美好。从第一天就建立一个Facebook架构,这并不是正确的方式。最好的策略是实现应用所明确需要的,并为可能的快速增长做好预先规划,成功的规划是可以为任何必要的措施筹集资金以满足需求。

 

在MySQL扩展策略方面,典型的应用在增长到非常庞大时,通常先从单个服务器转移到向外扩展的拥有读备库的架构,再到数据分片和按功能分区。我们并不同意那些提倡为每个应用“尽早分片,尽量分片”(shardearly, shard often)的建议。这很复杂且代价昂贵,并且许多应用可能根本不需要。可以花一些时间去看看新的硬件和新版本的MySQL有哪些变化。

 

当存在多个服务器时,可能出现跟一致性或原子性相关的问题。我们看到的最普遍的问题是缺少会话一致性。负载均衡器可以解决这个问题,但它本身也有一些问题。

突破枷锁:解析MySQL扩展性瓶颈与应对策略 MySQL作为一种轻量级、开源、易于使用的关系型数据库管理系统,在小型到中型应用中广受欢迎。其简单的部署和良好的性能使得它成为许多企业和开发者的首选。然而,随着数据量和并发请求的增加,MySQL可能会面临扩展性的挑战。这些挑战可能导致数据库性能下降,甚至系统崩溃,对业务造成严重影响。因此,本文旨在深入分析MySQL的扩展性瓶颈,并提供相应的解决方案,以帮助开发者有效应对这些挑战。 阅读详情

相关推荐

基于MySQL的实用可扩展架构设计_-_新浪杨海朝

新浪高级DBA,整个新浪数据库运维工作,超过700台数据库机器,每天查询量超过50亿...

6种MySQL数据库平滑扩容方案剖析

但是在极限情况下, 即便通过上面的数据校验处理, 也有可能出现99.99%数据一致, 不能保障完全一致,这个时候可以在旧库做一个readonly只读功能, 或者将流量屏蔽降级,等待日志增量同步工具完全追平后, 再进行新库的切换。日志增量同步过程随时可能会产生新的数据, 新库与旧库的数据追平也会是一个无限逼近的过程。修复切换异常数据:在切换过程中, 如果出现,Canal未同步,但已切换至新库的请求(比如下单,修改了资金, 但还未同步 ), 可以通过定制程序, 读取检测异常日志,做自动修复或人工处理。

BASK2311的博客 2230

用本地 Chrome + DeepSeek 实现浏览器自动化:browser-use 实战与踩坑记录

本文记录了使用本地Chrome浏览器结合DeepSeek API实现浏览器自动化的实战经验。作者通过browser-use项目连接本地Chrome(启动时需添加--remote-debugging-port=9222参数),并解决了DeepSeek API不支持response_format的问题,通过设置dont_force_structured_output=True和add_schema_to_system_prompt=True成功绕过。同时分享了任务描述需精准的重要性,避免Agent输出多余信息导

LY的博客 750

MySQL第八讲 MySQL集群扩容与半同步复制

MySQL第八讲 MySQL集群扩容与半同步复制

程序员路同学 461

f103vet6 SD卡SDIO+DMA配置避坑指南:从初始化卡死到稳定读写的全流程解析

本文详细解析STM32F103VET6芯片SD卡SDIO与DMA配置中的常见问题,从初始化卡死到读写不稳定的全流程解决方案。重点分析总线宽度配置、时钟分频调整及DMA通道管理技巧,帮助开发者避开常见陷阱,实现稳定高效的数据存储。

u0v1w2x3的博客 666

PLECS中DLL模块的使用

PLECS中DLL模块的使用 之前发布了一篇文章,介绍如何使用PSIM中的DLL模块。而本篇文章的内容与之类似,不过主角换成了PLECS。 PLECS和PSIM类似,也属于电力电子仿真软件,使用方便,仿真速度快,和Matlab也有一定的联系,有兴趣的可以去试试。PLECS可以利用外部动态链接库(DLL)来调用外部的代码参与仿真,方便复杂控制算法的实现,也有利于后期直接将代码移植到硬件控制器上。

OptimisticPoplar的博客 2710

高性能MySQL实战第11讲:如何做到MySQL高扩展性?

课时的内容主要包含 MySQL 架构设计方法论、MySQL 高并发及其关注要点、MySQL 扩展的原因及其基本方法、万亿级数据量的应对技巧等内容。高并发及其关注要点近年来,随着互联网、移动互联网的飞速发展,业务系统的互动性日益增强,用户规模不断攀升,电商、游戏、直播、在线教育、短视频等一系列新兴移动端应用如雨后春笋般涌现出来,这些应用 “高并发、低延迟” 的需求对传统数据库的性能提出了新的要求和挑战,并且数据规模也井喷式增长。高并发是互联网分布式系统架构设计中必须考虑的因素之一,

fegus的博客 1177

手把手教你学Simulink——基于Simulink的变换器老化预测与数字孪生(Digital Twin)

这不仅是技术的演进,更是从“事后救火”到“事前预言”的降维打击。:通过本文的实战演练,你不仅掌握了功率变换器“电气-热-老化”多物理场耦合的建模哲学,更深刻领悟了如何将高深的随机过程(粒子滤波)降维成可落地、可量产的工程工具;:起初,由于数据量少,粒子滤波器预测的剩余寿命(RUL)置信区间(95%)非常宽泛(如 1000~2000小时)。在工业4.0与智能制造的浪潮下,功率变换器(如光伏逆变器、车载OBC、服务器电源)不再是孤立的硬件,而是具备“自我感知”与“寿命预知”的智能节点。

MHD0815的博客 296

仅用一个月,游卡完成从MySQL到上线OceanBase的实践

作为国内最早涉足卡牌游戏研发的公司之一,游卡不仅拥有以桌游为代表的线下社交场景,还积极拓展以线上游戏为引领的数字文化场景。其核心业务主要围绕“三国杀”这一知名IP展开,推出了一系列深受玩家喜爱的游戏和产品。同时,游卡近年来也在不断探索并打造超越“三国”光环的爆款游戏,其中《自在西游》这款作品在上线仅一个月的时间内,便实现了突破2亿的流水佳绩。

OceanBase分布式数据库的博客 1420

智慧园区——解读零碳智慧园区全域双碳管理建设方案【附全文阅读】

《零碳智慧园区全域双碳管理建设方案》为园区开发运营企业、政府部门及绿色能源服务商等提供系统性指导。方案基于"背景-理念-路径"框架,首先分析全球双碳趋势及我国园区高碳排放现状,明确零碳园区价值;其次提出"数字+绿色"双动力理念,构建数字底座与绿色能源体系;最后详细规划实施路径,包括碳排查、绿能规划、能效优化、碳交易等全流程管理,结合数字孪生技术实现可视化管控,助力园区实现碳中和目标。

cdfunlove的博客 206

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统(195)

当前,传统的养老院出入管理模式普遍存在信息更新滞后、数据统计繁琐、实时监控能力不足等问题,难以满足现代养老机构对安全管理与服务质量提升的需求。本系统设计正是针对这些问题,通过集成先进的硬件设备如高性能GEC6818开发板以及RFID刷卡模块,结合稳定高效的嵌入式Linux操作系统和QT开发框架,构建一套功能齐全、操作直观、响应迅速的智能出入管理系统。 该系统能自动记录并实时显示老人的进出时间,方便管理人员及时了解每位老人的活动轨迹,同时具备强大的后台管理功能,支持管理员便捷地进行老人信息的增删改查操作。通

1069

《高性能MySQL》读书笔记

前言 读的这一版是涵盖MySQL5.5的第3版,700多页的大部头,只在部分目前比较关注的章节细读,有第4章Schema与数据类型优化、第五章创建高性能的索引、第六章查询性能优化、第10章复制、第11章可扩展的MySQL以及第12章高可用性。两个月的时间通读了一遍,受益匪浅,简单记录一些概念性要点,很多实操细节还需反复研读和躬身实践。 全书目录 第1章 MySQL架构与历史 第2章 MySQL基...

云潮海啸的博客 304

手把手教你学Simulink——基于AI融合与智能调度的场实例:强化学习在卫星资源分配中的应用

本文详细介绍了如何利用Simulink和强化学习技术实现智能卫星资源分配。文章首先分析了低轨卫星通信系统面临的动态资源调度挑战,提出采用强化学习(特别是PPO算法)的解决方案。接着逐步展示了完整的建模过程:从Simulink项目创建、卫星通信环境建模(用户业务、信道特性、资源池),到强化学习任务定义(状态空间、动作空间、奖励函数),再到PPO智能体的构建与训练。最后通过仿真验证,PPO智能体在系统吞吐量、公平性和阻塞率等关键指标上均优于传统方法。该方案为卫星通信系统的智能资源管理提供了可行方案,并支持进一步

MHD0815的博客 190

高性能MySQL读书笔记 (四)

视图本身是一个虚拟表,不存放任何数据,不能对视图创建触发器。

1071

第八节:Orin NX 修改pinmux

读SPI1对应的寄存器,看对应的GPIO口是否被复用为SPI功能。说明GPIO口的功能已经被复用为SPI。烧录或者命令行烧录,都是根据。这里我们把文件统一命名成。文件,Orin NX的。测试SPI功能,基于。

孤独旅客的博客 792

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

高性能MySQL读书笔记 (三)

特殊类型:书中举例,ip地址应该用无符号整数存储,MySQL提供inet_aton, inet_ntoa方法转换。MySQL中,存储引擎先在索引中找到对应值根据匹配的索引记录找到对应的数据行.索引在存储引擎层实现。避免使用Null: 含有Null列会使索引,索引统计和值更为复杂。业务上有时需要一张完全独立的汇总表或缓存表主要用于满足检索的需求。分配空间: 根据实际需要分配.使用内存临时表或操作时会比较糟糕。索引是存储引擎用于快速查找记录的数据结构。更小: 选择不超过需求范围的最小类型。

929

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

高性能MySQL读书笔记 (六)

损坏系统结构: 系统结构包括事务日志等,可能需要做整个数据库的导出和还原,因为InnoDB内部绝大部分的工作可能受影响。共享存储或磁盘复制,如果服务器挂了,备用服务器可以挂载相同的文件系统执行需要的恢复操作。按功能拆分: 常见做法,根据功能将应用部署在不同服务器,并使用专用的数据库服务器。数据量: 很多应用从不物理删除任何数据,应用所积累的数据量是可扩展的普遍挑战。一致性: 如果应用是有状态的,负载均衡器就应该将相关的查询指向同一个服务器。负载均衡算法: 随机, 轮询,最少连接数,最快响应,哈希,权重。

955

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

高性能mysql读书笔记四-MySQL高级特性

本篇博文是高性能Mysql一书中 mysql高级特性分析。主要介绍了分区表,视图、存储代码三大模块,详细内容包含:分区表概念,优劣,类型,原理、使用、示例等, 视图的概念,示例,存储代码主要包含 触发器、事件、存储过程、存储函数。本篇在介绍高级特性的时候,辅助以详尽的语法、示例,希望读者能有所收获。

liushangzaibeijing的博客 3万+

《高性能MYSQL》逻辑结构-读书笔记

高性能MYSQL笔记 1. MYSQL逻辑结构 MYSQL逻辑结构有三层,分别为 1. 连接/线程处理:实现连接处理,授权认证,安全等 2. 服务层:该层主要有缓存,解析,处理,优化以及跨存储引擎如存储过程,触发器,视图等 3. 存储引擎:主要负责数据读取和存储。根据服务器层提供的执行计划,进行语句的执行。 2. 并发控制 并发控制是当多个线程或者事务同时操作同一...

Yoga0301的博客 517

《高性能Mysql》读书笔记(2)

本文是阅读《高性能mysql》的笔记,主要内容是原书的第四章 Schema与数据类型优化。

Henry_ss的博客 877

mysql可扩展(读书笔记)

1、知识框架图 2、MySQL可扩展的理解      2.1 可扩展的定义?与高可用的区别?      2.2 扩展与投入的关系?      2.3 扩展和拆分的概念区别? 3、垂直拆分 4、水平拆分      关注下面几个核心问题:      4.1 什么是水平拆分?           4.2 拆分原则有哪些?            4.3 如何进行水平拆分,有哪些...

hpuhpu2010的博客 315

mysql查看开销较高的语句,高性能MYSQL读书笔记:MYSQL准备语句

高性能MYSQL读书笔记:MYSQL准备语句MYSQL4.1及更高版本支持服务器端准备语句(Prepared Statements), 它使用增强的二进制客户端/服务器协议在客户端和服务器之间高效的发送数据,可以通过支持这种行协议的编程库来访问准备语句,列入MYSQL CAPI,MYSQL Connector/J和MYSQL Connector/NET 为JAVA和.NET提供了同样的访问接口。它...

weixin_36116366的博客 219
上一篇: 用FlashCache加速MySQL
下一篇: 高性能MySQL.读书笔记(五)MySQL分支与变种
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值