架构设计系列二(高性能数据库集群)
2024-06-21 17:18:53 0 举报
AI智能生成
内容整理自极客时间-从0开始学架构
作者其他创作
大纲/内容
读写分离(提高读写性能)
复杂度
主从复制延迟
解决读写一致性问题
对于写后读,直读主库
读从机失败后再读一次主机(又叫二次读取)
关键业务读写操作全部指向主机,非关键业务采用读写分离
分配机制
实现读写请求分离
程序代码封装
优:简单,自由定制
缺:若有多种语言,每种都要实现
缺:若发生主从切换,所有系统要重启
中间件封装
解释
独立一套系统出来,实现读写操作分离和数据库服务器连接的管理
中间件对业务服务器提供 SQL 兼容的协议
对于业务服务器来说,访问中间件和访问数据库没有区别
特点
能够支持多种编程语言
支持完整的 SQL 语法和数据库服务器的协议
实现比较复杂,很容易出现 bug,需要较长的时间才能稳定
所有的数据库操作请求都要经过中间件,中间件的性能要求也很高
数据库主从切换对业务服务器无感知,数据库中间件可以探测数据库服务器的主从状态
只有大公司有能力开发和维护,价值也会更高
MySQL 官方推荐 MySQL Router
手动处理
最简单!
分库分表(提高读写性能同时分散存储压力)
解决问题:海量数据存储的情况下,单机存储成为瓶颈
读写性能大幅下降
数据文件会变得很大,数据库备份和恢复需要耗费很长时间
数据文件越大,极端情况下丢失数据的风险越高
分库
按照业务模块将数据分散到不同的数据库服务器(单机无法提高连接数)
新的问题
不同库的表无法JOIN查询
解决:合并同步到OLAP数据库进行查询,如TiDB/Clickhouse/阿里云ADB等
自带事务不支持跨库,而XA协议性能低
解决:定时任务+人工补偿
一台机变成了多台机,成本增加
解决:评估业务量短期是否发展迅速,是再使用此方案
能够支撑百万甚至千万用户规模的业务
分表
解决单表海量数据的问题,例如淘宝的几亿用户数据
垂直分表
将部分字段分离到另一张表
引入复杂度
查询完整信息需要JOIN(还能接受)
水平分表
解释:表结构不变,拆分部分数据量到多个表
对特定字段进行路由计算,拼接出结果表名
引入复杂度
路由算法
首先尽量选择分布均匀的整数列作为路由字段
范围路由
根据ID范围确定表名
优:可以平滑地扩充新的表
缺:可能分布不均
Hash路由
对列值进行Hash后再取模
优:分布均匀
缺:扩新表导致所有数据重分布,所以一般开始时确定了表数量就不会变(准确评估数据量)
配置路由
新增一个路由表包含路由列和表id,读写数据时先通过路由表查表id,再查数据
优:设计简单,使用起来非常灵活,方便扩充新表
缺:多查询一次,会影响整体性能
缺:若路由表本身如果太大,又成为瓶颈
Join查询
需要依次JOIN每张表再合并结果
Count查询
需要单独查询每张表行数再求和
或者:在增删行后,将表行数单独维护到一张表中,在这张表中离线维护总行数。缺点是可能不准确
OrderBy查询
需要SQL汇总查询结果后再排序
实现:也可以通过程序封装和中间件封装实现。
0 条评论
下一页