关于MySQL的在线扩容
原文地址: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的在线扩容的更多相关文章
- LVM在线扩容
我虚拟机根分区已经使用了35%,现在需要对他进行在线扩容,扩容之后使用率降到30% [root@localhost ~]# dfFilesystem 1K-blocks Used Available ...
- 使用LVM对硬盘在线扩容
初始状态: root@control:/dev/nova-volumes# vgdisplay --- Volume group --- VG Name nova-volumes System ID ...
- 动态在线扩容root根分区大小的方法详解
前言 本文主要介绍了关于动态在线扩容root根分区大小的相关内容,分享出来供大家参考学习,下面话不都说了,来一起看看详细的介绍吧. ? 1 qemu-img resize yourname.img + ...
- mysql查看在线用户
有时候我们需要了解mysql数据库都有那些用户在线操作.我们可以用以下命令来查看当前在操作mysql的在线账户. show processlist;
- CentOS下KVM增加磁盘/磁盘扩容/在线扩容
一.磁盘镜像操作(适用于raw和qcow2格式) 1.创建镜像 qemu-img create -f qcow2(格式) /kvm/centos1_1.qcow2(路径) 5G(容量) 2.修改镜像容 ...
- [转] LVM分区在线扩容
[转] LVM分区在线扩容 在线扩容的这台服务器,LV分区格式为xfs,原大小1.2TB.增加了一块硬盘,大小为1.8TB. fdisk /dev/cciss/c0d1 # 创建分区,并指定分区类型为 ...
- Linux下lvm在线扩容步骤
转 :https://jingyan.baidu.com/article/25648fc18f22b29191fd0011.html 图片看不清可以看原文 LVM是逻辑盘卷管理(Logical Vol ...
- Linux LVM在线扩容
环境: 虚拟化环境,SUSE Linux Enterprise Server 11sp3,直接把虚拟磁盘从100G改成150G. 现有的LVM是100G,/home 的LV需要再加50G. 步骤: f ...
- CentOS 磁盘在线扩容
场景介绍: 操作系统Centos7.x 系统有一块vdisk,容量为20G,共分为3个区(swap和boot分区为标准分区xfs文件系统,根分区为LVM分区,xfs文件系统) 业务需求:在VM系统不关 ...
随机推荐
- Servlet过滤器(详询请加qq:2085920154)
1.1 过滤器简介 过滤器是向Web应用程序的请求和响应处理添加功能的Web服务组件.在Servlet处理用户输入的请求之前,过滤器可以访问该请求.在将Web响应发送给用户之前,过滤器还可以访问该响 ...
- 特殊的ASCII码对应的字符
Special Characters " " " quotation mark u+0022 ISOnum p:before { content:"\0022& ...
- Sprint 3 回顾与总结 和团队贡献分 以及Sprint 1、2、3 总概
团队情况: 团队名称:Heaven Fire 团队博客地址:https://home.cnblogs.com/u/gjpg/ 团队Github地址:ht ...
- Java Web1
Java Web应用的核心技术是Java Server Page和Servlet.此外,开发一个完整的Java Web应该涉及一下几种概念及技术. 1.Servlet组件 Servlet响 ...
- css3的transition过渡
从*开始样式*,经过指定*时间*后,缓慢过渡到*结束样式* 语法:transition:要变化的属性名 持续时间 速度变化类型 延迟 强调:写在开始样式中 如何实现多个属性同时过渡:2种办法: 1. ...
- JAVA编程心得-Eclipse/MyEclipse 中文乱码解决办法
将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclipse编码格式不同.总结网上的建议和自己的体会 ...
- Linux下VFP NEON浮点编译
http://blog.csdn.net/liujia2100/article/details/27236477 NEON:SIMD(Single Instruction Multiple Data ...
- TYVJ博弈论
一些比较水的博弈论...(为什么都没有用到那什么SG呢....) TYVJ 1140 飘飘乎居士拯救MM 题解: 歌德巴赫猜想 #include <cmath> #include < ...
- Win10专业版激活方法可查版本
Win10专业版激活步骤 ------安装Win10专业版,请win+R,键入winver回车,可查看版本------ 1.点击左下角windows按钮,找到设置并打开,依次点击"更新和安全 ...
- java获取文件名的三种方法
import java.io.File; import java.util.Arrays; public class FileName { /** * @param args */ public st ...