范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

数据库架构选型与落地,看这篇就够了

  随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘、IO、系统开销,甚至性能上的瓶颈,而单台服务器的资源终究是有限的。
  因此在面对业务扩张过程中,应用程序对数据库系统的健壮性,安全性,扩展性提出了更高的要求。
  以下,我从数据库架构、选型与落地来让大家入门。数据库架构有哪些
  数据库会面临什么样的挑战呢?
  业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。IO瓶颈:大规模的用户查询和写入,由于单机数据库的IO有限无法支撑;存储瓶颈:大量数据的存储让数据库原有的逻辑结构已经无法适用,性能急剧下降;可用性:重点业务系统对数据库的要求是不间断地提供服务,一旦遇到突发事件时系统可以快速恢复;安全性:数据的容灾能力,保证数据在任何时候不会丢失(避免运维删库跑路);
  为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。
  一、主从架构
  将数据库的写操作和读操作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。
  这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读操作的场景。
  因为主从的数据是相同的,一旦主库宕机的时候,从库可以切换为主库提供写入,所以这个架构也可以提高数据库系统的安全性和可用性;
  优点:结构简单,技术成熟,市面上大多数数据库都支持这个方案;业务入侵最低;数据拥有多个容灾副本,提高数据安全性;当主服务器故障时,可立即切换到其他服务器,提高系统可用性;
  缺点:无法支持大量写的场景,因为主库无法水平扩展;从库的数据都是全量并且重复的,浪费存储空间;数据一致性问题;数据同步延迟问题;
  二、垂直分库
  在数据库遇到IO瓶颈过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由热点业务的密集IO请求影响了其他正常业务,所以垂直分库也叫业务分库。
  优点:业务清晰,专库专用,契合服务化的拆分;冷热数据分离,业务数据相互独立各不干扰;独立的数据库便于日常迭代和维护;
  缺点:数据之间无法联表,只能在程序中多次查询组合或者冗余数据;需要解决分布式事务问题;
  三、水平分片
  在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。
  这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。
  但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈(单个服务器的IO有上限)。
  所以水平分表主要还是针对数据量较大,整体业务请求量较低的场景。
  优点:单表数据量减少,性能得到提升;数据都在同个数据库中,没有跨库事务问题;
  缺点:需要解决跨片查询问题;数据分片在扩容时需要迁移;存在IO瓶颈,无法处理大量业务请求;
  四、分库分表
  在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。
  所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。
  分库分表能够有效地缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。
  优点:单表数据量减少,性能得到提升;数据分散在多个服务器,提高了整体系统的负载能力;
  缺点:需要解决跨片查询问题;数据分片在扩容时需要迁移;需要处理广播表(公共表)问题;需要解决分布式事务问题;
  注:分库还是分表核心关键是有没有IO瓶颈。
  分片方式都有什么呢?
  RANGE(范围分片)
  将业务表中的某个关键字段排序后,按照顺序从0到10000一个表,10001到20000一个表。最常见的就是按照时间切分(月表、年表)。
  比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,银行的交易记录多数是采用这种方式。
  优点:天然便于水平扩展,后期想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移;使用分片字段进行范围查找时,连续分片可快速定位分片进行快速查询,有效避免跨分片查询的问题。
  缺点:热点数据成为性能瓶颈。连续分片可能存在数据热点,例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁地读写,而有些分片存储的历史数据,则很少被查询。
  HASH(哈希分片)
  将订单作为主表,然后将其相关的业务表作为附表,取用户id然后hash取模,分配到不同的数据表或者数据库上。
  优点:数据分片相对比较均匀,不容易出现热点和并发访问的瓶颈。
  缺点:后期分片集群扩容时,需要迁移旧的数据,容易面临跨分片查询的复杂问题。比如上例中,如果频繁用到的查询条件中不带用户id时,将会导致无法定位数据库,从而需要同时向所有库发起查询,再在内存中合并数据,取最小集返回给应用,分库反而成为拖累。
  讲到这里,我们已经知道数据库有哪些架构,解决的是哪些问题,因此,我们在日常设计中需要根据数据的特点,数据的倾向性,数据的安全性等来选择不同的架构。
  那么,我们应该如何选择数据库架构呢?
  虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。
  混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。
  所以,在选择数据库架构之前,我们先思考一下,实际上会面临什么样的难题?
  1、对事务支持
  分库分表后(无论是垂直还是水平拆分),就成了分布式事务了,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价(XA事务);如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担(TCC、SAGA)。
  2、多库结果集合并(group by,order by)
  由于数据分布于不同的数据库中,无法直接对其做分页、分组、排序等操作,一般应对这种多库结果集合并的查询业务都需要采用数据清洗、同步等其他手段处理(TIDB、KUDU等)。
  3、数据延迟
  主从架构下的多副本机制和水平分库后的聚合库都会存在主数据和副本数据之间的延迟问题。
  4、跨库join
  分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表(垂直),也无法join分表粒度不同的表(水平), 结果原本一次查询就能够完成的业务,可能需要多次查询才能完成。
  5、分片扩容
  水平分片之后,一旦需要做扩容时。需要将对应的数据做一次迁移,成本代价都极高的。
  6、ID生成
  分库分表后由于数据库独立,原有的基于数据库自增ID将无法再使用,这个时候需要采用其他外部的ID生成方案。数据库的选型与落地
  那么,从技术种类上看,都有哪些呢?大厂的选择又会是怎样的呢?
  一、应用层依赖类(JDBC)
  这类分库分表中间件的特点就是和应用强耦合,需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、当当开源的sharding-jdbc、蘑菇街的TSharding等。
  此类中间件的基本思路就是重新实现JDBC的API,通过重新实现DataSource、PrepareStatement等操作数据库的接口,让应用层在基本不改变业务代码的情况下透明地实现分库分表的能力。
  中间件给上层应用提供熟悉的JDBC API,内部通过sql解析、sql重写、sql路由等一系列的准备工作获取真正可执行的sql,然后底层再按照传统的方法(比如数据库连接池)获取物理连接来执行sql,最后把数据结果合并处理成ResultSet返回给应用层。
  优点无需额外部署,只要和应用绑定一起发布即可;任意数据库都可以使用;
  缺点不能跨语言,比如Java写的sharding-jdbc显然不能用在C#项目中;数据库连接数消耗高(各个应用节点的连接池不共享);
  二、中间层代理类(Proxy)
  这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个代理层,上层应用以标准的MySQL协议来连接代理层,然后代理层负责转发请求到底层的MySQL物理实例,这种方式对应用只有一个要求,就是只要用MySQL协议来通信即可。
  所以用MySQL Navicat这种纯的客户端都可以直接连接你的分布式数据库,自然也天然支持所有的编程语言。
  在技术实现上除了和应用层依赖类中间件基本相似外,代理类的分库分表产品必须实现标准的MySQL协议,某种意义上讲数据库代理层转发的就是MySQL协议请求,就像Nginx转发的是Http协议请求。
  比较有代表性的产品有开创性质的Amoeba、阿里开源的Cobar、社区发展比较好的Mycat(基于Cobar开发)等。
  优点跨语言,任何编程语言都可以使用;数据库连接数消耗低(连接池由代理层持有,所以可以复用);
  缺点只支持少量数据库(MYSQL/PostgreSQL);需要单独部署,形成中心化架构(一旦宕机系统将不可用);多了一层代理层,性能下降;
  接下来谈谈落地方案。
  JDBC方案:无中心化架构,兼容市面上大多数关系型数据库,适用于开发高性能的轻量级 OLTP 应用(面向前台)。
  Proxy方案:提供静态入口以及异构语言的支持,适用于 OLAP 应用(面向后台)以及对分片数据库进行管理和运维的场景。
  混合方案:在大型复杂系统中存在面向C端用户的前台应用,也有面向企业分析的后台应用,这个时候就可以采用混合模式。
  混合结构
  JDBC 采用无中心化架构,适用于 Java 开发的高性能的轻量级 OLTP 应用;Proxy 提供静态入口以及异构语言的支持,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。ShardingSphere
  ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
  ShardingSphere提供的核心功能:数据分片分库 & 分表读写分离分片策略定制化无中心化分布式主键分布式事务标准化事务接口XA强一致事务柔性事务
  Sharding-Proxy
  定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。
  目前已提供MySQL版本,它可以使用任何兼容MySQL协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好。
  向应用程序完全透明,可直接当做MySQL使用。
  适用于任何兼容MySQL协议的客户端。
  Sharding-JDBC
  定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
  应用案例
  以电商SaaS系统为例,前台应用采用Sharding-JDBC,根据业务场景的差异主要分为三种方案。
  分库(用户)
  问题解析:头部企业日活高并发高,单独分库避免干扰其他企业用户,用户数据的增长缓慢可以不分表。
  拆分维度:企业ID分库
  拆分策略:头部企业单独库、非头部企业一个库
  分库分表(订单)
  问题解析:订单数据增长速度较快,在分库之余需要分表。
  拆分维度:企业ID分库、用户ID分表
  拆分策略:头部企业单独库、非头部企业一个库,分库之后用户ID取模拆分表
  单库分表(附件)
  问题解析:附件数据特点是并发量不大,只需要解决数据增长问题,所以单库IO足以支撑的情况下分表即可。
  拆分维度:用户ID分表
  拆分策略:用户ID取模分表
  随着而来的问题
  问题一:分布式事务
  分布式事务过于复杂也是分布式系统最难处理的问题,由于篇幅有限,后续会开篇专讲这一块内容。
  问题二:分布式ID简单粗暴的UUID:生成足够简单,本地生成无网络消耗,具有唯一性。缺点:无序、无业务意义、过长基于Redis模式:利用redis的 incr命令实现ID的原子性自增。缺点:需要开启持久化,有可能丢失雪花算法:Snowflake ID组成结构:正数位(占1比特)+ 时间戳(占41比特)+ 机器ID(占5比特)+ 数据中心(占5比特)+ 自增值(占12比特),总共64比特组成的一个Long类型。美团leaf:提供雪花和程序自增方案,其中雪花依赖ZK,程序自增依赖数据库。
  问题三:跨片查询
  举个例子,以用户id分片之后,需要根据企业id查询企业所有用户信息。索引表法:建立索引表,存储用户id和企业id的关系。查询时先通过索引表找到对应用户id之后,再查询数据库。缺点:多一次数据库查询,性能下降。用户和企业关系变动时,需要维护数据。基因法:截取用户id的部分数据加入到企业id,例如用户id后3位直接加到企业id中,然后分片时根据用户id后3位计算分片,这个时候使用企业id也可以提取这三位数来计算分片位置,缺点是,只能针对单一字段,并且对数据有一定的入侵干扰。宽表法:使用NOSQL建立宽表(全量表),提供对应的查询能力。异构下的读写分离,缺点是,引入中间件成本、数据一致性问题,数据延迟问题;
  sharding针对跨片查询也是能够支持的,本质上sharding的跨片查询是采用同时查询多个分片的数据,然后聚合结果返回,这个方式对资源耗费比较大,特别是对数据库连接资源的消耗。
  假设分4个数据库,8个表,则sharding会同时发出32个SQL去查询。一下子消耗掉了32个连接;
  特别是针对单库分表的情况要注意,假设单库分64个表,则要消耗64个连接。如果我们部署了2个节点,这个时候两个节点同时查询的话,就会遇到数据库连接数上限问题(mysql默认100连接数)
  问题四:分片扩容
  随着数据增长,每个片区的数据也会达到瓶颈,这个时候需要将原有的分片数量进行增加。由于增加了片区,原先的hash规则也跟着变化,造成了需要将旧数据做迁移。
  假设原先1个亿的数据,hash分64个表,现在增长到50亿的数据,需要扩容到128个表,一旦扩容就需要将这50亿的数据做一次迁移,迁移成本是无法想象的。
  问题五:一致性哈希
  首先,求出每个服务器的hash值,将其配置到一个 0~2^n 的圆环上(n通常取32)
  其次,用同样的方法求出待存储对象的主键 hash值,也将其配置到这个圆环上。
  然后,从数据映射到的位置开始顺时针查找,将数据分布到找到的第一个服务器节点上。
  一致性hash的优点在于加入和删除节点时只会影响到在哈希环中相邻的节点,而对其他节点没有影响。
  所以使用一致性哈希在集群扩容过程中可以减少数据的迁移。
  最后总结一下数据库架构可以分为主从架构、垂直架构、水平架构,分别解决高可用、密集IO、大规模数据存储问题。每个架构会面临不同的难题,数据延迟、分布式事务、跨片查询、扩容等等,越复杂的架构面对的难题越多,而我们应该把这些难题考虑进去。对于架构的选择上,架构不是越复杂越好,应用在不同的阶段需要针对问题点选择合适的架构。从技术种类上看,实现分库分表技术的中间件分为JDBC方案和PROXY方案。JDBC性能高,跨数据库;PROXY省连接,跨语言。ShardingSphere是一个功能强大的中间件,支持多种方案(JDBC、PROXY、混合),可以快速实现数据库读写分离、数据库分片等技术方案。根据业务的特点可以选择不同的分库方案,在复杂的数据库架构中,需要解决分布式事务、分布式id、跨片查询、分片扩容等等问题。
  好了,这次分享到这里,我们日常的实践可能只会用到其中一种方案,但它不是数据库架构的全貌,打开技术视野,才能更好地把存储工具利用起来。
  老规矩,一键三连,日入两千,点赞在看,年薪百万!
  本文作者:Jensen
  7年Java老兵,小米主题设计师,手机输入法设计师,ProcessOn特邀讲师。
  曾涉猎航空、电信、IoT、垂直电商产品研发,现就职于某知名电商企业。
  技术公众号 【架构师修行录】 号主,专注于分享日常架构、技术、职场干货,Java Goals:架构师。
  交个朋友,一起成长!

