推荐:采用垂直分库&水平分表
总结:分库要解决的是硬件资源的问题,不管是拆分字段,还是拆分数据,都是要拆到不同的数据库不同的服务器上,从硬件资源上解决性能瓶颈。而分表是解决单表数据量过大的问题,拆分完后还是放在同一数据库中不同表里面,只是减少了单表的读写锁资源消耗,如果性能瓶颈在硬件资源,只是简单的分表并不能从根本上解决问题,所有具体分库分表亦或者是结合使用都要结合具体的业务场景
每一个独立的服务(业务)都拥有自己的数据库,如订单、用户、商品
基于数据表的列为依据切分,大表拆小表,拆的是表结构,如一个表内将常用和访问不频繁的字段分到不同表中存储,把text,blob等大字段拆分出来放在附表中
分的是数据,将一张大数据量的表,切分成多个表结构相同,而每个表只占原表一部分数据,然后按不同的条件分散到多个数据库中。
表拆分了,但还在一个数据库内,还是存在竞争同一物理机的CPU、内存、网络IO
将切分出来的子表,放到不同数据库
hash(key) % NUM_DB
id数据取模,按照不同的模值存放到不同表
优点:
可以是 ID 范围也可以是时间范围
按ID区间区分,0-10000,10000-20000
优点:
使用单独的一个数据库来存储映射关系
由于分库分表把数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题。
由于原来一张表的数据现在分布在不同数据库,不同表中,在涉及到多表关联,一定要设计好分片策略以及查询条件,否则很可能出现笛卡尔积现象,导致性能更低。
笛卡尔积现象:当进?多张表联合查询的时候,在没有任何条件进?限制情况下,最终查询结果条数是多张表记录条数的乘积!
跨节点多库进行查询时,limit分页、order by排序等问题,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。
不能在采用数据库自增主键,应采用分布式id,保证全局唯一。
实际的应用场景中,参数表、数据字典表等都是数据量较小,变动少,而且属于高频联合查询的依赖表。例如地理区域表也属于此类型。可以将这类表在每个数据库都保存一份,所有对公共表的更新操作都同时发送到所有分库执行。
用户端:按照用户id,订单id(内部含userid后四位)
商家端:商家id,mq备份一下订单数据
运营管理端:查全量,非实时(数据仓库),实时(elasticsearch)
有不断的增删改查
同步:
binlog日志、canal(阿里开源),同步两个表
增量同步的话可能会组件/数据冲突,update和delete会有问题,数据混乱
rocketmg延迟再传递一遍
运行一段时间,抽检,总数的比对等进行校验
不会全量把老系统下掉
有损发布:
做一个灰度发布(用一部分流量打到新的系统),观察一段时间
少数情况下,数据到了新系统,旧系统没有,会有一部分数据问题
无损发布:
短暂灰度之后,全流量切
一种全局ID生成算法,其核心思想是将64位的long型ID分为四个部分,分别为:时间戳、工作机器ID、数据中心ID和序列号。通过将数据映射到具有特定结构的分布式系统中,实现数据的存储和查询。该算法由一系列节点组成,每个节点负责存储数据的一部分。这些节点通过哈希函数将数据映射到特定的位置,形成类似于雪花结构的分布式系统。通过这种方式,雪花算法能够在分布式系统中保证ID的唯一性和有序性。