运维派官方|面试官邪魅一笑:MySQL千万级别大表,你要如何优化?( 三 )
分片原则
?能不分就不分 , 参考单表优化 ?分片数量尽量少 , 分片尽量均匀分布在多个数据结点上 , 因为一个查询SQL跨分片越多 , 则总体性能越差 , 虽然要好于所有数据在一个分片的结果 , 只在必要的时候进行扩容 , 增加分片数量 ?分片规则需要慎重选择做好提前规划 , 分片规则的选择 , 需要考虑数据的增长模式 , 数据的访问模式 , 分片关联性问题 , 以及分片扩容问题 , 最近的分片策略为范围分片 , 枚举分片 , 一致性Hash分片 , 这几种分片都有利于扩容 ?尽量不要在一个事务中的SQL跨越多个分片 , 分布式事务一直是个不好处理的问题 ?查询条件尽量优化 , 尽量避免Select * 的方式 , 大量数据结果集下 , 会消耗大量带宽和CPU资源 , 查询尽量避免返回大量结果集 , 并且尽量为频繁使用的查询语句建立索引 。?通过数据冗余和表分区赖降低跨库Join的可能
这里特别强调一下分片规则的选择问题 , 如果某个表的数据有明显的时间特征 , 比如订单、交易记录等 , 则他们通常比较合适用时间范围分片 , 因为具有时效性的数据 , 我们往往关注其近期的数据 , 查询条件中往往带有时间字段进行过滤 , 比较好的方案是 , 当前活跃的数据 , 采用跨度比较短的时间段进行分片 , 而历史性的数据 , 则采用比较长的跨度存储 。
总体上来说 , 分片的选择是取决于最频繁的查询SQL的条件 , 因为不带任何Where语句的查询SQL , 会遍历所有的分片 , 性能相对最差 , 因此这种SQL越多 , 对系统的影响越大 , 所以我们要尽量避免这种SQL的产生 。
解决方案
由于水平拆分牵涉的逻辑比较复杂 , 当前也有了不少比较成熟的解决方案 。 这些方案分为两大类:客户端架构和代理架构 。
客户端架构
通过修改数据访问层 , 如JDBC、Data Source、MyBatis , 通过配置来管理多个数据源 , 直连数据库 , 并在模块内完成数据的分片整合 , 一般以Jar包的方式呈现 这是一个客户端架构的例子:
可以看到分片的实现是和应用服务器在一起的 , 通过修改Spring JDBC层来实现
客户端架构的优点是:
?应用直连数据库 , 降低外围系统依赖所带来的宕机风险 ?集成成本低 , 无需额外运维的组件
缺点是:
?限于只能在数据库访问层上做文章 , 扩展性一般 , 对于比较复杂的系统可能会力不从心 ?将分片逻辑的压力放在应用服务器上 , 造成额外风险
代理架构
通过独立的中间件来统一管理所有数据源和数据分片整合 , 后端数据库集群对前端应用程序透明 , 需要独立部署和运维代理组件
这是一个代理架构的例子:
本文插图
代理组件为了分流和防止单点 , 一般以集群形式存在 , 同时可能需要Zookeeper之类的服务组件来管理
代理架构的优点是:
?能够处理非常复杂的需求 , 不受数据库访问层原来实现的限制 , 扩展性强 ?对于应用服务器透明且没有增加任何额外负载
缺点是:
?需部署和运维独立的代理中间件 , 成本高 ?应用需经过代理来连接数据库 , 网络上多了一跳 , 性能有损失且有额外风险 。
作者:李红欧巴
推荐阅读
- 常吹水的阿诚|平板手机测评之后冷宴华立即回应 官方修复bug实力打脸
- 华商韬略官方账号|最牛经理人方洪波,每年帮老板赚几百亿,瞄一眼就懂老板心思
- 数据库|面试官:说说MySQL数据库分库分表,并且会有哪些问题?
- 技术编程|Ubuntu 19.10 Eoan Ermine 完成整个生命周期 官方停止支持
- 柴狗夫斯基|北京比特大陆《再致全体同仁书》 官方证实詹克团人设崩塌史
- 普通车|本田官方确认 全新一代思域2021年春季亮相
- 中年|想拿腾讯Offer?设计模式,算法高频面试题别漏了
- 一加手机|一加8官方渲染图曝光:它会是你心中最完美的手机?
- 新机发布|一加8官方渲染图曝光:它会是你心中最完美的手机?
- 漏洞|Oracle发布7月份安全公告,360安全大脑测绘云再获Oracle官方致谢