真正贵气的女人,气质来自这4个穿衣原则,不是靠钱堆出来在现实生活当中,大多数的女人对于贵气感的理解还不是很深刻,甚至有人会觉得,贵气感是用金钱堆出来的,只有选择了足够昂贵的首饰衣服,高贵的气质,自然而然就流露出来了。可实际上,事实并非为什么有的女人身上香香的?学会这么做,衣服持久留香女人都希望自己能变得精致,除了打扮得好看之外,还需要散发出迷人的体香,体香这种东西虽然听起来很玄幻,却很多人都盲目追求,甚至会采用各种各样的方法。相对于中国女孩,日本主妇都是很喜欢女人产后50多天小肚子痛,看完后,到底是老公错还是自己太矫情?我看到一个老公这样的故事他说我妻子生孩子的时候侧切了,伤口痛,孩子(男孩)是晚上生下来的,当天晚上我在外面走廊的凳子上睡觉,半夜她起来找东西找不见,让我妈叫我,我妈没有叫,想让我好OECDG20三季度货物贸易两年来首次下滑,料明年美国通胀仍将远高于目标经合组织(OECD)最新发布的数据显示,二十国集团(G20)第三季度货物贸易出现两年来首次下降,从2022年第二季度的近期高位回落。数据显示,以现价美元计算,随着全球需求开始放缓以广东队补强双方案,有意考辛斯再次被拒,辽宁旧将成朱芳雨的目标广东队需不需要补强呢?杜锋在接受记者采访时谈到回归广东队后需要做的一些工作,杜锋直言还是以培养新人为主,这是否意味着广东队放弃争冠呢?培养新人很重要,但是夺冠一样是广东队本赛季的重科企岛光伏窗户开启了提高摩天大楼能源效率的目标摩天大楼主导着城市的天际线,但根据国家可再生能源实验室(NREL)研究人员的分析,这些巨大的玻璃墙结构可以通过增加热效率高的光伏(PV)窗户来提高能源效率。他们的研究结果发表在一个大众下调2022年在华销量目标!新能源赛道上传统大厂开始乏力了?2022年剩下已不到两个月的时间了,今年定下的小目标,大家都完成了吗?在汽车圈,一直流行着10月销量看全年的说法,也就是说,过了金九银十后,各大车企的销量基本就不会再有大的涨幅了,古今中外祛痘方法大盘点,原来慈禧也祛痘你有没有好奇过古代人会长痘痘吗?会战国时期庄子里有个曹商舐痔的故事庄子拿破痈溃痤者,得车一乘。舐痔者,得车五乘来讽刺曹商丧失尊严来换取财富这里的痤,就是痤疮的意思东汉时期说文解字曰永恒岛之彩虹回忆平民生活技能的正确使用方法HELLO观众老爷们你们的纯爱战士同学又来出干货啦本期带来的主要内容是生活技能方面的攻略什么是生活技能呢生活技能主要是可以让平民玩家自己制造武器丶护具丶饰品丶药物等等,这些都是提升产后月经量少是卵巢早衰?颜色暗说明恢复差?别信,都是忽悠你的准妈妈们从怀孕开始,就跟大姨妈暂时拜拜了。可等到生完孩子再次跟大姨妈相遇后,突然发现,对这个陪伴了几年或者十几年的老朋友变得陌生了,比如说大姨妈来得早,说明身体恢复得很好,或者是突给网课出问题的孩子家长一些改善方法与建议亲爱的家长朋友您们好。因为疫情原因,无论是校内还是校外培训班,线上课已经进行了一段时间了。不少孩子对于线上课开始变得消极,不再像对待线下课那样认真和用心,有的孩子成绩甚至因为网课也
前2个月青岛自巴西进口农产品增长343月22日,青岛新协航国际物流有限公司从巴西进口的27吨冻猪肉到达青岛港前湾港区。利用先期机检船边直提智能查验新模式,货物卸船后随即发往山东淄博的工厂,待加工成酱货后将销往全国各地老字号品牌保护需综合施策老字号是数百年商业和手工业竞争中留下的宝贵遗产,具有鲜明的民族文化背景,拥有世代相承的独特工艺或经营特色,是珍贵的自主品牌,品牌价值无可替代。但是,由于老字号运营主体企业自身经营原国家队VS传统品牌,主打中式豪华的岚图追光,能取代奥迪A6L吗?伴随着电动化时代的到来,新能源汽车的热度可谓是越来越高,特别是在30万50万的高端豪华市场上,新能源汽车扮演了非常重要的角色,对BBA等传统豪华品牌造成了很大的威胁。就拿当前关注度天马科技获水产行业卓越贡献奖和百强品牌来源人民网3月24日,以创新引领绿色发展智慧兴渔为主题的2023第七届中国国际水产科技大会召开。会上,天马科技集团获评2023中国水产行业十大卓越贡献奖天马科技旗下品牌鳗鲡堂获评2甘肃省博推出的文创产品惹游客爱不释手图为游客在甘肃省博物馆推出的文创产品前合影留念,留下美好瞬间。戴文昌摄图为游客在甘肃省博物馆推出的文创产品前合影留念。戴文昌摄图为游客对甘肃省博物馆推出的文创产品绿马爱不释手。戴文OPPOFindX6Pro优缺点总结,不吹不黑,更推荐标准版先看缺点1长焦pro的长焦虽然是大底imx890,但是由于光学变焦倍率不足只有2。7x,在白天常规背景下,长焦100x不如x90pro和s23ultra。但是暗光下因为有大底可以带青未了灿若云霞樱花谷文吴仲尧一夜春风来,万树樱花开。早听说张村樱花谷的樱花很美,600余亩樱花,绵延数里,开得大气磅礴,灿若云霞,壮观之极,撼人心魄。樱花美得惊艳,但花期很短,民谚有樱花七日之说,一旦四款值得捡漏的荣耀手机,8256GB已经降到最低,强烈推荐!如果你是荣耀手机的忠实粉丝,用习惯了荣耀手机不想换别的品牌,或者最近想尝试一下荣耀手机,那么目前推荐可以入手的手机就是以下四款。荣耀magic5(4k左右)荣耀刚推出的新旗舰机,搭刘勇教授团队在Nature子刊NatureCommuncations发表电催化最新研究成果近日,我校材料科学与工程国际化示范学院(材料与微电子学院)刘勇教授团队在燃料电池阴极氧还原反应电催化剂的设计研究上取得重大突破,成果以MesoporousPtPtskinPtNic99。80元NVIDIACMP61显卡性能评分19162打平10606G,I3内存6800M上面显卡是淘宝购入的ZOTAC索泰P1061006GB,型号是CMP611,购入价格104。80元,然后好评返现5元,最终价格正好不到100元99。80元(不用优惠券,不用各种耍猴聊一款励志的高端游戏本上次发布这篇文章时,发现了几个比较明显的错误,所以回炉重写了一下,今天重写发布,感谢大家的理解。要说游戏本领域最励志的产品线是哪个?答案肯定是微星GE系列,它曾经是一款500060