如何进行mysql的动态扩容和缩容

另外一种方式是通过分析mysql的binlog再进行不同数据拓扑的复制。两者本质上来说应该是一样的,后者可能更加简便,并且对应用无侵入,前者虽然也能够做到,实际实现或者推广和操作上都有不少阻力,最起码解析binlog方式是mysql一上去,更新的log已经天然存在与binlog中了。增量同步的两种方式如果要考虑到同步...
如何进行mysql的动态扩容和缩容
mysql在线扩容和缩容一般涉及到的内容,主要包括三个方面,1.在线也就意味着需要把增量的数据重新分布到新的拓扑结构中,我们一般称做增量复制,2.原有的数据需要一条不漏的扫出来重新分布到新的拓扑结构中,这个一般叫做全量复制,3.全量做完,增量正在同步,把应用的数据路由拓扑切到新的路由拓扑上来,并且做到无数据丢失,这个我们叫做停写切换。做好这三个方面的工作,能够达到的效果就是应用在最后切换数据分布拓扑的时刻,只要停写非常短的时间(秒级别)就能够做到无数据丢失的扩容和缩容。

增量同步一般有2种方式,一种是应用端或者数据库前端做trigger,记录变更数据的特征值log(比如pk,sharding key),然后异步复制到新的拓扑结构中。另外一种方式是通过分析mysql的binlog再进行不同数据拓扑的复制。两者本质上来说应该是一样的,后者可能更加简便,并且对应用无侵入,前者虽然也能够做到,实际实现或者推广和操作上都有不少阻力,最起码解析binlog方式是mysql一上去,更新的log已经天然存在与binlog中了。

增量同步的两种方式如果要考虑到同步的可伸缩性(也就是多台机器可以同时消费相同的变更日志),需要在原数据中添加数据的版本信息防止更新乱序,或者通过唯一键进行复制机器的sharding,也就是不同进程(线程)同时消费相同的更新日志,必须让同一条记录的更新落在同一个线程里面,如果还需要保证复制的事务,那么实现会非常复杂,一般不会去支持多线程下复制的事务。

全量复制,也就是扫描需要复制的表的数据进行重新分布,主要存在的问题是复制速度和对数据库的写入压力的矛盾,其实能够做到整个拓扑连数据库都全部换掉,来达到对正在使用数据库的0影响,这个是一种可行的方案,另外是分时段调整复制线程数,一般单线程复制对于数据库的影响不会很大,在凌晨再转换成多线程方式达到提速的目标。

扩容或者缩容在最后阶段如何切换,这个涉及到的问题主要是如何避免新更新进来以至于增量没完没了,方式有很多,最简单的方法就是停掉应用,一般时间只有几分钟是可以接受的。另外一种是逻辑停写,因为我们迁移的时候是有一个规则去重新散列数据,也就是如果新的规则和旧的规则两者算出来的结果不一致,那么这个数据就是需要被迁移的,如果在停写的时刻,向前端抛错即可。逻辑停写最大的好处就是避免PE的介入,并且配合动态的数据路由数据推送,可以完全避免重新发布达到扩容或者缩容,这个就是真正的在线扩容,停写不可避免(等待延迟的增量同步完成),但是不影响读。

数据扩容或者缩容,我们觉得不应该排入业务的开发日程中,而是由数据管理团队对应用透明地进行这种操作,最后介入的人员只是DBA而已。但是不像一些nosql一样按容量或者完全透明的split,数据库的sharding还是按照应用的数据特性(pk,user_id,gmt_create等等不同字段,自选策略)进行sharding,应用知道他们的某条数据具体存在哪个机器哪张表上,这个无论对于开发还是测试或者DBA都是一件不错的事情。2016-10-24
mengvlog 阅读 267 次 更新于 2025-09-10 10:34:58 我来答关注问题0
  • mysql在线扩容和缩容一般涉及到的内容,主要包括三个方面,1.在线也就意味着需要把增量的数据重新分布到新的拓扑结构中,我们一般称做增量复制,2.原有的数据需要一条不漏的扫出来重新分布到新的拓扑结构中,这个一般叫做全量复制,3.全量做完,增量正在同步,把应用的数据路由拓扑切到新的路由拓扑上来,并...

  •  翡希信息咨询 告别内存OOM,解决MySQL内存增长问题

    进一步分析Rpl_transaction_write_set_ctx::add_write_set函数的实现,我们发现write_set是一个vector,其底层数据结构是一段连续的线性空间。当原空间使用完时,vector会执行的动态扩容,也就是_M_realloc_insert过程。这个过程会导致内存占用过多,并且扩容的过程中反复的申请新内存、释放旧内存也会导致...

  •  翡希信息咨询 如何打造一款 NewSQL + MySQL 的分布式数据库?

    特定分区方式:确保数据均匀分布于存储节点。动态迁移:通过动态迁移小表至新增节点,实现平滑扩容,不影响业务连续性。5. 高可用性保障 Raft协议与GTID机制:结合Raft协议与MySQL GTID机制,确保存储节点内三个副本的高可用性。实时监测与快速选主:实时监测节点状态,快速进行故障恢复和选主操作。并行复制与s...

  •  文暄生活科普 MySQL表空间介绍

    配置:独立表空间可以通过MySQL配置文件[mysqld]中的innodb_file_per_table参数进行设置,也可以通过SQL命令SET GLOBAL innodb_file_per_table=ON;进行动态设置。2、系统表空间(共享表空间)定义:系统表空间(共享表空间)是MySQL 5.5版本之后引入的概念,用于更容易地进行数据扩容。在MySQL 5.6版本中...

  •  翡希信息咨询 MySQL之InnoDB存储引擎:浅谈InnoDB缓冲池Buffer Pool

    MySQL 5.7.5版本后支持运行时调整Buffer Pool大小。引入chunk概念,每个chunk为内存空间单位,便于扩容和缩容,减少复制缓存页的操作。通过innodb_buffer_pool_chunk_size参数设置chunk的内存大小。状态查看:可以通过SQL命令获取InnoDB引擎的运行状态信息,特别关注与Buffer Pool相关的统计项,以便进行性能调优和...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部