Mysql分片

分片

数据库分片概述

  1. 什么是数据切分:
    将数据量大的表或表比较多的数据库切分成多个部分放到同一数据库不同表、同一数据库实例节点不同数据库或不同数据库实例节点上

  2. 为什么要数据切分
    优点:分散单台设备的负载,提高数据的安全性,性能
    缺点:增加系统复杂度,跨节点Join,跨节点的count,order by,group by以及聚合函数问题)

分片策略

  1. 分片枚举
  2. hash
  3. 约定范围
  4. 取模
  5. 按日期分片

分片需要解决的问题

事务问题

什么是分布式事务

分布式事务就是指事务的参与者、资源服务器以及事务管理器分别位于不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务节点或资源节点上,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

分布式事务产生的原因

从上面事务概念来看,分布式事务产生的原因是因为跨网络通信,我们可以看为两块,一个是service产生多个节点,另一个是resource产生多个节点。

service多个节点

随着互联网快速发展,微服务,SOA等服务架构模式正在被大规模的使用,举个简单的例子,一个公司之内,用户的资产可能分为好多个部分,比如余额,积分,优惠券等等。在公司内部有可能积分功能由一个微服务团队维护,优惠券又是另外的团队维护
在这里插入图片描述

这样的话就无法保证积分扣减了之后,优惠券能否扣减成功。

resource多个节点

同样的,互联网发展得太快了,我们的Mysql一般来说装千万级的数据就得进行分库分表,对于一个支付宝的转账业务来说,你给的朋友转钱,有可能你的数据库是在北京,而你的朋友的钱是存在上海,所以我们依然无法保证他们能同时成功。

在这里插入图片描述

解决事务问题可行的方案:

分布式事务和通过应用程序与数据库共同控制实现事务下面对两套方案进行一个简单的对比。

方案一:使用分布式事务
优点:交由数据库管理,简单有效
缺点:性能代价高,特别是shard越来越多时 ,对跨service不适用
方案二:由应用程序和数据库共同控制
原理:将分布式事务分拆成多个小事务,每个小事务仅处 于单个数据库上面的,并通过应用程序来总控 各个小事务。 优点:性能上有优势
缺点:需要应用程序在事务控制上做灵活设计。如果使用 了spring的事务管理,改动起来会面临一定的困难。

方案一:

  1. 全局事务(数据库XA协议)

方案二:

  1. 异步消息最终一致型
  2. TCC(两阶段提交型,补偿型)
  3. 最大努力通知型

跨节点Join的问题

只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。

跨节点的count,order by,group by以及聚合函数问题

这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。

全局序列号

可靠性是周期内正常运行的概率
可用性是从灾难中恢复的时间
提高可靠性需要强调减少系统中断(故障)的次数,提高可用性需要强调减少从灾难中恢复的时间。

示例:
A系统每年因故障中断十次,每次恢复平均要20分钟,B系统每年因故障中断2次,每次需5小时恢复。则A系统可用性比B系统高,但可靠性比B系统差。

### MySQL 分片键实现分库分表策略设计 #### 数据分片概述 随着互联网业务的发展,传统单库单表架构面临诸多挑战,如查询效率低、写入延迟高等问题。为了提升系统的存储能力和读写性能,MySQL 的分库分表技术成为解决大规模数据场景的有效方案之一[^3]。 #### 分片键的选择与应用 在分库分表过程中,选择合适的分片键至关重要。分片键决定了数据如何分布到不同的数据库实例和表中。常见的分片键有用户ID、订单号等具有唯一性和均匀分布特性的字段。对于SQL语句中的条件判断,存在两种主要类型的分片算法: - **精准分片算法**:适用于处理 `=` 和 `IN` 条件的 SQL 查询。当分片键仅涉及这些操作符时,采用此算法可以精确定位目标数据所在的分片位置[^1]。 - **范围分片算法**:针对包含 `<`, `>`, `<=`, `>=`, 或者 `BETWEEN AND` 这类比较运算符的情况。虽然不是强制要求,但在某些情况下能够提高查询效率并减少扫描的数据量。 #### 实现方式 一种常用的组合是利用 MyCat 中间件来简化分库分表的操作流程。MyCat 支持多种高可用集群配置,例如 Galera for MySQL, Percona Cluster 或 MariaDB cluster,从而增强了整个系统的稳定性和可靠性[^2]。 下面是一个简单的 Python 脚本示例,展示基于哈希函数计算分片 ID 并分配给不同数据库的方法: ```python import hashlib def get_shard_id(user_id): """根据 user_id 计算 hash 值作为 shard id""" m = hashlib.md5() m.update(str(user_id).encode('utf8')) return int(m.hexdigest(), 16) % 10 # 假设有10个shards print(get_shard_id(12345)) ``` 该脚本定义了一个名为 `get_shard_id()` 的函数,接收用户的 ID 参数并通过 MD5 散列将其映射至特定数量(此处假设为十个)的分片上。实际项目里可根据具体需求调整散列机制及分片数目。 #### 维护与优化建议 尽管引入了分库分表能显著改善性能表现,但也增加了系统复杂度和技术维护难度。因此,在实施前需充分考量诸如数据迁移、事务一致性保障等方面的问题,并制定相应的应急预案以应对可能出现的风险因素[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值