`
green_tea
  • 浏览: 4615 次
  • 性别: Icon_minigender_1
  • 来自: 北京务工人员
文章分类
社区版块
存档分类

对分库分表的一些想法

阅读更多



         经历过几家公司从小到大的成长,数据量也会跟着业务量和访问量剧增。最初的系统架构完全无法支持大数据的到来,期间做过多次架构升级,包括数据库主从读写分离,系统soa化等等。那么就针对系统最重要的一块 数据来说吧。

       说到数据大家都会想到数据存储和读取,还会联想到关系型数据库和非关系型数据库,当然随着互联网的发展,非关系性数据库越来越火,但是不能说明非关系型数据库完全能取代关系型数据库,至少目前不行。那么,关系型数据库的性能,是让人头疼的一个问题。目前最主流的方案是分库分表。

先说分表吧,可以分为纵向拆分和横向拆分,纵向拆分就是根据时间或者业务分表,或者拆分表结构,这些都需要改变表结构。但是数据量暴增,纵向分表最终还是无法解决问题,最终还是要考虑到横向拆分。

横向拆分也可以说是水平拆分,就是按照一定规则进行分表,不改变表结构。那么水平拆分的依据也是需要斟酌的。要保证数据能基本平均分配到不同的分表中,那么分表的依据就是重复性不能太高。那么首先考虑的就是主键。根据主键按照一定的策略进行分表。我想到的的有按区间分表,取模分表。

       先说按区间分表,按区间分表有局限性,就是主键一定要保证是一个有序的数字,而且是不执行或很少执行delete的。但是好处是能保证表的数据量,也好维护。分表后的数据如下表:

 

 

 

       取模分表,很简单就是对某个数值取余,然后分配到不同的表里。比如对4取余。那么数据分布如下:

 

 

 

        取模分表没有对数据有苛刻要求,但是需要提前确定好取模因子(被取余数 也可以看做分表的数量)

看似取模分表比较合适,但是如果分表后数据量增长,当前分表已经无法支撑的时候怎么办呢,增加表,再取模? 那么同步数据将会是很头疼的事情。因为每张表都要再从新分配数据。那么我们能不能借鉴一致性hash来进行分库分表呢? 

 

 

 

 

 

 

 

         一致性hash也可以看做是按区间分表,在0-2^32之间创建几个节点,节点可以看做是表,同时增加虚拟节点(对0-2^32分成多个区间段,然后多个区间段分别指定到几个表中)来保证各表的数据基本均衡,如果出现数据分配不均衡,就增加节点来分流数据命中大的节点。这样增加表的时候只同步数据量最大的那张表即可。但是0-2^32是一个很大的范围,怎么分区保证数据平均将是很复杂的事情。如果分段比较粗粒度那么不能保证数据的均衡,细粒度的话则需要维护一个范围段的数据,增加运算和维护成本。粒度越细运算和维护成本越高。那么有没有更好的方案呢?

       能不能用二叉树的结构来进行分表呢?统一对2取模,left节点库存放可整除的数据,right存放不可被2整除的数据。如果某个节点压力较大则对该节点继续二叉,同时对分库指标加固定前缀或后缀,再hash对2取模。这样的话就可以避免添加表的时候全部数据要从新分配,也节省了维护成本(只维护一个二叉树即可)。

 

        比如:分表字段为一个uuid,值为b9a6fd18-8734-45c4-ad81-57a98ada8304,hashcode = 2039422118(可以被2整除), 那么该数据存放在left节点, 如果left节点不是最终节点(再分表),则uuid+后缀 如:b9a6fd18-8734-45c4-ad81-57a98ada8304_EXT , 则该值的hashcode为 -1376741656(可以被2整除),则该数据存放再二级二叉树的left节点。 

 

 

 

 

 

 

 

 

 

       节点内容存放表名称,如果该节点有子节点,则按照规则加前缀或后缀,再hash,按照取模原则找下一节点,直到节点没有子节点的时候,获取表名称。 

 

 

 

 

 

 

 

 

 

 

 

        先分析添加表,比如某个节点表压力较大需要分表,则分流这个节点即可,最糟糕的情况是多个节点同时分表,那么逐个分表即可,各个节点互不影响。这样比取模分表扩容的时候要方便的多。

从维护的角度看,根据二叉树的原理分表,可以避免数据迁移的麻烦,同时系统只要维护一个二叉树即可,也节省了维护成本。

 

 

 

以上只是个人的一些想法,难免有一些不合理或者错误的地方,请大家指出批评并一块讨论改进。

 

http://308812025-qq-com.iteye.com/blog/1697104

  • 大小: 693 Bytes
  • pac.zip (959.2 KB)
  • 下载次数: 1
  • mm.zip (189.9 KB)
  • 下载次数: 7
  • tm.zip (8.8 KB)
  • 下载次数: 4
  • p.zip (3.1 KB)
  • 下载次数: 1
  • cs.zip (3.6 KB)
  • 下载次数: 1
  • com.zip (168.6 KB)
  • 下载次数: 1
分享到:
评论

相关推荐

    分库分表Sharding中间件Kamike.divide.zip

    分库分表这个是8月份左右跟淘宝的数据分析部门的架构师离哲交流的时候产生的想法,离哲推荐采用TDDL进行分库分表。 回去一看,却发现TDDL只开源了一半,开源的那一半基本没法使用,所以只能自己写一个Sharding了...

    Timo:分布式MySQL数据库中间件,支持数据的水平、垂直拆分,支持分库分表,支持读写分离,支持结果集合并,支持故障自动切换

    Timo目前是实验性质,主要用于熟悉相关技术,实现个人想法,提高姿势水平。(●`・(エ)・´●) Timo Technical Terms [Timo中的术语介绍] (./doc/TimoTechnicalTerms.md) Quick Start [马上开始使用Timo!] (./doc/...

    javalruleetcode-docs:文档

    分库分表 读写分离 高并发系统 分布式系统 系统拆分 分布式服务框架 分布式锁 分布式事务 分布式会话 高可用架构 高可用系统 如何设计一个高可用系统? 限流 熔断 如何进行熔断? 熔断框架都有哪些?具体实现原理...

    高级色系PPT11.pptx

    高级色系PPT11.pptx

    node-v7.9.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于tensorflow的的cnn卷积神经网络的图像识别分类

    【作品名称】:基于tensorflow的的cnn卷积神经网络的图像识别分类 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    ### 数据分析概念、使用技巧、优缺点的文章

    数据分析是指通过收集、清洗、处理和解释数据,以发现其中的模式、趋势和关联,从而提供决策支持或洞察见解的过程。它在各行各业中都扮演着至关重要的角色,从市场营销到科学研究,从金融领域到医疗保健,都有广泛的应用。

    对微信帐单进行数据分析

    #pip install pandas -i https://mirrors.aliyun.com/pypi/simple #安装pandas处理数据模块 #pip install xlwt -i https://mirrors.aliyun.com/pypi/simple #安装excel模块 #pip install openpyxl #从微信导出对帐帐单 import pandas as pd #引入pandas,重命名为pd,Python3.9.10版本的Pandas无法兼容低版本的xls import numpy as np #导入均值模块 #从第17行读取csv格式的帐单 df = pd.read_csv('微信支付账单(20230101-20230401).csv',header=16) #分析数据 ...... #将分析数据另存为out.xlsx ..... #进行交易进间分析 ...... #统计交易对方 ...... #将结果保存到excel ..... writer.close()

    node-v7.2.0-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    作业.docx

    作业.docx

    DB23∕T 2540-2019 智慧城市建设项目可行性研究报告.pdf

    DB23∕T 2540-2019 智慧城市建设项目可行性研究报告.pdf

    在CentOS系统上安装Docker 步骤

    附件是在CentOS系统上安装Docker 步骤,仅供交流学习使用,无任何商业目的! 在执行这些步骤之前,请确保你的CentOS系统已经更新到最新,并且你了解Docker容器技术的相关概念。如果你在安装过程中遇到任何问题,可以查看Docker的官方文档或搜索相关的错误信息。

    node-v0.12.3-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    蜂群系统链性态网体系化作战矩阵.txt

    蜂群系统链性态网体系化作战矩阵.txt

    高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip

    【资源概览】 高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    ### 这是一篇对Qt开发进行了详细概述的文章

    Qt是一套跨平台的C++应用程序开发框架,被广泛应用于开发图形用户界面(GUI)程序、嵌入式系统、移动设备应用等领域。它提供了丰富的类库和工具,使得开发者可以快速构建功能强大、美观易用的应用程序。以下是一个涵盖Qt开发的教程和案例的综合描述。

    高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip

    【资源概览】 高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    node-v7.1.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于深度神经网络的图像分类任务.zip

    基于深度神经网络的图像分类任务.zip

Global site tag (gtag.js) - Google Analytics