原文地址:http://bucketli.iteye.com/blog/1294032

主要简单总结下,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都是一件不错的事情。

关于MySQL的在线扩容的更多相关文章

  1. LVM在线扩容

    我虚拟机根分区已经使用了35%,现在需要对他进行在线扩容,扩容之后使用率降到30% [root@localhost ~]# dfFilesystem 1K-blocks Used Available ...

  2. 使用LVM对硬盘在线扩容

    初始状态: root@control:/dev/nova-volumes# vgdisplay --- Volume group --- VG Name nova-volumes System ID ...

  3. 动态在线扩容root根分区大小的方法详解

    前言 本文主要介绍了关于动态在线扩容root根分区大小的相关内容,分享出来供大家参考学习,下面话不都说了,来一起看看详细的介绍吧. ? 1 qemu-img resize yourname.img + ...

  4. mysql查看在线用户

    有时候我们需要了解mysql数据库都有那些用户在线操作.我们可以用以下命令来查看当前在操作mysql的在线账户. show processlist;

  5. CentOS下KVM增加磁盘/磁盘扩容/在线扩容

    一.磁盘镜像操作(适用于raw和qcow2格式) 1.创建镜像 qemu-img create -f qcow2(格式) /kvm/centos1_1.qcow2(路径) 5G(容量) 2.修改镜像容 ...

  6. [转] LVM分区在线扩容

    [转] LVM分区在线扩容 在线扩容的这台服务器,LV分区格式为xfs,原大小1.2TB.增加了一块硬盘,大小为1.8TB. fdisk /dev/cciss/c0d1 # 创建分区,并指定分区类型为 ...

  7. Linux下lvm在线扩容步骤

    转 :https://jingyan.baidu.com/article/25648fc18f22b29191fd0011.html 图片看不清可以看原文 LVM是逻辑盘卷管理(Logical Vol ...

  8. Linux LVM在线扩容

    环境: 虚拟化环境,SUSE Linux Enterprise Server 11sp3,直接把虚拟磁盘从100G改成150G. 现有的LVM是100G,/home 的LV需要再加50G. 步骤: f ...

  9. CentOS 磁盘在线扩容

    场景介绍: 操作系统Centos7.x 系统有一块vdisk,容量为20G,共分为3个区(swap和boot分区为标准分区xfs文件系统,根分区为LVM分区,xfs文件系统) 业务需求:在VM系统不关 ...

随机推荐

  1. .net mvc 扩展IPrincipal接口

    .自定义实现IPrincipal接口的类 interface ICustomPrincipal : IPrincipal { string Identifier { get; set; } strin ...

  2. linux搞大头,bang bang bang

    偶遇网站打不开,人懵逼了,然后各种查询资料,查到可能跟服务器的问题有关,于是乎连接linux服务器,开始一段苦逼旅程. 其实主要是一些简单的linux命令,对我这个没怎么接触linux的小白来说,何等 ...

  3. shell学习--grep1

    一. grep的来源 通过ex编辑器来查找某个字串: :/pattern/p 其中p是打印,包含字符串pattern的第一行将被打印:如果需要打印包含pattern的所有行,可以这样: :/g/pat ...

  4. apache和nginx开启https

    1.安装mod_ssl和openssl yum -y install mod_ssl openssl 2.建立服务器密钥 mkdir /etc/httpd/conf.d/ssl.key/ cd /et ...

  5. psp工具需求分析

    PSP个人软件过程开发工具需求分析文档 a.业务需求    a.1 背景 二十一世纪是软件开发的黄金时期,有人把过去的十年称作软件高度发展的十年,不可置疑,越来越多的软件设计需求是物联网时代的趋势,越 ...

  6. python+eclipse环境搭建

    一.Eclipse 的安装 Eclipse的安装是很容易的.Eclipse是基于java的一个应用程序,因此需要一个java的运行环境(JRE)才行.(我这里主要介绍windows下的安装) JRE的 ...

  7. 【Thinking in Java】编写构造器时应注意:尽量避免调用其他非private方法

    最近重温了<Thinking in Java>,发现了一个让我为之兴奋的知识漏洞,必须得分享一下. 上一篇的<Java类初始化的过程>的随笔中,那个初始化顺序并不完整.初始化的 ...

  8. Python socket (单线程)

    client, 客户端 code : 客户端主要方法, s.send(); s.sendall(); s.recv(); s.connect() class Client(object): def _ ...

  9. CMM能力成熟度模型

    CMM把软件企业的过程管理能力划分为5个等级: 1  .初始级:个别的.混乱无序的过程,软件缺乏定义,项目的成功严重依赖于某几个关键人员的努力.软件质量由个人的开发经验来保障. 2.可重复级 实施了基 ...

  10. 基于VC的ACM音频编程接口压缩Wave音频(一)

    (一)概述 音频数据一般都具有较高的采样率,经过压缩的原始数据才具有实用价值,否则不仅要占用大量存储空间而且在播放或进行网络传输时效率也是非常低下的,所以音频数字压缩编码在多媒体应用中有着广泛而又重要 ...