中型存储架构实践探索
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《中型存储架构实践探索》,介绍一下MySQL、Redis、读写分离、主从备份,希望对大家的知识积累有所帮助,助力实战开发!
最近一直在做平台优化:对于中小型的站点,
如何在资源有限的情况下,实现一个稳定,高效,靠谱的存储方案。下图是小拽个人在时间过程使用的一个存储架构。拿出来分享交流一下,也希望得到指点改进!
先上图
首先说思想
思想就一个:
权衡资源和业务需求
简单解释一下:对于架构的理解,个人非常认同百度架构师tandai的一句话:
架构设计本质上是折衷的艺术,如果你有足够量的高速存储和高性能的机器,那么完全可以用足量的cache,足量的离线计算存储,来提升时效性;同样,如果你的机器不足,资源不足,那么就可以通过可接受的时间消耗来节省存储空间。
架构基本组件:
至少两台机器。【保证物理容灾】
三个mysql实例。【一主两从,一主不解释;一从主要用于实时备份,暂叫容灾从;一从用于离线计算,cache更新,非时效性的数据抓取,暂叫api从;】
ameoba 负责负载均衡和读写分离【暂时用着还可以】。
redis 负责缓存,预取,存储cache。【可以换成其他】
一个抗高并发的中间件。【暂时只加了antispam组件,高并发并未处理,可能系统负载比较平均,qpd几千万 ,但是并未出现qps峰值】
that's all,这些组件对于一个操作尚可的程序员来说,部署一整套肯定不会特别麻烦,相对于其他大型的架构来说,略显简单;但是,麻雀虽小,五脏俱全,下面从架构必备的几个角度分析一下。
安全性(Failover)
任何一个架构首要考虑的是数据安全和容灾。小拽的架构中做了哪些
数据库全量备份
这个就是一个简单脚本,对api从库在闲暇时间【晚上3-4点】进行全量导出备份,同时scp到另一台机器一份。(之所以对api库,是因为api库主要负责非失效性的查询和计算)
# crontab 每天3点进行数据库备份 (cuihuan)
# 0 3 * * * sh /home/disk6/mysql/bin/backup.sh
# 每天备份,保存最近30天的
DATE=$(date +%Y%m%d)
/home/xxx/bin/mysqldump -uroot -pxxx db > /home/xxx/bak_sql/db_$DATE.sql;
find /home/xxx/bak_sql/ -mtime +30 -name '*.sql' -exec rm -rf {} \;
数据库增量备份
增量备份主要从两个角度
binlog中定期备份sql;
是采用主从库之后,从库会定时的备份主库信息,同时,对api库采用数据完全一致,对容灾库则设置只同步update 和insert;这样完备的保证了数据的安全。
可用性(Availabilty)
数据的安全排第一,毋庸置疑;次之排平台的可用性,也毫无争议。可用性最简单的一个指标则为:
不卡。
cache
cache是提升查询时效性最有效的一个手段,小拽在框架中主要应用了两种cache,满足不同的业务需求。(所有关于cache的使用,一定要注意时效性和一致性,时效性和一致性,时效性和一致性)
普通的cache。即用户搜索或者查询之后的结果存在redis里面,下次查询使用。
预取的cache。即预测用户要查询的内容,放到cache里面。举几个栗子,用户首页内容一定要存cache里面;用户在看page1的时候,可以后台预测用户会看page2,提前取过来等等,这些策略和自己的实际业务紧密结合。
关于时效性和一致性再多说一句:一定要注意及时更新,例如用户写操作,点击操作,都需要在后台触发cache的主动更新,否则可能造成数据一致性错误。
分库分表
中小型的架构中,存储的瓶颈往往在于读。
随着数据的增加,读库的成本越来越大,一个sql很可能会造成锁死整个库,一条sql 10+s也是常有的事情;因此,解决读库的瓶颈,可以大大提升系统的可用性;小拽的实践中主要应用了分库,分表。
分库
之所以要分库,是因为
二八原则的存在,80%的用户操作集中于20%的数据。
举个栗子:实践过程中小拽有个月库,只存本月的数据,基本上80%+的用户操作数据,都会命中这个库。
分库的原则有很多,例如时间原则,业务原则,数据逻辑原则等等;总之在您的框架中,当db扛不住的时候就分库,分层级。
分表
分表的思想和分库类似,只是粒度更小,不在赘述。
扩展性(Scabability)
小拽的架构中,扩展性主要从三个方面考虑
1:数据库的扩展性。如果资源允许N主N从都是可以的,基本上不会影响业务操作。
2:缓存的扩展。缓存基本上也是单独部署的,redis,memcache等均可以,变更成本不大。
3:高并发和负载均衡。这块属于大型网站需要考虑的,暂时只采用了ameaba进行负载均衡的扩展,高并发预留接口。
权衡(Balance)
所有的架构和技术,最终都要落实到和业务需求权衡。
上面的架构最大的优势其实就是:简单,搭建起来非常容易,这就够了。
作为一名码农,只有在实践的过程中,不断发现系统的瓶颈,权衡现有资源和需求,解决和处理问题,才能成为一名靠谱的码农。
以上只是小拽在实践过程中的一点小小心的,欢迎大家到小站交流(http://cuihuan.net)。
【转载请注明:中型存储架构实践探索 | 靠谱崔小拽 】
今天关于《中型存储架构实践探索》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!
php查询最近30天、7天、每天、昨天、上个月的记录
- 上一篇
- php查询最近30天、7天、每天、昨天、上个月的记录
- 下一篇
- MySQL分页查询offset过大,Sql优化经验
-
- 称心的台灯
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享博文!
- 2023-04-19 18:12:28
-
- 儒雅的心情
- 这篇文章出现的刚刚好,太细致了,很有用,已加入收藏夹了,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-03-12 21:33:23
-
- 笑点低的狗
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享博文!
- 2023-03-12 14:21:18
-
- 尊敬的音响
- 这篇技术贴真是及时雨啊,太详细了,很棒,码起来,关注作者大大了!希望作者大大能多写数据库相关的文章。
- 2023-03-10 16:06:05
-
- 朴实的牛排
- 这篇技术文章真及时,大佬加油!
- 2023-03-07 13:45:58
-
- 细心的自行车
- 很详细,收藏了,感谢博主的这篇文章,我会继续支持!
- 2023-03-07 04:39:58
-
- 眯眯眼的荔枝
- 细节满满,码起来,感谢老哥的这篇技术贴,我会继续支持!
- 2023-02-25 08:55:04
-
- 数据库 · MySQL | 5小时前 |
- MySQL collation 不一致导致 JOIN 报错怎么统一
- 446浏览 收藏
-
- 数据库 · MySQL | 13小时前 |
- MySQL 递归 CTE 生成日期序列时为什么列类型会截断
- 104浏览 收藏
-
- 数据库 · MySQL | 16小时前 |
- MySQL 递归 CTE 遍历树数据时怎么防止无限循环
- 142浏览 收藏
-
- 数据库 · MySQL | 19小时前 |
- MySQL invisible index 如何安全观察索引下线影响
- 300浏览 收藏
-
- 数据库 · MySQL | 20小时前 | MySQL · 索引优化 · generated column · mysql 索引 优化器 生成列
- MySQL 生成列索引为什么没有被优化器使用
- 300浏览 收藏
-
- 数据库 · MySQL | 23小时前 |
- MySQL 窗口函数取每组最新记录时如何处理并列时间
- 242浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL JSON_VALUE 返回 NULL 时怎么区分缺少路径和空值
- 170浏览 收藏
-
- 数据库 · MySQL | 1天前 | MySQL · JSON查询 · JSON_TABLE · SQL技巧 · mysql JSON_TABLE FOR ORDINALITY JSON数组序号
- MySQL JSON_TABLE 的 FOR ORDINALITY 怎么保留数组原始序号
- 139浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL 复制延迟升高时怎么区分 SQL 线程和 IO 线程
- 304浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 61次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 216次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 145次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 78次使用
-
- Generrated
- Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
- 55次使用
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览


