码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 分库分表知识内容


    分库分表知识

    为什么要分库分表?

    单库, 单表的问题(痛点), 每个数据库的连接数都是有上限的。

    • 查询瓶颈: 由于太多热点数据, 数据库缓存完全放不下, 只能放到磁盘中, 查询时候会产生大量磁盘IO, 导致查询缓慢, 占用连接, 最终可能导致无连接可用, 并且单表的数据量超过亿级后, 查询效率会变得越来越低, 并且由于需要扫描的索引树太多导致CPU使用率提升。
    • 写入瓶颈: 单个库写入的性能是有上限的, 单库频繁的写也会产生大量的磁盘IO操作占用连接, 最终可能也会导致无连接可用, 分库分表后能解决这种问题, 并且由于分表后, 单表数据量少, 插入时索引的查找和更新成本更低, 效率会更快。
    • 服务器瓶颈: 所有的读写都是在同一个库上的情况, 终有一天业务会增长到单体服务器资源完全支撑不起业务的写读而导致的宕机。

    分库分表解决方案?

    1. 采用读写分离架构, 实现一主三从, 主库专门用于写, 从库通过读取binlog日志同步数据到从库, 读操作都走从库, MySQL自带就可以实现一主多从, 读写分离可以采用中间件。
    2. 垂直切分根据业务不同将表字段拆分, 拆分不同的库, 例如用户库, 用户相关不同的表。
    3. 水平切分将表实现多个分片表, 写操作的数据, 按照特殊字段hash算法取余后决定存储到那张表, 将一个业务的数据平均分到不同的表里面去。
    4. MySQL自带的一个分区功能

    分库分表可选方案?

    目前互联网上有许多的版本,比较知名的一些方案:

    • 阿里的TDDL,DRDS和cobar,
    • Apache ShardingSphere;
    • Mycat2;
    • 360的Atlas;
    • 美团的zebra;
    • 其他比如网易、58、京东等公司都有自研的中间件。

    分库分表后的问题?

    1. 无法跨库连表查询, 尽量进行单表查询, 如果非要多表关联则需要进行建立关联索引表, 表里面是各个关联表的查询条件索引字段, 找到对应结果再去单表查询
    2. 主从延迟问题导致插入后查询可能查询不到, 采用强制查询走主库, 或者使用ShardingSphere中间件在写线程中有读操作都走主库
    3. 分布式事务问题, 解决方案是采用成熟开源的分布式事务解决方案
    4. 运维成本、 资源成本、 数据迁移问题
    5. 数据同步问题, 以前的单库单表, 变成需要同步多库多表
    6. 某些数据库函数不在支持, 批量插入根据分片规则可能也导致不支持

    如何进行分库分表?

    我们公司采用的是Apache ShardingSphere v4.1.1,

    这个版本不分片的表还不支持, 所以使用了Spring+AOP实现多数据源支持针对分片的表

    v5.x支持了自动识别, shardingjdbc不参与分库分表的配置处理方式

    1. 先考虑好恢复方案, 如果在分库分表途中出现了问题, 如何能最快速度的恢复
    2. 先从无关紧要的表, 进行分表, 然后进行测试, 最终到线上测试运行一段时间后, 没有问题再进行下一步略微重要的表进行分表
    3. 进行步骤2, 可以使用多数据源方案, 在需要进行分表的读写操作才走分表方案操作, 未分表的操作走以前操作
    4. 进行组织开发人员方案讲解, 说明那些SQL无法使用, 建议怎么使用
    5. 上线前经过充分的测试, 并提前列出有可能出现的风险点和解决方法

    总之就是需要稳

    总结:

    如果单表没有达到瓶颈, 没有必要的进行分表

    扩展

    ShardingSphere-JDBC兼容dynamicDataSource实现多数据源

    ShardingSphere jdbc集成多数据源

    Spring中可以通过AbstractRoutingDataSource来实现多数据源管理 (spring boot使用AbstractRoutingDataSource实现动态数据源切换)

    1

  • 相关阅读:
    C++set和map详细介绍
    JavaWeb Jsp 综合案例(mybatis,servlet,maven,jsp)(增删改查)
    秩(AB)≤min{秩(A), 秩(B)}
    django请求生命周期流程图 路由匹配 无名分组 有名分组 反向解析 无名有名反向解析 路由分发 名称空间
    网络实验 VlAN 中 Trunk Access端口的说明及实验
    学习相对论知识备忘
    ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types]
    SpringBoot、EasyPoi、Echarts 实现文档导入、出、图表显示 (饼状图、柱状图) 保姆级教程
    微服务(Microservice)那点事儿
    ASP.Net MVC 登录页面实现RSA非对称加密
  • 原文地址:https://blog.csdn.net/weixin_44600430/article/details/126286767
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号