热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:MySQL 分库分表的项目实践

一、为什么要分库分表数据库架构演变刚开始多数项目用单机数据库就够了,随着服务器流量越来越大,面对的请求也越来越多,我们做了数据库读写分离,使用多个从库副本(slave)负责读,使

一、为什么要分库分表

数据库架构演变

刚开始多数项目用单机数据库就够了,随着服务器流量越来越大,面对的请求也越来越多,我们做了数据库读写分离, 使用多个从库副本(slave)负责读,使用主库(master)负责写,master和slave通过主从复制实现数据同步更新,保持数据一致。slave 从库可以水平扩展,所以更多的读请求不成问题

但是当用户量级上升,写请求越来越多,怎么保证数据库的负载足够?增加一个master是不能解决问题的, 因为数据要保存一致性,写操作需要2个master之间同步,相当于是重复了,而且架构设计更加复杂

这时需要用到分库分表(sharding),把库和表存放在不同的mysql server上,每台服务器可以均衡写请求的次数

二、库表太大产生的问题

  • 单库太大:单库处理能力有限、所在服务器上的磁盘空间不足、遇到io瓶颈,需要把单库切分成更多更小的库
  • 单表太大:curd效率都很低、数据量太大导致索引文件过大,磁盘io加载索引花费时间,导致查询超时。所以只用索引还是不行的,需要把单表切分成多个数据集更小的表。mycat提供的分表算法都在rule.xml,可以根据不同的分表算法进行拆分,比如根据时间拆分、一致性哈希、直接用主键对分表的个数取模等

拆分策略

单个库太大,先考虑是表多还是数据多:

  • 如果因为表多而造成数据过多,则使用垂直拆分,即根据业务拆分成不同的库
  • 如果因为单张表的数据量太大,则使用水平拆分,即把表的数据按照某种规则(rule.xml定义的分表算法)拆分成多张表

分库分表的原则应该是先考虑垂直拆分,再考虑水平拆分

三、垂直拆分

分库分表和读写分离可以共同进行

1. 垂直分库

server.xml

  123456  userdb1,userdb2    

配置了userdb1、userdb2这两个逻辑库

schema.xml

      	  	   	  	  	    	    	  	  		select user()  		  	  	  	  		select user()  		  	    

两个逻辑库对应两个不同的数据节点,两个数据节点对应两个不同的物理机器

MySQL 分库分表的项目实践

mytest1和mytest2分成了不同机器上的不同的库,各包含一部分表,它们原来是合在一块的,在一台机器上,现在做了垂直的拆分。
客户端就需要去连接不同的逻辑库了,根据业务操作不同的逻辑库

MySQL 分库分表的项目实践

然后配置了两个写库,两台机器把库平分了,分担了原来单机的压力。分库伴随着分表,从业务上对表拆分

2. 垂直分表

垂直分表,基于列字段进行。一般是针对几百列的这种大表,也避免查询时,数据量太大造成的“跨页”问题。

一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到扩展表。访问频率较高的字段单独放在一张表

四、水平分库分表

针对数据量巨大的单张表(比如订单表),按照某种规则(range、hash取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有io瓶颈,不建议采用

将单张表的数据切分到多个服务器上去,每个服务器具有一部分库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破io、连接数、硬件资源等的瓶颈

分库分表可以和主从复制同时进行,但不基于主从复制;读写分离才基于主从复制

server.xml

  	123456  	userdb    

schema.xml

      	  	  		
select user() select user()

MySQL 分库分表的项目实践

user表示一个普通的表,直接放在数据节点dn1上,放在一台机器上,这张表不用进行拆分

student表的primarykey是id,根据id拆分,放在dn1和dn2上,最终这个表要分在两台机器上,在物理上分开了,但是在逻辑上还是一个,往哪张表里增加,在2台机器上查询然后如何合并这些操作都是由mycat完成的

拆分的规则是取模(mod – long),每次插入用id模上存在的机器数(2)

此外还需要在rule.xml中配置以下拆分算法

找到算法mod-long,因为我们将逻辑表student分开映射到两台主机上,所以修改数据节点的数量为2

MySQL 分库分表的项目实践

2. 测试水平分表

linux主机

MySQL 分库分表的项目实践

windows主机

MySQL 分库分表的项目实践

登录到mycat的8066端口

MySQL 分库分表的项目实践

使用mycat给user表插入两条数据

MySQL 分库分表的项目实践

由于schema.xml配置文件中,逻辑表user只在linux主机的mytest1库中存在,mycat操作的逻辑表user会影响linux主机上的物理表,而不会影响windows主机上的表。我们分别查看一下linux和windows主机的user表:

MySQL 分库分表的项目实践

MySQL 分库分表的项目实践

我们再通过mycat给student表插入两条数据

MySQL 分库分表的项目实践

我们知道schema.xml配置文件中,逻辑表student对应两台主机上的两个库mytest1、mytest2中的两张表,所以对逻辑表插入的两条数据,会实际影响到两张物理表(用id%机器数,决定插入到哪张物理表)。我们分别查看一下linux和windows主机的student表:

MySQL 分库分表的项目实践

再通过mycat插入id=3和id=4的数据,应该插入不同主机上的不同物理表

MySQL 分库分表的项目实践

MySQL 分库分表的项目实践

这就相当于把student表进行水平拆分了

通过mycat查询的时候只需要正常输入就行,我们配置的是表拆分后放在这2个数据节点上,mycat会根据配置在两个库上查询并进行数据合并

MySQL 分库分表的项目实践

 到此这篇关于mysql 分库分表的项目实践的文章就介绍到这了,更多相关mysql 分库分表内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!

需要了解更多数据库技术:MySQL 分库分表的项目实践,都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
白开水
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有