经历过几家公司从小到大的成长,数据量也会跟着业务量和访问量剧增。最初的系统架构完全无法支持大数据的到来,期间做过多次架构升级,包括数据库主从读写分离,系统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/...
Java 面试「Java面试小抄」一份通向理想互联网公司的面试指南,包括Java基础、集合、Java并发、JVM、MySQL、Redis、...总结版进程通信和线程通信的方式如何设计线程池AQS原理MySQLMySQL基础、锁、事务、分库分表、优化
基于S7-300PLC与MCGS6.2的饮料罐装生产线自动化控制系统设计,包含仿真、程序、IO表与电气原理,实现自动操作、灌装报警及瓶数记录功能。,基于PLC的饮料罐装生产线控制系统设计。 S7-300PLC MCGS6.2仿真 仿真,程序,IO表,电气原理图,6500字说明。 实现功能有: (1)系统通过开关设定为自动操作模式,一旦启动,则传送带的驱动电机启动并一直保持到停止开关动作或罐装设备下的传感器检测到一个瓶子时停止;瓶子装满饮料后,传送带驱动电机必须自动启动,并保持到又检测到一个瓶子或停止开关动作。 (2)当瓶子定位在灌装设备下时,停顿1秒,罐装设备开始工作,灌装过程为5秒钟,罐装过程应有报警显示,5秒后停止并不再显示报警。 (2)用两个传感器和若干个加法器检测并记录空瓶数和满瓶数,一旦系统启动,必须记录空瓶和满瓶数,设最多不超过99999999瓶。 (4)可以手动对计数器清零(复位)。 ,关键词:S7-300PLC; MCGS6.2仿真; 传送带驱动电机; 传感器检测; 瓶装; 空瓶数; 满瓶数; 报警显示; 自动操作模式; 灌装设备。,基于S7-300PLC的饮料罐装
python加密货币时间序列预测源码+数据集-最新出炉 加密货币分析: 对各种加密货币的数据进行分析和研究。可能会使用到从各种来源收集的数据,包括但不限于加密货币的价格、市值、交易量、交易时间等信息。 探索加密货币市场的趋势和模式,例如价格的波动情况、不同加密货币之间的相关性等。 数据处理与操作: 可能使用 Python 语言(Kaggle 上常用的数据分析语言),并运用一些数据处理和分析的库,如 pandas 用于数据的读取、清洗、整理和转换操作,将原始的加密货币数据转换为更易于分析的格式。 可视化展示: 通过可视化工具,如 matplotlib 或 seaborn 库,将加密货币的信息以图表的形式展示出来,以帮助直观地理解数据中的关系和趋势。 统计分析或预测: 可能会进行一些基本的统计分析,如计算加密货币价格的均值、中位数、标准差等统计量,以描述数据的特征。 或者使用机器学习或时间序列分析的方法对加密货币的价格进行预测,根据历史数据预测未来价格走势。 例如,使用 scikit-learn 进行简单的回归分析: 数据挖掘与特征提取: 挖掘加密货币数据中的特征,如找出影响价格的关键因素,对数据中的特征进行筛选和提取,以帮助更好地理解加密货币的市场行为。
类和对象、继承、封装、多态、接口、异常
gee python相关教程
夜间灯光强度(平均灯光强度)的高低反映了一个地区城市化发展的水平,平均灯光强度越高,说明该地区城市群越多,城市化程度越高。夜间灯光数据现在越来越广泛地应用于经济增长分析、经济地理、城市经济学、数字经济等众多领域。 本数据包括三套: [1]中国类DMSP-OLS灯光数据1992-202 [2]中国超长序列灯光数据1984-2020 [3]全球类NPP-VIIRS夜间灯光数据2000-2022 包括:全国各省、市、县夜间灯光数据 矫正后夜间灯光数据 细分:标准差、平均值、总值、最大值和最小值
工程项目总监绩效考核表
首先解释一下什么叫转移支付。其实,这和养老金的中央调剂是一样的。 每年,地方都要向中央缴纳财政。而中央又要根据各地方的财政实力,给予转移支付。比如一些经济弱省,本身财政收入就不够支出的,还得上交一部分给中央,怎么维持财政运转?由于各省市直接的财政收入能力存在差异,中央为实现各个地方的公共服务水平平等,于是便有了财政转移支付制度。 简单理解就是富省养穷省。 2022年全国一般预算内财政收入203703亿元,给地方转移支付了97144.75亿元,转移支付数额创下新高。
基于门控卷积和堆叠自注意力的离线手写汉字识别算法研究.pdf
【数据介绍】 作为第二大人类部门用水,高质量的工业用水格网数据对于水资源研究和管理至关重要。中国工业用水格网数据(China Industrial Water Withdrawal dataset, CIWW)基于超过 40 万家企业数据、月度工业产品产量数据和连续工业用水统计数据制作得到的一套1965-2020年逐月中国工业用水数据集,其空间分辨率为 0.1°和 0.25°。数据集包括工业用水、企业数量和企业生产总值(辅助数据)等变量,可被用于水文、地理学、环境、可持续发展等方面科学研究。 【数据来源】 数据来源为《中国经济普查年鉴》(省级工业取水量、工业产出)、《中国工业企业数据库》(企业地理位置、产值)、《中国工业产品产量数据库》(工业产品月生产量),以及《中国水资源公报》和(Zhou et al, 2020, PNAS)的工业用水量数据。 【数据处理】 首先通过2008年企业分布数据、经济普查年鉴中分省分部门的工业用水量和工业产值计算得到分省分部门工业用水效率和工业产品产量数据,得到了2008年逐月工业用水数据。然后结合中国水资源公报和相关文献中省级工业用水数据,以2008年工业用水的时空格局作为基础分配工业用水数据,最终得到1965-2020年逐月工业用水的格网数据。详细方法见High-resolution mapping of monthly industrial water withdrawal in China from 1965 to 2020 (Hou et al, 2024, ESSD). 将数据集与统计数据记录和其他数据集进行了验证,结果表示在时间尺度和空间尺度上都与统计数据具有一致性,相比已有工业用水数据有更好的精度。
65 -质量管理部经理绩效考核表1
11 -电脑部经理绩效考核表1
内容概要:本文提供了针对大学生英语竞赛写作准备的重要资源——一系列通用的英文句子模板。这些模板涵盖了现代经济社会的各种话题,从科技进步到环境保护,以及个人品质和社会责任等,并且适用于论述类文章、观点对比和个人见解的表达。文章通过对每一句话的应用环境解释和语法提示,确保使用者可以在实际写作中正确且有效地应用这些表达方式。 适合人群:正在准备参加大学生英语竞赛的学生及其他希望提高书面表达能力的学习者。 使用场景及目标:考生能够在竞赛时间内迅速构建思路完整的文章,增强语言表达的流利性和规范性;帮助学习者积累高级词汇,提升英语写作水平并培养良好的思维逻辑。 阅读建议:结合历年优秀范文进行深入学习,熟悉不同类型话题下的表述方法;练习将提供的句子融入自身创作的文章中,通过不断修订和完善来巩固记忆。同时也可以用于日常的英语写作训练当中。
法律事务专员绩效考核表
1、文件内容:apache-commons-digester-javadoc-1.8.1-19.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-digester-javadoc-1.8.1-19.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装