经历过几家公司从小到大的成长,数据量也会跟着业务量和访问量剧增。最初的系统架构完全无法支持大数据的到来,期间做过多次架构升级,包括数据库主从读写分离,系统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
相关推荐
分库分表这个是8月份左右跟淘宝的数据分析部门的架构师离哲交流的时候产生的想法,离哲推荐采用TDDL进行分库分表。 回去一看,却发现TDDL只开源了一半,开源的那一半基本没法使用,所以只能自己写一个Sharding了...
Timo目前是实验性质,主要用于熟悉相关技术,实现个人想法,提高姿势水平。(●`・(エ)・´●) Timo Technical Terms [Timo中的术语介绍] (./doc/TimoTechnicalTerms.md) Quick Start [马上开始使用Timo!] (./doc/...
分库分表 读写分离 高并发系统 分布式系统 系统拆分 分布式服务框架 分布式锁 分布式事务 分布式会话 高可用架构 高可用系统 如何设计一个高可用系统? 限流 熔断 如何进行熔断? 熔断框架都有哪些?具体实现原理...
python入门-30.寻找列表中只出现一次的数字——寻找单身狗.py
linux优化笔记,配套视频:https://www.bilibili.com/list/474327672?sid=4496133&spm_id_from=333.999.0.0&desc=1
知识付费系统-直播+讲师入驻+课程售卖+商城系统-v2.1.9版本搭建以及资源分享下载,CRMEB知识付费分销与直播营销系统是由西安众邦科技自主开发的一款在线教育平台,该系统不仅拥有独立的知识产权,还采用了先进的ThinkPhp5.0框架和Vue前端技术栈,集成了在线直播教学及课程分销等多种功能,旨在为用户提供全方位的学习体验,默认解压密码youyacaocom
美妆神域-JAVA-基于springBoot美妆神域设计与实现
原生js制作Google粘土logo动画涂鸦代码.zip
golin 扫描工具使用, 检查系统漏洞、web程序漏洞
原生态纯js图片网格鼠标悬停放大显示特效代码下载.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
去水印web端独立版web
原生js制作左侧浮动可折叠在线客服代码.zip
Chrome 谷歌浏览器下载
全新完整版H5商城系统源码 自己花钱买的,亲测可用,需要自行下载 H5商城系统设置是实现商城基本功能的核心部分,涵盖了从网站配置、短信和支付配置,到商品、工单、订单、分站和提现管理等多个模块的设置。以下是详细的设置指南,帮助您快速上手并高效管理商城系统。 测试环境:Nginx+PHP7.0+MySQL5.6 1. 网站配置 设置商城名称、LOGO、标题、联系方式和SEO关键词等,确保商城专业和易于搜索。 2. 短信配置 配置短信接口和模板,用于发送订单通知、验证码等,提升用户体验。 3. 支付接口配置 配置微信、支付宝等支付接口,填写API密钥和回调地址,确保支付流畅。 4. 商品分类管理 对商品进行分类和排序,设置分类名称和图标,便于用户查找商品。 5. 商品管理 添加和管理商品信息、规格、图片等,确保商品信息准确丰富。 6. 工单管理 查看和回复用户工单,记录售后问题,提升用户服务质量。 7. 订单管理 查看订单详情,更新订单状态,支持批量导出,方便订单跟踪。 8. 分站管理 创建不同区域分站,设置权限,统一管理各区域市场。 9. 提现管理
apk安装包
原生js选项卡插件自定义图片滑动选项卡切换.zip
宗教信息佛教佛寺寺庙庵堂相关数据集提供了全国各个地区省市县各个佛教寺庙的详细信息。这些数据不仅包括寺庙的名称和负责人姓名,还涵盖了所属省份、地级市、区县、具体地址、建立日期以及支派类别等关键信息。该数据集整理了超过3万条样本,为研究中国佛教寺庙的分布、历史和文化提供了丰富的第一手资料。这些信息有助于了解佛教在中国的传播和发展,以及寺庙在社会和文化中的作用。数据的整理和提供,对于宗教学、社会学、历史学和文化研究等领域的学者来说,是一个宝贵的资源。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手